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 de...@apache.org on 2006/04/06 10:42:46 UTC

svn commit: r391936 [2/3] - in /webservices/axis2/trunk/java/modules: codegen/src/org/apache/axis2/rpc/receivers/ codegen/src/org/apache/axis2/wsdl/template/java/ core/src/org/apache/axis2/ core/src/org/apache/axis2/context/ core/src/org/apache/axis2/d...

Modified: webservices/axis2/trunk/java/modules/core/src/org/apache/axis2/description/WSDL2AxisServiceBuilder.java
URL: http://svn.apache.org/viewcvs/webservices/axis2/trunk/java/modules/core/src/org/apache/axis2/description/WSDL2AxisServiceBuilder.java?rev=391936&r1=391935&r2=391936&view=diff
==============================================================================
--- webservices/axis2/trunk/java/modules/core/src/org/apache/axis2/description/WSDL2AxisServiceBuilder.java (original)
+++ webservices/axis2/trunk/java/modules/core/src/org/apache/axis2/description/WSDL2AxisServiceBuilder.java Thu Apr  6 01:42:42 2006
@@ -21,33 +21,12 @@
 import org.w3c.dom.Element;
 import org.xml.sax.SAXException;
 
-import javax.wsdl.Binding;
-import javax.wsdl.BindingInput;
-import javax.wsdl.BindingOperation;
-import javax.wsdl.BindingOutput;
-import javax.wsdl.Definition;
-import javax.wsdl.Fault;
-import javax.wsdl.Import;
-import javax.wsdl.Input;
-import javax.wsdl.Message;
-import javax.wsdl.Operation;
-import javax.wsdl.OperationType;
-import javax.wsdl.Output;
-import javax.wsdl.Part;
-import javax.wsdl.Port;
-import javax.wsdl.PortType;
-import javax.wsdl.Service;
-import javax.wsdl.Types;
-import javax.wsdl.WSDLException;
+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.SOAPAddress;
-import javax.wsdl.extensions.soap.SOAPBinding;
-import javax.wsdl.extensions.soap.SOAPBody;
-import javax.wsdl.extensions.soap.SOAPHeader;
-import javax.wsdl.extensions.soap.SOAPOperation;
+import javax.wsdl.extensions.soap.*;
 import javax.wsdl.factory.WSDLFactory;
 import javax.wsdl.xml.WSDLReader;
 import javax.xml.namespace.QName;
@@ -56,14 +35,7 @@
 import javax.xml.parsers.ParserConfigurationException;
 import java.io.IOException;
 import java.io.InputStream;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.Stack;
