/*
 * Copyright 2004,2005 The Apache Software Foundation.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package org.apache.axiom.om;

import org.apache.axiom.om.impl.MTOMConstants;
import org.apache.axiom.om.util.UUIDGenerator;
import org.apache.axiom.soap.SOAP11Constants;
import org.apache.axiom.soap.SOAP12Constants;


/**
 * Formats options for OM Output.
 * 
 * Setting of all the properties in a OMOutputFormat should be done before
 * calling the getContentType() method. It is advised to set all the properties
 * at the creation time of the OMOutputFormat and not to change them later.
 */
public class OMOutputFormat {
    private String mimeBoundary = null;
    private String rootContentId = null;
    private int nextid = 0;
    private boolean doOptimize;
    private boolean doingSWA;
    private boolean isSoap11 = true;

    /**
     * Field DEFAULT_CHAR_SET_ENCODING. Specifies the default
     * character encoding scheme to be used.
     */
    public static final String DEFAULT_CHAR_SET_ENCODING = "utf-8";

    private String charSetEncoding;
    private String xmlVersion;
    private boolean ignoreXMLDeclaration = false;


    public OMOutputFormat() {
    }

    public boolean isOptimized() {
        return doOptimize;
    }

    public String getContentType() {
        String SOAPContentType;
        if (isSoap11) {
            SOAPContentType = SOAP11Constants.SOAP_11_CONTENT_TYPE;
        } else {
            SOAPContentType = SOAP12Constants.SOAP_12_CONTENT_TYPE;
        }
        // MTOM is given priority
        if (isOptimized()) {
            return this.getContentTypeForMTOM(SOAPContentType);
        } else if (isDoingSWA())
        {
        	return this.getContentTypeForSwA(SOAPContentType);
        }
        else {
            return SOAPContentType;
        }
    }

    public String getMimeBoundary() {
        if (mimeBoundary == null) {
        	mimeBoundary =
                "MIMEBoundary"
                        + UUIDGenerator.getUUID().replace(':','_');

        }
        return mimeBoundary;
    }

    public String getRootContentId() {
        if (rootContentId == null) {
            rootContentId =
                    "0."
                            + UUIDGenerator.getUUID()
                            + "@apache.org";
        }
        return rootContentId;
    }

    public String getNextContentId() {
        nextid++;
        return nextid
                + "."
                + UUIDGenerator.getUUID()
                + "@apache.org";
    }

    /**
     * Returns the character set encoding scheme. If the value of the
     * charSetEncoding is not set then the default will be returned.
     *
     * @return Returns encoding string.
     */
    public String getCharSetEncoding() {
        return this.charSetEncoding;
    }

    public void setCharSetEncoding(String charSetEncoding) {
        this.charSetEncoding = charSetEncoding;
    }

    public String getXmlVersion() {
        return xmlVersion;
    }

    public void setXmlVersion(String xmlVersion) {
        this.xmlVersion = xmlVersion;
    }

    public void setSOAP11(boolean b) {
        isSoap11 = b;
    }
    
    public boolean isSOAP11() {
        return isSoap11;
    }

    public boolean isIgnoreXMLDeclaration() {
        return ignoreXMLDeclaration;
    }

    public void setIgnoreXMLDeclaration(boolean ignoreXMLDeclaration) {
        this.ignoreXMLDeclaration = ignoreXMLDeclaration;
    }

    public void setDoOptimize(boolean b) {
        doOptimize = b;
    }

	public boolean isDoingSWA() {
		return doingSWA;
	}

	public void setDoingSWA(boolean doingSWA) {
		this.doingSWA = doingSWA;
	}

	public String getContentTypeForMTOM(String SOAPContentType) {
	    StringBuffer sb = new StringBuffer();
	    sb.append("multipart/related");
	    sb.append("; ");
	    sb.append("boundary=");
	    sb.append(getMimeBoundary());
	    sb.append("; ");  
	  	sb.append("type=\""+MTOMConstants.MTOM_TYPE+"\"");
	    sb.append("; ");
	    sb.append("start=\"<" + getRootContentId() + ">\"");
	    sb.append("; ");
	    sb.append("start-info=\""+SOAPContentType+"\"");
	    return sb.toString();
	}
	
	public String getContentTypeForSwA(String SOAPContentType) {
	    StringBuffer sb = new StringBuffer();
	    sb.append("multipart/related");
	    sb.append("; ");
	    sb.append("boundary=");
	    sb.append(getMimeBoundary());
	    sb.append("; ");  
	  	sb.append("type=\""+SOAPContentType+"\"");
	    sb.append("; ");
	    sb.append("start=\"<" + getRootContentId() + ">\"");
	    return sb.toString();
	}
}
