You are viewing a plain text version of this content. The canonical link for it is here.
Posted to java-dev@axis.apache.org by di...@apache.org on 2005/09/15 21:07:03 UTC

svn commit: r289289 [108/134] - in /webservices/axis2/trunk/java: ./ etc/ modules/addressing/ modules/addressing/src/META-INF/ modules/addressing/src/org/apache/axis2/handlers/addressing/ modules/addressing/test-resources/ modules/addressing/test/org/a...

Modified: webservices/axis2/trunk/java/modules/wsdl/src/org/apache/axis2/wsdl/codegen/emitter/MultiLanguageClientEmitter.java
URL: http://svn.apache.org/viewcvs/webservices/axis2/trunk/java/modules/wsdl/src/org/apache/axis2/wsdl/codegen/emitter/MultiLanguageClientEmitter.java?rev=289289&r1=289288&r2=289289&view=diff
==============================================================================
--- webservices/axis2/trunk/java/modules/wsdl/src/org/apache/axis2/wsdl/codegen/emitter/MultiLanguageClientEmitter.java (original)
+++ webservices/axis2/trunk/java/modules/wsdl/src/org/apache/axis2/wsdl/codegen/emitter/MultiLanguageClientEmitter.java Thu Sep 15 11:52:11 2005
@@ -1,1199 +1,1199 @@
-package org.apache.axis2.wsdl.codegen.emitter;
-
-import org.apache.axis2.wsdl.codegen.CodeGenConfiguration;
-import org.apache.axis2.wsdl.codegen.CodeGenerationException;
-import org.apache.axis2.wsdl.codegen.XSLTConstants;
-import org.apache.axis2.wsdl.codegen.writer.*;
-import org.apache.axis2.wsdl.databinding.TypeMapper;
-import org.apache.wsdl.*;
-import org.apache.wsdl.extensions.ExtensionConstants;
-import org.apache.wsdl.extensions.SOAPOperation;
-import org.apache.wsdl.extensions.SOAPHeader;
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-import org.w3c.dom.Attr;
-import org.w3c.dom.Document;
-import org.w3c.dom.Element;
-import org.w3c.dom.Text;
-
-import javax.xml.parsers.DocumentBuilder;
-import javax.xml.parsers.DocumentBuilderFactory;
-import javax.xml.parsers.ParserConfigurationException;
-import javax.xml.transform.Transformer;
-import javax.xml.transform.TransformerFactory;
-import javax.xml.transform.dom.DOMSource;
-import javax.xml.transform.stream.StreamResult;
-import javax.xml.namespace.QName;
-import java.io.ByteArrayInputStream;
-import java.io.ByteArrayOutputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.*;
-
-/*
-* 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.
-*
-* Abstract Client emitter
-* the XML will look like the following
-* todo Add references to relevant schemas !
-*/
-
-
-public abstract class MultiLanguageClientEmitter implements Emitter {
-
-    private Log log = LogFactory.getLog(getClass());
-
-    /*
-    *  Important! These constants are used in some places in the templates. Care should
-    *  be taken when changing them
-    */
-    private static final String CALL_BACK_HANDLER_SUFFIX = "CallbackHandler";
-    private static final String STUB_SUFFIX = "Stub";
-    private static final String TEST_SUFFIX = "Test";
-    private static final String LOCAL_TEST_SUFFIX = "LocalTest";
-    private static final String SERVICE_CLASS_SUFFIX = "Skeleton";
-    private static final String TEST_PACKAGE_NAME_SUFFIX = ".test";
-    private static final String DATABINDING_SUPPORTER_NAME_SUFFIX = "DatabindingSupporter";
-    private static final String DATABINDING_PACKAGE_NAME_SUFFIX = ".databinding";
-    private static final String TEST_SERVICE_CLASS_NAME_SUFFIX = "SkeletonTest";
-    private static final String MESSAGE_RECEIVER_SUFFIX = "MessageReceiver";
-    private static final String SERVICE_XML_OUTPUT_FOLDER_NAME = "service_descriptors.";
-
-
-    protected InputStream xsltStream = null;
-    protected CodeGenConfiguration configuration;
-    protected TypeMapper mapper;
-
-
-    /**
-     * Sets the mapper
-     *
-     * @param mapper
-     * @see org.apache.axis2.wsdl.databinding.TypeMapper
-     */
-    public void setMapper(TypeMapper mapper) {
-        this.mapper = mapper;
-    }
-
-    /**
-     * Sets the code generator configuration
-     *
-     * @param configuration
-     */
-    public void setCodeGenConfiguration(CodeGenConfiguration configuration) {
-        this.configuration = configuration;
-    }
-    /**
-     * @see org.apache.axis2.wsdl.codegen.emitter.Emitter#emitSkeleton()
-     */
-    public void emitSkeleton() throws CodeGenerationException {
-        try {
-            //get the interface
-            WSDLDescription wom = this.configuration.getWom();
-            int codegenStyle = this.configuration.getCodeGenerationStyle();
-            if (codegenStyle== XSLTConstants.CodegenStyle.INTERFACE){
-                emitSkeletonInterface(wom);
-            }else if (codegenStyle== XSLTConstants.CodegenStyle.BINDING){
-                emitSkeletonBinding(wom);
-            }else if (codegenStyle==XSLTConstants.CodegenStyle.AUTOMATIC){
-                emitSkeletonAutomatic(wom);
-            }else{
-                throw new Exception("Unknown code generation style!!! " + codegenStyle);
-            }
-
-            // Call the emit stub method to generate the client side too
-            // Do we need to enforce this here ?????
-            // Perhaps we can introduce a flag to determine this!
-            emitStub();
-
-        } catch (Exception e) {
-            throw new CodeGenerationException(e);
-        }
-    }
-    /**
-     * @see org.apache.axis2.wsdl.codegen.emitter.Emitter#emitStub()
-     */
-    public void emitStub() throws CodeGenerationException {
-        try {
-            //get the interface
-            WSDLDescription wom = this.configuration.getWom();
-            int codegenStyle = this.configuration.getCodeGenerationStyle();
-            if (codegenStyle== XSLTConstants.CodegenStyle.INTERFACE){
-                emitStubInterface(wom);
-            }else if (codegenStyle== XSLTConstants.CodegenStyle.BINDING){
-                emitStubBinding(wom);
-            }else if (codegenStyle==XSLTConstants.CodegenStyle.AUTOMATIC){
-                emitStubAutomatic(wom);
-            }else{
-                throw new Exception("Unknown code generation style!!! " + codegenStyle);
-            }
-
-        } catch (Exception e) {
-            throw new CodeGenerationException(e);
-        }
-    }
-
-    /**
-     * Emit the skeleton with inteface only
-     * @param wom
-     */
-    private void emitSkeletonInterface(WSDLDescription wom) throws Exception{
-
-        Map interfaces = wom.getWsdlInterfaces();
-
-        //loop through the wsdlInterfaces to generate the interface code
-        //theoretically the interface should be the base for the interfaces
-        Collection interfaceCollection =interfaces.values();
-        for (Iterator iterator = interfaceCollection.iterator(); iterator.hasNext();) {
-            WSDLInterface axisInteface = (WSDLInterface) iterator.next();
-            //write skeleton
-            writeSkeleton(axisInteface, null);
-            //write interface implementations
-            writeServiceXml(axisInteface, null);
-        }
-
-
-        log.info("Interface mode is selected.The following items will not be generated");
-        log.info("1. Message Receiver");
-    }
-
-    /**
-     * Emit the skelton with binding
-     * @param wom
-     */
-    private void emitSkeletonBinding(WSDLDescription wom) throws Exception{
-        Map bindings = wom.getBindings();
-        if (bindings==null || bindings.isEmpty()){
-            //asking for a code generation with a binding when a binding is
-            //not present should be the cause of an Exception !
-            throw new Exception("Cannot find a binding!!");
-
-        }else{
-            WSDLBinding axisBinding;
-            Collection bindingCollection = bindings.values();
-            for (Iterator iterator = bindingCollection.iterator(); iterator.hasNext();) {
-                axisBinding  =  (WSDLBinding)iterator.next();
-
-                //write skeleton
-                writeSkeleton(axisBinding.getBoundInterface(), axisBinding);
-                //write service xml
-                writeServiceXml(axisBinding.getBoundInterface(), axisBinding);
-                //write a MessageReceiver for this particular service.
-                writeMessageReceiver(axisBinding);
-            }
-        }
-    }
-
-    /**
-     * Skeleton emission - Automatic mode
-     * @param wom
-     */
-    private void emitSkeletonAutomatic(WSDLDescription wom) throws Exception{
-        Map bindings = wom.getBindings();
-        if (bindings==null || bindings.isEmpty()){
-            //No binding is not present.use the interface mode
-            emitSkeletonInterface(wom);
-        }else{
-            //use the binding mode
-            emitSkeletonBinding(wom);
-        }
-
-    }
-    /**
-     * Emits the stub code with the interfaces only
-     * @param wom
-     * @throws Exception
-     */
-    private void emitStubInterface(WSDLDescription wom) throws Exception{
-        Map interfaces = wom.getWsdlInterfaces();
-        //loop through the wsdlInterfaces to generate the interface code
-        Collection interfaceCollection =interfaces.values();
-        for (Iterator iterator = interfaceCollection.iterator(); iterator.hasNext();) {
-            //Write the interfaces
-            WSDLInterface axisInterface = (WSDLInterface) iterator.next();
-            writeInterface(axisInterface, null);
-            //write the call back handlers
-            writeCallBackHandlers(axisInterface, null);
-        }
-
-        //log the message stating that the binding dependent parts are not generated
-        log.info("Interface code generation was selected! The following items are not generated");
-        log.info("1. Stub");
-        log.info("2. CallbackHandler");
-        log.info("3. Test Classes");
-        log.info("4. Databinding Supporters");
-    }
-
-    /**
-     * Emit the stubcode with bindings
-     * @param wom
-     * @throws Exception
-     */
-    private void emitStubBinding(WSDLDescription wom) throws Exception{
-        Map bindings = wom.getBindings();
-        if (bindings==null || bindings.isEmpty()){
-            //asking for a code generation with a binding when a binding is
-            //not present should be the cause of an Exception !
-            throw new Exception("Cannot find a binding!!");
-        }else{
-            WSDLBinding axisBinding ;
-            WSDLService axisService = null;
-            Collection bindingCollection = bindings.values();
-            for (Iterator iterator = bindingCollection.iterator(); iterator.hasNext();) {
-
-                axisBinding  =  (WSDLBinding)iterator.next();
-                //Check the service
-                axisService = checkService(wom, axisService);
-                //write the inteface
-                //feed the binding information also
-                writeInterface(axisBinding.getBoundInterface(), axisBinding);
-                //write the call back handlers
-                writeCallBackHandlers(axisBinding.getBoundInterface(), axisBinding);
-                //write interface implementations
-                writeInterfaceImplementation(axisBinding, axisService);
-                //write the test classes
-                writeTestClasses(axisBinding);
-                //write the databinding supporters
-                writeDatabindingSupporters(axisBinding);
-                //write a dummy implementation call for the tests to run.
-                //writeTestSkeletonImpl(axisBinding);
-                //write a testservice.xml that will load the dummy skeleton impl for testing
-                //writeTestServiceXML(axisBinding);
-            }
-        }
-    }
-
-    /**
-     * emit the stubcode with the automatic mode. Look for the binding and if present
-     * emit the skeleton with the binding. Else go for the interface
-     * @param wom
-     */
-    private void emitStubAutomatic(WSDLDescription wom) throws Exception{
-        Map bindings = wom.getBindings();
-        if (bindings==null || bindings.isEmpty()){
-            //No binding is not present.use the interface mode
-            emitStubInterface(wom);
-        }else{
-            //use the binding mode
-            emitStubBinding(wom);
-        }
-    }
-
-    /**
-     * Check the service for compatibility. Am incompatible service consists of
-     * multiple services ATM
-     * @param wom
-     * @param axisService
-     * @return  the WSDLService object
-     */
-    private WSDLService checkService(WSDLDescription wom, WSDLService axisService) {
-        Map services = wom.getServices();
-        if (!services.isEmpty()) {
-            if (services.size() == 1) {
-                axisService = (WSDLService) services.values().toArray()[0];
-            } else {
-                throw new UnsupportedOperationException(
-                        "Single service WSDL files only");
-            }
-        }
-        return axisService;
-    }
-
-
-
-
-    /**
-     * Write the callback handlers
-     */
-    protected void writeCallBackHandlers(WSDLInterface wsdlInterface, WSDLBinding axisBinding) throws Exception {
-
-        if (configuration.isAsyncOn()) {
-            Document interfaceModel = createDOMDocumentForCallbackHandler(
-                    wsdlInterface, axisBinding);
-            CallbackHandlerWriter callbackWriter =
-                    new CallbackHandlerWriter(
-                            this.configuration.getOutputLocation(),
-                            this.configuration.getOutputLanguage());
-            writeClass(interfaceModel, callbackWriter);
-        }
-
-    }
-
-
-
-    /**
-     *
-     */
-    protected void writeTestClasses(WSDLBinding binding) throws Exception {
-
-        if (configuration.isWriteTestCase()) {
-            Document classModel = createDOMDocumentForTestCase(binding);
-            TestClassWriter callbackWriter =
-                    new TestClassWriter(this.configuration.getOutputLocation(),
-                            this.configuration.getOutputLanguage());
-            writeClass(classModel, callbackWriter);
-        }
-
-    }
-
-    /**
-     * Writes the interfaces
-     * @param axisInterface
-     * @param axisBinding
-     * @throws Exception
-     */
-    protected void writeInterface(WSDLInterface axisInterface, WSDLBinding axisBinding) throws Exception {
-        Document interfaceModel = createDOMDocumentForInterface(axisInterface, axisBinding);
-        InterfaceWriter interfaceWriter =
-                new InterfaceWriter(this.configuration.getOutputLocation(),
-                        this.configuration.getOutputLanguage());
-        writeClass(interfaceModel, interfaceWriter);
-    }
-
-
-    /**
-     * Writes the skeleton
-     *
-     * @param axisInteface
-     * @param axisBinding
-     * @throws Exception
-     */
-    protected void writeSkeleton(WSDLInterface axisInteface, WSDLBinding axisBinding) throws Exception {
-
-        //Note -  One can generate the skeleton using the interface XML
-        Document skeletonModel = createDOMDocumentForSkeleton(axisInteface, axisBinding);
-        ClassWriter skeletonWriter = new SkeletonWriter(
-                this.configuration.getOutputLocation(),
-                this.configuration.getOutputLanguage());
-        writeClass(skeletonModel, skeletonWriter);
-
-
-    }
-
-    /**
-     * Writes the skeleton
-     *
-     * @param axisBinding
-     * @throws Exception
-     */
-    protected void writeDatabindingSupporters(WSDLBinding axisBinding) throws Exception {
-        Collection col = axisBinding.getBoundInterface().getOperations()
-                .values();
-
-        String portTypeName = axisBinding.getBoundInterface().getName().getLocalPart();
-        for (Iterator iterator = col.iterator(); iterator.hasNext();) {
-            //Note -  there will be a supporter generated per method and will contain the methods to serilize and
-            //deserailize the relevant objects
-
-            WSDLOperation operation = (WSDLOperation) iterator.next();
-            WSDLBindingOperation bindingop = axisBinding.getBindingOperation(operation.getName());
-            Document databindingSupporterModel = createDOMDocumentforSerialization(
-                    operation,portTypeName, bindingop);
-            ClassWriter databindingSupportWriter = new DatabindingSupportClassWriter(
-                    this.configuration.getOutputLocation(),
-                    this.configuration.getOutputLanguage(),
-                    this.configuration.getDatabindingType());
-            writeClass(databindingSupporterModel, databindingSupportWriter);
-        }
-
-    }
-
-
-    /**
-     * Writes the skeleton
-     *
-     * @param axisInterface
-     * @param axisBinding
-     * @throws Exception
-     */
-    protected void writeServiceXml(WSDLInterface axisInterface, WSDLBinding axisBinding) throws Exception {
-        if (this.configuration.isGenerateDeployementDescriptor()) {
-            //Write the service xml in a folder with the
-            Document skeletonModel = createDOMDocumentForServiceXML(
-                    axisInterface, false, axisBinding);
-            ClassWriter serviceXmlWriter = new ServiceXMLWriter(
-                    this.configuration.getOutputLocation(),
-                    this.configuration.getOutputLanguage());
-            writeClass(skeletonModel, serviceXmlWriter);
-        }
-    }
-
-
-    /**
-     * Writes the implementations
-     *
-     * @param axisBinding
-     * @throws Exception
-     */
-    protected void writeInterfaceImplementation(WSDLBinding axisBinding,
-                                                WSDLService service) throws Exception {
-        Document interfaceImplModel = createDOMDocumentForInterfaceImplementation(
-                axisBinding, service);
-        InterfaceImplementationWriter writer =
-                new InterfaceImplementationWriter(
-                        this.configuration.getOutputLocation(),
-                        this.configuration.getOutputLanguage());
-        writeClass(interfaceImplModel, writer);
-    }
-
-    protected void writeMessageReceiver(WSDLBinding axisBinding) throws Exception {
-        if (configuration.isWriteMessageReceiver()) {
-            Document classModel = createDocumentForMessageReceiver(
-                    axisBinding);
-            MessageReceiverWriter writer =
-                    new MessageReceiverWriter(
-                            this.configuration.getOutputLocation(),
-                            this.configuration.getOutputLanguage());
-            writeClass(classModel, writer);
-        }
-    }
-
-
-
-    /**
-     * A resusable method for the implementation of interface and implementation writing
-     *
-     * @param model
-     * @param writer
-     * @throws IOException
-     * @throws Exception
-     */
-    protected void writeClass(Document model, ClassWriter writer) throws IOException,
-            Exception {
-        ByteArrayOutputStream memoryStream = new ByteArrayOutputStream();
-        // Use a Transformer for output
-        TransformerFactory tFactory =
-                TransformerFactory.newInstance();
-        Transformer transformer = tFactory.newTransformer();
-
-        DOMSource source = new DOMSource(model);
-        StreamResult result = new StreamResult(memoryStream);
-        transformer.transform(source, result);
-
-        writer.loadTemplate();
-        writer.createOutFile(
-                model.getDocumentElement().getAttribute("package"),
-                model.getDocumentElement().getAttribute("name"));
-        writer.writeOutFile(
-                new ByteArrayInputStream(memoryStream.toByteArray()));
-    }
-
-
-
-
-    private Document getEmptyDocument() {
-        try {
-            DocumentBuilder documentBuilder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
-            return documentBuilder.newDocument();
-        } catch (ParserConfigurationException e) {
-            throw new RuntimeException(e);
-        }
-    }
-
-    /**
-     * Generating the model for the callbacks
-     * @param boundInterface
-     * @param axisBinding
-     */
-    protected Document createDOMDocumentForCallbackHandler(
-            WSDLInterface boundInterface, WSDLBinding axisBinding) {
-        Document doc = getEmptyDocument();
-        Element rootElement = doc.createElement("callback");
-        addAttribute(doc,
-                "package",
-                configuration.getPackageName(),
-                rootElement);
-        addAttribute(doc,
-                "name",
-                boundInterface.getName().getLocalPart() +
-                        CALL_BACK_HANDLER_SUFFIX,
-                rootElement);
-        addAttribute(doc,
-                "namespace",
-                boundInterface.getName().getNamespaceURI(),
-                rootElement);
-
-        //TODO JAXRPC mapping support should be considered
-        this.loadOperations(boundInterface, doc, rootElement,axisBinding);
-        //this.loadOperations(boundInterface, doc, rootElement, "on", "Complete");
-
-        doc.appendChild(rootElement);
-        return doc;
-    }
-
-
-
-    /**
-     * Finds the input element for the xml document
-     *
-     * @param doc
-     * @param operation
-     * @param headerParameterQNameList
-     */
-    protected Element getInputElement(Document doc,
-                                      WSDLOperation operation, List headerParameterQNameList) {
-        Element inputElt = doc.createElement("input");
-        Element param = getInputParamElement(doc, operation);
-        if (param!=null){
-            inputElt.appendChild(param);
-        }
-        List parameterElementList = getParameterElementList(doc,headerParameterQNameList, "header");
-        for (int i = 0; i < parameterElementList.size(); i++) {
-            inputElt.appendChild((Element)parameterElementList.get(i));
-        }
-        return inputElt;
-    }
-
-
-
-
-
-    private List getParameterElementList(Document doc, List parameters, String location){
-        List parameterElementList = new ArrayList();
-        if (parameters!=null && !parameters.isEmpty()) {
-            int count = parameters.size();
-            for (int i = 0; i < count; i++) {
-                Element param = doc.createElement("param");
-                QName name = (QName) parameters.get(i);
-                addAttribute(doc,
-                        "name",
-                        this.mapper.getParameterName(name),
-                        param);
-                String typeMapping = this.mapper.getTypeMapping(name);
-                String typeMappingStr = typeMapping == null ? "" : typeMapping;
-                addAttribute(doc, "type", typeMappingStr, param);
-                addAttribute(doc,"location",location,param);
-                parameterElementList.add(param);
-            }
-
-        }
-        return parameterElementList;
-    }
-
-    /**
-     *
-     * @param doc
-     * @param operation
-     * @return the parameter element
-     */
-    private Element getInputParamElement(Document doc,
-                                         WSDLOperation operation) {
-        //todo this should go in a loop
-        Element param = doc.createElement("param");
-        MessageReference inputMessage = operation.getInputMessage();
-        if (inputMessage!=null){
-            addAttribute(doc,
-                    "name",
-                    this.mapper.getParameterName(inputMessage.getElement()),
-                    param);
-            String typeMapping = this.mapper.getTypeMapping(
-                    inputMessage.getElement());
-            String typeMappingStr = typeMapping == null ? "" : typeMapping;
-            addAttribute(doc, "type", typeMappingStr, param);
-            //add this as a body parameter
-            addAttribute(doc,"location","body",param);
-            Iterator iter = inputMessage.getExtensibilityAttributes().iterator();
-            while(iter.hasNext()){
-                WSDLExtensibilityAttribute att = (WSDLExtensibilityAttribute) iter.next();
-                addAttribute(doc, att.getKey().getLocalPart(), att.getValue().toString(), param);
-            }
-        }else{
-            param = null;
-        }
-
-
-
-        return param;
-    }
-
-    /**
-     * Finds the output element for the output element
-     *
-     * @param doc
-     * @param operation
-     * @param headerParameterQNameList
-     */
-    protected Element getOutputElement(Document doc,
-                                       WSDLOperation operation, List headerParameterQNameList) {
-        Element outputElt = doc.createElement("output");
-        Element param = getOutputParamElement(doc, operation);
-        if (param!=null){
-            outputElt.appendChild(param);
-        }
-        List outputElementList = getParameterElementList(doc,headerParameterQNameList, "header");
-        for (int i = 0; i < outputElementList.size(); i++) {
-            outputElt.appendChild((Element)outputElementList.get(i));
-        }
-        return outputElt;
-    }
-
-
-    private Element getOutputParamElement(Document doc,
-                                          WSDLOperation operation) {
-        Element param = doc.createElement("param");
-        MessageReference outputMessage = operation.getOutputMessage();
-        String typeMappingStr;
-        String parameterName;
-
-        if (outputMessage!=null){
-            parameterName =  this.mapper.getParameterName(
-                    outputMessage.getElement()) ;
-            String typeMapping = this.mapper.getTypeMapping(
-                    operation.getOutputMessage().getElement());
-            typeMappingStr = typeMapping == null ? "" : typeMapping;
-
-        }else{
-            parameterName = "" ;
-            typeMappingStr = "";
-        }
-        addAttribute(doc,"name",parameterName,param);
-        addAttribute(doc,"type", typeMappingStr, param);
-        //add this as a body parameter
-        addAttribute(doc,"location","body",param);
-
-        return param;
-    }
-
-
-
-
-    protected Document createDOMDocumentForServiceXML(WSDLInterface boundInterface,
-                                                      boolean forTesting, WSDLBinding axisBinding) {
-
-        Document doc = getEmptyDocument();
-        Element rootElement = doc.createElement("interface");
-        String localPart = boundInterface.getName().getLocalPart();
-        if (forTesting) {
-            addAttribute(doc,
-                    "package",
-                    configuration.getPackageName() + TEST_PACKAGE_NAME_SUFFIX,
-                    rootElement);
-            addAttribute(doc,
-                    "name",
-                    localPart + TEST_SERVICE_CLASS_NAME_SUFFIX,
-                    rootElement);
-            addAttribute(doc,
-                    "servicename",
-                    localPart + TEST_SERVICE_CLASS_NAME_SUFFIX,
-                    rootElement);
-        } else {
-            //put the package to be SERVICE_XML_OUTPUT_FOLDER_NAME.interface name
-            //this forces the service XML to be written in a folder of it's porttype
-            //name
-            addAttribute(doc,
-                    "package",
-                    SERVICE_XML_OUTPUT_FOLDER_NAME+localPart,
-                    rootElement);
-            addAttribute(doc,
-                    "classpackage",
-                    configuration.getPackageName(),
-                    rootElement);
-            addAttribute(doc,
-                    "name",
-                    localPart + SERVICE_CLASS_SUFFIX,
-                    rootElement);
-            addAttribute(doc, "servicename", localPart, rootElement);
-        }
-
-        addAttribute(doc,
-                "messagereceiver",
-                localPart + MESSAGE_RECEIVER_SUFFIX,
-                rootElement);
-        fillSyncAttributes(doc, rootElement);
-        loadOperations(boundInterface, doc, rootElement,axisBinding);
-        doc.appendChild(rootElement);
-
-        return doc;
-    }
-
-
-    protected Document createDocumentForMessageReceiver(WSDLBinding binding) {
-        WSDLInterface boundInterface = binding.getBoundInterface();
-
-        Document doc = getEmptyDocument();
-        Element rootElement = doc.createElement("interface");
-        addAttribute(doc,
-                "package",
-                configuration.getPackageName(),
-                rootElement);
-        String localPart = boundInterface.getName().getLocalPart();
-        addAttribute(doc,
-                "name",
-                localPart + MESSAGE_RECEIVER_SUFFIX,
-                rootElement);
-        addAttribute(doc,
-                "skeletonname",
-                localPart + SERVICE_CLASS_SUFFIX,
-                rootElement);
-        addAttribute(doc,
-                "basereceiver",
-                "org.apache.axis2.receivers.AbstractInOutSyncMessageReceiver",
-                rootElement);
-        addAttribute(doc,
-                "dbsupportpackage",
-                configuration.getPackageName() +
-                        DATABINDING_PACKAGE_NAME_SUFFIX,
-                rootElement);
-        fillSyncAttributes(doc, rootElement);
-        loadOperations(boundInterface, doc, rootElement, binding);
-        doc.appendChild(rootElement);
-
-
-        return doc;
-    }
-
-    /**
-     * Creates the DOM tree for the interface creation. Uses the interface
-     * @param wsdlInterface
-     * @param axisBinding
-     */
-    protected Document createDOMDocumentForInterface(WSDLInterface wsdlInterface, WSDLBinding axisBinding) {
-
-        Document doc = getEmptyDocument();
-        Element rootElement = doc.createElement("interface");
-        addAttribute(doc,
-                "package",
-                configuration.getPackageName(),
-                rootElement);
-        addAttribute(doc,
-                "name",
-                wsdlInterface.getName().getLocalPart(),
-                rootElement);
-        addAttribute(doc,
-                "callbackname",
-                wsdlInterface.getName().getLocalPart() +
-                        CALL_BACK_HANDLER_SUFFIX,
-                rootElement);
-        fillSyncAttributes(doc, rootElement);
-        loadOperations(wsdlInterface, doc, rootElement,axisBinding);
-        doc.appendChild(rootElement);
-        return doc;
-
-    }
-
-
-    /**
-     * Create the model for the skeleton
-     * @param boundInterface
-     * @param axisBinding
-     * @return documentModel for the skeleton
-     */
-    protected Document createDOMDocumentForSkeleton(WSDLInterface boundInterface, WSDLBinding axisBinding) {
-
-        Document doc = getEmptyDocument();
-        Element rootElement = doc.createElement("interface");
-        addAttribute(doc,
-                "package",
-                configuration.getPackageName(),
-                rootElement);
-        addAttribute(doc,
-                "name",
-                boundInterface.getName().getLocalPart() + SERVICE_CLASS_SUFFIX,
-                rootElement);
-        addAttribute(doc,
-                "callbackname",
-                boundInterface.getName().getLocalPart() +
-                        CALL_BACK_HANDLER_SUFFIX,
-                rootElement);
-        fillSyncAttributes(doc, rootElement);
-        loadOperations(boundInterface, doc, rootElement,axisBinding);
-        doc.appendChild(rootElement);
-        return doc;
-
-    }
-
-    private void fillSyncAttributes(Document doc, Element rootElement) {
-        addAttribute(doc,
-                "isAsync",
-                this.configuration.isAsyncOn() ? "1" : "0",
-                rootElement);
-        addAttribute(doc,
-                "isSync",
-                this.configuration.isSyncOn() ? "1" : "0",
-                rootElement);
-    }
-
-    /**
-     * Loads operations based on the interface
-     * @param boundInterface
-     * @param doc
-     * @param rootElement
-     */
-    private void loadOperations(WSDLInterface boundInterface,
-                                Document doc,
-                                Element rootElement) {
-        loadOperations(boundInterface, doc, rootElement, null);
-    }
-
-
-    /**
-     *
-     * @param boundInterface
-     * @param doc
-     * @param rootElement
-     * @param binding
-     */
-    private void loadOperations(WSDLInterface boundInterface,
-                                Document doc,
-                                Element rootElement,
-                                WSDLBinding binding) {
-
-        Collection col = boundInterface.getOperations().values();
-        String portTypeName = boundInterface.getName().getLocalPart();
-
-        List soapHeaderInputParameterList = new ArrayList();
-        List soapHeaderOutputParameterList = new ArrayList();
-        Element methodElement ;
-        WSDLOperation operation ;
-
-        for (Iterator iterator = col.iterator(); iterator.hasNext();) {
-            operation = (WSDLOperation) iterator.next();
-            methodElement = doc.createElement("method");
-            String localPart = operation.getName().getLocalPart();
-            addAttribute(doc, "name", localPart, methodElement);
-            addAttribute(doc,
-                    "namespace",
-                    operation.getName().getNamespaceURI(),
-                    methodElement);
-            addAttribute(doc, "style", operation.getStyle(), methodElement);
-            addAttribute(doc,
-                    "dbsupportname",
-                    portTypeName + localPart + DATABINDING_SUPPORTER_NAME_SUFFIX,
-                    methodElement);
-
-            addAttribute(doc,
-                    "mep",
-                    operation.getMessageExchangePattern(),
-                    methodElement);
-
-            if (null != binding) {
-                WSDLBindingOperation bindingOperation =
-                        binding.getBindingOperation(operation.getName());
-                addSOAPAction(doc, methodElement, bindingOperation);
-                addHeaderOperations(soapHeaderInputParameterList,bindingOperation,true);
-                addHeaderOperations(soapHeaderOutputParameterList,bindingOperation,false);
-            }
-
-            methodElement.appendChild(getInputElement(doc, operation, soapHeaderInputParameterList));
-            methodElement.appendChild(getOutputElement(doc, operation, soapHeaderOutputParameterList));
-
-            rootElement.appendChild(methodElement);
-
-        }
-    }
-
-    private void addHeaderOperations(List soapHeaderParameterQNameList, WSDLBindingOperation bindingOperation,boolean input) {
-        Iterator extIterator;
-        if (input){
-            extIterator = bindingOperation.getInput().getExtensibilityElements().iterator();
-        }else{
-            extIterator = bindingOperation.getOutput().getExtensibilityElements().iterator();
-        }
-
-        while (extIterator.hasNext()) {
-            WSDLExtensibilityElement element = (WSDLExtensibilityElement) extIterator.next();
-            if (element.getType().equals(ExtensionConstants.SOAP_11_HEADER)) {
-                SOAPHeader header = (SOAPHeader)element;
-                soapHeaderParameterQNameList.add(header.getElement());
-            }
-        }
-    }
-
-
-    private void addSOAPAction(Document doc,
-                               Element rootElement,
-                               WSDLBindingOperation binding) {
-        Iterator extIterator = binding.getExtensibilityElements().iterator();
-        boolean actionAdded = false;
-        while (extIterator.hasNext()) {
-            WSDLExtensibilityElement element = (WSDLExtensibilityElement) extIterator.next();
-            if (ExtensionConstants.SOAP_11_OPERATION.equals(element.getType())) {
-                addAttribute(doc,
-                        "soapaction",
-                        ((SOAPOperation) element).getSoapAction(),
-                        rootElement);
-                actionAdded = true;
-            }
-        }
-
-        if (!actionAdded) {
-            addAttribute(doc, "soapaction", "", rootElement);
-        }
-    }
-
-    protected Document createDOMDocumentForTestCase(WSDLBinding binding) {
-        WSDLInterface boundInterface = binding.getBoundInterface();
-
-        Document doc = getEmptyDocument();
-        Element rootElement = doc.createElement("class");
-        addAttribute(doc,
-                "package",
-                configuration.getPackageName(),
-                rootElement);
-        String localPart = boundInterface.getName().getLocalPart();
-        addAttribute(doc, "name", localPart + TEST_SUFFIX, rootElement);
-        addAttribute(doc,
-                "namespace",
-                boundInterface.getName().getNamespaceURI(),
-                rootElement);
-        addAttribute(doc, "interfaceName", localPart, rootElement);
-        addAttribute(doc,
-                "callbackname",
-                localPart + CALL_BACK_HANDLER_SUFFIX,
-                rootElement);
-        addAttribute(doc, "stubname", localPart + STUB_SUFFIX, rootElement);
-        addAttribute(doc,
-                "dbsupportpackage",
-                configuration.getPackageName() +
-                        DATABINDING_PACKAGE_NAME_SUFFIX,
-                rootElement);
-        fillSyncAttributes(doc, rootElement);
-        loadOperations(boundInterface, doc, rootElement);
-        doc.appendChild(rootElement);
-        return doc;
-
-    }
-
-
-
-    protected Document createDOMDocumentforSerialization(
-            WSDLOperation operation, String portTypeName, WSDLBindingOperation bindingOperation) {
-
-        Document doc = getEmptyDocument();
-        Element rootElement = doc.createElement("class");
-        addAttribute(doc,
-                "package",
-                configuration.getPackageName() +
-                        DATABINDING_PACKAGE_NAME_SUFFIX,
-                rootElement);
-        String localPart = operation.getName().getLocalPart();
-        addAttribute(doc,
-                "name",
-                portTypeName + localPart + DATABINDING_SUPPORTER_NAME_SUFFIX,
-                rootElement);
-        addAttribute(doc, "methodname", localPart, rootElement);
-        addAttribute(doc,
-                "namespace",
-                operation.getName().getNamespaceURI(),
-                rootElement);
-
-        //Add the parameters to a map with their type as the key
-        //this step is needed to remove repetitions
-        Map parameterMap = new HashMap();
-        Element inputParamElement = getInputParamElement(doc, operation);
-        if (inputParamElement!=null){
-            parameterMap.put(inputParamElement.getAttribute("type"),inputParamElement);
-        }
-
-        Element outputParamElement = getOutputParamElement(doc, operation);
-        if (outputParamElement!=null){
-            parameterMap.put(outputParamElement.getAttribute("type"),outputParamElement);
-        }
-        Element newChild;
-
-        if (bindingOperation!=null) {
-            List headerParameterQNameList= new ArrayList();
-            addHeaderOperations(headerParameterQNameList,bindingOperation,true);
-            List parameterElementList = getParameterElementList(doc,headerParameterQNameList, "header");
-
-            for (int i = 0; i < parameterElementList.size(); i++) {
-                newChild = (Element) parameterElementList.get(i);
-                parameterMap.put(newChild.getAttribute("type"),newChild);
-            }
-
-            headerParameterQNameList.clear();
-            parameterElementList.clear();
-            addHeaderOperations(headerParameterQNameList,bindingOperation,false);
-            parameterElementList = getParameterElementList(doc,headerParameterQNameList, "header");
-            for (int i = 0; i < parameterElementList.size(); i++) {
-                newChild = (Element) parameterElementList.get(i);
-                parameterMap.put(newChild.getAttribute("type"),newChild);
-            }
-        }
-
-        //add the names of the elements that have base 64 content
-        //if the base64 name list is missing then this whole step is skipped
-        rootElement.appendChild(getBase64Elements(doc));
-
-        //Now run through the parameters and add them to the root element
-        Collection parameters = parameterMap.values();
-        for (Iterator iterator = parameters.iterator(); iterator.hasNext();) {
-            rootElement.appendChild((Element)iterator.next());
-        }
-
-        doc.appendChild(rootElement);
-        ///////////////////////////////////////////////////
-        //System.out.println("rootElement = " + rootElement);
-        ///////////////////////////////////////////////////
-        return doc;
-    }
-
-    /**
-     * Get the base64 types. If not available this will be empty!!!
-     * @param doc
-     * @return element
-     */
-    private Element getBase64Elements(Document doc){
-        Element root = doc.createElement("base64Elements");
-        Element elt;
-        QName qname;
-        //this is a list of QNames
-        List list = (List)configuration.getProperties().get(XSLTConstants.BASE_64_PROPERTY_KEY);
-        if (list!=null && !list.isEmpty()){
-            int count = list.size();
-            for (int i = 0; i < count; i++) {
-                qname = (QName)list.get(i);
-                elt = doc.createElement("name") ;
-                addAttribute(doc,"ns-url",qname.getNamespaceURI(),elt);
-                addAttribute(doc,"localName",qname.getLocalPart(),elt);
-                root.appendChild(elt);
-            }
-        }
-
-        return root;
-    }
-    /**
-     * Creates the DOM tree for implementations
-     *
-     * @param binding
-     * @param service
-     */
-    protected Document createDOMDocumentForInterfaceImplementation(
-            WSDLBinding binding, WSDLService service) {
-        WSDLInterface boundInterface = binding.getBoundInterface();
-        HashMap endpoints = new HashMap(1);
-        if (service!=null){
-            endpoints = service.getEndpoints();
-        }
-
-        Document doc = getEmptyDocument();
-        Element rootElement = doc.createElement("class");
-        addAttribute(doc,
-                "package",
-                configuration.getPackageName(),
-                rootElement);
-        String localPart = boundInterface.getName().getLocalPart();
-        addAttribute(doc, "name", localPart + STUB_SUFFIX, rootElement);
-        addAttribute(doc, "servicename", localPart, rootElement);
-        addAttribute(doc,
-                "namespace",
-                boundInterface.getName().getNamespaceURI(),
-                rootElement);
-        addAttribute(doc, "interfaceName", localPart, rootElement);
-        addAttribute(doc,
-                "callbackname",
-                localPart + CALL_BACK_HANDLER_SUFFIX,
-                rootElement);
-        addAttribute(doc,
-                "dbsupportpackage",
-                configuration.getPackageName() +
-                        DATABINDING_PACKAGE_NAME_SUFFIX,
-                rootElement);
-        addAttribute(doc,
-                "dbsupportpackage",
-                configuration.getPackageName() +
-                        DATABINDING_PACKAGE_NAME_SUFFIX,
-                rootElement);
-        //add SOAP version
-        addSoapVersion(binding,doc,rootElement);
-        //add the end point
-        addEndpoints(doc, rootElement, endpoints);
-        //set the sync/async attributes
-        fillSyncAttributes(doc, rootElement);
-        //load the operations
-        loadOperations(boundInterface, doc, rootElement, binding);
-        doc.appendChild(rootElement);
-
-        return doc;
-
-
-    }
-
-    protected void addSoapVersion(WSDLBinding binding,Document doc,Element rootElement){
-        //loop through the extensibility elements to get to the bindings element
-        List extensibilityElementsList = binding.getExtensibilityElements();
-        int count = extensibilityElementsList.size();
-        for (int i = 0; i < count; i++) {
-            WSDLExtensibilityElement extElement =  (WSDLExtensibilityElement)extensibilityElementsList.get(i);
-            if (ExtensionConstants.SOAP_11_BINDING.equals(extElement.getType())){
-                addAttribute(doc,"soap-version", "1.1",rootElement);
-                break;
-            }else if (ExtensionConstants.SOAP_12_BINDING.equals(extElement.getType())){
-                addAttribute(doc,"soap-version", "1.2",rootElement);
-                break;
-            }
-        }
-    }
-    /**
-     * Add the endpoint to the document
-     * @param doc
-     * @param rootElement
-     * @param endpointMap
-     */
-
-    protected void addEndpoints(Document doc,
-                                Element rootElement,
-                                HashMap endpointMap) {
-        Object[] endpoints = endpointMap.values().toArray();
-        WSDLEndpoint endpoint;
-        Element endpointElement;
-        Text text;
-        for (int i = 0; i < endpoints.length; i++) {
-            endpoint = (WSDLEndpoint) endpoints[i];
-            endpointElement = doc.createElement("endpoint");
-            org.apache.wsdl.extensions.SOAPAddress address = null;
-            Iterator iterator = endpoint.getExtensibilityElements().iterator();
-            while (iterator.hasNext()) {
-                WSDLExtensibilityElement element = (WSDLExtensibilityElement) iterator.next();
-                if (ExtensionConstants.SOAP_11_ADDRESS.equals(element.getType()) ||
-                        ExtensionConstants.SOAP_12_ADDRESS.equals(element.getType())){
-                    address = (org.apache.wsdl.extensions.SOAPAddress) element;
-                }
-            }
-            text = doc.createTextNode(address!=null?address.getLocationURI():"");     //todo How to get the end point address
-            endpointElement.appendChild(text);
-            rootElement.appendChild(endpointElement);
-        }
-
-    }
-
-    /**
-     * Utility method to add an attribute to a given element
-     * @param document
-     * @param AttribName
-     * @param attribValue
-     * @param element
-     */
-    protected void addAttribute(Document document,
-                                String AttribName,
-                                String attribValue,
-                                Element element) {
-        Attr attribute = document.createAttribute(AttribName);
-        attribute.setValue(attribValue);
-        element.setAttributeNode(attribute);
-    }
-
-    /**
-     *
-     * @param word
-     * @return character removed string
-     */
-    protected String removeUnsuitableCharacters(String word) {
-        return word.replaceAll("\\W", "_");
-    }
-
-
-}
-
+package org.apache.axis2.wsdl.codegen.emitter;
+
+import org.apache.axis2.wsdl.codegen.CodeGenConfiguration;
+import org.apache.axis2.wsdl.codegen.CodeGenerationException;
+import org.apache.axis2.wsdl.codegen.XSLTConstants;
+import org.apache.axis2.wsdl.codegen.writer.*;
+import org.apache.axis2.wsdl.databinding.TypeMapper;
+import org.apache.wsdl.*;
+import org.apache.wsdl.extensions.ExtensionConstants;
+import org.apache.wsdl.extensions.SOAPOperation;
+import org.apache.wsdl.extensions.SOAPHeader;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.w3c.dom.Attr;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.w3c.dom.Text;
+
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.DocumentBuilderFactory;
+import javax.xml.parsers.ParserConfigurationException;
+import javax.xml.transform.Transformer;
+import javax.xml.transform.TransformerFactory;
+import javax.xml.transform.dom.DOMSource;
+import javax.xml.transform.stream.StreamResult;
+import javax.xml.namespace.QName;
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.*;
+
+/*
+* 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.
+*
+* Abstract Client emitter
+* the XML will look like the following
+* todo Add references to relevant schemas !
+*/
+
+
+public abstract class MultiLanguageClientEmitter implements Emitter {
+
+    private Log log = LogFactory.getLog(getClass());
+
+    /*
+    *  Important! These constants are used in some places in the templates. Care should
+    *  be taken when changing them
+    */
+    private static final String CALL_BACK_HANDLER_SUFFIX = "CallbackHandler";
+    private static final String STUB_SUFFIX = "Stub";
+    private static final String TEST_SUFFIX = "Test";
+    private static final String LOCAL_TEST_SUFFIX = "LocalTest";
+    private static final String SERVICE_CLASS_SUFFIX = "Skeleton";
+    private static final String TEST_PACKAGE_NAME_SUFFIX = ".test";
+    private static final String DATABINDING_SUPPORTER_NAME_SUFFIX = "DatabindingSupporter";
+    private static final String DATABINDING_PACKAGE_NAME_SUFFIX = ".databinding";
+    private static final String TEST_SERVICE_CLASS_NAME_SUFFIX = "SkeletonTest";
+    private static final String MESSAGE_RECEIVER_SUFFIX = "MessageReceiver";
+    private static final String SERVICE_XML_OUTPUT_FOLDER_NAME = "service_descriptors.";
+
+
+    protected InputStream xsltStream = null;
+    protected CodeGenConfiguration configuration;
+    protected TypeMapper mapper;
+
+
+    /**
+     * Sets the mapper
+     *
+     * @param mapper
+     * @see org.apache.axis2.wsdl.databinding.TypeMapper
+     */
+    public void setMapper(TypeMapper mapper) {
+        this.mapper = mapper;
+    }
+
+    /**
+     * Sets the code generator configuration
+     *
+     * @param configuration
+     */
+    public void setCodeGenConfiguration(CodeGenConfiguration configuration) {
+        this.configuration = configuration;
+    }
+    /**
+     * @see org.apache.axis2.wsdl.codegen.emitter.Emitter#emitSkeleton()
+     */
+    public void emitSkeleton() throws CodeGenerationException {
+        try {
+            //get the interface
+            WSDLDescription wom = this.configuration.getWom();
+            int codegenStyle = this.configuration.getCodeGenerationStyle();
+            if (codegenStyle== XSLTConstants.CodegenStyle.INTERFACE){
+                emitSkeletonInterface(wom);
+            }else if (codegenStyle== XSLTConstants.CodegenStyle.BINDING){
+                emitSkeletonBinding(wom);
+            }else if (codegenStyle==XSLTConstants.CodegenStyle.AUTOMATIC){
+                emitSkeletonAutomatic(wom);
+            }else{
+                throw new Exception("Unknown code generation style!!! " + codegenStyle);
+            }
+
+            // Call the emit stub method to generate the client side too
+            // Do we need to enforce this here ?????
+            // Perhaps we can introduce a flag to determine this!
+            emitStub();
+
+        } catch (Exception e) {
+            throw new CodeGenerationException(e);
+        }
+    }
+    /**
+     * @see org.apache.axis2.wsdl.codegen.emitter.Emitter#emitStub()
+     */
+    public void emitStub() throws CodeGenerationException {
+        try {
+            //get the interface
+            WSDLDescription wom = this.configuration.getWom();
+            int codegenStyle = this.configuration.getCodeGenerationStyle();
+            if (codegenStyle== XSLTConstants.CodegenStyle.INTERFACE){
+                emitStubInterface(wom);
+            }else if (codegenStyle== XSLTConstants.CodegenStyle.BINDING){
+                emitStubBinding(wom);
+            }else if (codegenStyle==XSLTConstants.CodegenStyle.AUTOMATIC){
+                emitStubAutomatic(wom);
+            }else{
+                throw new Exception("Unknown code generation style!!! " + codegenStyle);
+            }
+
+        } catch (Exception e) {
+            throw new CodeGenerationException(e);
+        }
+    }
+
+    /**
+     * Emit the skeleton with inteface only
+     * @param wom
+     */
+    private void emitSkeletonInterface(WSDLDescription wom) throws Exception{
+
+        Map interfaces = wom.getWsdlInterfaces();
+
+        //loop through the wsdlInterfaces to generate the interface code
+        //theoretically the interface should be the base for the interfaces
+        Collection interfaceCollection =interfaces.values();
+        for (Iterator iterator = interfaceCollection.iterator(); iterator.hasNext();) {
+            WSDLInterface axisInteface = (WSDLInterface) iterator.next();
+            //write skeleton
+            writeSkeleton(axisInteface, null);
+            //write interface implementations
+            writeServiceXml(axisInteface, null);
+        }
+
+
+        log.info("Interface mode is selected.The following items will not be generated");
+        log.info("1. Message Receiver");
+    }
+
+    /**
+     * Emit the skelton with binding
+     * @param wom
+     */
+    private void emitSkeletonBinding(WSDLDescription wom) throws Exception{
+        Map bindings = wom.getBindings();
+        if (bindings==null || bindings.isEmpty()){
+            //asking for a code generation with a binding when a binding is
+            //not present should be the cause of an Exception !
+            throw new Exception("Cannot find a binding!!");
+
+        }else{
+            WSDLBinding axisBinding;
+            Collection bindingCollection = bindings.values();
+            for (Iterator iterator = bindingCollection.iterator(); iterator.hasNext();) {
+                axisBinding  =  (WSDLBinding)iterator.next();
+
+                //write skeleton
+                writeSkeleton(axisBinding.getBoundInterface(), axisBinding);
+                //write service xml
+                writeServiceXml(axisBinding.getBoundInterface(), axisBinding);
+                //write a MessageReceiver for this particular service.
+                writeMessageReceiver(axisBinding);
+            }
+        }
+    }
+
+    /**
+     * Skeleton emission - Automatic mode
+     * @param wom
+     */
+    private void emitSkeletonAutomatic(WSDLDescription wom) throws Exception{
+        Map bindings = wom.getBindings();
+        if (bindings==null || bindings.isEmpty()){
+            //No binding is not present.use the interface mode
+            emitSkeletonInterface(wom);
+        }else{
+            //use the binding mode
+            emitSkeletonBinding(wom);
+        }
+
+    }
+    /**
+     * Emits the stub code with the interfaces only
+     * @param wom
+     * @throws Exception
+     */
+    private void emitStubInterface(WSDLDescription wom) throws Exception{
+        Map interfaces = wom.getWsdlInterfaces();
+        //loop through the wsdlInterfaces to generate the interface code
+        Collection interfaceCollection =interfaces.values();
+        for (Iterator iterator = interfaceCollection.iterator(); iterator.hasNext();) {
+            //Write the interfaces
+            WSDLInterface axisInterface = (WSDLInterface) iterator.next();
+            writeInterface(axisInterface, null);
+            //write the call back handlers
+            writeCallBackHandlers(axisInterface, null);
+        }
+
+        //log the message stating that the binding dependent parts are not generated
+        log.info("Interface code generation was selected! The following items are not generated");
+        log.info("1. Stub");
+        log.info("2. CallbackHandler");
+        log.info("3. Test Classes");
+        log.info("4. Databinding Supporters");
+    }
+
+    /**
+     * Emit the stubcode with bindings
+     * @param wom
+     * @throws Exception
+     */
+    private void emitStubBinding(WSDLDescription wom) throws Exception{
+        Map bindings = wom.getBindings();
+        if (bindings==null || bindings.isEmpty()){
+            //asking for a code generation with a binding when a binding is
+            //not present should be the cause of an Exception !
+            throw new Exception("Cannot find a binding!!");
+        }else{
+            WSDLBinding axisBinding ;
+            WSDLService axisService = null;
+            Collection bindingCollection = bindings.values();
+            for (Iterator iterator = bindingCollection.iterator(); iterator.hasNext();) {
+
+                axisBinding  =  (WSDLBinding)iterator.next();
+                //Check the service
+                axisService = checkService(wom, axisService);
+                //write the inteface
+                //feed the binding information also
+                writeInterface(axisBinding.getBoundInterface(), axisBinding);
+                //write the call back handlers
+                writeCallBackHandlers(axisBinding.getBoundInterface(), axisBinding);
+                //write interface implementations
+                writeInterfaceImplementation(axisBinding, axisService);
+                //write the test classes
+                writeTestClasses(axisBinding);
+                //write the databinding supporters
+                writeDatabindingSupporters(axisBinding);
+                //write a dummy implementation call for the tests to run.
+                //writeTestSkeletonImpl(axisBinding);
+                //write a testservice.xml that will load the dummy skeleton impl for testing
+                //writeTestServiceXML(axisBinding);
+            }
+        }
+    }
+
+    /**
+     * emit the stubcode with the automatic mode. Look for the binding and if present
+     * emit the skeleton with the binding. Else go for the interface
+     * @param wom
+     */
+    private void emitStubAutomatic(WSDLDescription wom) throws Exception{
+        Map bindings = wom.getBindings();
+        if (bindings==null || bindings.isEmpty()){
+            //No binding is not present.use the interface mode
+            emitStubInterface(wom);
+        }else{
+            //use the binding mode
+            emitStubBinding(wom);
+        }
+    }
+
+    /**
+     * Check the service for compatibility. Am incompatible service consists of
+     * multiple services ATM
+     * @param wom
+     * @param axisService
+     * @return  the WSDLService object
+     */
+    private WSDLService checkService(WSDLDescription wom, WSDLService axisService) {
+        Map services = wom.getServices();
+        if (!services.isEmpty()) {
+            if (services.size() == 1) {
+                axisService = (WSDLService) services.values().toArray()[0];
+            } else {
+                throw new UnsupportedOperationException(
+                        "Single service WSDL files only");
+            }
+        }
+        return axisService;
+    }
+
+
+
+
+    /**
+     * Write the callback handlers
+     */
+    protected void writeCallBackHandlers(WSDLInterface wsdlInterface, WSDLBinding axisBinding) throws Exception {
+
+        if (configuration.isAsyncOn()) {
+            Document interfaceModel = createDOMDocumentForCallbackHandler(
+                    wsdlInterface, axisBinding);
+            CallbackHandlerWriter callbackWriter =
+                    new CallbackHandlerWriter(
+                            this.configuration.getOutputLocation(),
+                            this.configuration.getOutputLanguage());
+            writeClass(interfaceModel, callbackWriter);
+        }
+
+    }
+
+
+
+    /**
+     *
+     */
+    protected void writeTestClasses(WSDLBinding binding) throws Exception {
+
+        if (configuration.isWriteTestCase()) {
+            Document classModel = createDOMDocumentForTestCase(binding);
+            TestClassWriter callbackWriter =
+                    new TestClassWriter(this.configuration.getOutputLocation(),
+                            this.configuration.getOutputLanguage());
+            writeClass(classModel, callbackWriter);
+        }
+
+    }
+
+    /**
+     * Writes the interfaces
+     * @param axisInterface
+     * @param axisBinding
+     * @throws Exception
+     */
+    protected void writeInterface(WSDLInterface axisInterface, WSDLBinding axisBinding) throws Exception {
+        Document interfaceModel = createDOMDocumentForInterface(axisInterface, axisBinding);
+        InterfaceWriter interfaceWriter =
+                new InterfaceWriter(this.configuration.getOutputLocation(),
+                        this.configuration.getOutputLanguage());
+        writeClass(interfaceModel, interfaceWriter);
+    }
+
+
+    /**
+     * Writes the skeleton
+     *
+     * @param axisInteface
+     * @param axisBinding
+     * @throws Exception
+     */
+    protected void writeSkeleton(WSDLInterface axisInteface, WSDLBinding axisBinding) throws Exception {
+
+        //Note -  One can generate the skeleton using the interface XML
+        Document skeletonModel = createDOMDocumentForSkeleton(axisInteface, axisBinding);
+        ClassWriter skeletonWriter = new SkeletonWriter(
+                this.configuration.getOutputLocation(),
+                this.configuration.getOutputLanguage());
+        writeClass(skeletonModel, skeletonWriter);
+
+
+    }
+
+    /**
+     * Writes the skeleton
+     *
+     * @param axisBinding
+     * @throws Exception
+     */
+    protected void writeDatabindingSupporters(WSDLBinding axisBinding) throws Exception {
+        Collection col = axisBinding.getBoundInterface().getOperations()
+                .values();
+
+        String portTypeName = axisBinding.getBoundInterface().getName().getLocalPart();
+        for (Iterator iterator = col.iterator(); iterator.hasNext();) {
+            //Note -  there will be a supporter generated per method and will contain the methods to serilize and
+            //deserailize the relevant objects
+
+            WSDLOperation operation = (WSDLOperation) iterator.next();
+            WSDLBindingOperation bindingop = axisBinding.getBindingOperation(operation.getName());
+            Document databindingSupporterModel = createDOMDocumentforSerialization(
+                    operation,portTypeName, bindingop);
+            ClassWriter databindingSupportWriter = new DatabindingSupportClassWriter(
+                    this.configuration.getOutputLocation(),
+                    this.configuration.getOutputLanguage(),
+                    this.configuration.getDatabindingType());
+            writeClass(databindingSupporterModel, databindingSupportWriter);
+        }
+
+    }
+
+
+    /**
+     * Writes the skeleton
+     *
+     * @param axisInterface
+     * @param axisBinding
+     * @throws Exception
+     */
+    protected void writeServiceXml(WSDLInterface axisInterface, WSDLBinding axisBinding) throws Exception {
+        if (this.configuration.isGenerateDeployementDescriptor()) {
+            //Write the service xml in a folder with the
+            Document skeletonModel = createDOMDocumentForServiceXML(
+                    axisInterface, false, axisBinding);
+            ClassWriter serviceXmlWriter = new ServiceXMLWriter(
+                    this.configuration.getOutputLocation(),
+                    this.configuration.getOutputLanguage());
+            writeClass(skeletonModel, serviceXmlWriter);
+        }
+    }
+
+
+    /**
+     * Writes the implementations
+     *
+     * @param axisBinding
+     * @throws Exception
+     */
+    protected void writeInterfaceImplementation(WSDLBinding axisBinding,
+                                                WSDLService service) throws Exception {
+        Document interfaceImplModel = createDOMDocumentForInterfaceImplementation(
+                axisBinding, service);
+        InterfaceImplementationWriter writer =
+                new InterfaceImplementationWriter(
+                        this.configuration.getOutputLocation(),
+                        this.configuration.getOutputLanguage());
+        writeClass(interfaceImplModel, writer);
+    }
+
+    protected void writeMessageReceiver(WSDLBinding axisBinding) throws Exception {
+        if (configuration.isWriteMessageReceiver()) {
+            Document classModel = createDocumentForMessageReceiver(
+                    axisBinding);
+            MessageReceiverWriter writer =
+                    new MessageReceiverWriter(
+                            this.configuration.getOutputLocation(),
+                            this.configuration.getOutputLanguage());
+            writeClass(classModel, writer);
+        }
+    }
+
+
+
+    /**
+     * A resusable method for the implementation of interface and implementation writing
+     *
+     * @param model
+     * @param writer
+     * @throws IOException
+     * @throws Exception
+     */
+    protected void writeClass(Document model, ClassWriter writer) throws IOException,
+            Exception {
+        ByteArrayOutputStream memoryStream = new ByteArrayOutputStream();
+        // Use a Transformer for output
+        TransformerFactory tFactory =
+                TransformerFactory.newInstance();
+        Transformer transformer = tFactory.newTransformer();
+
+        DOMSource source = new DOMSource(model);
+        StreamResult result = new StreamResult(memoryStream);
+        transformer.transform(source, result);
+
+        writer.loadTemplate();
+        writer.createOutFile(
+                model.getDocumentElement().getAttribute("package"),
+                model.getDocumentElement().getAttribute("name"));
+        writer.writeOutFile(
+                new ByteArrayInputStream(memoryStream.toByteArray()));
+    }
+
+
+
+
+    private Document getEmptyDocument() {
+        try {
+            DocumentBuilder documentBuilder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
+            return documentBuilder.newDocument();
+        } catch (ParserConfigurationException e) {
+            throw new RuntimeException(e);
+        }
+    }
+
+    /**
+     * Generating the model for the callbacks
+     * @param boundInterface
+     * @param axisBinding
+     */
+    protected Document createDOMDocumentForCallbackHandler(
+            WSDLInterface boundInterface, WSDLBinding axisBinding) {
+        Document doc = getEmptyDocument();
+        Element rootElement = doc.createElement("callback");
+        addAttribute(doc,
+                "package",
+                configuration.getPackageName(),
+                rootElement);
+        addAttribute(doc,
+                "name",
+                boundInterface.getName().getLocalPart() +
+                        CALL_BACK_HANDLER_SUFFIX,
+                rootElement);
+        addAttribute(doc,
+                "namespace",
+                boundInterface.getName().getNamespaceURI(),
+                rootElement);
+
+        //TODO JAXRPC mapping support should be considered
+        this.loadOperations(boundInterface, doc, rootElement,axisBinding);
+        //this.loadOperations(boundInterface, doc, rootElement, "on", "Complete");
+
+        doc.appendChild(rootElement);
+        return doc;
+    }
+
+
+
+    /**
+     * Finds the input element for the xml document
+     *
+     * @param doc
+     * @param operation
+     * @param headerParameterQNameList
+     */
+    protected Element getInputElement(Document doc,
+                                      WSDLOperation operation, List headerParameterQNameList) {
+        Element inputElt = doc.createElement("input");
+        Element param = getInputParamElement(doc, operation);
+        if (param!=null){
+            inputElt.appendChild(param);
+        }
+        List parameterElementList = getParameterElementList(doc,headerParameterQNameList, "header");
+        for (int i = 0; i < parameterElementList.size(); i++) {
+            inputElt.appendChild((Element)parameterElementList.get(i));
+        }
+        return inputElt;
+    }
+
+
+
+
+
+    private List getParameterElementList(Document doc, List parameters, String location){
+        List parameterElementList = new ArrayList();
+        if (parameters!=null && !parameters.isEmpty()) {
+            int count = parameters.size();
+            for (int i = 0; i < count; i++) {
+                Element param = doc.createElement("param");
+                QName name = (QName) parameters.get(i);
+                addAttribute(doc,
+                        "name",
+                        this.mapper.getParameterName(name),
+                        param);
+                String typeMapping = this.mapper.getTypeMapping(name);
+                String typeMappingStr = typeMapping == null ? "" : typeMapping;
+                addAttribute(doc, "type", typeMappingStr, param);
+                addAttribute(doc,"location",location,param);
+                parameterElementList.add(param);
+            }
+
+        }
+        return parameterElementList;
+    }
+
+    /**
+     *
+     * @param doc
+     * @param operation
+     * @return the parameter element
+     */
+    private Element getInputParamElement(Document doc,
+                                         WSDLOperation operation) {
+        //todo this should go in a loop
+        Element param = doc.createElement("param");
+        MessageReference inputMessage = operation.getInputMessage();
+        if (inputMessage!=null){
+            addAttribute(doc,
+                    "name",
+                    this.mapper.getParameterName(inputMessage.getElement()),
+                    param);
+            String typeMapping = this.mapper.getTypeMapping(
+                    inputMessage.getElement());
+            String typeMappingStr = typeMapping == null ? "" : typeMapping;
+            addAttribute(doc, "type", typeMappingStr, param);
+            //add this as a body parameter
+            addAttribute(doc,"location","body",param);
+            Iterator iter = inputMessage.getExtensibilityAttributes().iterator();
+            while(iter.hasNext()){
+                WSDLExtensibilityAttribute att = (WSDLExtensibilityAttribute) iter.next();
+                addAttribute(doc, att.getKey().getLocalPart(), att.getValue().toString(), param);
+            }
+        }else{
+            param = null;
+        }
+
+
+
+        return param;
+    }
+
+    /**
+     * Finds the output element for the output element
+     *
+     * @param doc
+     * @param operation
+     * @param headerParameterQNameList
+     */
+    protected Element getOutputElement(Document doc,
+                                       WSDLOperation operation, List headerParameterQNameList) {
+        Element outputElt = doc.createElement("output");
+        Element param = getOutputParamElement(doc, operation);
+        if (param!=null){
+            outputElt.appendChild(param);
+        }
+        List outputElementList = getParameterElementList(doc,headerParameterQNameList, "header");
+        for (int i = 0; i < outputElementList.size(); i++) {
+            outputElt.appendChild((Element)outputElementList.get(i));
+        }
+        return outputElt;
+    }
+
+
+    private Element getOutputParamElement(Document doc,
+                                          WSDLOperation operation) {
+        Element param = doc.createElement("param");
+        MessageReference outputMessage = operation.getOutputMessage();
+        String typeMappingStr;
+        String parameterName;
+
+        if (outputMessage!=null){
+            parameterName =  this.mapper.getParameterName(
+                    outputMessage.getElement()) ;
+            String typeMapping = this.mapper.getTypeMapping(
+                    operation.getOutputMessage().getElement());
+            typeMappingStr = typeMapping == null ? "" : typeMapping;
+
+        }else{
+            parameterName = "" ;
+            typeMappingStr = "";
+        }
+        addAttribute(doc,"name",parameterName,param);
+        addAttribute(doc,"type", typeMappingStr, param);
+        //add this as a body parameter
+        addAttribute(doc,"location","body",param);
+
+        return param;
+    }
+
+
+
+
+    protected Document createDOMDocumentForServiceXML(WSDLInterface boundInterface,
+                                                      boolean forTesting, WSDLBinding axisBinding) {
+
+        Document doc = getEmptyDocument();
+        Element rootElement = doc.createElement("interface");
+        String localPart = boundInterface.getName().getLocalPart();
+        if (forTesting) {
+            addAttribute(doc,
+                    "package",
+                    configuration.getPackageName() + TEST_PACKAGE_NAME_SUFFIX,
+                    rootElement);
+            addAttribute(doc,
+                    "name",
+                    localPart + TEST_SERVICE_CLASS_NAME_SUFFIX,
+                    rootElement);
+            addAttribute(doc,
+                    "servicename",
+                    localPart + TEST_SERVICE_CLASS_NAME_SUFFIX,
+                    rootElement);
+        } else {
+            //put the package to be SERVICE_XML_OUTPUT_FOLDER_NAME.interface name
+            //this forces the service XML to be written in a folder of it's porttype
+            //name
+            addAttribute(doc,
+                    "package",
+                    SERVICE_XML_OUTPUT_FOLDER_NAME+localPart,
+                    rootElement);
+            addAttribute(doc,
+                    "classpackage",
+                    configuration.getPackageName(),
+                    rootElement);
+            addAttribute(doc,
+                    "name",
+                    localPart + SERVICE_CLASS_SUFFIX,
+                    rootElement);
+            addAttribute(doc, "servicename", localPart, rootElement);
+        }
+
+        addAttribute(doc,
+                "messagereceiver",
+                localPart + MESSAGE_RECEIVER_SUFFIX,
+                rootElement);
+        fillSyncAttributes(doc, rootElement);
+        loadOperations(boundInterface, doc, rootElement,axisBinding);
+        doc.appendChild(rootElement);
+
+        return doc;
+    }
+
+
+    protected Document createDocumentForMessageReceiver(WSDLBinding binding) {
+        WSDLInterface boundInterface = binding.getBoundInterface();
+
+        Document doc = getEmptyDocument();
+        Element rootElement = doc.createElement("interface");
+        addAttribute(doc,
+                "package",
+                configuration.getPackageName(),
+                rootElement);
+        String localPart = boundInterface.getName().getLocalPart();
+        addAttribute(doc,
+                "name",
+                localPart + MESSAGE_RECEIVER_SUFFIX,
+                rootElement);
+        addAttribute(doc,
+                "skeletonname",
+                localPart + SERVICE_CLASS_SUFFIX,
+                rootElement);
+        addAttribute(doc,
+                "basereceiver",
+                "org.apache.axis2.receivers.AbstractInOutSyncMessageReceiver",
+                rootElement);
+        addAttribute(doc,
+                "dbsupportpackage",
+                configuration.getPackageName() +
+                        DATABINDING_PACKAGE_NAME_SUFFIX,
+                rootElement);
+        fillSyncAttributes(doc, rootElement);
+        loadOperations(boundInterface, doc, rootElement, binding);
+        doc.appendChild(rootElement);
+
+
+        return doc;
+    }
+
+    /**
+     * Creates the DOM tree for the interface creation. Uses the interface
+     * @param wsdlInterface
+     * @param axisBinding
+     */
+    protected Document createDOMDocumentForInterface(WSDLInterface wsdlInterface, WSDLBinding axisBinding) {
+
+        Document doc = getEmptyDocument();
+        Element rootElement = doc.createElement("interface");
+        addAttribute(doc,
+                "package",
+                configuration.getPackageName(),
+                rootElement);
+        addAttribute(doc,
+                "name",
+                wsdlInterface.getName().getLocalPart(),
+                rootElement);
+        addAttribute(doc,
+                "callbackname",
+                wsdlInterface.getName().getLocalPart() +
+                        CALL_BACK_HANDLER_SUFFIX,
+                rootElement);
+        fillSyncAttributes(doc, rootElement);
+        loadOperations(wsdlInterface, doc, rootElement,axisBinding);
+        doc.appendChild(rootElement);
+        return doc;
+
+    }
+
+
+    /**
+     * Create the model for the skeleton
+     * @param boundInterface
+     * @param axisBinding
+     * @return documentModel for the skeleton
+     */
+    protected Document createDOMDocumentForSkeleton(WSDLInterface boundInterface, WSDLBinding axisBinding) {
+
+        Document doc = getEmptyDocument();
+        Element rootElement = doc.createElement("interface");
+        addAttribute(doc,
+                "package",
+                configuration.getPackageName(),
+                rootElement);
+        addAttribute(doc,
+                "name",
+                boundInterface.getName().getLocalPart() + SERVICE_CLASS_SUFFIX,
+                rootElement);
+        addAttribute(doc,
+                "callbackname",
+                boundInterface.getName().getLocalPart() +
+                        CALL_BACK_HANDLER_SUFFIX,
+                rootElement);
+        fillSyncAttributes(doc, rootElement);
+        loadOperations(boundInterface, doc, rootElement,axisBinding);
+        doc.appendChild(rootElement);
+        return doc;
+
+    }
+
+    private void fillSyncAttributes(Document doc, Element rootElement) {
+        addAttribute(doc,
+                "isAsync",
+                this.configuration.isAsyncOn() ? "1" : "0",
+                rootElement);
+        addAttribute(doc,
+                "isSync",
+                this.configuration.isSyncOn() ? "1" : "0",
+                rootElement);
+    }
+
+    /**
+     * Loads operations based on the interface
+     * @param boundInterface
+     * @param doc
+     * @param rootElement
+     */
+    private void loadOperations(WSDLInterface boundInterface,
+                                Document doc,
+                                Element rootElement) {
+        loadOperations(boundInterface, doc, rootElement, null);
+    }
+
+
+    /**
+     *
+     * @param boundInterface
+     * @param doc
+     * @param rootElement
+     * @param binding
+     */
+    private void loadOperations(WSDLInterface boundInterface,
+                                Document doc,
+                                Element rootElement,
+                                WSDLBinding binding) {
+
+        Collection col = boundInterface.getOperations().values();
+        String portTypeName = boundInterface.getName().getLocalPart();
+
+        List soapHeaderInputParameterList = new ArrayList();
+        List soapHeaderOutputParameterList = new ArrayList();
+        Element methodElement ;
+        WSDLOperation operation ;
+
+        for (Iterator iterator = col.iterator(); iterator.hasNext();) {
+            operation = (WSDLOperation) iterator.next();
+            methodElement = doc.createElement("method");
+            String localPart = operation.getName().getLocalPart();
+            addAttribute(doc, "name", localPart, methodElement);
+            addAttribute(doc,
+                    "namespace",
+                    operation.getName().getNamespaceURI(),
+                    methodElement);
+            addAttribute(doc, "style", operation.getStyle(), methodElement);
+            addAttribute(doc,
+                    "dbsupportname",
+                    portTypeName + localPart + DATABINDING_SUPPORTER_NAME_SUFFIX,
+                    methodElement);
+
+            addAttribute(doc,
+                    "mep",
+                    operation.getMessageExchangePattern(),
+                    methodElement);
+
+            if (null != binding) {
+                WSDLBindingOperation bindingOperation =
+                        binding.getBindingOperation(operation.getName());
+                addSOAPAction(doc, methodElement, bindingOperation);
+                addHeaderOperations(soapHeaderInputParameterList,bindingOperation,true);
+                addHeaderOperations(soapHeaderOutputParameterList,bindingOperation,false);
+            }
+
+            methodElement.appendChild(getInputElement(doc, operation, soapHeaderInputParameterList));
+            methodElement.appendChild(getOutputElement(doc, operation, soapHeaderOutputParameterList));
+
+            rootElement.appendChild(methodElement);
+
+        }
+    }
+
+    private void addHeaderOperations(List soapHeaderParameterQNameList, WSDLBindingOperation bindingOperation,boolean input) {
+        Iterator extIterator;
+        if (input){
+            extIterator = bindingOperation.getInput().getExtensibilityElements().iterator();
+        }else{
+            extIterator = bindingOperation.getOutput().getExtensibilityElements().iterator();
+        }
+
+        while (extIterator.hasNext()) {
+            WSDLExtensibilityElement element = (WSDLExtensibilityElement) extIterator.next();
+            if (element.getType().equals(ExtensionConstants.SOAP_11_HEADER)) {
+                SOAPHeader header = (SOAPHeader)element;
+                soapHeaderParameterQNameList.add(header.getElement());
+            }
+        }
+    }
+
+
+    private void addSOAPAction(Document doc,
+                               Element rootElement,
+                               WSDLBindingOperation binding) {
+        Iterator extIterator = binding.getExtensibilityElements().iterator();
+        boolean actionAdded = false;
+        while (extIterator.hasNext()) {
+            WSDLExtensibilityElement element = (WSDLExtensibilityElement) extIterator.next();
+            if (ExtensionConstants.SOAP_11_OPERATION.equals(element.getType())) {
+                addAttribute(doc,
+                        "soapaction",
+                        ((SOAPOperation) element).getSoapAction(),
+                        rootElement);
+                actionAdded = true;
+            }
+        }
+
+        if (!actionAdded) {
+            addAttribute(doc, "soapaction", "", rootElement);
+        }
+    }
+
+    protected Document createDOMDocumentForTestCase(WSDLBinding binding) {
+        WSDLInterface boundInterface = binding.getBoundInterface();
+
+        Document doc = getEmptyDocument();
+        Element rootElement = doc.createElement("class");
+        addAttribute(doc,
+                "package",
+                configuration.getPackageName(),
+                rootElement);
+        String localPart = boundInterface.getName().getLocalPart();
+        addAttribute(doc, "name", localPart + TEST_SUFFIX, rootElement);
+        addAttribute(doc,
+                "namespace",
+                boundInterface.getName().getNamespaceURI(),
+                rootElement);
+        addAttribute(doc, "interfaceName", localPart, rootElement);
+        addAttribute(doc,
+                "callbackname",
+                localPart + CALL_BACK_HANDLER_SUFFIX,
+                rootElement);
+        addAttribute(doc, "stubname", localPart + STUB_SUFFIX, rootElement);
+        addAttribute(doc,
+                "dbsupportpackage",
+                configuration.getPackageName() +
+                        DATABINDING_PACKAGE_NAME_SUFFIX,
+                rootElement);
+        fillSyncAttributes(doc, rootElement);
+        loadOperations(boundInterface, doc, rootElement);
+        doc.appendChild(rootElement);
+        return doc;
+
+    }
+
+
+
+    protected Document createDOMDocumentforSerialization(
+            WSDLOperation operation, String portTypeName, WSDLBindingOperation bindingOperation) {
+
+        Document doc = getEmptyDocument();
+        Element rootElement = doc.createElement("class");
+        addAttribute(doc,
+                "package",
+                configuration.getPackageName() +
+                        DATABINDING_PACKAGE_NAME_SUFFIX,
+                rootElement);
+        String localPart = operation.getName().getLocalPart();
+        addAttribute(doc,
+                "name",
+                portTypeName + localPart + DATABINDING_SUPPORTER_NAME_SUFFIX,
+                rootElement);
+        addAttribute(doc, "methodname", localPart, rootElement);
+        addAttribute(doc,
+                "namespace",
+                operation.getName().getNamespaceURI(),
+                rootElement);
+
+        //Add the parameters to a map with their type as the key
+        //this step is needed to remove repetitions
+        Map parameterMap = new HashMap();
+        Element inputParamElement = getInputParamElement(doc, operation);
+        if (inputParamElement!=null){
+            parameterMap.put(inputParamElement.getAttribute("type"),inputParamElement);
+        }
+
+        Element outputParamElement = getOutputParamElement(doc, operation);
+        if (outputParamElement!=null){
+            parameterMap.put(outputParamElement.getAttribute("type"),outputParamElement);
+        }
+        Element newChild;
+
+        if (bindingOperation!=null) {
+            List headerParameterQNameList= new ArrayList();
+            addHeaderOperations(headerParameterQNameList,bindingOperation,true);
+            List parameterElementList = getParameterElementList(doc,headerParameterQNameList, "header");
+
+            for (int i = 0; i < parameterElementList.size(); i++) {
+                newChild = (Element) parameterElementList.get(i);
+                parameterMap.put(newChild.getAttribute("type"),newChild);
+            }
+
+            headerParameterQNameList.clear();
+            parameterElementList.clear();
+            addHeaderOperations(headerParameterQNameList,bindingOperation,false);
+            parameterElementList = getParameterElementList(doc,headerParameterQNameList, "header");
+            for (int i = 0; i < parameterElementList.size(); i++) {
+                newChild = (Element) parameterElementList.get(i);
+                parameterMap.put(newChild.getAttribute("type"),newChild);
+            }
+        }
+
+        //add the names of the elements that have base 64 content
+        //if the base64 name list is missing then this whole step is skipped
+        rootElement.appendChild(getBase64Elements(doc));
+
+        //Now run through the parameters and add them to the root element
+        Collection parameters = parameterMap.values();
+        for (Iterator iterator = parameters.iterator(); iterator.hasNext();) {
+            rootElement.appendChild((Element)iterator.next());
+        }
+
+        doc.appendChild(rootElement);
+        ///////////////////////////////////////////////////
+        //System.out.println("rootElement = " + rootElement);
+        ///////////////////////////////////////////////////
+        return doc;
+    }
+
+    /**
+     * Get the base64 types. If not available this will be empty!!!
+     * @param doc
+     * @return element
+     */
+    private Element getBase64Elements(Document doc){
+        Element root = doc.createElement("base64Elements");
+        Element elt;
+        QName qname;
+        //this is a list of QNames
+        List list = (List)configuration.getProperties().get(XSLTConstants.BASE_64_PROPERTY_KEY);
+        if (list!=null && !list.isEmpty()){
+            int count = list.size();
+            for (int i = 0; i < count; i++) {
+                qname = (QName)list.get(i);
+                elt = doc.createElement("name") ;
+                addAttribute(doc,"ns-url",qname.getNamespaceURI(),elt);
+                addAttribute(doc,"localName",qname.getLocalPart(),elt);
+                root.appendChild(elt);
+            }
+        }
+
+        return root;
+    }
+    /**
+     * Creates the DOM tree for implementations
+     *
+     * @param binding
+     * @param service
+     */
+    protected Document createDOMDocumentForInterfaceImplementation(
+            WSDLBinding binding, WSDLService service) {
+        WSDLInterface boundInterface = binding.getBoundInterface();
+        HashMap endpoints = new HashMap(1);

[... 124 lines stripped ...]