-import java.util.Vector;
+import java.util.*;
 
 /*
  * Copyright 2004,2005 The Apache Software Foundation.
@@ -85,1223 +57,1217 @@
 
 public class WSDL2AxisServiceBuilder {
 
-	private static final String XMLSCHEMA_NAMESPACE_URI = Constants.URI_2001_SCHEMA_XSD;
+    private static final String XMLSCHEMA_NAMESPACE_URI = Constants.URI_2001_SCHEMA_XSD;
 
-	private static final String XMLSCHEMA_NAMESPACE_PREFIX = "xs";
+    private static final String XMLSCHEMA_NAMESPACE_PREFIX = "xs";
 
-	private static final String XML_SCHEMA_LOCAL_NAME = "schema";
+    private static final String XML_SCHEMA_LOCAL_NAME = "schema";
 
-	private static final String XML_SCHEMA_SEQUENCE_LOCAL_NAME = "sequence";
+    private static final String XML_SCHEMA_SEQUENCE_LOCAL_NAME = "sequence";
 
-	private static final String XML_SCHEMA_COMPLEX_TYPE_LOCAL_NAME = "complexType";
-
-	private static final String XML_SCHEMA_ELEMENT_LOCAL_NAME = "element";
-
-	private static final String XML_SCHEMA_IMPORT_LOCAL_NAME = "import";
-
-	private static final String XSD_NAME = "name";
-
-	private static final String XSD_TARGETNAMESPACE = "targetNamespace";
-
-	private static final String XMLNS_AXIS2WRAPPED = "xmlns:axis2wrapped";
-
-	private static final String AXIS2WRAPPED = "axis2wrapped";
-
-	private static final String XSD_TYPE = "type";
-
-	private static final String XSD_REF = "ref";
-
-	private static int nsCount = 0;
-
-	private Map resolvedRpcWrappedElementMap = new HashMap();
-
-	private static final String XSD_ELEMENT_FORM_DEFAULT = "elementFormDefault";
-
-	private static final String XSD_UNQUALIFIED = "unqualified";
-
-	private InputStream in;
-
-	private AxisService axisService;
-
-	private QName serviceName;
-
-	private String portName;
-
-	private QName bindingName;
-
-	public WSDL2AxisServiceBuilder(InputStream in, QName serviceName,
-			String portName) {
-		this.in = in;
-		this.serviceName = serviceName;
-		this.portName = portName;
-		this.axisService = new AxisService();
-	}
-
-	public WSDL2AxisServiceBuilder(InputStream in) {
-		this(in, null, null);
-	}
-
-	public WSDL2AxisServiceBuilder(QName bindingName, InputStream in) {
-		this.bindingName = bindingName;
-		this.in = in;
-	}
-
-	public AxisService populateService() throws AxisFault {
-		try {
-			Definition definition = readInTheWSDLFile(in);
-			//setting target name space
-			axisService.setTargetNamespace(definition.getTargetNamespace());
-			//adding ns in the original WSDL
-			axisService.setNameSpacesMap(definition.getNamespaces());
-			//scheam generation
-			processImports(definition);
-			Types wsdl4jTypes = definition.getTypes();
-			if (null != wsdl4jTypes) {
-				this.copyExtensibleElements(wsdl4jTypes
-						.getExtensibilityElements(), definition, axisService,
-						AxisExtensiblityElementWrapper.PORT);
-			}
-			Binding binding = findBinding(definition);
-			//////////////////(1.2) /////////////////////////////
-			// create new Schema extensions element for wrapping
-			Element[] schemaElements = generateWrapperSchema(definition, binding);
-			if (schemaElements != null && schemaElements.length > 0) {
-				for (int i = 0; i < schemaElements.length; i++) {
-					Element schemaElement = schemaElements[i];
-					if (schemaElement != null) {
-						System.out.println(schemaElement.getNamespaceURI());
-						ExtensionFactoryImpl extensionFactory = new ExtensionFactoryImpl();
-						org.apache.wsdl.extensions.Schema schemaExtensibilityElement = (org.apache.wsdl.extensions.Schema) extensionFactory
-								.getExtensionElement(ExtensionConstants.SCHEMA);
-						schemaExtensibilityElement.setElement(schemaElement);
-						axisService
-								.setSchema(getXMLSchema(schemaExtensibilityElement
-										.getElement()));
-					}
-				}
-			}
-			processBinding(binding, definition);
-			return axisService;
-		} catch (WSDLException e) {
-			throw new AxisFault(e);
-		}
-	}
-
-	private Binding findBinding(Definition dif) throws AxisFault {
-		Map services = dif.getServices();
-		Service service;
-		Binding binding = null;
-		Port port = null;
-		if (bindingName != null) {
-			binding = dif.getBinding(bindingName);
-			if (binding == null) {
-				throw new AxisFault(
-						"No biding found for the given biding name: "
-								+ bindingName.getLocalPart());
-			} else {
-				return binding;
-			}
-		}
-		if (serviceName != null) {
-			service = (Service) services.get(serviceName);
-			if (service == null) {
-				throw new AxisFault("Service not found the WSDL "
-						+ serviceName.getLocalPart());
-			}
-		} else {
-			if (services.size() > 0) {
-				service = (Service) services.values().toArray()[0];
-			} else {
-				throw new AxisFault("No service element found in the WSDL");
-			}
-		}
-		copyExtensibleElements(service.getExtensibilityElements(), dif,
-				axisService, AxisExtensiblityElementWrapper.PORT);
-		if (portName != null) {
-			port = service.getPort(portName);
-			if (port == null) {
-				throw new AxisFault("No port found for the given name :"
-						+ portName);
-			}
-		} else {
-			Map ports = service.getPorts();
-			if (ports != null && ports.size() > 0) {
-				port = (Port) ports.values().toArray()[0];
-			}
-		}
-		axisService.setName(service.getQName().getLocalPart());
-		if (port != null) {
-			copyExtensibleElements(port.getExtensibilityElements(), dif,
-					axisService, AxisExtensiblityElementWrapper.PORT);
-			binding = port.getBinding();
-		}
-		return binding;
-	}
-
-	private void processBinding(Binding binding, Definition dif)
-			throws AxisFault {
-		if (binding != null) {
-			PortType portType = binding.getPortType();
-
-			processPortType(portType, dif);
-
-			List list = binding.getBindingOperations();
-			copyExtensibleElements(binding.getExtensibilityElements(), dif,
-					axisService, AxisExtensiblityElementWrapper.PORT_BINDING);
-			for (int i = 0; i < list.size(); i++) {
-				BindingOperation wsdl4jBindingOperation = (BindingOperation) list
-						.get(i);
-				AxisOperation operation = axisService.getOperation(new QName(
-						wsdl4jBindingOperation.getName()));
-				copyExtensibleElements(wsdl4jBindingOperation
-						.getExtensibilityElements(), dif, operation,
-						AxisExtensiblityElementWrapper.PORT_BINDING);
-				ArrayList extElemntList = operation.getWsdlExtElements();
-				if (extElemntList != null) {
-					Iterator elements = extElemntList.iterator();
-					while (elements.hasNext()) {
-						AxisExtensiblityElementWrapper element = (AxisExtensiblityElementWrapper) elements
-								.next();
-						WSDLExtensibilityElement wsdlextElement = element
-								.getExtensibilityElement();
-						if (wsdlextElement instanceof org.apache.wsdl.extensions.SOAPOperation) {
-							org.apache.wsdl.extensions.SOAPOperation soapOperation = (org.apache.wsdl.extensions.SOAPOperation) wsdlextElement;
-							operation.setSoapAction(soapOperation
-									.getSoapAction());
-
-						}
-					}
-				}
-
-				// wsdl:binding -> wsdl:operation
-				populatePolicyInclude(PolicyInclude.BINDING_OPERATION_POLICY,
-						operation);
-
-				BindingInput bindingInput = wsdl4jBindingOperation
-						.getBindingInput();
-				BindingOutput bindingOutput = wsdl4jBindingOperation
-						.getBindingOutput();
-				String MEP = operation.getMessageExchangePattern();
-				if (bindingInput != null) {
-					if (WSDLConstants.MEP_URI_IN_ONLY.equals(MEP)
-							|| WSDLConstants.MEP_URI_IN_OPTIONAL_OUT
-									.equals(MEP)
-							|| WSDLConstants.MEP_URI_OUT_OPTIONAL_IN
-									.equals(MEP)
-							|| WSDLConstants.MEP_URI_ROBUST_OUT_ONLY
-									.equals(MEP)
-							|| WSDLConstants.MEP_URI_ROBUST_IN_ONLY.equals(MEP)
-							|| WSDLConstants.MEP_URI_IN_OUT.equals(MEP)) {
-						AxisMessage inMessage = operation
-								.getMessage(WSDLConstants.MESSAGE_LABEL_IN_VALUE);
-						copyExtensibleElements(bindingInput
-								.getExtensibilityElements(), dif, inMessage,
-								AxisExtensiblityElementWrapper.PORT_BINDING);
-
-						// wsdl:binding -> wsdl:operation - > wsdl:input
-						populatePolicyInclude(
-								PolicyInclude.BINDING_INPUT_POLICY, inMessage);
-
-					}
-				}
-				if (bindingOutput != null) {
-					if (WSDLConstants.MEP_URI_OUT_ONLY.equals(MEP)
-							|| WSDLConstants.MEP_URI_OUT_OPTIONAL_IN
-									.equals(MEP)
-							|| WSDLConstants.MEP_URI_IN_OPTIONAL_OUT
-									.equals(MEP)
-							|| WSDLConstants.MEP_URI_ROBUST_OUT_ONLY
-									.equals(MEP)
-							|| WSDLConstants.MEP_URI_ROBUST_IN_ONLY.equals(MEP)
-							|| WSDLConstants.MEP_URI_IN_OUT.equals(MEP)) {
-						AxisMessage outAxisMessage = operation
-								.getMessage(WSDLConstants.MESSAGE_LABEL_OUT_VALUE);
-						copyExtensibleElements(bindingOutput
-								.getExtensibilityElements(), dif,
-								outAxisMessage,
-								AxisExtensiblityElementWrapper.PORT_BINDING);
-
-						// wsdl:binding -> wsdl:operation -> wsdl:output
-						populatePolicyInclude(
-								PolicyInclude.BINDING_OUTPUT_POLICY,
-								outAxisMessage);
-
-					}
-				}
-			}
-
-		}
-	}
-
-	/**
-	 * Simply Copy information.
-	 *
-	 * @param wsdl4jPortType
-	 */
-	// FIXME Evaluate a way of injecting features and priperties with a general
-	// formatted input
-	private void processPortType(PortType wsdl4jPortType, Definition dif)
-			throws AxisFault {
-
-		//Copy the Attribute information items
-		//Copied with the Same QName so it will require no Query in Binding
-		//Coping.
-		Iterator wsdl4JOperationsIterator = wsdl4jPortType.getOperations()
-				.iterator();
-		Operation wsdl4jOperation;
-		while (wsdl4JOperationsIterator.hasNext()) {
-			wsdl4jOperation = (Operation) wsdl4JOperationsIterator.next();
-			copyExtensibleElements(wsdl4jOperation.getExtensibilityElements(),
-					dif, axisService, AxisExtensiblityElementWrapper.PORT_TYPE);
-
-			// wsdl:portType
-			populatePolicyInclude(PolicyInclude.PORT_TYPE_POLICY, axisService);
-
-			axisService.addOperation(populateOperations(wsdl4jOperation,
-					wsdl4jPortType.getQName().getNamespaceURI(), dif));
-		}
-	}
-
-	/////////////////////////////////////////////////////////////////////////////
-	//////////////////////////// Internal Component Copying ///////////////////
-	public AxisOperation populateOperations(Operation wsdl4jOperation,
-			String nameSpaceOfTheOperation, Definition dif) throws AxisFault {
-		//Copy Name Attribute
-		String MEP = getMEP(wsdl4jOperation);
-		AxisOperation axisOperation = AxisOperationFactory
-				.getOperationDescription(MEP);
-		axisOperation.setName(new QName(wsdl4jOperation.getName()));
-		copyExtensibleElements(wsdl4jOperation.getExtensibilityElements(), dif,
-				axisOperation, AxisExtensiblityElementWrapper.SERVICE);
-
-		// wsdl:portType -> wsdl:operation
-		populatePolicyInclude(PolicyInclude.OPERATION_POLICY, axisOperation);
-
-		Input wsdl4jInputMessage = wsdl4jOperation.getInput();
-		QName wrappedInputName = axisOperation.getName();
-		QName wrappedOutputName = new QName(wrappedInputName.getNamespaceURI(),
-				wrappedInputName.getLocalPart() + "Response", wrappedInputName
-						.getPrefix());
-		if (null != wsdl4jInputMessage) {
-			AxisMessage inMessage = axisOperation
-					.getMessage(WSDLConstants.MESSAGE_LABEL_IN_VALUE);
-			Message message = wsdl4jInputMessage.getMessage();
-			if (null != message) {
-				inMessage.setElementQName(generateReferenceQname(
-						wrappedInputName, message, findWrapppable(message)));
-				inMessage.setName(message.getQName().getLocalPart());
-				copyExtensibleElements(message.getExtensibilityElements(), dif,
-						inMessage, AxisExtensiblityElementWrapper.PORT_TYPE);
-
-				// wsdl:portType -> wsdl:operation -> wsdl:input
-				populatePolicyInclude(PolicyInclude.INPUT_POLICY, inMessage);
-			}
-		}
-		//Create an output message and add
-		Output wsdl4jOutputMessage = wsdl4jOperation.getOutput();
-		if (null != wsdl4jOutputMessage) {
-			AxisMessage outMessage = axisOperation
-					.getMessage(WSDLConstants.MESSAGE_LABEL_OUT_VALUE);
-			Message message = wsdl4jOutputMessage.getMessage();
-			if (null != message) {
-				outMessage.setElementQName(generateReferenceQname(
-						wrappedOutputName, message, findWrapppable(message)));
-				outMessage.setName(message.getQName().getLocalPart());
-				copyExtensibleElements(message.getExtensibilityElements(), dif,
-						outMessage, AxisExtensiblityElementWrapper.PORT_TYPE);
-
-				// wsdl:portType -> wsdl:operation -> wsdl:output
-				populatePolicyInclude(PolicyInclude.OUTPUT_POLICY, outMessage);
-			}
-		}
-
-		Map faults = wsdl4jOperation.getFaults();
-		Iterator faultKeyIterator = faults.keySet().iterator();
-
-		while (faultKeyIterator.hasNext()) {
-			Fault fault = (Fault) faults.get(faultKeyIterator.next());
-			AxisMessage faultyMessge = new AxisMessage();
-			Message faultMessage = fault.getMessage();
-			if (null != faultMessage) {
-				faultyMessge.setElementQName(generateReferenceQname(
-						faultMessage.getQName(), faultMessage,
-						findWrapppable(faultMessage)));
-				copyExtensibleElements(faultMessage.getExtensibilityElements(),
-						dif, faultyMessge,
-						AxisExtensiblityElementWrapper.PORT_TYPE);
-				faultyMessge.setName(faultMessage.getQName().getLocalPart());
-
-			}
-
-			axisOperation.setFaultMessages(faultyMessge);
-		}
-		return axisOperation;
-	}
-
-	/**
-	 * Generates a referenceQName
-	 *
-	 * @param wsdl4jMessage
-	 */
-	private QName generateReferenceQname(QName outerName,
-			Message wsdl4jMessage, boolean isWrappable) {
-		QName referenceQName = null;
-		if (isWrappable) {
-			//The schema for this should be already made ! Find the QName from
-			// the list
-			referenceQName = (QName) resolvedRpcWrappedElementMap.get(outerName
-					.getLocalPart());
-
-		} 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();
-				}
-			}
-		}
-		////////////////////////////////////////////////////////////////////////////////
-		//System.out.println("final referenceQName = " + referenceQName);
-		////////////////////////////////////////////////////////////////////////////////
-		return referenceQName;
-	}
-
-	private Element[] generateWrapperSchema(Definition wsdl4jDefinition,
-			Binding binding) {
-
-		List schemaElementList = new ArrayList();
-		String targetNamespaceUri = wsdl4jDefinition.getTargetNamespace();
-
-		/////////////////////////////////////////////////////////////////////////////////////////////
-		// if there are any bindings present then we have to process them. we
-		// have to generate a schema
-		// per binding (that is the safest option). if not we just resolve to
-		// the good old port type
-		// list, in which case we'll generate a schema per porttype
-		////////////////////////////////////////////////////////////////////////////////////////////
-
-		schemaElementList.add(createSchemaForPorttype(binding.getPortType(),
-				targetNamespaceUri, findWrapForceable(binding)));
-		return (Element[]) schemaElementList
-				.toArray(new Element[schemaElementList.size()]);
-	}
-
-	private Element createSchemaForPorttype(PortType porttype,
-			String targetNamespaceUri, boolean forceWrapping) {
-
-		//loop through the messages. We'll populate this map with the relevant
-		// messages
-		//from the operations
-		Map messagesMap = new HashMap();
-		Map inputOperationsMap = new HashMap();
-		Map outputOperationsMap = new HashMap();
-		Map faultyOperationsMap = new HashMap();
-		//this contains the required namespace imports. the key in this
-		//map would be the namaspace URI
-		Map namespaceImportsMap = new HashMap();
-		//generated complextypes. Keep in the list for writing later
-		//the key for the complexType map is the message QName
-		Map complexTypeElementsMap = new HashMap();
-		//generated Elements. Kep in the list for later writing
-		List elementElementsList = new ArrayList();
-		//list namespace prefix map. This map will include uri -> prefix
-		Map namespacePrefixMap = new HashMap();
-
-		////////////////////////////////////////////////////////////////////////////////////////////////////
-		// First thing is to populate the message map with the messages to
-		// process.
-		////////////////////////////////////////////////////////////////////////////////////////////////////
-
-		//we really need to do this for a single porttype!
-		List operations = porttype.getOperations();
-		Operation op;
-		for (int k = 0; k < operations.size(); k++) {
-			op = (Operation) operations.get(k);
-			Input input = op.getInput();
-			Message message;
-			if (input != null) {
-				message = input.getMessage();
-				messagesMap.put(message.getQName(), message);
-				inputOperationsMap.put(op.getName(), message);
-
-			}
-
-			Output output = op.getOutput();
-			if (output != null) {
-				message = output.getMessage();
-				messagesMap.put(message.getQName(), message);
-				outputOperationsMap.put(op.getName(), message);
-			}
-
-			Map faultMap = op.getFaults();
-			if (faultMap != null && faultMap.size() > 0) {
-				Iterator keys = faultMap.keySet().iterator();
-				while (keys.hasNext()) {
-					Object key = keys.next();
-					Fault fault = (Fault) faultMap.get(key);
-					if (fault != null) {
-						message = fault.getMessage();
-						messagesMap.put(message.getQName(), message);
-						faultyOperationsMap.put(key, message);
-					}
-				}
-			}
-		}
-
-		///////////////////////////////////////////////////////////////////////////////////////////////////////////////
-		//check whether there are messages that are wrappable. If there are no
-		// messages that are wrappable we'll
-		//just return null and endup this process. However we need to take the
-		// force flag into account here
-		///////////////////////////////////////////////////////////////////////////////////////////////////////////////
-
-		QName[] keys;
-		if (forceWrapping) {
-			//just take all the messages and wrap them, we've been told to
-			// force wrapping!
-			keys = (QName[]) messagesMap.keySet().toArray(
-					new QName[messagesMap.size()]);
-		} else {
-			//
-			QName[] allKeys = (QName[]) messagesMap.keySet().toArray(
-					new QName[messagesMap.size()]);
-			List wrappableMessageNames = new ArrayList();
-			boolean noMessagesTobeProcessed = true;
-			for (int i = 0; i < allKeys.length; i++) {
-				if (findWrapppable((Message) messagesMap.get(allKeys[i]))) {
-					noMessagesTobeProcessed = false;
-					//add that message to the list
-					wrappableMessageNames.add(allKeys[i]);
-				}
-			}
-			if (noMessagesTobeProcessed) {
-				return null;
-			}
-
-			keys = (QName[]) wrappableMessageNames
-					.toArray(new QName[wrappableMessageNames.size()]);
-		}
-
-		///////////////////////////////////////////////////////////////////////////////////////////////////////////////
-		// Now we have the message list to process - Process the whole list of
-		// messages at once
-		// since we need to generate one single schema
-		///////////////////////////////////////////////////////////////////////////////////////////////////////////////
-
-		List resolvedMessageQNames = new ArrayList();
-		//find the xsd prefix
-		String xsdPrefix = findSchemaPrefix();
-		Message wsdl4jMessage;
-		//DOM document that will be the ultimate creator
-		Document document = getDOMDocumentBuilder().newDocument();
-		for (int i = 0; i < keys.length; i++) {
-			wsdl4jMessage = (Message) messagesMap.get(keys[i]);
-			//No need to check the wrappable,
-
-			//This message is wrappabel. However we need to see whether the
-			// message is already
-			//resolved!
-			if (!resolvedMessageQNames.contains(wsdl4jMessage.getQName())) {
-				//This message has not been touched before!. So we can go ahead
-				// now
-				Map parts = wsdl4jMessage.getParts();
-				//add the complex type
-				String name = wsdl4jMessage.getQName().getLocalPart();
-				Element newComplexType = document.createElementNS(
-						XMLSCHEMA_NAMESPACE_URI, xsdPrefix + ":"
-								+ XML_SCHEMA_COMPLEX_TYPE_LOCAL_NAME);
-				newComplexType.setAttribute(XSD_NAME, name);
-
-				Element cmplxContentSequence = document.createElementNS(
-						XMLSCHEMA_NAMESPACE_URI, xsdPrefix + ":"
-								+ XML_SCHEMA_SEQUENCE_LOCAL_NAME);
-				Element child;
-				Iterator iterator = parts.keySet().iterator();
-				while (iterator.hasNext()) {
-					Part part = (Part) parts.get(iterator.next());
-					//the part name
-					String elementName = part.getName();
-					boolean isTyped = true;
-					//the type name
-					QName schemaTypeName;
-					if (part.getTypeName() != null) {
-						schemaTypeName = part.getTypeName();
-					} else if (part.getElementName() != null) {
-						schemaTypeName = part.getElementName();
-						isTyped = false;
-					} else {
-						throw new RuntimeException(" Unqualified Message part!");
-					}
-
-					child = document.createElementNS(XMLSCHEMA_NAMESPACE_URI,
-							xsdPrefix + ":" + XML_SCHEMA_ELEMENT_LOCAL_NAME);
-
-					String prefix;
-					if (XMLSCHEMA_NAMESPACE_URI.equals(schemaTypeName
-							.getNamespaceURI())) {
-						prefix = xsdPrefix;
-					} else {
-						//this schema is a third party one. So we need to have
-						// an import statement in our generated schema
-						String uri = schemaTypeName.getNamespaceURI();
-						if (!namespaceImportsMap.containsKey(uri)) {
-							//create Element for namespace import
-							Element namespaceImport = document.createElementNS(
-									XMLSCHEMA_NAMESPACE_URI, xsdPrefix + ":"
-											+ XML_SCHEMA_IMPORT_LOCAL_NAME);
-							namespaceImport.setAttribute("namespace", uri);
-							//add this to the map
-							namespaceImportsMap.put(uri, namespaceImport);
-							//we also need to associate this uri with a prefix
-							// and include that prefix
-							//in the schema's namspace declarations. So add
-							// theis particular namespace to the
-							//prefix map as well
-							prefix = getTemporaryNamespacePrefix();
-							namespacePrefixMap.put(uri, prefix);
-						} else {
-							//this URI should be already in the namspace prefix
-							// map
-							prefix = (String) namespacePrefixMap.get(uri);
-						}
-
-					}
-					// If it's from a type the element we need to add a name and
-					// the type
-					//if not it's the element reference
-					if (isTyped) {
-						child.setAttribute(XSD_NAME, elementName);
-						child.setAttribute(XSD_TYPE, prefix + ":"
-								+ schemaTypeName.getLocalPart());
-					} else {
-						child.setAttribute(XSD_REF, prefix + ":"
-								+ schemaTypeName.getLocalPart());
-					}
-					cmplxContentSequence.appendChild(child);
-				}
-				newComplexType.appendChild(cmplxContentSequence);
-				//add this newly created complextype to the list
-				complexTypeElementsMap.put(wsdl4jMessage.getQName(),
-						newComplexType);
-				resolvedMessageQNames.add(wsdl4jMessage.getQName());
-			}
-
-		}
-
-		Element elementDeclaration;
-
-		//loop through the input op map and generate the elements
-		String[] inputOperationtNames = (String[]) inputOperationsMap.keySet()
-				.toArray(new String[inputOperationsMap.size()]);
-		for (int j = 0; j < inputOperationtNames.length; j++) {
-			String inputOpName = inputOperationtNames[j];
-			elementDeclaration = document.createElementNS(
-					XMLSCHEMA_NAMESPACE_URI, xsdPrefix + ":"
-							+ XML_SCHEMA_ELEMENT_LOCAL_NAME);
-			elementDeclaration.setAttribute(XSD_NAME, inputOpName);
-
-			String typeValue = ((Message) inputOperationsMap.get(inputOpName))
-					.getQName().getLocalPart();
-			elementDeclaration.setAttribute(XSD_TYPE, AXIS2WRAPPED + ":"
-					+ typeValue);
-			elementElementsList.add(elementDeclaration);
-			resolvedRpcWrappedElementMap.put(inputOpName, new QName(
-					targetNamespaceUri, inputOpName, AXIS2WRAPPED));
-		}
-
-		//loop through the output op map and generate the elements
-		String[] outputOperationtNames = (String[]) outputOperationsMap
-				.keySet().toArray(new String[outputOperationsMap.size()]);
-		for (int j = 0; j < outputOperationtNames.length; j++) {
-
-			String baseoutputOpName = outputOperationtNames[j];
-			String outputOpName = baseoutputOpName + "Response";
-			elementDeclaration = document.createElementNS(
-					XMLSCHEMA_NAMESPACE_URI, xsdPrefix + ":"
-							+ XML_SCHEMA_ELEMENT_LOCAL_NAME);
-			elementDeclaration.setAttribute(XSD_NAME, outputOpName);
-			String typeValue = ((Message) outputOperationsMap
-					.get(baseoutputOpName)).getQName().getLocalPart();
-			elementDeclaration.setAttribute(XSD_TYPE, AXIS2WRAPPED + ":"
-					+ typeValue);
-			elementElementsList.add(elementDeclaration);
-			resolvedRpcWrappedElementMap.put(outputOpName, new QName(
-					targetNamespaceUri, outputOpName, AXIS2WRAPPED));
-
-		}
-
-		//loop through the faultoutput op map and generate the elements
-		String[] faultyOperationtNames = (String[]) faultyOperationsMap
-				.keySet().toArray(new String[faultyOperationsMap.size()]);
-		for (int j = 0; j < faultyOperationtNames.length; j++) {
-
-			String baseFaultOpName = faultyOperationtNames[j];
-			elementDeclaration = document.createElementNS(
-					XMLSCHEMA_NAMESPACE_URI, xsdPrefix + ":"
-							+ XML_SCHEMA_ELEMENT_LOCAL_NAME);
-			elementDeclaration.setAttribute(XSD_NAME, baseFaultOpName);
-			String typeValue = ((Message) faultyOperationsMap
-					.get(baseFaultOpName)).getQName().getLocalPart();
-			elementDeclaration.setAttribute(XSD_TYPE, AXIS2WRAPPED + ":"
-					+ typeValue);
-			elementElementsList.add(elementDeclaration);
-			resolvedRpcWrappedElementMap.put(baseFaultOpName, new QName(
-					targetNamespaceUri, baseFaultOpName, AXIS2WRAPPED));
-
-		}
-
-		//////////////////////////////////////////////////////////////////////////////////////////////
-		// Now we are done with processing the messages and generating the right
-		// schema object model
-		// time to write out the schema
-		//////////////////////////////////////////////////////////////////////////////////////////////
-
-		Element schemaElement = document.createElementNS(
-				XMLSCHEMA_NAMESPACE_URI, xsdPrefix + ":"
-						+ XML_SCHEMA_LOCAL_NAME);
-
-		//loop through the namespace declarations first
-		String[] nameSpaceDeclarationArray = (String[]) namespacePrefixMap
-				.keySet().toArray(new String[namespacePrefixMap.size()]);
-		for (int i = 0; i < nameSpaceDeclarationArray.length; i++) {
-			String s = nameSpaceDeclarationArray[i];
-			schemaElement.setAttributeNS("http://www.w3.org/2000/xmlns/",
-					"xmlns:" + namespacePrefixMap.get(s).toString(), s);
-
-		}
-
-		//add the targetNamespace
-
-		schemaElement.setAttributeNS("http://www.w3.org/2000/xmlns/",
-				XMLNS_AXIS2WRAPPED, targetNamespaceUri);
-		schemaElement.setAttribute(XSD_TARGETNAMESPACE, targetNamespaceUri);
-		schemaElement.setAttribute(XSD_ELEMENT_FORM_DEFAULT, XSD_UNQUALIFIED);
-
-		Element[] namespaceImports = (Element[]) namespaceImportsMap.values()
-				.toArray(new Element[namespaceImportsMap.size()]);
-		for (int i = 0; i < namespaceImports.length; i++) {
-			schemaElement.appendChild(namespaceImports[i]);
-
-		}
-
-		Element[] complexTypeElements = (Element[]) complexTypeElementsMap
-				.values().toArray(new Element[complexTypeElementsMap.size()]);
-		for (int i = 0; i < complexTypeElements.length; i++) {
-			schemaElement.appendChild(complexTypeElements[i]);
-
-		}
-
-		Element[] elementDeclarations = (Element[]) elementElementsList
-				.toArray(new Element[elementElementsList.size()]);
-		for (int i = 0; i < elementDeclarations.length; i++) {
-			schemaElement.appendChild(elementDeclarations[i]);
-
-		}
-
-		return schemaElement;
-	}
-
-	/**
-	 * The intention of this procedure is to process the imports. When
-	 * processing the imports the imported documents will be populating the
-	 * items in the main document recursivley
-	 *
-	 * @param wsdl4JDefinition
-	 */
-	private void processImports(Definition wsdl4JDefinition) {
-		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 (importedDef != null) {
-							processImports(importedDef);
-
-							//copy types
-							Types t = importedDef.getTypes();
-							List typesList = t.getExtensibilityElements();
-							for (int j = 0; j < typesList.size(); j++) {
-								Types types = wsdl4JDefinition.getTypes();
-								if (types == null) {
-									types = wsdl4JDefinition.createTypes();
-									wsdl4JDefinition.setTypes(types);
-								}
-								types
-										.addExtensibilityElement((ExtensibilityElement) typesList
-												.get(j));
-
-							}
-
-							//add messages
-							Map messagesMap = importedDef.getMessages();
-							wsdl4JDefinition.getMessages().putAll(messagesMap);
-
-							//add portypes
-							Map porttypeMap = importedDef.getPortTypes();
-							wsdl4JDefinition.getPortTypes().putAll(porttypeMap);
-
-							//add bindings
-							Map bindingMap = importedDef.getBindings();
-							wsdl4JDefinition.getBindings().putAll(bindingMap);
-
-						}
-
-					}
-				}
-			}
-		}
-	}
-
-	private XmlSchema getXMLSchema(Element element) {
-		XmlSchemaCollection schemaCollection = new XmlSchemaCollection();
-		Map nsMap = axisService.getNameSpacesMap();
-		Iterator keys = nsMap.keySet().iterator();
-		String key;
-		while (keys.hasNext()) {
-			key = (String) keys.next();
-			schemaCollection.mapNamespace(key, (String) nsMap.get(key));
-		}
-		return schemaCollection.read(element);
-	}
-
-	private Definition readInTheWSDLFile(InputStream in) throws WSDLException {
-
-		WSDLReader reader = WSDLFactory.newInstance().newWSDLReader();
-		reader.setFeature("javax.wsdl.importDocuments", true);
-		Document doc;
-		try {
-			doc = XMLUtils.newDocument(in);
-		} catch (ParserConfigurationException e) {
-			throw new WSDLException(WSDLException.PARSER_ERROR,
-					"Parser Configuration Error", e);
-		} catch (SAXException e) {
-			throw new WSDLException(WSDLException.PARSER_ERROR,
-					"Parser SAX Error", e);
-
-		} catch (IOException e) {
-			throw new WSDLException(WSDLException.INVALID_WSDL, "IO Error", e);
-		}
-
-		return reader.readWSDL(null, doc);
-	}
-
-	/**
-	 * Get the Extensible elements form wsdl4jExtensibleElements
-	 * <code>Vector</code> if any and copy them to <code>Component</code>
-	 *
-	 * @param wsdl4jExtensibleElements
-	 * @param description
-	 * @param location :
-	 *            where is the ext element (port , portype , biding)
-	 * @param wsdl4jDefinition
-	 */
-	private void copyExtensibleElements(List wsdl4jExtensibleElements,
-			Definition wsdl4jDefinition, AxisDescription description,
-			int location) {
-		Iterator iterator = wsdl4jExtensibleElements.iterator();
-		ExtensionFactoryImpl extensionFactory = new ExtensionFactoryImpl();
-		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
-					description
-							.setWsdlExtElements(new AxisExtensiblityElementWrapper(
-									location, 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
-					description
-							.setWsdlExtElements(new AxisExtensiblityElementWrapper(
-									location, 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
-					description
-							.setWsdlExtElements(new AxisExtensiblityElementWrapper(
-									location, 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"));
-					description
-							.setWsdlExtElements(new AxisExtensiblityElementWrapper(
-									location, 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"));
-					description
-							.setWsdlExtElements(new AxisExtensiblityElementWrapper(
-									location, soapAddressExtensibiltyElement));
-
-				} else if (ExtensionConstants.POLICY.equals(unknown
-						.getElementType())) {
-
-					PolicyExtensibilityElement policyExtensibilityElement = (PolicyExtensibilityElement) extensionFactory
-							.getExtensionElement(wsdl4jElement.getElementType());
-					DOMPolicyReader policyReader = (DOMPolicyReader) PolicyFactory
-							.getPolicyReader(PolicyFactory.DOM_POLICY_READER);
-					policyExtensibilityElement.setPolicyElement(policyReader
-							.readPolicy(unknown.getElement()));
-					description
-							.setWsdlExtElements(new AxisExtensiblityElementWrapper(
-									location, policyExtensibilityElement));
-
-				} else if (ExtensionConstants.POLICY_REFERENCE.equals(unknown
-						.getElementType())) {
-
-					PolicyExtensibilityElement policyExtensibilityElement = (PolicyExtensibilityElement) extensionFactory
-							.getExtensionElement(wsdl4jElement.getElementType());
-					DOMPolicyReader policyReader = (DOMPolicyReader) PolicyFactory
-							.getPolicyReader(PolicyFactory.DOM_POLICY_READER);
-					policyExtensibilityElement.setPolicyElement(policyReader
-							.readPolicyReference(unknown.getElement()));
-					description
-							.setWsdlExtElements(new AxisExtensiblityElementWrapper(
-									location, policyExtensibilityElement));
-
-				} else {
-
-					DefaultExtensibilityElement defaultExtensibilityElement = (DefaultExtensibilityElement) extensionFactory
-							.getExtensionElement(wsdl4jElement.getElementType());
-					defaultExtensibilityElement
-							.setElement(unknown.getElement());
-					Boolean required = unknown.getRequired();
-					if (null != required) {
-						defaultExtensibilityElement.setRequired(required
-								.booleanValue());
-					}
-					description
-							.setWsdlExtElements(new AxisExtensiblityElementWrapper(
-									location, 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());
-				}
-				description
-						.setWsdlExtElements(new AxisExtensiblityElementWrapper(
-								location, 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()));
-				}
-				axisService.setSchema(getXMLSchema(schemaExtensibilityElement
-						.getElement()));
-			} 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());
-				}
-				description
-						.setWsdlExtElements(new AxisExtensiblityElementWrapper(
-								location, 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());
-				}
-				description
-						.setWsdlExtElements(new AxisExtensiblityElementWrapper(
-								location, 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());
-				}
-				soapHeaderExtensibilityElement.setMessage(soapHeader
-						.getMessage());
-
-				soapHeaderExtensibilityElement.setPart(soapHeader.getPart());
-				soapHeader.getMessage();
-				description
-						.setWsdlExtElements(new AxisExtensiblityElementWrapper(
-								location, 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());
-				}
-				description
-						.setWsdlExtElements(new AxisExtensiblityElementWrapper(
-								location, soapBindingExtensibilityElement));
-			}
-		}
-	}
-
-	private void pushSchemaElement(Schema originalSchema, Stack stack) {
-		if (originalSchema == null) {
-			return;
-		}
-		stack.push(originalSchema.getElement());
-		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);
-				}
-
-			}
-		}
-	}
-
-	private boolean findWrapForceable(Binding binding) {
-		List extElements = binding.getExtensibilityElements();
-		for (int i = 0; i < extElements.size(); i++) {
-			if (extElements.get(i) instanceof SOAPBinding) {
-				SOAPBinding soapBinding = (SOAPBinding) extElements.get(i);
-				if ("rpc".equals(soapBinding.getStyle())) {
-					//oops - we've found a SOAPBinding that has a rpc style
-					//we better force the wrapping then
-					return true;
-				}
-			}
-		}
-
-		return false;
-	}
-
-	/**
-	 * Finds whether a given message is wrappable
-	 */
-	private boolean findWrapppable(Message message) {
-
-		// ********************************************************************************************
-		// Note
-		// We will not use the binding to set the wrappable/unwrappable state
-		// here. instead we'll look at the
-		// Messages for the following features
-		// 1. Messages with multiple parts -> We have no choice but to wrap
-		// 2. Messages with one part having a type attribute -> Again we have no
-		// choice but to wrap
-
-		// ********************************************************************************************
-		Map partsMap = message.getParts();
-		Iterator parts = partsMap.values().iterator();
-		boolean wrappable = partsMap.size() > 1;
-		Part part;
-		while (!wrappable && parts.hasNext()) {
-			part = (Part) parts.next();
-			wrappable = (part.getTypeName() != null) || wrappable;
-		}
-
-		return wrappable;
-	}
-
-	/**
-	 * Find the XML schema prefix
-	 */
-	private String findSchemaPrefix() {
-		String xsdPrefix = null;
-		Map declaredNameSpaces = axisService.getNameSpacesMap();
-		if (declaredNameSpaces.containsValue(XMLSCHEMA_NAMESPACE_URI)) {
-			//loop and find the prefix
-			Iterator it = declaredNameSpaces.keySet().iterator();
-			String key;
-			while (it.hasNext()) {
-				key = (String) it.next();
-				if (XMLSCHEMA_NAMESPACE_URI.equals(declaredNameSpaces.get(key))) {
-					xsdPrefix = key;
-					break;
-				}
-			}
-		} else {
-			xsdPrefix = XMLSCHEMA_NAMESPACE_PREFIX; //default prefix
-		}
-		return xsdPrefix;
-	}
-
-	/**
-	 * Utility method that returns a DOM Builder
-	 */
-	private DocumentBuilder getDOMDocumentBuilder() {
-		DocumentBuilder documentBuilder;
-		try {
-			DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory
-					.newInstance();
-			documentBuilderFactory.setNamespaceAware(true);
-			documentBuilder = documentBuilderFactory.newDocumentBuilder();
-		} catch (ParserConfigurationException e) {
-			throw new RuntimeException(e);
-		}
-		return documentBuilder;
-	}
-
-	/**
-	 */
-	private String getTemporaryNamespacePrefix() {
-		return "ns" + nsCount++;
-	}
-
-	private String getMEP(Operation operation) {
-		OperationType operationType = operation.getStyle();
-		if (null != operationType) {
-
-			if (operationType.equals(OperationType.REQUEST_RESPONSE))
-				return WSDLConstants.MEP_URI_IN_OUT;
-
-			if (operationType.equals(OperationType.ONE_WAY))
-				return WSDLConstants.MEP_URI_IN_ONLY;
-
-			if (operationType.equals(OperationType.NOTIFICATION))
-				return WSDLConstants.MEP_URI_OUT_ONLY;
-
-			if (operationType.equals(OperationType.SOLICIT_RESPONSE))
-				return WSDLConstants.MEP_URI_OUT_IN;
-		}
-		throw new WSDLProcessingException("Cannot Determine the MEP");
-	}
-
-	private void populatePolicyInclude(int location, AxisDescription description) {
-		PolicyInclude policyInclude = description.getPolicyInclude();
-		ArrayList wsdlExtElements = description.getWsdlExtElements();
-
-		if (wsdlExtElements != null) {
-			Object wsdlExtElement;
-			Object policyElement;
-
-			for (Iterator iterator = wsdlExtElements.iterator(); iterator
-					.hasNext();) {
-				wsdlExtElement = iterator.next();
-
-				if (wsdlExtElement instanceof PolicyExtensibilityElement) {
-					policyElement = ((PolicyExtensibilityElement) wsdlExtElement)
-							.getPolicyElement();
-
-					if (policyElement instanceof Policy) {
-						policyInclude.addPolicyElement(location,
-								(Policy) policyElement);
-
-					} else {
-						policyInclude.addPolicyRefElement(location,
-								(PolicyReference) policyElement);
-					}
-				}
-			}
+    private static final String XML_SCHEMA_COMPLEX_TYPE_LOCAL_NAME = "complexType";
+
+    private static final String XML_SCHEMA_ELEMENT_LOCAL_NAME = "element";
+
+    private static final String XML_SCHEMA_IMPORT_LOCAL_NAME = "import";
+
+    private static final String XSD_NAME = "name";
+
+    private static final String XSD_TARGETNAMESPACE = "targetNamespace";
+
+    private static final String XMLNS_AXIS2WRAPPED = "xmlns:axis2wrapped";
+
+    private static final String AXIS2WRAPPED = "axis2wrapped";
+
+    private static final String XSD_TYPE = "type";
+
+    private static final String XSD_REF = "ref";
+
+    private static int nsCount = 0;
+
+    private Map resolvedRpcWrappedElementMap = new HashMap();
+
+    private static final String XSD_ELEMENT_FORM_DEFAULT = "elementFormDefault";
+
+    private static final String XSD_UNQUALIFIED = "unqualified";
+
+    private InputStream in;
+
+    private AxisService axisService;
+
+    private QName serviceName;
+
+    private String portName;
+
+    public WSDL2AxisServiceBuilder(InputStream in, QName serviceName,
+                                   String portName) {
+        this.in = in;
+        this.serviceName = serviceName;
+        this.portName = portName;
+        this.axisService = new AxisService();
+    }
+
+    public WSDL2AxisServiceBuilder(InputStream in, AxisService service) {
+        this(in);
+        this.axisService = service;
+    }
+
+    public WSDL2AxisServiceBuilder(InputStream in) {
+        this(in, null, null);
+    }
+
+    public AxisService populateService() throws AxisFault {
+        try {
+            Definition dif = readInTheWSDLFile(in);
+            //setting target name space
+            axisService.setTargetNamespace(dif.getTargetNamespace());
+            //adding ns in the original WSDL
+            axisService.setNameSpacesMap(dif.getNamespaces());
+            //scheam generation
+            processImports(dif);
+            Types wsdl4jTypes = dif.getTypes();
+            if (null != wsdl4jTypes) {
+                this.copyExtensibleElements(wsdl4jTypes
+                        .getExtensibilityElements(), dif, axisService,
+                        AxisExtensiblityElementWrapper.PORT);
+            }
+            Binding binding = findBinding(dif);
+            //////////////////(1.2) /////////////////////////////
+            // create new Schema extensions element for wrapping
+            Element[] schemaElements = generateWrapperSchema(dif, binding);
+            if (schemaElements != null && schemaElements.length > 0) {
+                for (int i = 0; i < schemaElements.length; i++) {
+                    Element schemaElement = schemaElements[i];
+                    if (schemaElement != null) {
+                        System.out.println(schemaElement.getNamespaceURI());
+                        ExtensionFactoryImpl extensionFactory = new ExtensionFactoryImpl();
+                        org.apache.wsdl.extensions.Schema schemaExtensibilityElement = (org.apache.wsdl.extensions.Schema) extensionFactory
+                                .getExtensionElement(ExtensionConstants.SCHEMA);
+                        schemaExtensibilityElement.setElement(schemaElement);
+                        axisService
+                                .setSchema(getXMLSchema(schemaExtensibilityElement
+                                        .getElement()));
+                    }
+                }
+            }
+            processBinding(binding, dif);
+            return axisService;
+        } catch (WSDLException e) {
+            throw new AxisFault(e);
+        }
+    }
+
+
+    private Binding findBinding(Definition dif) throws AxisFault {
+        Map services = dif.getServices();
+        Service service;
+        Binding binding = null;
+        Port port = null;
+        if (serviceName != null) {
+            service = (Service) services.get(serviceName);
+            if (service == null) {
+                throw new AxisFault("Service not found the WSDL "
+                        + serviceName.getLocalPart());
+            }
+        } else {
+            if (services.size() > 0) {
+                service = (Service) services.values().toArray()[0];
+            } else {
+                throw new AxisFault("No service element found in the WSDL");
+            }
+        }
+        copyExtensibleElements(service.getExtensibilityElements(), dif,
+                axisService, AxisExtensiblityElementWrapper.PORT);
+        if (portName != null) {
+            port = service.getPort(portName);
+            if (port == null) {
+                throw new AxisFault("No port found for the given name :"
+                        + portName);
+            }
+        } else {
+            Map ports = service.getPorts();
+            if (ports != null && ports.size() > 0) {
+                port = (Port) ports.values().toArray()[0];
+            }
+        }
+        axisService.setName(service.getQName().getLocalPart());
+        if (port != null) {
+            copyExtensibleElements(port.getExtensibilityElements(), dif,
+                    axisService, AxisExtensiblityElementWrapper.PORT);
+            binding = port.getBinding();
+        }
+        return binding;
+    }
+
+
+    private void processBinding(Binding binding, Definition dif)
+            throws AxisFault {
+        if (binding != null) {
+            PortType portType = binding.getPortType();
+
+            processPortType(portType, dif);
+
+            List list = binding.getBindingOperations();
+            copyExtensibleElements(binding.getExtensibilityElements(), dif,
+                    axisService, AxisExtensiblityElementWrapper.PORT_BINDING);
+            for (int i = 0; i < list.size(); i++) {
+                BindingOperation wsdl4jBindingOperation = (BindingOperation) list
+                        .get(i);
+                AxisOperation operation = axisService.getOperation(new QName(
+                        wsdl4jBindingOperation.getName()));
+                copyExtensibleElements(wsdl4jBindingOperation
+                        .getExtensibilityElements(), dif, operation,
+                        AxisExtensiblityElementWrapper.PORT_BINDING);
+                ArrayList extElemntList = operation.getWsdlExtElements();
+                if (extElemntList != null) {
+                    Iterator elements = extElemntList.iterator();
+                    while (elements.hasNext()) {
+                        AxisExtensiblityElementWrapper element = (AxisExtensiblityElementWrapper) elements
+                                .next();
+                        WSDLExtensibilityElement wsdlextElement = element
+                                .getExtensibilityElement();
+                        if (wsdlextElement instanceof org.apache.wsdl.extensions.SOAPOperation) {
+                            org.apache.wsdl.extensions.SOAPOperation soapOperation = (org.apache.wsdl.extensions.SOAPOperation) wsdlextElement;
+                            operation.setSoapAction(soapOperation
+                                    .getSoapAction());
+
+                        }
+                    }
+                }
+
+                // wsdl:binding -> wsdl:operation
+                populatePolicyInclude(PolicyInclude.BINDING_OPERATION_POLICY,
+                        operation);
+
+                BindingInput bindingInput = wsdl4jBindingOperation
+                        .getBindingInput();
+                BindingOutput bindingOutput = wsdl4jBindingOperation
+                        .getBindingOutput();
+                String MEP = operation.getMessageExchangePattern();
+                if (bindingInput != null) {
+                    if (WSDLConstants.MEP_URI_IN_ONLY.equals(MEP)
+                            || WSDLConstants.MEP_URI_IN_OPTIONAL_OUT
+                            .equals(MEP)
+                            || WSDLConstants.MEP_URI_OUT_OPTIONAL_IN
+                            .equals(MEP)
+                            || WSDLConstants.MEP_URI_ROBUST_OUT_ONLY
+                            .equals(MEP)
+                            || WSDLConstants.MEP_URI_ROBUST_IN_ONLY.equals(MEP)
+                            || WSDLConstants.MEP_URI_IN_OUT.equals(MEP)) {
+                        AxisMessage inMessage = operation
+                                .getMessage(WSDLConstants.MESSAGE_LABEL_IN_VALUE);
+                        copyExtensibleElements(bindingInput
+                                .getExtensibilityElements(), dif, inMessage,
+                                AxisExtensiblityElementWrapper.PORT_BINDING);
+
+                        // wsdl:binding -> wsdl:operation - > wsdl:input
+                        populatePolicyInclude(
+                                PolicyInclude.BINDING_INPUT_POLICY, inMessage);
+
+                    }
+                }
+                if (bindingOutput != null) {
+                    if (WSDLConstants.MEP_URI_OUT_ONLY.equals(MEP)
+                            || WSDLConstants.MEP_URI_OUT_OPTIONAL_IN
+                            .equals(MEP)
+                            || WSDLConstants.MEP_URI_IN_OPTIONAL_OUT
+                            .equals(MEP)
+                            || WSDLConstants.MEP_URI_ROBUST_OUT_ONLY
+                            .equals(MEP)
+                            || WSDLConstants.MEP_URI_ROBUST_IN_ONLY.equals(MEP)
+                            || WSDLConstants.MEP_URI_IN_OUT.equals(MEP)) {
+                        AxisMessage outAxisMessage = operation
+                                .getMessage(WSDLConstants.MESSAGE_LABEL_OUT_VALUE);
+                        copyExtensibleElements(bindingOutput
+                                .getExtensibilityElements(), dif,
+                                outAxisMessage,
+                                AxisExtensiblityElementWrapper.PORT_BINDING);
+
+                        // wsdl:binding -> wsdl:operation -> wsdl:output
+                        populatePolicyInclude(
+                                PolicyInclude.BINDING_OUTPUT_POLICY,
+                                outAxisMessage);
+
+                    }
+                }
+            }
+
+        }
+    }
+
+    /**
+     * Simply Copy information.
+     *
+     * @param wsdl4jPortType
+     */
+    // FIXME Evaluate a way of injecting features and priperties with a general
+    // formatted input
+    private void processPortType(PortType wsdl4jPortType, Definition dif)
+            throws AxisFault {
+
+        //Copy the Attribute information items
+        //Copied with the Same QName so it will require no Query in Binding
+        //Coping.
+        Iterator wsdl4JOperationsIterator = wsdl4jPortType.getOperations()
+                .iterator();
+        Operation wsdl4jOperation;
+        while (wsdl4JOperationsIterator.hasNext()) {
+            wsdl4jOperation = (Operation) wsdl4JOperationsIterator.next();
+            copyExtensibleElements(wsdl4jOperation.getExtensibilityElements(),
+                    dif, axisService, AxisExtensiblityElementWrapper.PORT_TYPE);
+
+            // wsdl:portType
+            populatePolicyInclude(PolicyInclude.PORT_TYPE_POLICY, axisService);
+
+            axisService.addOperation(populateOperations(wsdl4jOperation,
+                    wsdl4jPortType.getQName().getNamespaceURI(), dif));
+        }
+    }
+
+    /////////////////////////////////////////////////////////////////////////////
+    //////////////////////////// Internal Component Copying ///////////////////
+    public AxisOperation populateOperations(Operation wsdl4jOperation,
+                                            String nameSpaceOfTheOperation,
+                                            Definition dif) throws AxisFault {
+        QName opName = new QName(wsdl4jOperation.getName());
+        //Copy Name Attribute
+        AxisOperation axisOperation = axisService.getOperation(opName);
+        if (axisOperation == null) {
+            String MEP = getMEP(wsdl4jOperation);
+            axisOperation = AxisOperationFactory
+                    .getOperationDescription(MEP);
+            axisOperation.setName(opName);
+        }
+        copyExtensibleElements(wsdl4jOperation.getExtensibilityElements(), dif,
+                axisOperation, AxisExtensiblityElementWrapper.SERVICE);
+
+        // wsdl:portType -> wsdl:operation
+        populatePolicyInclude(PolicyInclude.OPERATION_POLICY, axisOperation);
+
+        Input wsdl4jInputMessage = wsdl4jOperation.getInput();
+        QName wrappedInputName = axisOperation.getName();
+        QName wrappedOutputName = new QName(wrappedInputName.getNamespaceURI(),
+                wrappedInputName.getLocalPart() + "Response", wrappedInputName
+                .getPrefix());
+        if (null != wsdl4jInputMessage) {
+            AxisMessage inMessage = axisOperation
+                    .getMessage(WSDLConstants.MESSAGE_LABEL_IN_VALUE);
+            Message message = wsdl4jInputMessage.getMessage();
+            if (null != message) {
+                inMessage.setElementQName(generateReferenceQname(
+                        wrappedInputName, message, findWrapppable(message)));
+                inMessage.setName(message.getQName().getLocalPart());
+                copyExtensibleElements(message.getExtensibilityElements(), dif,
+                        inMessage, AxisExtensiblityElementWrapper.PORT_TYPE);
+
+                // wsdl:portType -> wsdl:operation -> wsdl:input
+                populatePolicyInclude(PolicyInclude.INPUT_POLICY, inMessage);
+            }
+        }
+        //Create an output message and add
+        Output wsdl4jOutputMessage = wsdl4jOperation.getOutput();
+        if (null != wsdl4jOutputMessage) {
+            AxisMessage outMessage = axisOperation
+                    .getMessage(WSDLConstants.MESSAGE_LABEL_OUT_VALUE);
+            Message message = wsdl4jOutputMessage.getMessage();
+            if (null != message) {
+                outMessage.setElementQName(generateReferenceQname(
+                        wrappedOutputName, message, findWrapppable(message)));
+                outMessage.setName(message.getQName().getLocalPart());
+                copyExtensibleElements(message.getExtensibilityElements(), dif,
+                        outMessage, AxisExtensiblityElementWrapper.PORT_TYPE);
+
+                // wsdl:portType -> wsdl:operation -> wsdl:output
+                populatePolicyInclude(PolicyInclude.OUTPUT_POLICY, outMessage);
+            }
+        }
+
+        Map faults = wsdl4jOperation.getFaults();
+        Iterator faultKeyIterator = faults.keySet().iterator();
+
+        while (faultKeyIterator.hasNext()) {
+            Fault fault = (Fault) faults.get(faultKeyIterator.next());
+            AxisMessage faultyMessge = new AxisMessage();
+            Message faultMessage = fault.getMessage();
+            if (null != faultMessage) {
+                faultyMessge.setElementQName(generateReferenceQname(
+                        faultMessage.getQName(), faultMessage,
+                        findWrapppable(faultMessage)));
+                copyExtensibleElements(faultMessage.getExtensibilityElements(),
+                        dif, faultyMessge,
+                        AxisExtensiblityElementWrapper.PORT_TYPE);
+                faultyMessge.setName(faultMessage.getQName().getLocalPart());
+
+            }
+
+            axisOperation.setFaultMessages(faultyMessge);
+        }
+        return axisOperation;
+    }
+
+    /**
+     * Generates a referenceQName
+     *
+     * @param wsdl4jMessage
+     */
+    private QName generateReferenceQname(QName outerName,
+                                         Message wsdl4jMessage, boolean isWrappable) {
+        QName referenceQName = null;
+        if (isWrappable) {
+            //The schema for this should be already made ! Find the QName from
+            // the list
+            referenceQName = (QName) resolvedRpcWrappedElementMap.get(outerName
+                    .getLocalPart());
+
+        } 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();
+                }
+            }
+        }
+        ////////////////////////////////////////////////////////////////////////////////
+        //System.out.println("final referenceQName = " + referenceQName);
+        ////////////////////////////////////////////////////////////////////////////////
+        return referenceQName;
+    }
+
+    private Element[] generateWrapperSchema(Definition wsdl4jDefinition,
+                                            Binding binding) {
+
+        List schemaElementList = new ArrayList();
+        String targetNamespaceUri = wsdl4jDefinition.getTargetNamespace();
+
+        /////////////////////////////////////////////////////////////////////////////////////////////
+        // if there are any bindings present then we have to process them. we
+        // have to generate a schema
+        // per binding (that is the safest option). if not we just resolve to
+        // the good old port type
+        // list, in which case we'll generate a schema per porttype
+        ////////////////////////////////////////////////////////////////////////////////////////////
+
+        schemaElementList.add(createSchemaForPorttype(binding.getPortType(),
+                targetNamespaceUri, findWrapForceable(binding)));
+        return (Element[]) schemaElementList
+                .toArray(new Element[schemaElementList.size()]);
+    }
+
+    private Element createSchemaForPorttype(PortType porttype,
+                                            String targetNamespaceUri, boolean forceWrapping) {
+
+        //loop through the messages. We'll populate this map with the relevant
+        // messages
+        //from the operations
+        Map messagesMap = new HashMap();
+        Map inputOperationsMap = new HashMap();
+        Map outputOperationsMap = new HashMap();
+        Map faultyOperationsMap = new HashMap();
+        //this contains the required namespace imports. the key in this
+        //map would be the namaspace URI
+        Map namespaceImportsMap = new HashMap();
+        //generated complextypes. Keep in the list for writing later
+        //the key for the complexType map is the message QName
+        Map complexTypeElementsMap = new HashMap();
+        //generated Elements. Kep in the list for later writing
+        List elementElementsList = new ArrayList();
+        //list namespace prefix map. This map will include uri -> prefix
+        Map namespacePrefixMap = new HashMap();
+
+        ////////////////////////////////////////////////////////////////////////////////////////////////////
+        // First thing is to populate the message map with the messages to
+        // process.
+        ////////////////////////////////////////////////////////////////////////////////////////////////////
+
+        //we really need to do this for a single porttype!
+        List operations = porttype.getOperations();
+        Operation op;
+        for (int k = 0; k < operations.size(); k++) {
+            op = (Operation) operations.get(k);
+            Input input = op.getInput();
+            Message message;
+            if (input != null) {
+                message = input.getMessage();
+                messagesMap.put(message.getQName(), message);
+                inputOperationsMap.put(op.getName(), message);
+            }
+
+            Output output = op.getOutput();
+            if (output != null) {
+                message = output.getMessage();
+                messagesMap.put(message.getQName(), message);
+                outputOperationsMap.put(op.getName(), message);
+            }
+
+            Map faultMap = op.getFaults();
+            if (faultMap != null && faultMap.size() > 0) {
+                Iterator keys = faultMap.keySet().iterator();
+                while (keys.hasNext()) {
+                    Object key = keys.next();
+                    Fault fault = (Fault) faultMap.get(key);
+                    if (fault != null) {
+                        message = fault.getMessage();
+                        messagesMap.put(message.getQName(), message);
+                        faultyOperationsMap.put(key, message);
+                    }
+                }
+            }
+        }
+
+        ///////////////////////////////////////////////////////////////////////////////////////////////////////////////
+        //check whether there are messages that are wrappable. If there are no
+        // messages that are wrappable we'll
+        //just return null and endup this process. However we need to take the
+        // force flag into account here
+        ///////////////////////////////////////////////////////////////////////////////////////////////////////////////
+
+        QName[] keys;
+        if (forceWrapping) {
+            //just take all the messages and wrap them, we've been told to
+            // force wrapping!
+            keys = (QName[]) messagesMap.keySet().toArray(
+                    new QName[messagesMap.size()]);
+        } else {
+            //
+            QName[] allKeys = (QName[]) messagesMap.keySet().toArray(
+                    new QName[messagesMap.size()]);
+            List wrappableMessageNames = new ArrayList();
+            boolean noMessagesTobeProcessed = true;
+            for (int i = 0; i < allKeys.length; i++) {
+                if (findWrapppable((Message) messagesMap.get(allKeys[i]))) {
+                    noMessagesTobeProcessed = false;
+                    //add that message to the list
+                    wrappableMessageNames.add(allKeys[i]);
+                }
+            }
+            if (noMessagesTobeProcessed) {
+                return null;
+            }
+
+            keys = (QName[]) wrappableMessageNames
+                    .toArray(new QName[wrappableMessageNames.size()]);
+        }
+
+        ///////////////////////////////////////////////////////////////////////////////////////////////////////////////
+        // Now we have the message list to process - Process the whole list of
+        // messages at once
+        // since we need to generate one single schema
+        ///////////////////////////////////////////////////////////////////////////////////////////////////////////////
+
+        List resolvedMessageQNames = new ArrayList();
+        //find the xsd prefix
+        String xsdPrefix = findSchemaPrefix();
+        Message wsdl4jMessage;
+        //DOM document that will be the ultimate creator
+        Document document = getDOMDocumentBuilder().newDocument();
+        for (int i = 0; i < keys.length; i++) {
+            wsdl4jMessage = (Message) messagesMap.get(keys[i]);
+            //No need to check the wrappable,
+
+            //This message is wrappabel. However we need to see whether the
+            // message is already
+            //resolved!
+            if (!resolvedMessageQNames.contains(wsdl4jMessage.getQName())) {
+                //This message has not been touched before!. So we can go ahead
+                // now
+                Map parts = wsdl4jMessage.getParts();
+                //add the complex type
+                String name = wsdl4jMessage.getQName().getLocalPart();
+                Element newComplexType = document.createElementNS(
+                        XMLSCHEMA_NAMESPACE_URI, xsdPrefix + ":"
+                        + XML_SCHEMA_COMPLEX_TYPE_LOCAL_NAME);
+                newComplexType.setAttribute(XSD_NAME, name);
+
+                Element cmplxContentSequence = document.createElementNS(
+                        XMLSCHEMA_NAMESPACE_URI, xsdPrefix + ":"
+                        + XML_SCHEMA_SEQUENCE_LOCAL_NAME);
+                Element child;
+                Iterator iterator = parts.keySet().iterator();
+                while (iterator.hasNext()) {
+                    Part part = (Part) parts.get(iterator.next());
+                    //the part name
+                    String elementName = part.getName();
+                    boolean isTyped = true;
+                    //the type name
+                    QName schemaTypeName;
+                    if (part.getTypeName() != null) {
+                        schemaTypeName = part.getTypeName();
+                    } else if (part.getElementName() != null) {
+                        schemaTypeName = part.getElementName();
+                        isTyped = false;
+                    } else {
+                        throw new RuntimeException(" Unqualified Message part!");
+                    }
+
+                    child = document.createElementNS(XMLSCHEMA_NAMESPACE_URI,
+                            xsdPrefix + ":" + XML_SCHEMA_ELEMENT_LOCAL_NAME);
+
+                    String prefix;
+                    if (XMLSCHEMA_NAMESPACE_URI.equals(schemaTypeName
+                            .getNamespaceURI())) {
+                        prefix = xsdPrefix;
+                    } else {
+                        //this schema is a third party one. So we need to have
+                        // an import statement in our generated schema
+                        String uri = schemaTypeName.getNamespaceURI();
+                        if (!namespaceImportsMap.containsKey(uri)) {
+                            //create Element for namespace import
+                            Element namespaceImport = document.createElementNS(
+                                    XMLSCHEMA_NAMESPACE_URI, xsdPrefix + ":"
+                                    + XML_SCHEMA_IMPORT_LOCAL_NAME);
+                            namespaceImport.setAttribute("namespace", uri);
+                            //add this to the map
+                            namespaceImportsMap.put(uri, namespaceImport);
+                            //we also need to associate this uri with a prefix
+                            // and include that prefix
+                            //in the schema's namspace declarations. So add
+                            // theis particular namespace to the
+                            //prefix map as well
+                            prefix = getTemporaryNamespacePrefix();
+                            namespacePrefixMap.put(uri, prefix);
+                        } else {
+                            //this URI should be already in the namspace prefix
+                            // map
+                            prefix = (String) namespacePrefixMap.get(uri);
+                        }
+
+                    }
+                    // If it's from a type the element we need to add a name and
+                    // the type
+                    //if not it's the element reference
+                    if (isTyped) {
+                        child.setAttribute(XSD_NAME, elementName);
+                        child.setAttribute(XSD_TYPE, prefix + ":"
+                                + schemaTypeName.getLocalPart());
+                    } else {
+                        child.setAttribute(XSD_REF, prefix + ":"
+                                + schemaTypeName.getLocalPart());
+                    }
+                    cmplxContentSequence.appendChild(child);
+                }
+                newComplexType.appendChild(cmplxContentSequence);
+                //add this newly created complextype to the list
+                complexTypeElementsMap.put(wsdl4jMessage.getQName(),
+                        newComplexType);
+                resolvedMessageQNames.add(wsdl4jMessage.getQName());
+            }
+
+        }
+
+        Element elementDeclaration;
+
+        //loop through the input op map and generate the elements
+        String[] inputOperationtNames = (String[]) inputOperationsMap.keySet()
+                .toArray(new String[inputOperationsMap.size()]);
+        for (int j = 0; j < inputOperationtNames.length; j++) {
+            String inputOpName = inputOperationtNames[j];
+            elementDeclaration = document.createElementNS(
+                    XMLSCHEMA_NAMESPACE_URI, xsdPrefix + ":"
+                    + XML_SCHEMA_ELEMENT_LOCAL_NAME);
+            elementDeclaration.setAttribute(XSD_NAME, inputOpName);
+
+            String typeValue = ((Message) inputOperationsMap.get(inputOpName))
+                    .getQName().getLocalPart();
+            elementDeclaration.setAttribute(XSD_TYPE, AXIS2WRAPPED + ":"
+                    + typeValue);
+            elementElementsList.add(elementDeclaration);
+            resolvedRpcWrappedElementMap.put(inputOpName, new QName(
+                    targetNamespaceUri, inputOpName, AXIS2WRAPPED));
+        }
+
+        //loop through the output op map and generate the elements
+        String[] outputOperationtNames = (String[]) outputOperationsMap
+                .keySet().toArray(new String[outputOperationsMap.size()]);
+        for (int j = 0; j < outputOperationtNames.length; j++) {
+
+            String baseoutputOpName = outputOperationtNames[j];
+            String outputOpName = baseoutputOpName + "Response";
+            elementDeclaration = document.createElementNS(
+                    XMLSCHEMA_NAMESPACE_URI, xsdPrefix + ":"
+                    + XML_SCHEMA_ELEMENT_LOCAL_NAME);
+            elementDeclaration.setAttribute(XSD_NAME, outputOpName);
+            String typeValue = ((Message) outputOperationsMap
+                    .get(baseoutputOpName)).getQName().getLocalPart();
+            elementDeclaration.setAttribute(XSD_TYPE, AXIS2WRAPPED + ":"
+                    + typeValue);
+            elementElementsList.add(elementDeclaration);
+            resolvedRpcWrappedElementMap.put(outputOpName, new QName(
+                    targetNamespaceUri, outputOpName, AXIS2WRAPPED));
+
+        }
+
+        //loop through the faultoutput op map and generate the elements
+        String[] faultyOperationtNames = (String[]) faultyOperationsMap
+                .keySet().toArray(new String[faultyOperationsMap.size()]);
+        for (int j = 0; j < faultyOperationtNames.length; j++) {
+
+            String baseFaultOpName = faultyOperationtNames[j];
+            elementDeclaration = document.createElementNS(
+                    XMLSCHEMA_NAMESPACE_URI, xsdPrefix + ":"
+                    + XML_SCHEMA_ELEMENT_LOCAL_NAME);
+            elementDeclaration.setAttribute(XSD_NAME, baseFaultOpName);
+            String typeValue = ((Message) faultyOperationsMap
+                    .get(baseFaultOpName)).getQName().getLocalPart();
+            elementDeclaration.setAttribute(XSD_TYPE, AXIS2WRAPPED + ":"
+                    + typeValue);
+            elementElementsList.add(elementDeclaration);
+            resolvedRpcWrappedElementMap.put(baseFaultOpName, new QName(
+                    targetNamespaceUri, baseFaultOpName, AXIS2WRAPPED));
+
+        }
+
+        //////////////////////////////////////////////////////////////////////////////////////////////
+        // Now we are done with processing the messages and generating the right
+        // schema object model
+        // time to write out the schema
+        //////////////////////////////////////////////////////////////////////////////////////////////
+
+        Element schemaElement = document.createElementNS(
+                XMLSCHEMA_NAMESPACE_URI, xsdPrefix + ":"
+                + XML_SCHEMA_LOCAL_NAME);
+
+        //loop through the namespace declarations first
+        String[] nameSpaceDeclarationArray = (String[]) namespacePrefixMap
+                .keySet().toArray(new String[namespacePrefixMap.size()]);
+        for (int i = 0; i < nameSpaceDeclarationArray.length; i++) {
+            String s = nameSpaceDeclarationArray[i];
+            schemaElement.setAttributeNS("http://www.w3.org/2000/xmlns/",
+                    "xmlns:" + namespacePrefixMap.get(s).toString(), s);
+
+        }
+
+        //add the targetNamespace
+
+        schemaElement.setAttributeNS("http://www.w3.org/2000/xmlns/",
+                XMLNS_AXIS2WRAPPED, targetNamespaceUri);
+        schemaElement.setAttribute(XSD_TARGETNAMESPACE, targetNamespaceUri);
+        schemaElement.setAttribute(XSD_ELEMENT_FORM_DEFAULT, XSD_UNQUALIFIED);
+
+        Element[] namespaceImports = (Element[]) namespaceImportsMap.values()
+                .toArray(new Element[namespaceImportsMap.size()]);
+        for (int i = 0; i < namespaceImports.length; i++) {
+            schemaElement.appendChild(namespaceImports[i]);
+
+        }
+
+        Element[] complexTypeElements = (Element[]) complexTypeElementsMap
+                .values().toArray(new Element[complexTypeElementsMap.size()]);
+        for (int i = 0; i < complexTypeElements.length; i++) {
+            schemaElement.appendChild(complexTypeElements[i]);
+
+        }
+
+        Element[] elementDeclarations = (Element[]) elementElementsList
+                .toArray(new Element[elementElementsList.size()]);
+        for (int i = 0; i < elementDeclarations.length; i++) {
+            schemaElement.appendChild(elementDeclarations[i]);
+
+        }
+
+        return schemaElement;
+    }
+
+    /**
+     * The intention of this procedure is to process the imports. When
+     * processing the imports the imported documents will be populating the
+     * items in the main document recursivley
+     *
+     * @param wsdl4JDefinition
+     */
+    private void processImports(Definition wsdl4JDefinition) {
+        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 (importedDef != null) {
+                            processImports(importedDef);
+
+                            //copy types
+                            Types t = importedDef.getTypes();
+                            List typesList = t.getExtensibilityElements();
+                            for (int j = 0; j < typesList.size(); j++) {
+                                Types types = wsdl4JDefinition.getTypes();
+                                if (types == null) {
+                                    types = wsdl4JDefinition.createTypes();
+                                    wsdl4JDefinition.setTypes(types);
+                                }
+                                types
+                                        .addExtensibilityElement((ExtensibilityElement) typesList
+                                                .get(j));
+
+                            }
+
+                            //add messages
+                            Map messagesMap = importedDef.getMessages();
+                            wsdl4JDefinition.getMessages().putAll(messagesMap);
+
+                            //add portypes
+                            Map porttypeMap = importedDef.getPortTypes();
+                            wsdl4JDefinition.getPortTypes().putAll(porttypeMap);
+
+                            //add bindings
+                            Map bindingMap = importedDef.getBindings();
+                            wsdl4JDefinition.getBindings().putAll(bindingMap);
+
+                        }
+
+                    }
+                }
+            }
+        }
+    }
+
+    private XmlSchema getXMLSchema(Element element) {
+        XmlSchemaCollection schemaCollection = new XmlSchemaCollection();
+        Map nsMap = axisService.getNameSpacesMap();
+        Iterator keys = nsMap.keySet().iterator();
+        String key;
+        while (keys.hasNext()) {
+            key = (String) keys.next();
+            schemaCollection.mapNamespace(key, (String) nsMap.get(key));
+        }
+        return schemaCollection.read(element);
+    }
+
+    private Definition readInTheWSDLFile(InputStream in) throws WSDLException {
+
+        WSDLReader reader = WSDLFactory.newInstance().newWSDLReader();
+        reader.setFeature("javax.wsdl.importDocuments", true);
+        Document doc;
+        try {
+            doc = XMLUtils.newDocument(in);
+        } catch (ParserConfigurationException e) {
+            throw new WSDLException(WSDLException.PARSER_ERROR,
+                    "Parser Configuration Error", e);
+        } catch (SAXException e) {
+            throw new WSDLException(WSDLException.PARSER_ERROR,
+                    "Parser SAX Error", e);
+
+        } catch (IOException e) {
+            throw new WSDLException(WSDLException.INVALID_WSDL, "IO Error", e);
+        }
+
+        return reader.readWSDL(null, doc);
+    }
+
+    /**
+     * Get the Extensible elements form wsdl4jExtensibleElements
+     * <code>Vector</code> if any and copy them to <code>Component</code>
+     *
+     * @param wsdl4jExtensibleElements
+     * @param description
+     * @param location                 :
+     *                                 where is the ext element (port , portype , biding)
+     * @param wsdl4jDefinition
+     */
+    private void copyExtensibleElements(List wsdl4jExtensibleElements,
+                                        Definition wsdl4jDefinition, AxisDescription description,
+                                        int location) {
+        Iterator iterator = wsdl4jExtensibleElements.iterator();
+        ExtensionFactoryImpl extensionFactory = new ExtensionFactoryImpl();
+        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

[... 385 lines stripped ...]