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 [106/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/builder/wsdl4j/WSDLPump.java
URL: http://svn.apache.org/viewcvs/webservices/axis2/trunk/java/modules/wsdl/src/org/apache/axis2/wsdl/builder/wsdl4j/WSDLPump.java?rev=289289&r1=289288&r2=289289&view=diff
==============================================================================
--- webservices/axis2/trunk/java/modules/wsdl/src/org/apache/axis2/wsdl/builder/wsdl4j/WSDLPump.java (original)
+++ webservices/axis2/trunk/java/modules/wsdl/src/org/apache/axis2/wsdl/builder/wsdl4j/WSDLPump.java Thu Sep 15 11:52:11 2005
@@ -1,881 +1,881 @@
-/*
-* Copyright 2001-2004 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.axis2.wsdl.builder.wsdl4j;
-
-import com.ibm.wsdl.extensions.soap.SOAPConstants;
-import org.apache.axis2.wsdl.builder.WSDLComponentFactory;
-import org.apache.wsdl.*;
-import org.apache.wsdl.extensions.ExtensionConstants;
-import org.apache.wsdl.extensions.ExtensionFactory;
-import org.apache.wsdl.extensions.DefaultExtensibilityElement;
-import org.apache.wsdl.impl.WSDLProcessingException;
-import org.w3c.dom.Document;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
-
-import javax.wsdl.*;
-import javax.wsdl.extensions.ExtensibilityElement;
-import javax.wsdl.extensions.UnknownExtensibilityElement;
-import javax.wsdl.extensions.schema.Schema;
-import javax.wsdl.extensions.schema.SchemaImport;
-import javax.wsdl.extensions.soap.*;
-import javax.xml.namespace.QName;
-import javax.xml.parsers.DocumentBuilder;
-import javax.xml.parsers.DocumentBuilderFactory;
-import javax.xml.parsers.ParserConfigurationException;
-import java.util.*;
-
-/**
- * @author chathura@opensource.lk
- */
-public class WSDLPump {
-
-    private static final String XSD_TYPE = "type";
-    private static final String XSD_SEQUENCE = "sequence";
-    private static final String XSD_NAME = "name";
-    private static final String XSD_COMPLEXTYPE = "complexType";
-    private static final String XSD_TARGETNAMESPACE = "targetNamespace";
-    private static final String XMLNS_AXIS2WRAPPED = "xmlns:axis2wrapped";
-    private static final String NAMESPACE_XMLSCHEMA = "http://www.w3.org/2001/XMLSchema";
-    private static final String XSD_ELEMENT = "element";
-    private static final String BOUND_INTERFACE_NAME = "BoundInterface";
-
-    private WSDLDescription womDefinition;
-
-    private Definition wsdl4jParsedDefinition;
-
-    private WSDLComponentFactory wsdlComponentFactory;
-
-
-    private List resolvedMultipartMessageList = new LinkedList();
-
-    public WSDLPump(WSDLDescription womDefinition,
-                    Definition wsdl4jParsedDefinition) {
-        this(womDefinition, wsdl4jParsedDefinition, womDefinition);
-    }
-
-    public WSDLPump(WSDLDescription womDefinition,
-                    Definition wsdl4jParsedDefinition,
-                    WSDLComponentFactory wsdlComponentFactory) {
-        this.womDefinition = womDefinition;
-        this.wsdl4jParsedDefinition = wsdl4jParsedDefinition;
-        this.wsdlComponentFactory = wsdlComponentFactory;
-    }
-
-    public void pump() {
-        if (null != this.wsdl4jParsedDefinition && null != this.womDefinition) {
-            this.populateDefinition(this.womDefinition,
-                    this.wsdl4jParsedDefinition);
-        } else {
-            throw new WSDLProcessingException("Properties not set properly");
-        }
-
-    }
-
-    private void populateDefinition(WSDLDescription wsdlDefinition,
-                                    Definition wsdl4JDefinition) {
-        //Go through the WSDL4J Definition and pump it to the WOM
-        wsdlDefinition.setWSDL1DefinitionName(wsdl4JDefinition.getQName());
-        wsdlDefinition
-                .setTargetNameSpace(wsdl4JDefinition.getTargetNamespace());
-        wsdlDefinition.setNamespaces(wsdl4JDefinition.getNamespaces());
-        this.copyExtensibleElements(
-                wsdl4JDefinition.getExtensibilityElements(), wsdlDefinition, null);
-
-        /////////////////////////////////////////////////////////////////////
-        // Order of the following items shouldn't be changed unless you //
-        // really know what you are doing. Reason being the components that //
-        // are copied(pumped) towards the end depend on the components that //
-        // has already being pumped. Following Lists some of the //
-        // dependencies. //
-        //1) The Binding refers to the Interface //
-        //2) The Endpoint refers to the Bindings //
-        // .... //
-        //																   	//
-        //////////////////////////////////////////////////////////////////////
-
-        //////////////////(1)First Copy the Types/////////////////////////////
-        //Types may get changed inside the Operation pumping.
-
-        Types wsdl4jTypes = wsdl4JDefinition.getTypes();
-        WSDLTypes wsdlTypes = null;
-        if (null != wsdl4jTypes) {
-            wsdlTypes = this.wsdlComponentFactory.createTypes();
-            this.copyExtensibleElements(wsdl4jTypes.getExtensibilityElements(),
-                    wsdlTypes, null);
-            this.womDefinition.setTypes(wsdlTypes);
-        }
-
-
-        // There can be types that are imported. Check the imports and
-        // These schemas are needed for code generation
-
-        Map wsdlImports = wsdl4JDefinition.getImports();
-
-        if (null != wsdlImports && !wsdlImports.isEmpty()){
-            Collection importsCollection = wsdlImports.values();
-            for (Iterator iterator = importsCollection.iterator(); iterator.hasNext();) {
-                Vector values = (Vector)iterator.next();
-                for (int i = 0; i < values.size(); i++) {
-                    Import wsdlImport = (Import)values.elementAt(i);
-
-                    if (wsdlImport.getDefinition()!=null){
-                        Definition importedDef = wsdlImport.getDefinition();
-
-                        if (wsdlTypes==null){
-                            wsdlTypes = this.wsdlComponentFactory.createTypes();
-                        }
-                        //add the imported types
-                        this.copyExtensibleElements(importedDef.getTypes().
-                                getExtensibilityElements(),
-                                wsdlTypes, null);
-                        this.womDefinition.setTypes(wsdlTypes);
-                    }
-                }
-
-            }
-        }
-        ///////////////////(2)Copy the Interfaces///////////////////////////
-        //copy the Interfaces: Get the PortTypes from WSDL4J parse OM and
-        // copy it to the
-        //WOM's WSDLInterface Components
-
-        Iterator portTypeIterator = wsdl4JDefinition.getPortTypes().values()
-                .iterator();
-        WSDLInterface wsdlInterface;
-        PortType portType;
-        while (portTypeIterator.hasNext()) {
-            wsdlInterface = this.wsdlComponentFactory.createInterface();
-            portType = (PortType) portTypeIterator.next();
-            this.populateInterfaces(wsdlInterface, portType);
-            this.copyExtensibilityAttribute(portType.getExtensionAttributes(),
-                    wsdlInterface);
-            wsdlDefinition.addInterface(wsdlInterface);
-        }
-
-        //////////////////(3)Copy the Bindings///////////////////////
-        //pump the Bindings: Get the Bindings map from WSDL4J and create a new
-        // map of WSDLBinding elements. At this point we need to do some extra work since there
-        //can be header parameters
-
-        Iterator bindingIterator = wsdl4JDefinition.getBindings().values()
-                .iterator();
-        WSDLBinding wsdlBinding;
-        Binding wsdl4jBinding;
-        while (bindingIterator.hasNext()) {
-            wsdlBinding = this.wsdlComponentFactory.createBinding();
-            wsdl4jBinding = (Binding) bindingIterator.next();
-            this.populateBindings(wsdlBinding, wsdl4jBinding, wsdl4JDefinition);
-            this.copyExtensibleElements(
-                    wsdl4jBinding.getExtensibilityElements(),
-                    wsdlBinding, null);
-            wsdlDefinition.addBinding(wsdlBinding);
-
-        }
-
-        ///////////////////(4)Copy the Services///////////////////////////////
-
-        Iterator serviceIterator = wsdl4JDefinition.getServices().values()
-                .iterator();
-        WSDLService wsdlService;
-        Service wsdl4jService;
-        while (serviceIterator.hasNext()) {
-            wsdlService = this.wsdlComponentFactory.createService();
-            wsdl4jService = (Service) serviceIterator.next();
-            this.populateServices(wsdlService, wsdl4jService);
-            this.copyExtensibleElements(
-                    wsdl4jService.getExtensibilityElements(),
-                    wsdlService, null);
-            wsdlDefinition.addService(wsdlService);
-        }
-
-    }
-
-    //////////////////////////////////////////////////////////////////////////////
-    ////////////////////////// Top level Components Copying
-    // ////////////////////
-
-    /**
-     * Simply Copy information.
-     *
-     * @param wsdlInterface
-     * @param wsdl4jPortType
-     */
-    //FIXME Evaluate a way of injecting features and priperties with a general
-    // formatted input
-    private void populateInterfaces(WSDLInterface wsdlInterface,
-                                    PortType wsdl4jPortType) {
-
-        //Copy the Attrebute information items
-        //Copied with the Same QName so it will require no Query in Binding
-        //Coping.
-        wsdlInterface.setName(wsdl4jPortType.getQName());
-        Iterator wsdl4JOperationsIterator =
-                wsdl4jPortType.getOperations().iterator();
-        WSDLOperation wsdloperation;
-        Operation wsdl4jOperation;
-        while (wsdl4JOperationsIterator.hasNext()) {
-            wsdloperation = this.wsdlComponentFactory.createOperation();
-            wsdl4jOperation = (Operation) wsdl4JOperationsIterator.next();
-            this.populateOperations(wsdloperation,
-                    wsdl4jOperation,
-                    wsdl4jPortType.getQName().getNamespaceURI());
-            this.copyExtensibleElements(
-                    wsdl4jOperation.getExtensibilityElements(), wsdloperation, null);
-            wsdlInterface.setOperation(wsdloperation);
-        }
-    }
-
-    /**
-     * Pre Condition: The Interface Components must be copied by now.
-     */
-    private void populateBindings(WSDLBinding wsdlBinding,
-                                  Binding wsdl4JBinding, Definition wsdl4jDefinition) {
-        //Copy attributes
-        wsdlBinding.setName(wsdl4JBinding.getQName());
-        QName interfaceName = wsdl4JBinding.getPortType().getQName();
-        WSDLInterface wsdlInterface =
-                this.womDefinition.getInterface(interfaceName);
-
-        //FIXME Do We need this eventually???
-        if (null == wsdlInterface)
-            throw new WSDLProcessingException("Interface/PortType not found for the Binding :"
-                    + wsdlBinding.getName());
-        wsdlBinding.setBoundInterface(wsdlInterface);
-        Iterator bindingoperationsIterator =
-                wsdl4JBinding.getBindingOperations().iterator();
-        WSDLBindingOperation wsdlBindingOperation;
-        BindingOperation wsdl4jBindingOperation;
-        while (bindingoperationsIterator.hasNext()) {
-            wsdlBindingOperation =
-                    this.wsdlComponentFactory.createWSDLBindingOperation();
-            wsdl4jBindingOperation =
-                    (BindingOperation) bindingoperationsIterator.next();
-            this.populateBindingOperation(wsdlBindingOperation,
-                    wsdl4jBindingOperation,
-                    wsdl4JBinding.getQName().getNamespaceURI(), wsdl4jDefinition);
-            wsdlBindingOperation.setOperation(
-                    wsdlInterface.getOperation(
-                            wsdl4jBindingOperation.getOperation().getName()));
-            this.copyExtensibleElements(
-                    wsdl4jBindingOperation.getExtensibilityElements(),
-                    wsdlBindingOperation, wsdl4jDefinition);
-            wsdlBinding.addBindingOperation(wsdlBindingOperation);
-        }
-
-    }
-
-    public void populateServices(WSDLService wsdlService,
-                                 Service wsdl4jService) {
-        wsdlService.setName(wsdl4jService.getQName());
-        Iterator wsdl4jportsIterator =
-                wsdl4jService.getPorts().values().iterator();
-        wsdlService.setServiceInterface(this.getBoundInterface(wsdlService));
-        WSDLEndpoint wsdlEndpoint;
-        Port wsdl4jPort;
-        while (wsdl4jportsIterator.hasNext()) {
-            wsdlEndpoint = this.wsdlComponentFactory.createEndpoint();
-            wsdl4jPort = (Port) wsdl4jportsIterator.next();
-            this.populatePorts(wsdlEndpoint,
-                    wsdl4jPort,
-                    wsdl4jService.getQName().getNamespaceURI());
-            this.copyExtensibleElements(wsdl4jPort.getExtensibilityElements(),
-                    wsdlEndpoint, null);
-            wsdlService.setEndpoint(wsdlEndpoint);
-        }
-
-    }
-
-    private void pushSchemaElement(Schema originalSchema,Stack stack){
-        if (originalSchema==null){
-            return;
-        }
-        stack.push(originalSchema);
-        Map map = originalSchema.getImports();
-        Collection values;
-        if (map!=null && map.size()>0){
-            values = map.values();
-            for (Iterator iterator = values.iterator(); iterator.hasNext();) {
-                //recursively add the schema's
-                Vector v = (Vector)iterator.next();
-                for (int i = 0; i < v.size(); i++) {
-                    pushSchemaElement(((SchemaImport)v.get(i)).getReferencedSchema(),stack);
-                }
-
-            }
-        }
-    }
-
-    /////////////////////////////////////////////////////////////////////////////
-    //////////////////////////// Internal Component Copying ///////////////////
-    public void populateOperations(WSDLOperation wsdlOperation,
-                                   Operation wsdl4jOperation,
-                                   String nameSpaceOfTheOperation) {
-        //Copy Name Attrebute
-        wsdlOperation.setName(new QName(nameSpaceOfTheOperation,
-                wsdl4jOperation.getName()));
-
-        //This code make no attempt to make use of the special xs:Token
-        //defined in the WSDL 2.0. eg like #any, #none
-        // Create the Input Message and add
-        Input wsdl4jInputMessage = wsdl4jOperation.getInput();
-
-        if (null != wsdl4jInputMessage) {
-            MessageReference wsdlInputMessage = this.wsdlComponentFactory
-                    .createMessageReference();
-            wsdlInputMessage.setDirection(
-                    WSDLConstants.WSDL_MESSAGE_DIRECTION_IN);
-            wsdlInputMessage.setMessageLabel(
-                    WSDLConstants.MESSAGE_LABEL_IN_VALUE);
-
-            Message message = wsdl4jInputMessage.getMessage();
-            if (null != message) {
-                wsdlInputMessage.setElement(
-                        this.generateReferenceQname(message));
-                this.copyExtensibleElements(
-                        (message).getExtensibilityElements(),
-                        wsdlInputMessage, null);
-            }
-            this.copyExtensibilityAttribute(
-                    wsdl4jInputMessage.getExtensionAttributes(),
-                    wsdlInputMessage);
-            wsdlOperation.setInputMessage(wsdlInputMessage);
-        }
-
-        //Create an output message and add
-        Output wsdl4jOutputMessage = wsdl4jOperation.getOutput();
-        if (null != wsdl4jOutputMessage) {
-            MessageReference wsdlOutputMessage =
-                    this.wsdlComponentFactory.createMessageReference();
-            wsdlOutputMessage.setDirection(
-                    WSDLConstants.WSDL_MESSAGE_DIRECTION_OUT);
-            wsdlOutputMessage.setMessageLabel(
-                    WSDLConstants.MESSAGE_LABEL_OUT_VALUE);
-
-            Message outputMessage = wsdl4jOutputMessage.getMessage();
-            if (null != outputMessage) {
-                wsdlOutputMessage.setElement(
-                        this.generateReferenceQname(outputMessage));
-                this.copyExtensibleElements(
-                        (outputMessage).getExtensibilityElements(),
-                        wsdlOutputMessage, null);
-            }
-            this.copyExtensibilityAttribute(
-                    wsdl4jOutputMessage.getExtensionAttributes(),
-                    wsdlOutputMessage);
-            wsdlOperation.setOutputMessage(wsdlOutputMessage);
-        }
-
-        Map faults = wsdl4jOperation.getFaults();
-        Iterator faultKeyIterator = faults.keySet().iterator();
-        WSDLFaultReference faultReference = null;
-
-        while (faultKeyIterator.hasNext()) {
-
-            Fault fault = (Fault) faults.get(faultKeyIterator.next());
-            faultReference = wsdlComponentFactory.createFaultReference();
-            faultReference.setDirection(
-                    WSDLConstants.WSDL_MESSAGE_DIRECTION_OUT);
-            Message faultMessage = fault.getMessage();
-            if (null != faultMessage) {
-                faultReference.setRef(
-                        this.generateReferenceQname(faultMessage));
-            }
-            wsdlOperation.addOutFault(faultReference);
-            this.copyExtensibilityAttribute(fault.getExtensionAttributes(),
-                    faultReference);
-            //TODO Fault Message lable
-
-        }
-
-        //Set the MEP
-        wsdlOperation.setMessageExchangePattern(WSDL11MEPFinder
-                .getMEP(wsdl4jOperation));
-
-    }
-
-    private QName generateReferenceQname(Message wsdl4jMessage) {
-        QName referenceQName = null;
-        if (wsdl4jMessage.getParts().size() > 1) {
-            Map parts = wsdl4jMessage.getParts();
-            Iterator i = parts.keySet().iterator();
-            Part thisPart = (Part)(parts.get(i.next()));
-            if (thisPart.getElementName() != null) {
-                throw new RuntimeException(
-                        "We don't support multiple element parts in a WSDL message");
-            }
-
-            // Multipart Message
-
-            // NOTE (gdaniels) : It appears this code is taking multiple
-            // part declarations and "wrapping" them into a single schema
-            // type.  This is fine for RPC style stuff, but should not be
-            // happening for document style.
-            // TODO : sanity check
-
-            // Check whether this message parts have been made to a type
-            Iterator multipartListIterator = this.resolvedMultipartMessageList.iterator();
-            boolean multipartAlreadyResolved = false;
-            while (multipartListIterator.hasNext() &&
-                    !multipartAlreadyResolved) {
-                QName temp = (QName) multipartListIterator.next();
-                multipartAlreadyResolved =
-                        wsdl4jMessage.getQName().equals(temp);
-            }
-            if (multipartAlreadyResolved) {
-                //This message with multiple parts has resolved and a new type has been
-                //made out of it earlier.
-                //FIXME Actual element name should it be xs:, if yes change the qname added to the
-                //resolvedmessage list too.
-                referenceQName = wsdl4jMessage.getQName();
-            } else {
-                //Get the list of multiparts of the message and create a new Element
-                //out of it and add it to the schema.
-                Element schemaElement = null;
-                WSDLTypes types = womDefinition.getTypes();
-
-                //If types is null create a new one to be used for multipart 
-                //resolution if any.
-                if (null == types) {
-                    DocumentBuilder documentBuilder = null;
-                    try {
-                        documentBuilder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
-                    } catch (ParserConfigurationException e) {
-                        throw new RuntimeException(e);
-                    }
-                    Document newDoc = documentBuilder.newDocument();
-
-                    Element newSchemaElement = newDoc.createElementNS("http://www.w3.org/2001/XMLSchema", "schema");
-                    types = wsdlComponentFactory.createTypes();
-                    ExtensionFactory extensionFactory = wsdlComponentFactory.createExtensionFactory();
-                    org.apache.wsdl.extensions.Schema typesElement = (org.apache.wsdl.extensions.Schema) extensionFactory.getExtensionElement(
-                            ExtensionConstants.SCHEMA);
-                    typesElement.setElement(newSchemaElement);
-                    types.addExtensibilityElement(typesElement);
-                    this.womDefinition.setTypes(types);
-                }
-
-
-                //
-                Iterator schemaEIIterator = types.getExtensibilityElements()
-                        .iterator();
-                while (schemaEIIterator.hasNext()) {
-                    WSDLExtensibilityElement temp = (WSDLExtensibilityElement) schemaEIIterator.next();
-                    if (ExtensionConstants.SCHEMA.equals(temp.getType())) {
-                        schemaElement =
-                                ((org.apache.wsdl.extensions.Schema) temp).getElement();
-                        break;
-                    }
-                }
-
-                schemaElement.setAttribute(WSDLPump.XMLNS_AXIS2WRAPPED, schemaElement.getAttribute(WSDLPump.XSD_TARGETNAMESPACE));
-                Document doc = schemaElement.getOwnerDocument();
-                String name = wsdl4jMessage.getQName().getLocalPart();
-                Element newType = doc.createElementNS(WSDLPump.NAMESPACE_XMLSCHEMA, WSDLPump.XSD_COMPLEXTYPE);
-                newType.setAttribute(WSDLPump.XSD_NAME, name);
-
-
-                Element cmplxContent = doc.createElementNS(WSDLPump.NAMESPACE_XMLSCHEMA, WSDLPump.XSD_SEQUENCE);
-                Element child;
-                Element relaventElementInSchemaReferedByPart = null;
-                Iterator iterator = parts.keySet().iterator();
-                while (iterator.hasNext()) {
-                    Part part = (Part) parts.get(iterator.next());
-                    QName elementName = part.getElementName();
-                    if (null == elementName) {
-                        elementName = part.getTypeName();
-                    }
-
-                    NodeList allSchemaElements = schemaElement.getChildNodes();
-                    for(int idx = 0; idx < allSchemaElements.getLength(); idx++){
-                        if(allSchemaElements.item(idx).getNodeType() == Node.ELEMENT_NODE &&
-                                allSchemaElements.item(idx).getLocalName().equals(WSDLPump.XSD_ELEMENT)
-                                && elementName.getLocalPart().equals(((Element)allSchemaElements.item(idx)).getAttribute(WSDLPump.XSD_NAME))){
-                            relaventElementInSchemaReferedByPart = (Element)allSchemaElements.item(idx);
-                            break;
-                        }
-                    }
-                    child = doc.createElementNS(WSDLPump.NAMESPACE_XMLSCHEMA, WSDLPump.XSD_ELEMENT);
-                    child.setAttribute(WSDLPump.XSD_NAME, elementName.getLocalPart());
-                    if(null != relaventElementInSchemaReferedByPart){
-
-
-                        child.setAttribute(WSDLPump.XSD_TYPE,
-                                relaventElementInSchemaReferedByPart.getAttribute(WSDLPump.XSD_TYPE));
-                    }else{
-                        child.setAttribute(WSDLPump.XSD_TYPE, elementName.getLocalPart());
-                    }
-                    cmplxContent.appendChild(child);
-
-                }
-
-
-                newType.appendChild(cmplxContent);
-
-                schemaElement.appendChild(newType);
-
-
-                Element newElement = doc.createElementNS(WSDLPump.NAMESPACE_XMLSCHEMA, WSDLPump.XSD_ELEMENT);
-                newElement.setAttribute(WSDLPump.XSD_NAME,
-                        wsdl4jMessage.getQName().getLocalPart());
-                newElement.setAttribute(WSDLPump.XSD_TYPE,
-                        "axis2wrapped:"+wsdl4jMessage.getQName().getLocalPart());
-                schemaElement.appendChild(newElement);
-                //Now since  a new type is created augmenting the parts add the QName
-                //of the newly created type as the messageReference's name.
-                referenceQName = wsdl4jMessage.getQName();
-                //Add this message as a resolved message, so that incase some other
-                //operation refer to the same message the if above will take a hit
-                //and the cashed QName can be used instead of creating another type
-                //for the same message.
-
-                this.resolvedMultipartMessageList.add(wsdl4jMessage.getQName());
-
-            }
-        } else {
-            //Only one part so copy the QName of the referenced type.
-            Iterator outputIterator =
-                    wsdl4jMessage.getParts().values().iterator();
-            if (outputIterator.hasNext()) {
-                Part outPart = ((Part) outputIterator.next());
-                QName typeName;
-                if (null != (typeName = outPart.getTypeName())) {
-                    referenceQName = typeName;
-                } else {
-                    referenceQName = outPart.getElementName();
-                }
-            }
-        }
-        return referenceQName;
-    }
-
-    private void populateBindingOperation(
-            WSDLBindingOperation wsdlBindingOperation,
-            BindingOperation wsdl4jBindingOperation,
-            String nameSpaceOfTheBindingOperation, Definition wsdl4jDefinition) {
-
-        wsdlBindingOperation.setName(
-                new QName(nameSpaceOfTheBindingOperation,
-                        wsdl4jBindingOperation.getName()));
-
-        BindingInput wsdl4jInputBinding =
-                wsdl4jBindingOperation.getBindingInput();
-
-        if (null != wsdl4jInputBinding) {
-            WSDLBindingMessageReference wsdlInputBinding =
-                    this.wsdlComponentFactory.createWSDLBindingMessageReference();
-            wsdlInputBinding.setDirection(
-                    WSDLConstants.WSDL_MESSAGE_DIRECTION_IN);
-            this.copyExtensibleElements(
-                    wsdl4jInputBinding.getExtensibilityElements(),
-                    wsdlInputBinding, wsdl4jDefinition);
-            wsdlBindingOperation.setInput(wsdlInputBinding);
-        }
-
-        BindingOutput wsdl4jOutputBinding = wsdl4jBindingOperation
-                .getBindingOutput();
-        if (null != wsdl4jOutputBinding) {
-            WSDLBindingMessageReference wsdlOutputBinding = this.wsdlComponentFactory
-                    .createWSDLBindingMessageReference();
-            wsdlOutputBinding.setDirection(
-                    WSDLConstants.WSDL_MESSAGE_DIRECTION_OUT);
-
-            this.copyExtensibleElements(
-                    wsdl4jOutputBinding.getExtensibilityElements(),
-                    wsdlOutputBinding, null);
-            wsdlBindingOperation.setOutput(wsdlOutputBinding);
-        }
-
-
-        Map bindingFaults = wsdl4jBindingOperation.getBindingFaults();
-        Iterator keyIterator = bindingFaults.keySet().iterator();
-        while (keyIterator.hasNext()) {
-            BindingFault bindingFault = (BindingFault) bindingFaults.get(
-                    keyIterator.next());
-            WSDLBindingFault womBindingFault = this.wsdlComponentFactory.createBindingFault();
-            this.copyExtensibleElements(
-                    bindingFault.getExtensibilityElements(), womBindingFault, null);
-            wsdlBindingOperation.addOutFault(womBindingFault);
-        }
-
-    }
-
-    public void populatePorts(WSDLEndpoint wsdlEndpoint, Port wsdl4jPort,
-                              String targetNamspace) {
-        wsdlEndpoint.setName(new QName(targetNamspace, wsdl4jPort.getName()));
-
-        wsdlEndpoint.setBinding(
-                this.womDefinition.getBinding(
-                        wsdl4jPort
-                                .getBinding()
-                                .getQName()));
-
-    }
-
-    /**
-     * This method will fill up the gap of WSDL 1.1 and WSDL 2.0 w.r.t. the
-     * bound interface for the Service Component Defined in the WSDL 2.0. Logic
-     * being if there exist only one PortType in the WSDL 1.1 file then that
-     * will be set as the bound interface of the Service. If more than one
-     * Porttype exist in the WSDl 1.1 file this will create a dummy Interface
-     * with the available PortTypes and will return that interface so that it
-     * will inherit all those interfaces.
-     * <p/>
-     * Eventuall this will have to be fixed using user input since
-     *
-     * @param service
-     * @return wsdl interface
-     */
-    private WSDLInterface getBoundInterface(WSDLService service) {
-
-        // Throw an exception if there are no interfaces defined as at yet.
-        if (0 == this.womDefinition.getWsdlInterfaces().size())
-            throw new WSDLProcessingException("There are no "
-                    +
-                    "Interfaces/PortTypes identified in the current partially built"
-                    + "WOM");
-
-        //If there is only one Interface available hten return that because
-        // normally
-        // that interface must be the one to the service should get bound.
-        if (1 == this.womDefinition.getWsdlInterfaces().size())
-            return (WSDLInterface) this.womDefinition.getWsdlInterfaces()
-                    .values().iterator().next();
-
-        //If there are more than one interface available... For the time being
-        // create a
-        // new interface and set all those existing interfaces as
-        // superinterfaces of it
-        // and return.
-        WSDLInterface newBoundInterface = this.womDefinition.createInterface();
-        newBoundInterface.setName(
-                new QName(service.getNamespace(),
-                        service
-                                .getName()
-                                .getLocalPart()
-                                + BOUND_INTERFACE_NAME));
-        Iterator interfaceIterator = this.womDefinition.getWsdlInterfaces()
-                .values().iterator();
-        while (interfaceIterator.hasNext()) {
-            newBoundInterface
-                    .addSuperInterface(
-                            (WSDLInterface) interfaceIterator.next());
-        }
-        return newBoundInterface;
-    }
-
-    /**
-     * Get the Extensible elements form wsdl4jExtensibleElements
-     * <code>Vector</code> if any and copy them to <code>Component</code>
-     *
-
-
-     @param wsdl4jExtensibleElements
-      * @param component
-     * @param wsdl4jDefinition
-
-     */
-    private void copyExtensibleElements(List wsdl4jExtensibleElements,
-                                        Component component, Definition wsdl4jDefinition) {
-        Iterator iterator = wsdl4jExtensibleElements.iterator();
-        ExtensionFactory extensionFactory = this.wsdlComponentFactory
-                .createExtensionFactory();
-        while (iterator.hasNext()) {
-
-            ExtensibilityElement wsdl4jElement = (ExtensibilityElement) iterator
-                    .next();
-
-            if (wsdl4jElement instanceof UnknownExtensibilityElement) {
-                UnknownExtensibilityElement unknown = (UnknownExtensibilityElement) (wsdl4jElement);
-
-                //look for the SOAP 1.2 stuff here. WSDL4j does not understand SOAP 1.2 things
-                if (ExtensionConstants.SOAP_12_OPERATION.equals(unknown.getElementType())){
-                    org.apache.wsdl.extensions.SOAPOperation soapOperationExtensibiltyElement = (org.apache.wsdl.extensions.SOAPOperation) extensionFactory
-                            .getExtensionElement(wsdl4jElement.getElementType());
-                    Element element = unknown.getElement();
-                    soapOperationExtensibiltyElement.setSoapAction(element.getAttribute("soapAction"));
-                    soapOperationExtensibiltyElement.setStyle(element.getAttribute("style"));
-                    // soapActionRequired
-                    component.addExtensibilityElement(soapOperationExtensibiltyElement);
-                }else if (ExtensionConstants.SOAP_12_BODY.equals(unknown.getElementType())){
-                    org.apache.wsdl.extensions.SOAPBody soapBodyExtensibiltyElement = (org.apache.wsdl.extensions.SOAPBody) extensionFactory
-                            .getExtensionElement(wsdl4jElement.getElementType());
-                    Element element = unknown.getElement();
-                    soapBodyExtensibiltyElement.setUse(element.getAttribute("use"));
-                    soapBodyExtensibiltyElement.setNamespaceURI(element.getAttribute("namespace"));
-                    //encoding style
-                    component.addExtensibilityElement(soapBodyExtensibiltyElement);
-                }else if (ExtensionConstants.SOAP_12_HEADER.equals(unknown.getElementType())){
-                    org.apache.wsdl.extensions.SOAPHeader soapHeaderExtensibilityElement = (org.apache.wsdl.extensions.SOAPHeader) extensionFactory.getExtensionElement(
-                            unknown.getElementType());
-                    //right now there's no known header binding!. Ignore the copying of values for now
-                    component.addExtensibilityElement(soapHeaderExtensibilityElement);
-                }else if (ExtensionConstants.SOAP_12_BINDING.equals(unknown.getElementType())){
-                     org.apache.wsdl.extensions.SOAPBinding soapBindingExtensibiltyElement = (org.apache.wsdl.extensions.SOAPBinding) extensionFactory
-                            .getExtensionElement(wsdl4jElement.getElementType());
-                    Element element = unknown.getElement();
-                    soapBindingExtensibiltyElement.setTransportURI(element.getAttribute("transport"));
-                    soapBindingExtensibiltyElement.setStyle(element.getAttribute("style"));
-
-                    component.addExtensibilityElement(soapBindingExtensibiltyElement);
-                } else if (ExtensionConstants.SOAP_12_ADDRESS.equals(unknown.getElementType())){
-                     org.apache.wsdl.extensions.SOAPAddress soapAddressExtensibiltyElement = (org.apache.wsdl.extensions.SOAPAddress) extensionFactory
-                            .getExtensionElement(wsdl4jElement.getElementType());
-                    Element element = unknown.getElement();
-                    soapAddressExtensibiltyElement.setLocationURI(element.getAttribute("location"));
-                    component.addExtensibilityElement(soapAddressExtensibiltyElement);
-                }else{
-
-                    DefaultExtensibilityElement defaultExtensibilityElement = (DefaultExtensibilityElement) extensionFactory
-                            .getExtensionElement(wsdl4jElement.getElementType());
-                    defaultExtensibilityElement.setElement(unknown.getElement());
-                    Boolean required = unknown.getRequired();
-                    if (null != required) {
-                        defaultExtensibilityElement.setRequired(required.booleanValue());
-                    }
-                    component.addExtensibilityElement(defaultExtensibilityElement);
-                }
-
-
-            } else if (wsdl4jElement instanceof SOAPAddress) {
-                SOAPAddress soapAddress = (SOAPAddress) wsdl4jElement;
-                org.apache.wsdl.extensions.SOAPAddress soapAddressExtensibilityElement = (org.apache.wsdl.extensions.SOAPAddress) extensionFactory
-                        .getExtensionElement(soapAddress.getElementType());
-                soapAddressExtensibilityElement.setLocationURI(soapAddress
-                        .getLocationURI());
-                Boolean required = soapAddress.getRequired();
-                if (null != required) {
-                    soapAddressExtensibilityElement.setRequired(required.booleanValue());
-                }
-                component.addExtensibilityElement(soapAddressExtensibilityElement);
-            } else if (wsdl4jElement instanceof Schema) {
-                Schema schema = (Schema) wsdl4jElement;
-                //schema.getDocumentBaseURI()
-                //populate the imported schema stack
-                Stack schemaStack = new Stack();
-                //recursivly load the schema elements. The best thing is to push these into
-                //a stack and then pop from the other side
-                pushSchemaElement(schema, schemaStack);
-                org.apache.wsdl.extensions.Schema schemaExtensibilityElement = (org.apache.wsdl.extensions.Schema) extensionFactory.getExtensionElement(
-                        schema.getElementType());
-                schemaExtensibilityElement.setElement(schema.getElement());
-                schemaExtensibilityElement.setImportedSchemaStack(schemaStack);
-                Boolean required = schema.getRequired();
-                if (null != required) {
-                    schemaExtensibilityElement.setRequired(required.booleanValue());
-                }
-                //set the name of this Schema element
-                //todo this needs to be fixed
-                if(schema.getDocumentBaseURI() != null) {
-                    schemaExtensibilityElement.setName(new QName("",schema.getDocumentBaseURI()));
-                }
-                component.addExtensibilityElement(schemaExtensibilityElement);
-            } else if (SOAPConstants.Q_ELEM_SOAP_OPERATION.equals(
-                    wsdl4jElement.getElementType())) {
-                SOAPOperation soapOperation = (SOAPOperation) wsdl4jElement;
-                org.apache.wsdl.extensions.SOAPOperation soapOperationextensibilityElement = (org.apache.wsdl.extensions.SOAPOperation) extensionFactory.getExtensionElement(
-                        soapOperation.getElementType());
-                soapOperationextensibilityElement.setSoapAction(
-                        soapOperation.getSoapActionURI());
-                soapOperationextensibilityElement.setStyle(soapOperation.getStyle());
-                Boolean required = soapOperation.getRequired();
-                if (null != required) {
-                    soapOperationextensibilityElement.setRequired(required.booleanValue());
-                }
-                component.addExtensibilityElement(soapOperationextensibilityElement);
-            } else if (SOAPConstants.Q_ELEM_SOAP_BODY.equals(
-                    wsdl4jElement.getElementType())) {
-                SOAPBody soapBody = (SOAPBody) wsdl4jElement;
-                org.apache.wsdl.extensions.SOAPBody soapBodyExtensibilityElement = (org.apache.wsdl.extensions.SOAPBody) extensionFactory.getExtensionElement(
-                        soapBody.getElementType());
-                soapBodyExtensibilityElement.setNamespaceURI(
-                        soapBody.getNamespaceURI());
-                soapBodyExtensibilityElement.setUse(soapBody.getUse());
-                Boolean required = soapBody.getRequired();
-                if (null != required) {
-                    soapBodyExtensibilityElement.setRequired(required.booleanValue());
-                }
-
-                component.addExtensibilityElement(soapBodyExtensibilityElement);
-                //add the header
-            } else if (SOAPConstants.Q_ELEM_SOAP_HEADER.equals(
-                    wsdl4jElement.getElementType())) {
-                SOAPHeader soapHeader = (SOAPHeader) wsdl4jElement;
-                org.apache.wsdl.extensions.SOAPHeader soapHeaderExtensibilityElement = (org.apache.wsdl.extensions.SOAPHeader) extensionFactory.getExtensionElement(
-                        soapHeader.getElementType());
-                soapHeaderExtensibilityElement.setNamespaceURI(
-                        soapHeader.getNamespaceURI());
-                soapHeaderExtensibilityElement.setUse(soapHeader.getUse());
-                Boolean required = soapHeader.getRequired();
-                if (null != required) {
-                    soapHeaderExtensibilityElement.setRequired(required.booleanValue());
-                }
-                if (null!=wsdl4jDefinition){
-                    //find the relevant schema part from the messages
-                    Message msg = wsdl4jDefinition.getMessage(soapHeader.getMessage());
-                    Part msgPart = msg.getPart(soapHeader.getPart());
-                    soapHeaderExtensibilityElement.setElement(msgPart.getElementName());
-                }
-//                msgPart.
-                soapHeaderExtensibilityElement.setMessage(soapHeader.getMessage());
-
-                soapHeaderExtensibilityElement.setPart(soapHeader.getPart());
-                soapHeader.getMessage();
-                component.addExtensibilityElement(soapHeaderExtensibilityElement);
-            } else if (SOAPConstants.Q_ELEM_SOAP_BINDING.equals(
-                    wsdl4jElement.getElementType())) {
-                SOAPBinding soapBinding = (SOAPBinding) wsdl4jElement;
-                org.apache.wsdl.extensions.SOAPBinding soapBindingExtensibilityElement = (org.apache.wsdl.extensions.SOAPBinding) extensionFactory.getExtensionElement(
-                        soapBinding.getElementType());
-                soapBindingExtensibilityElement.setTransportURI(
-                        soapBinding.getTransportURI());
-                soapBindingExtensibilityElement.setStyle(soapBinding.getStyle());
-                Boolean required = soapBinding.getRequired();
-                if (null != required) {
-                    soapBindingExtensibilityElement.setRequired(required.booleanValue());
-                }
-                component.addExtensibilityElement(soapBindingExtensibilityElement);
-            } else {
-                 //	throw new AxisError(
-//						"An Extensible item "+wsdl4jElement.getElementType()+" went unparsed during WSDL Parsing");
-
-            }
-        }
-    }
-
-    /**
-     * Get the Extensible Attributes from wsdl4jExtensibilityAttribute
-     * <code>Map</code> if any and copy them to the <code>Component</code>
-     *
-     * @param wsdl4jExtensibilityAttributes
-     * @param component
-     */
-    private void copyExtensibilityAttribute(Map wsdl4jExtensibilityAttributes,
-                                            Component component) {
-        Iterator iterator = wsdl4jExtensibilityAttributes.keySet().iterator();
-        while (iterator.hasNext()) {
-            QName attributeName = (QName) iterator.next();
-            QName value = (QName) wsdl4jExtensibilityAttributes
-                    .get(attributeName);
-            WSDLExtensibilityAttribute attribute = this.wsdlComponentFactory
-                    .createWSDLExtensibilityAttribute();
-            attribute.setKey(attributeName);
-            attribute.setValue(value);
-            component.addExtensibleAttributes(attribute);
-        }
-    }
-}
+/*
+* Copyright 2001-2004 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.axis2.wsdl.builder.wsdl4j;
+
+import com.ibm.wsdl.extensions.soap.SOAPConstants;
+import org.apache.axis2.wsdl.builder.WSDLComponentFactory;
+import org.apache.wsdl.*;
+import org.apache.wsdl.extensions.ExtensionConstants;
+import org.apache.wsdl.extensions.ExtensionFactory;
+import org.apache.wsdl.extensions.DefaultExtensibilityElement;
+import org.apache.wsdl.impl.WSDLProcessingException;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+
+import javax.wsdl.*;
+import javax.wsdl.extensions.ExtensibilityElement;
+import javax.wsdl.extensions.UnknownExtensibilityElement;
+import javax.wsdl.extensions.schema.Schema;
+import javax.wsdl.extensions.schema.SchemaImport;
+import javax.wsdl.extensions.soap.*;
+import javax.xml.namespace.QName;
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.DocumentBuilderFactory;
+import javax.xml.parsers.ParserConfigurationException;
+import java.util.*;
+
+/**
+ * @author chathura@opensource.lk
+ */
+public class WSDLPump {
+
+    private static final String XSD_TYPE = "type";
+    private static final String XSD_SEQUENCE = "sequence";
+    private static final String XSD_NAME = "name";
+    private static final String XSD_COMPLEXTYPE = "complexType";
+    private static final String XSD_TARGETNAMESPACE = "targetNamespace";
+    private static final String XMLNS_AXIS2WRAPPED = "xmlns:axis2wrapped";
+    private static final String NAMESPACE_XMLSCHEMA = "http://www.w3.org/2001/XMLSchema";
+    private static final String XSD_ELEMENT = "element";
+    private static final String BOUND_INTERFACE_NAME = "BoundInterface";
+
+    private WSDLDescription womDefinition;
+
+    private Definition wsdl4jParsedDefinition;
+
+    private WSDLComponentFactory wsdlComponentFactory;
+
+
+    private List resolvedMultipartMessageList = new LinkedList();
+
+    public WSDLPump(WSDLDescription womDefinition,
+                    Definition wsdl4jParsedDefinition) {
+        this(womDefinition, wsdl4jParsedDefinition, womDefinition);
+    }
+
+    public WSDLPump(WSDLDescription womDefinition,
+                    Definition wsdl4jParsedDefinition,
+                    WSDLComponentFactory wsdlComponentFactory) {
+        this.womDefinition = womDefinition;
+        this.wsdl4jParsedDefinition = wsdl4jParsedDefinition;
+        this.wsdlComponentFactory = wsdlComponentFactory;
+    }
+
+    public void pump() {
+        if (null != this.wsdl4jParsedDefinition && null != this.womDefinition) {
+            this.populateDefinition(this.womDefinition,
+                    this.wsdl4jParsedDefinition);
+        } else {
+            throw new WSDLProcessingException("Properties not set properly");
+        }
+
+    }
+
+    private void populateDefinition(WSDLDescription wsdlDefinition,
+                                    Definition wsdl4JDefinition) {
+        //Go through the WSDL4J Definition and pump it to the WOM
+        wsdlDefinition.setWSDL1DefinitionName(wsdl4JDefinition.getQName());
+        wsdlDefinition
+                .setTargetNameSpace(wsdl4JDefinition.getTargetNamespace());
+        wsdlDefinition.setNamespaces(wsdl4JDefinition.getNamespaces());
+        this.copyExtensibleElements(
+                wsdl4JDefinition.getExtensibilityElements(), wsdlDefinition, null);
+
+        /////////////////////////////////////////////////////////////////////
+        // Order of the following items shouldn't be changed unless you //
+        // really know what you are doing. Reason being the components that //
+        // are copied(pumped) towards the end depend on the components that //
+        // has already being pumped. Following Lists some of the //
+        // dependencies. //
+        //1) The Binding refers to the Interface //
+        //2) The Endpoint refers to the Bindings //
+        // .... //
+        //																   	//
+        //////////////////////////////////////////////////////////////////////
+
+        //////////////////(1)First Copy the Types/////////////////////////////
+        //Types may get changed inside the Operation pumping.
+
+        Types wsdl4jTypes = wsdl4JDefinition.getTypes();
+        WSDLTypes wsdlTypes = null;
+        if (null != wsdl4jTypes) {
+            wsdlTypes = this.wsdlComponentFactory.createTypes();
+            this.copyExtensibleElements(wsdl4jTypes.getExtensibilityElements(),
+                    wsdlTypes, null);
+            this.womDefinition.setTypes(wsdlTypes);
+        }
+
+
+        // There can be types that are imported. Check the imports and
+        // These schemas are needed for code generation
+
+        Map wsdlImports = wsdl4JDefinition.getImports();
+
+        if (null != wsdlImports && !wsdlImports.isEmpty()){
+            Collection importsCollection = wsdlImports.values();
+            for (Iterator iterator = importsCollection.iterator(); iterator.hasNext();) {
+                Vector values = (Vector)iterator.next();
+                for (int i = 0; i < values.size(); i++) {
+                    Import wsdlImport = (Import)values.elementAt(i);
+
+                    if (wsdlImport.getDefinition()!=null){
+                        Definition importedDef = wsdlImport.getDefinition();
+
+                        if (wsdlTypes==null){
+                            wsdlTypes = this.wsdlComponentFactory.createTypes();
+                        }
+                        //add the imported types
+                        this.copyExtensibleElements(importedDef.getTypes().
+                                getExtensibilityElements(),
+                                wsdlTypes, null);
+                        this.womDefinition.setTypes(wsdlTypes);
+                    }
+                }
+
+            }
+        }
+        ///////////////////(2)Copy the Interfaces///////////////////////////
+        //copy the Interfaces: Get the PortTypes from WSDL4J parse OM and
+        // copy it to the
+        //WOM's WSDLInterface Components
+
+        Iterator portTypeIterator = wsdl4JDefinition.getPortTypes().values()
+                .iterator();
+        WSDLInterface wsdlInterface;
+        PortType portType;
+        while (portTypeIterator.hasNext()) {
+            wsdlInterface = this.wsdlComponentFactory.createInterface();
+            portType = (PortType) portTypeIterator.next();
+            this.populateInterfaces(wsdlInterface, portType);
+            this.copyExtensibilityAttribute(portType.getExtensionAttributes(),
+                    wsdlInterface);
+            wsdlDefinition.addInterface(wsdlInterface);
+        }
+
+        //////////////////(3)Copy the Bindings///////////////////////
+        //pump the Bindings: Get the Bindings map from WSDL4J and create a new
+        // map of WSDLBinding elements. At this point we need to do some extra work since there
+        //can be header parameters
+
+        Iterator bindingIterator = wsdl4JDefinition.getBindings().values()
+                .iterator();
+        WSDLBinding wsdlBinding;
+        Binding wsdl4jBinding;
+        while (bindingIterator.hasNext()) {
+            wsdlBinding = this.wsdlComponentFactory.createBinding();
+            wsdl4jBinding = (Binding) bindingIterator.next();
+            this.populateBindings(wsdlBinding, wsdl4jBinding, wsdl4JDefinition);
+            this.copyExtensibleElements(
+                    wsdl4jBinding.getExtensibilityElements(),
+                    wsdlBinding, null);
+            wsdlDefinition.addBinding(wsdlBinding);
+
+        }
+
+        ///////////////////(4)Copy the Services///////////////////////////////
+
+        Iterator serviceIterator = wsdl4JDefinition.getServices().values()
+                .iterator();
+        WSDLService wsdlService;
+        Service wsdl4jService;
+        while (serviceIterator.hasNext()) {
+            wsdlService = this.wsdlComponentFactory.createService();
+            wsdl4jService = (Service) serviceIterator.next();
+            this.populateServices(wsdlService, wsdl4jService);
+            this.copyExtensibleElements(
+                    wsdl4jService.getExtensibilityElements(),
+                    wsdlService, null);
+            wsdlDefinition.addService(wsdlService);
+        }
+
+    }
+
+    //////////////////////////////////////////////////////////////////////////////
+    ////////////////////////// Top level Components Copying
+    // ////////////////////
+
+    /**
+     * Simply Copy information.
+     *
+     * @param wsdlInterface
+     * @param wsdl4jPortType
+     */
+    //FIXME Evaluate a way of injecting features and priperties with a general
+    // formatted input
+    private void populateInterfaces(WSDLInterface wsdlInterface,
+                                    PortType wsdl4jPortType) {
+
+        //Copy the Attrebute information items
+        //Copied with the Same QName so it will require no Query in Binding
+        //Coping.
+        wsdlInterface.setName(wsdl4jPortType.getQName());
+        Iterator wsdl4JOperationsIterator =
+                wsdl4jPortType.getOperations().iterator();
+        WSDLOperation wsdloperation;
+        Operation wsdl4jOperation;
+        while (wsdl4JOperationsIterator.hasNext()) {
+            wsdloperation = this.wsdlComponentFactory.createOperation();
+            wsdl4jOperation = (Operation) wsdl4JOperationsIterator.next();
+            this.populateOperations(wsdloperation,
+                    wsdl4jOperation,
+                    wsdl4jPortType.getQName().getNamespaceURI());
+            this.copyExtensibleElements(
+                    wsdl4jOperation.getExtensibilityElements(), wsdloperation, null);
+            wsdlInterface.setOperation(wsdloperation);
+        }
+    }
+
+    /**
+     * Pre Condition: The Interface Components must be copied by now.
+     */
+    private void populateBindings(WSDLBinding wsdlBinding,
+                                  Binding wsdl4JBinding, Definition wsdl4jDefinition) {
+        //Copy attributes
+        wsdlBinding.setName(wsdl4JBinding.getQName());
+        QName interfaceName = wsdl4JBinding.getPortType().getQName();
+        WSDLInterface wsdlInterface =
+                this.womDefinition.getInterface(interfaceName);
+
+        //FIXME Do We need this eventually???
+        if (null == wsdlInterface)
+            throw new WSDLProcessingException("Interface/PortType not found for the Binding :"
+                    + wsdlBinding.getName());
+        wsdlBinding.setBoundInterface(wsdlInterface);
+        Iterator bindingoperationsIterator =
+                wsdl4JBinding.getBindingOperations().iterator();
+        WSDLBindingOperation wsdlBindingOperation;
+        BindingOperation wsdl4jBindingOperation;
+        while (bindingoperationsIterator.hasNext()) {
+            wsdlBindingOperation =
+                    this.wsdlComponentFactory.createWSDLBindingOperation();
+            wsdl4jBindingOperation =
+                    (BindingOperation) bindingoperationsIterator.next();
+            this.populateBindingOperation(wsdlBindingOperation,
+                    wsdl4jBindingOperation,
+                    wsdl4JBinding.getQName().getNamespaceURI(), wsdl4jDefinition);
+            wsdlBindingOperation.setOperation(
+                    wsdlInterface.getOperation(
+                            wsdl4jBindingOperation.getOperation().getName()));
+            this.copyExtensibleElements(
+                    wsdl4jBindingOperation.getExtensibilityElements(),
+                    wsdlBindingOperation, wsdl4jDefinition);
+            wsdlBinding.addBindingOperation(wsdlBindingOperation);
+        }
+
+    }
+
+    public void populateServices(WSDLService wsdlService,
+                                 Service wsdl4jService) {
+        wsdlService.setName(wsdl4jService.getQName());
+        Iterator wsdl4jportsIterator =
+                wsdl4jService.getPorts().values().iterator();
+        wsdlService.setServiceInterface(this.getBoundInterface(wsdlService));
+        WSDLEndpoint wsdlEndpoint;
+        Port wsdl4jPort;
+        while (wsdl4jportsIterator.hasNext()) {
+            wsdlEndpoint = this.wsdlComponentFactory.createEndpoint();
+            wsdl4jPort = (Port) wsdl4jportsIterator.next();
+            this.populatePorts(wsdlEndpoint,
+                    wsdl4jPort,
+                    wsdl4jService.getQName().getNamespaceURI());
+            this.copyExtensibleElements(wsdl4jPort.getExtensibilityElements(),
+                    wsdlEndpoint, null);
+            wsdlService.setEndpoint(wsdlEndpoint);
+        }
+
+    }
+
+    private void pushSchemaElement(Schema originalSchema,Stack stack){
+        if (originalSchema==null){
+            return;
+        }
+        stack.push(originalSchema);
+        Map map = originalSchema.getImports();
+        Collection values;
+        if (map!=null && map.size()>0){
+            values = map.values();
+            for (Iterator iterator = values.iterator(); iterator.hasNext();) {
+                //recursively add the schema's
+                Vector v = (Vector)iterator.next();
+                for (int i = 0; i < v.size(); i++) {
+                    pushSchemaElement(((SchemaImport)v.get(i)).getReferencedSchema(),stack);
+                }
+
+            }
+        }
+    }
+
+    /////////////////////////////////////////////////////////////////////////////
+    //////////////////////////// Internal Component Copying ///////////////////
+    public void populateOperations(WSDLOperation wsdlOperation,
+                                   Operation wsdl4jOperation,
+                                   String nameSpaceOfTheOperation) {
+        //Copy Name Attrebute
+        wsdlOperation.setName(new QName(nameSpaceOfTheOperation,
+                wsdl4jOperation.getName()));
+
+        //This code make no attempt to make use of the special xs:Token
+        //defined in the WSDL 2.0. eg like #any, #none
+        // Create the Input Message and add
+        Input wsdl4jInputMessage = wsdl4jOperation.getInput();
+
+        if (null != wsdl4jInputMessage) {
+            MessageReference wsdlInputMessage = this.wsdlComponentFactory
+                    .createMessageReference();
+            wsdlInputMessage.setDirection(
+                    WSDLConstants.WSDL_MESSAGE_DIRECTION_IN);
+            wsdlInputMessage.setMessageLabel(
+                    WSDLConstants.MESSAGE_LABEL_IN_VALUE);
+
+            Message message = wsdl4jInputMessage.getMessage();
+            if (null != message) {
+                wsdlInputMessage.setElement(
+                        this.generateReferenceQname(message));
+                this.copyExtensibleElements(
+                        (message).getExtensibilityElements(),
+                        wsdlInputMessage, null);
+            }
+            this.copyExtensibilityAttribute(
+                    wsdl4jInputMessage.getExtensionAttributes(),
+                    wsdlInputMessage);
+            wsdlOperation.setInputMessage(wsdlInputMessage);
+        }
+
+        //Create an output message and add
+        Output wsdl4jOutputMessage = wsdl4jOperation.getOutput();
+        if (null != wsdl4jOutputMessage) {
+            MessageReference wsdlOutputMessage =
+                    this.wsdlComponentFactory.createMessageReference();
+            wsdlOutputMessage.setDirection(
+                    WSDLConstants.WSDL_MESSAGE_DIRECTION_OUT);
+            wsdlOutputMessage.setMessageLabel(
+                    WSDLConstants.MESSAGE_LABEL_OUT_VALUE);
+
+            Message outputMessage = wsdl4jOutputMessage.getMessage();
+            if (null != outputMessage) {
+                wsdlOutputMessage.setElement(
+                        this.generateReferenceQname(outputMessage));
+                this.copyExtensibleElements(
+                        (outputMessage).getExtensibilityElements(),
+                        wsdlOutputMessage, null);
+            }
+            this.copyExtensibilityAttribute(
+                    wsdl4jOutputMessage.getExtensionAttributes(),
+                    wsdlOutputMessage);
+            wsdlOperation.setOutputMessage(wsdlOutputMessage);
+        }
+
+        Map faults = wsdl4jOperation.getFaults();
+        Iterator faultKeyIterator = faults.keySet().iterator();
+        WSDLFaultReference faultReference = null;
+
+        while (faultKeyIterator.hasNext()) {
+
+            Fault fault = (Fault) faults.get(faultKeyIterator.next());
+            faultReference = wsdlComponentFactory.createFaultReference();
+            faultReference.setDirection(
+                    WSDLConstants.WSDL_MESSAGE_DIRECTION_OUT);
+            Message faultMessage = fault.getMessage();
+            if (null != faultMessage) {
+                faultReference.setRef(
+                        this.generateReferenceQname(faultMessage));
+            }
+            wsdlOperation.addOutFault(faultReference);
+            this.copyExtensibilityAttribute(fault.getExtensionAttributes(),
+                    faultReference);
+            //TODO Fault Message lable
+
+        }
+
+        //Set the MEP
+        wsdlOperation.setMessageExchangePattern(WSDL11MEPFinder
+                .getMEP(wsdl4jOperation));
+
+    }
+
+    private QName generateReferenceQname(Message wsdl4jMessage) {
+        QName referenceQName = null;
+        if (wsdl4jMessage.getParts().size() > 1) {
+            Map parts = wsdl4jMessage.getParts();
+            Iterator i = parts.keySet().iterator();
+            Part thisPart = (Part)(parts.get(i.next()));
+            if (thisPart.getElementName() != null) {
+                throw new RuntimeException(
+                        "We don't support multiple element parts in a WSDL message");
+            }
+
+            // Multipart Message
+
+            // NOTE (gdaniels) : It appears this code is taking multiple
+            // part declarations and "wrapping" them into a single schema
+            // type.  This is fine for RPC style stuff, but should not be
+            // happening for document style.
+            // TODO : sanity check
+
+            // Check whether this message parts have been made to a type
+            Iterator multipartListIterator = this.resolvedMultipartMessageList.iterator();
+            boolean multipartAlreadyResolved = false;
+            while (multipartListIterator.hasNext() &&
+                    !multipartAlreadyResolved) {
+                QName temp = (QName) multipartListIterator.next();
+                multipartAlreadyResolved =
+                        wsdl4jMessage.getQName().equals(temp);
+            }
+            if (multipartAlreadyResolved) {
+                //This message with multiple parts has resolved and a new type has been
+                //made out of it earlier.
+                //FIXME Actual element name should it be xs:, if yes change the qname added to the
+                //resolvedmessage list too.
+                referenceQName = wsdl4jMessage.getQName();
+            } else {
+                //Get the list of multiparts of the message and create a new Element
+                //out of it and add it to the schema.
+                Element schemaElement = null;
+                WSDLTypes types = womDefinition.getTypes();
+
+                //If types is null create a new one to be used for multipart 
+                //resolution if any.
+                if (null == types) {
+                    DocumentBuilder documentBuilder = null;
+                    try {
+                        documentBuilder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
+                    } catch (ParserConfigurationException e) {
+                        throw new RuntimeException(e);
+                    }
+                    Document newDoc = documentBuilder.newDocument();
+
+                    Element newSchemaElement = newDoc.createElementNS("http://www.w3.org/2001/XMLSchema", "schema");
+                    types = wsdlComponentFactory.createTypes();
+                    ExtensionFactory extensionFactory = wsdlComponentFactory.createExtensionFactory();
+                    org.apache.wsdl.extensions.Schema typesElement = (org.apache.wsdl.extensions.Schema) extensionFactory.getExtensionElement(
+                            ExtensionConstants.SCHEMA);
+                    typesElement.setElement(newSchemaElement);
+                    types.addExtensibilityElement(typesElement);
+                    this.womDefinition.setTypes(types);
+                }
+
+
+                //
+                Iterator schemaEIIterator = types.getExtensibilityElements()
+                        .iterator();
+                while (schemaEIIterator.hasNext()) {
+                    WSDLExtensibilityElement temp = (WSDLExtensibilityElement) schemaEIIterator.next();
+                    if (ExtensionConstants.SCHEMA.equals(temp.getType())) {
+                        schemaElement =
+                                ((org.apache.wsdl.extensions.Schema) temp).getElement();
+                        break;
+                    }
+                }
+
+                schemaElement.setAttribute(WSDLPump.XMLNS_AXIS2WRAPPED, schemaElement.getAttribute(WSDLPump.XSD_TARGETNAMESPACE));
+                Document doc = schemaElement.getOwnerDocument();
+                String name = wsdl4jMessage.getQName().getLocalPart();
+                Element newType = doc.createElementNS(WSDLPump.NAMESPACE_XMLSCHEMA, WSDLPump.XSD_COMPLEXTYPE);
+                newType.setAttribute(WSDLPump.XSD_NAME, name);
+
+
+                Element cmplxContent = doc.createElementNS(WSDLPump.NAMESPACE_XMLSCHEMA, WSDLPump.XSD_SEQUENCE);
+                Element child;
+                Element relaventElementInSchemaReferedByPart = null;
+                Iterator iterator = parts.keySet().iterator();
+                while (iterator.hasNext()) {
+                    Part part = (Part) parts.get(iterator.next());
+                    QName elementName = part.getElementName();
+                    if (null == elementName) {
+                        elementName = part.getTypeName();
+                    }
+
+                    NodeList allSchemaElements = schemaElement.getChildNodes();
+                    for(int idx = 0; idx < allSchemaElements.getLength(); idx++){
+                        if(allSchemaElements.item(idx).getNodeType() == Node.ELEMENT_NODE &&
+                                allSchemaElements.item(idx).getLocalName().equals(WSDLPump.XSD_ELEMENT)
+                                && elementName.getLocalPart().equals(((Element)allSchemaElements.item(idx)).getAttribute(WSDLPump.XSD_NAME))){
+                            relaventElementInSchemaReferedByPart = (Element)allSchemaElements.item(idx);
+                            break;
+                        }
+                    }
+                    child = doc.createElementNS(WSDLPump.NAMESPACE_XMLSCHEMA, WSDLPump.XSD_ELEMENT);
+                    child.setAttribute(WSDLPump.XSD_NAME, elementName.getLocalPart());
+                    if(null != relaventElementInSchemaReferedByPart){
+
+
+                        child.setAttribute(WSDLPump.XSD_TYPE,
+                                relaventElementInSchemaReferedByPart.getAttribute(WSDLPump.XSD_TYPE));
+                    }else{
+                        child.setAttribute(WSDLPump.XSD_TYPE, elementName.getLocalPart());
+                    }
+                    cmplxContent.appendChild(child);
+
+                }
+
+
+                newType.appendChild(cmplxContent);
+
+                schemaElement.appendChild(newType);
+
+
+                Element newElement = doc.createElementNS(WSDLPump.NAMESPACE_XMLSCHEMA, WSDLPump.XSD_ELEMENT);
+                newElement.setAttribute(WSDLPump.XSD_NAME,
+                        wsdl4jMessage.getQName().getLocalPart());
+                newElement.setAttribute(WSDLPump.XSD_TYPE,
+                        "axis2wrapped:"+wsdl4jMessage.getQName().getLocalPart());
+                schemaElement.appendChild(newElement);
+                //Now since  a new type is created augmenting the parts add the QName
+                //of the newly created type as the messageReference's name.
+                referenceQName = wsdl4jMessage.getQName();
+                //Add this message as a resolved message, so that incase some other
+                //operation refer to the same message the if above will take a hit
+                //and the cashed QName can be used instead of creating another type
+                //for the same message.
+
+                this.resolvedMultipartMessageList.add(wsdl4jMessage.getQName());
+
+            }
+        } else {
+            //Only one part so copy the QName of the referenced type.
+            Iterator outputIterator =
+                    wsdl4jMessage.getParts().values().iterator();
+            if (outputIterator.hasNext()) {
+                Part outPart = ((Part) outputIterator.next());
+                QName typeName;
+                if (null != (typeName = outPart.getTypeName())) {
+                    referenceQName = typeName;
+                } else {
+                    referenceQName = outPart.getElementName();
+                }
+            }
+        }
+        return referenceQName;
+    }
+
+    private void populateBindingOperation(
+            WSDLBindingOperation wsdlBindingOperation,
+            BindingOperation wsdl4jBindingOperation,
+            String nameSpaceOfTheBindingOperation, Definition wsdl4jDefinition) {
+
+        wsdlBindingOperation.setName(
+                new QName(nameSpaceOfTheBindingOperation,
+                        wsdl4jBindingOperation.getName()));
+
+        BindingInput wsdl4jInputBinding =
+                wsdl4jBindingOperation.getBindingInput();
+
+        if (null != wsdl4jInputBinding) {
+            WSDLBindingMessageReference wsdlInputBinding =
+                    this.wsdlComponentFactory.createWSDLBindingMessageReference();
+            wsdlInputBinding.setDirection(
+                    WSDLConstants.WSDL_MESSAGE_DIRECTION_IN);
+            this.copyExtensibleElements(
+                    wsdl4jInputBinding.getExtensibilityElements(),
+                    wsdlInputBinding, wsdl4jDefinition);
+            wsdlBindingOperation.setInput(wsdlInputBinding);
+        }
+
+        BindingOutput wsdl4jOutputBinding = wsdl4jBindingOperation
+                .getBindingOutput();
+        if (null != wsdl4jOutputBinding) {
+            WSDLBindingMessageReference wsdlOutputBinding = this.wsdlComponentFactory
+                    .createWSDLBindingMessageReference();
+            wsdlOutputBinding.setDirection(
+                    WSDLConstants.WSDL_MESSAGE_DIRECTION_OUT);
+
+            this.copyExtensibleElements(
+                    wsdl4jOutputBinding.getExtensibilityElements(),
+                    wsdlOutputBinding, null);
+            wsdlBindingOperation.setOutput(wsdlOutputBinding);
+        }
+
+
+        Map bindingFaults = wsdl4jBindingOperation.getBindingFaults();
+        Iterator keyIterator = bindingFaults.keySet().iterator();
+        while (keyIterator.hasNext()) {
+            BindingFault bindingFault = (BindingFault) bindingFaults.get(
+                    keyIterator.next());
+            WSDLBindingFault womBindingFault = this.wsdlComponentFactory.createBindingFault();
+            this.copyExtensibleElements(
+                    bindingFault.getExtensibilityElements(), womBindingFault, null);
+            wsdlBindingOperation.addOutFault(womBindingFault);
+        }
+
+    }
+
+    public void populatePorts(WSDLEndpoint wsdlEndpoint, Port wsdl4jPort,
+                              String targetNamspace) {
+        wsdlEndpoint.setName(new QName(targetNamspace, wsdl4jPort.getName()));
+
+        wsdlEndpoint.setBinding(
+                this.womDefinition.getBinding(
+                        wsdl4jPort
+                                .getBinding()
+                                .getQName()));
+
+    }
+
+    /**
+     * This method will fill up the gap of WSDL 1.1 and WSDL 2.0 w.r.t. the
+     * bound interface for the Service Component Defined in the WSDL 2.0. Logic
+     * being if there exist only one PortType in the WSDL 1.1 file then that
+     * will be set as the bound interface of the Service. If more than one
+     * Porttype exist in the WSDl 1.1 file this will create a dummy Interface
+     * with the available PortTypes and will return that interface so that it
+     * will inherit all those interfaces.
+     * <p/>
+     * Eventuall this will have to be fixed using user input since
+     *
+     * @param service
+     * @return wsdl interface
+     */
+    private WSDLInterface getBoundInterface(WSDLService service) {
+
+        // Throw an exception if there are no interfaces defined as at yet.
+        if (0 == this.womDefinition.getWsdlInterfaces().size())
+            throw new WSDLProcessingException("There are no "
+                    +
+                    "Interfaces/PortTypes identified in the current partially built"
+                    + "WOM");
+
+        //If there is only one Interface available hten return that because
+        // normally
+        // that interface must be the one to the service should get bound.
+        if (1 == this.womDefinition.getWsdlInterfaces().size())
+            return (WSDLInterface) this.womDefinition.getWsdlInterfaces()
+                    .values().iterator().next();
+
+        //If there are more than one interface available... For the time being
+        // create a
+        // new interface and set all those existing interfaces as
+        // superinterfaces of it
+        // and return.
+        WSDLInterface newBoundInterface = this.womDefinition.createInterface();
+        newBoundInterface.setName(
+                new QName(service.getNamespace(),
+                        service
+                                .getName()
+                                .getLocalPart()
+                                + BOUND_INTERFACE_NAME));
+        Iterator interfaceIterator = this.womDefinition.getWsdlInterfaces()
+                .values().iterator();
+        while (interfaceIterator.hasNext()) {
+            newBoundInterface
+                    .addSuperInterface(
+                            (WSDLInterface) interfaceIterator.next());
+        }
+        return newBoundInterface;
+    }
+
+    /**
+     * Get the Extensible elements form wsdl4jExtensibleElements
+     * <code>Vector</code> if any and copy them to <code>Component</code>
+     *
+
+
+     @param wsdl4jExtensibleElements
+      * @param component
+     * @param wsdl4jDefinition
+
+     */
+    private void copyExtensibleElements(List wsdl4jExtensibleElements,
+                                        Component component, Definition wsdl4jDefinition) {
+        Iterator iterator = wsdl4jExtensibleElements.iterator();
+        ExtensionFactory extensionFactory = this.wsdlComponentFactory
+                .createExtensionFactory();
+        while (iterator.hasNext()) {
+
+            ExtensibilityElement wsdl4jElement = (ExtensibilityElement) iterator
+                    .next();
+
+            if (wsdl4jElement instanceof UnknownExtensibilityElement) {
+                UnknownExtensibilityElement unknown = (UnknownExtensibilityElement) (wsdl4jElement);
+
+                //look for the SOAP 1.2 stuff here. WSDL4j does not understand SOAP 1.2 things
+                if (ExtensionConstants.SOAP_12_OPERATION.equals(unknown.getElementType())){
+                    org.apache.wsdl.extensions.SOAPOperation soapOperationExtensibiltyElement = (org.apache.wsdl.extensions.SOAPOperation) extensionFactory
+                            .getExtensionElement(wsdl4jElement.getElementType());
+                    Element element = unknown.getElement();
+                    soapOperationExtensibiltyElement.setSoapAction(element.getAttribute("soapAction"));
+                    soapOperationExtensibiltyElement.setStyle(element.getAttribute("style"));
+                    // soapActionRequired
+                    component.addExtensibilityElement(soapOperationExtensibiltyElement);
+                }else if (ExtensionConstants.SOAP_12_BODY.equals(unknown.getElementType())){
+                    org.apache.wsdl.extensions.SOAPBody soapBodyExtensibiltyElement = (org.apache.wsdl.extensions.SOAPBody) extensionFactory
+                            .getExtensionElement(wsdl4jElement.getElementType());
+                    Element element = unknown.getElement();
+                    soapBodyExtensibiltyElement.setUse(element.getAttribute("use"));
+                    soapBodyExtensibiltyElement.setNamespaceURI(element.getAttribute("namespace"));
+                    //encoding style
+                    component.addExtensibilityElement(soapBodyExtensibiltyElement);
+                }else if (ExtensionConstants.SOAP_12_HEADER.equals(unknown.getElementType())){
+                    org.apache.wsdl.extensions.SOAPHeader soapHeaderExtensibilityElement = (org.apache.wsdl.extensions.SOAPHeader) extensionFactory.getExtensionElement(
+                            unknown.getElementType());
+                    //right now there's no known header binding!. Ignore the copying of values for now
+                    component.addExtensibilityElement(soapHeaderExtensibilityElement);
+                }else if (ExtensionConstants.SOAP_12_BINDING.equals(unknown.getElementType())){
+                     org.apache.wsdl.extensions.SOAPBinding soapBindingExtensibiltyElement = (org.apache.wsdl.extensions.SOAPBinding) extensionFactory
+                            .getExtensionElement(wsdl4jElement.getElementType());
+                    Element element = unknown.getElement();
+                    soapBindingExtensibiltyElement.setTransportURI(element.getAttribute("transport"));
+                    soapBindingExtensibiltyElement.setStyle(element.getAttribute("style"));
+
+                    component.addExtensibilityElement(soapBindingExtensibiltyElement);
+                } else if (ExtensionConstants.SOAP_12_ADDRESS.equals(unknown.getElementType())){
+                     org.apache.wsdl.extensions.SOAPAddress soapAddressExtensibiltyElement = (org.apache.wsdl.extensions.SOAPAddress) extensionFactory
+                            .getExtensionElement(wsdl4jElement.getElementType());
+                    Element element = unknown.getElement();
+                    soapAddressExtensibiltyElement.setLocationURI(element.getAttribute("location"));
+                    component.addExtensibilityElement(soapAddressExtensibiltyElement);
+                }else{
+
+                    DefaultExtensibilityElement defaultExtensibilityElement = (DefaultExtensibilityElement) extensionFactory
+                            .getExtensionElement(wsdl4jElement.getElementType());
+                    defaultExtensibilityElement.setElement(unknown.getElement());
+                    Boolean required = unknown.getRequired();
+                    if (null != required) {
+                        defaultExtensibilityElement.setRequired(required.booleanValue());
+                    }
+                    component.addExtensibilityElement(defaultExtensibilityElement);
+                }
+
+
+            } else if (wsdl4jElement instanceof SOAPAddress) {
+                SOAPAddress soapAddress = (SOAPAddress) wsdl4jElement;
+                org.apache.wsdl.extensions.SOAPAddress soapAddressExtensibilityElement = (org.apache.wsdl.extensions.SOAPAddress) extensionFactory
+                        .getExtensionElement(soapAddress.getElementType());
+                soapAddressExtensibilityElement.setLocationURI(soapAddress
+                        .getLocationURI());
+                Boolean required = soapAddress.getRequired();
+                if (null != required) {
+                    soapAddressExtensibilityElement.setRequired(required.booleanValue());
+                }
+                component.addExtensibilityElement(soapAddressExtensibilityElement);
+            } else if (wsdl4jElement instanceof Schema) {
+                Schema schema = (Schema) wsdl4jElement;
+                //schema.getDocumentBaseURI()
+                //populate the imported schema stack
+                Stack schemaStack = new Stack();
+                //recursivly load the schema elements. The best thing is to push these into
+                //a stack and then pop from the other side
+                pushSchemaElement(schema, schemaStack);
+                org.apache.wsdl.extensions.Schema schemaExtensibilityElement = (org.apache.wsdl.extensions.Schema) extensionFactory.getExtensionElement(
+                        schema.getElementType());
+                schemaExtensibilityElement.setElement(schema.getElement());
+                schemaExtensibilityElement.setImportedSchemaStack(schemaStack);
+                Boolean required = schema.getRequired();
+                if (null != required) {
+                    schemaExtensibilityElement.setRequired(required.booleanValue());
+                }
+                //set the name of this Schema element
+                //todo this needs to be fixed
+                if(schema.getDocumentBaseURI() != null) {
+                    schemaExtensibilityElement.setName(new QName("",schema.getDocumentBaseURI()));
+                }
+                component.addExtensibilityElement(schemaExtensibilityElement);
+            } else if (SOAPConstants.Q_ELEM_SOAP_OPERATION.equals(
+                    wsdl4jElement.getElementType())) {
+                SOAPOperation soapOperation = (SOAPOperation) wsdl4jElement;
+                org.apache.wsdl.extensions.SOAPOperation soapOperationextensibilityElement = (org.apache.wsdl.extensions.SOAPOperation) extensionFactory.getExtensionElement(
+                        soapOperation.getElementType());
+                soapOperationextensibilityElement.setSoapAction(
+                        soapOperation.getSoapActionURI());
+                soapOperationextensibilityElement.setStyle(soapOperation.getStyle());
+                Boolean required = soapOperation.getRequired();
+                if (null != required) {
+                    soapOperationextensibilityElement.setRequired(required.booleanValue());
+                }
+                component.addExtensibilityElement(soapOperationextensibilityElement);
+            } else if (SOAPConstants.Q_ELEM_SOAP_BODY.equals(
+                    wsdl4jElement.getElementType())) {
+                SOAPBody soapBody = (SOAPBody) wsdl4jElement;
+                org.apache.wsdl.extensions.SOAPBody soapBodyExtensibilityElement = (org.apache.wsdl.extensions.SOAPBody) extensionFactory.getExtensionElement(
+                        soapBody.getElementType());
+                soapBodyExtensibilityElement.setNamespaceURI(
+                        soapBody.getNamespaceURI());
+                soapBodyExtensibilityElement.setUse(soapBody.getUse());
+                Boolean required = soapBody.getRequired();
+                if (null != required) {
+                    soapBodyExtensibilityElement.setRequired(required.booleanValue());
+                }
+
+                component.addExtensibilityElement(soapBodyExtensibilityElement);
+                //add the header
+            } else if (SOAPConstants.Q_ELEM_SOAP_HEADER.equals(
+                    wsdl4jElement.getElementType())) {
+                SOAPHeader soapHeader = (SOAPHeader) wsdl4jElement;
+                org.apache.wsdl.extensions.SOAPHeader soapHeaderExtensibilityElement = (org.apache.wsdl.extensions.SOAPHeader) extensionFactory.getExtensionElement(
+                        soapHeader.getElementType());
+                soapHeaderExtensibilityElement.setNamespaceURI(
+                        soapHeader.getNamespaceURI());
+                soapHeaderExtensibilityElement.setUse(soapHeader.getUse());
+                Boolean required = soapHeader.getRequired();
+                if (null != required) {
+                    soapHeaderExtensibilityElement.setRequired(required.booleanValue());
+                }
+                if (null!=wsdl4jDefinition){
+                    //find the relevant schema part from the messages
+                    Message msg = wsdl4jDefinition.getMessage(soapHeader.getMessage());
+                    Part msgPart = msg.getPart(soapHeader.getPart());
+                    soapHeaderExtensibilityElement.setElement(msgPart.getElementName());
+                }
+//                msgPart.
+                soapHeaderExtensibilityElement.setMessage(soapHeader.getMessage());
+
+                soapHeaderExtensibilityElement.setPart(soapHeader.getPart());
+                soapHeader.getMessage();
+                component.addExtensibilityElement(soapHeaderExtensibilityElement);
+            } else if (SOAPConstants.Q_ELEM_SOAP_BINDING.equals(
+                    wsdl4jElement.getElementType())) {
+                SOAPBinding soapBinding = (SOAPBinding) wsdl4jElement;
+                org.apache.wsdl.extensions.SOAPBinding soapBindingExtensibilityElement = (org.apache.wsdl.extensions.SOAPBinding) extensionFactory.getExtensionElement(
+                        soapBinding.getElementType());
+                soapBindingExtensibilityElement.setTransportURI(
+                        soapBinding.getTransportURI());
+                soapBindingExtensibilityElement.setStyle(soapBinding.getStyle());
+                Boolean required = soapBinding.getRequired();
+                if (null != required) {
+                    soapBindingExtensibilityElement.setRequired(required.booleanValue());
+                }
+                component.addExtensibilityElement(soapBindingExtensibilityElement);
+            } else {
+                 //	throw new AxisError(
+//						"An Extensible item "+wsdl4jElement.getElementType()+" went unparsed during WSDL Parsing");
+
+            }
+        }
+    }
+
+    /**
+     * Get the Extensible Attributes from wsdl4jExtensibilityAttribute
+     * <code>Map</code> if any and copy them to the <code>Component</code>
+     *
+     * @param wsdl4jExtensibilityAttributes
+     * @param component
+     */
+    private void copyExtensibilityAttribute(Map wsdl4jExtensibilityAttributes,
+                                            Component component) {
+        Iterator iterator = wsdl4jExtensibilityAttributes.keySet().iterator();
+        while (iterator.hasNext()) {
+            QName attributeName = (QName) iterator.next();
+            QName value = (QName) wsdl4jExtensibilityAttributes
+                    .get(attributeName);
+            WSDLExtensibilityAttribute attribute = this.wsdlComponentFactory
+                    .createWSDLExtensibilityAttribute();
+            attribute.setKey(attributeName);
+            attribute.setValue(value);
+            component.addExtensibleAttributes(attribute);
+        }
+    }
+}

Propchange: webservices/axis2/trunk/java/modules/wsdl/src/org/apache/axis2/wsdl/builder/wsdl4j/WSDLPump.java
------------------------------------------------------------------------------
    svn:eol-style = native