You are viewing a plain text version of this content. The canonical link for it is here.
Posted to axis-cvs@ws.apache.org by sa...@apache.org on 2005/12/21 11:23:33 UTC

svn commit: r358255 - /webservices/axis2/trunk/java/modules/core/src/org/apache/axis2/deployment/AxisServiceBuilder.java

Author: sanka
Date: Wed Dec 21 02:23:27 2005
New Revision: 358255

URL: http://svn.apache.org/viewcvs?rev=358255&view=rev
Log:
Added: Generating wrapper elements for Messages with more than one Part

Modified:
    webservices/axis2/trunk/java/modules/core/src/org/apache/axis2/deployment/AxisServiceBuilder.java

Modified: webservices/axis2/trunk/java/modules/core/src/org/apache/axis2/deployment/AxisServiceBuilder.java
URL: http://svn.apache.org/viewcvs/webservices/axis2/trunk/java/modules/core/src/org/apache/axis2/deployment/AxisServiceBuilder.java?rev=358255&r1=358254&r2=358255&view=diff
==============================================================================
--- webservices/axis2/trunk/java/modules/core/src/org/apache/axis2/deployment/AxisServiceBuilder.java (original)
+++ webservices/axis2/trunk/java/modules/core/src/org/apache/axis2/deployment/AxisServiceBuilder.java Wed Dec 21 02:23:27 2005
@@ -16,6 +16,33 @@
 
 package org.apache.axis2.deployment;
 
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
+
+import javax.wsdl.Binding;
+import javax.wsdl.BindingOperation;
+import javax.wsdl.Definition;
+import javax.wsdl.Input;
+import javax.wsdl.Message;
+import javax.wsdl.Operation;
+import javax.wsdl.Output;
+import javax.wsdl.Part;
+import javax.wsdl.Port;
+import javax.wsdl.Service;
+import javax.wsdl.Types;
+import javax.wsdl.WSDLException;
+import javax.wsdl.extensions.ExtensibilityElement;
+import javax.wsdl.extensions.schema.Schema;
+import javax.wsdl.extensions.soap.SOAPBinding;
+import javax.wsdl.factory.WSDLFactory;
+import javax.wsdl.xml.WSDLReader;
+import javax.xml.namespace.QName;
+import javax.xml.parsers.DocumentBuilderFactory;
+import javax.xml.parsers.ParserConfigurationException;
+
 import org.apache.axis2.AxisFault;
 import org.apache.axis2.description.AxisMessage;
 import org.apache.axis2.description.AxisOperation;
@@ -30,18 +57,6 @@
 import org.w3c.dom.Element;
 import org.xml.sax.SAXException;
 
-import javax.wsdl.*;
-import javax.wsdl.extensions.ExtensibilityElement;
-import javax.wsdl.extensions.schema.Schema;
-import javax.wsdl.extensions.soap.SOAPBinding;
-import javax.wsdl.factory.WSDLFactory;
-import javax.wsdl.xml.WSDLReader;
-import javax.xml.parsers.ParserConfigurationException;
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.Iterator;
-import java.util.Map;
-
 /**
  * AxisServiceBuilder builds an AxisService using a WSDL document which is feed
  * as a javax.wsdl.Definition or as an InputStream. If there are multiple
@@ -51,6 +66,26 @@
  */
 public class AxisServiceBuilder {
 
+    private static final String XMLSCHEMA_NAMESPACE_URI = "http://www.w3.org/2001/XMLSchema";
+
+    private static final String XMLSCHEMA_NAMESPACE_PREFIX = "xs";
+
+    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_TYPE = "type";
+
+    private static final String XSD_REF = "ref";
+
+    private int nsCount = 1;
+
     public AxisService getAxisService(InputStream wsdlInputStream)
             throws WSDLException {
         WSDLReader reader = WSDLFactory.newInstance().newWSDLReader();
@@ -127,21 +162,48 @@
                 AxisOperation axisOperation = AxisOperationFactory
                         .getAxisOperation(getMessageExchangePattern(bindingOperation));
 
+                // setting operation name
+                axisOperation.setName(new QName(operation.getName()));
+
                 // Input
                 Input input = operation.getInput();
                 AxisMessage inAxisMsg = axisOperation
                         .getMessage(WSDLConstants.MESSAGE_LABEL_IN_VALUE);
                 Message inMsg = input.getMessage();
-                inAxisMsg.setElementQName(inMsg.getQName());
+
+                if (wrapperble(inMsg)) {
+                    Element wrapper = getWrappedElement(definition, inMsg);
+                    inAxisMsg.setElementQName(new QName(wrapper
+                            .getNamespaceURI(), wrapper.getLocalName(), wrapper
+                            .getPrefix()));
+
+                    // TODO
+                    // axisService.addSchema(getXmlSchema(wrapper));
+
+                } else {
+                    inAxisMsg.setElementQName(inMsg.getQName());
+                }
 
                 // Output
                 Output output = operation.getOutput();
 
                 if (output != null) {
+
                     AxisMessage outAxisMsg = axisOperation
                             .getMessage(WSDLConstants.MESSAGE_LABEL_OUT_VALUE);
                     Message outMsg = output.getMessage();
-                    outAxisMsg.setElementQName(outMsg.getQName());
+
+                    if (wrapperble(outMsg)) {
+                        Element wrapper = getWrappedElement(definition, outMsg);
+                        outAxisMsg.setElementQName(new QName(wrapper
+                                .getNamespaceURI(), wrapper.getLocalName(),
+                                wrapper.getPrefix()));
+                        // TODO
+                        // axisService.addSchema(getXmlSchema(wrapper));
+
+                    } else {
+                        outAxisMsg.setElementQName(outMsg.getQName());
+                    }
                 }
 
                 axisService.addOperation(axisOperation);
@@ -151,6 +213,7 @@
                 throw new WSDLProcessingException(axisFault.getMessage());
             }
         }
+        getXmlSchemaPrefix(definition);
 
         return axisService;
     }
@@ -159,12 +222,12 @@
         Iterator ports = service.getPorts().values().iterator();
         Port port;
         Binding binding;
-
+        Iterator extElements;
+        
         while (ports.hasNext()) {
             port = (Port) ports.next();
             binding = port.getBinding();
-            Iterator extElements = binding.getExtensibilityElements()
-                    .iterator();
+            extElements = binding.getExtensibilityElements().iterator();
 
             while (extElements.hasNext()) {
 
@@ -188,5 +251,138 @@
 
     private XmlSchema getXMLSchema(Element element) {
         return (new XmlSchemaCollection()).read(element);
+    }
+
+    private String getXmlSchemaPrefix(Definition definition) {
+        Map namespaces = definition.getNamespaces();
+
+        if (namespaces.containsValue(XMLSCHEMA_NAMESPACE_URI)) {
+
+            Iterator prefixes = namespaces.keySet().iterator();
+            String prefix;
+
+            while (prefixes.hasNext()) {
+                prefix = (String) prefixes.next();
+
+                if (XMLSCHEMA_NAMESPACE_URI.equals(namespaces.get(prefix))) {
+                    return prefix;
+                }
+            }
+        }
+        return XMLSCHEMA_NAMESPACE_PREFIX; //default prefix
+    }
+
+    private boolean wrapperble(Message message) {
+        Map parts = message.getParts();
+
+        if (parts.size() > 1) {
+            return true;
+        }
+
+        Iterator iterator = parts.values().iterator();
+        Part part;
+
+        while (iterator.hasNext()) {
+            part = (Part) iterator.next();
+            if (part.getTypeName() != null) {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    private Document getDOMDocument() {
+        try {
+            DocumentBuilderFactory fac = DocumentBuilderFactory.newInstance();
+            fac.setNamespaceAware(true);
+            return fac.newDocumentBuilder().newDocument();
+
+        } catch (ParserConfigurationException ex) {
+            throw new WSDLProcessingException(ex.getMessage());
+        }
+    }
+
+    private Element getWrappedElement(Definition definition, Message message) {
+        Document document = getDOMDocument();
+        String xsdPrefix = getXmlSchemaPrefix(definition);
+        Map namespaceImports = new HashMap();
+        Map namespacePrefixes = new HashMap();
+        Map parts = message.getParts();
+
+        String name = message.getQName().getLocalPart();
+        Element nComplexType = document.createElementNS(
+                XMLSCHEMA_NAMESPACE_URI, xsdPrefix + ":"
+                        + XML_SCHEMA_COMPLEX_TYPE_LOCAL_NAME);
+        nComplexType.setAttribute(XSD_NAME, name);
+
+        Element contextSequence = document.createElementNS(
+                XMLSCHEMA_NAMESPACE_URI, xsdPrefix + ":"
+                        + XML_SCHEMA_SEQUENCE_LOCAL_NAME);
+
+        Element childElement;
+        Iterator iterator = parts.values().iterator();
+
+        while (iterator.hasNext()) {
+            Part part = (Part) iterator.next();
+            String elementName = part.getName();
+            boolean isTyped = true;
+
+            QName schemaTypeName;
+
+            if (part.getTypeName() != null) {
+                schemaTypeName = part.getTypeName();
+
+            } else if (part.getElementName() != null) {
+                schemaTypeName = part.getElementName();
+
+            } else {
+                throw new WSDLProcessingException("unqualified message part");
+            }
+
+            childElement = document.createElementNS(XMLSCHEMA_NAMESPACE_URI,
+                    xsdPrefix + ":" + XML_SCHEMA_ELEMENT_LOCAL_NAME);
+            String prefix;
+
+            if (!XMLSCHEMA_NAMESPACE_URI.equals(schemaTypeName
+                    .getNamespaceURI())) {
+                String namespace = schemaTypeName.getNamespaceURI();
+
+                if (namespaceImports.containsKey(namespace)) {
+                    Element namespaceImport = document.createElementNS(
+                            XMLSCHEMA_NAMESPACE_URI, xsdPrefix + ":"
+                                    + XML_SCHEMA_IMPORT_LOCAL_NAME);
+                    namespaceImport.setAttribute("namespace", namespace);
+                    namespaceImports.put(namespace, namespaceImport);
+                    prefix = getTempPrefix();
+                    namespacePrefixes.put(namespace, prefix);
+
+                } else {
+                    prefix = (String) namespacePrefixes.get(namespace);
+                }
+
+            } else {
+                prefix = xsdPrefix;
+            }
+
+            if (isTyped) {
+                childElement.setAttribute(XSD_NAME, elementName);
+                childElement.setAttribute(XSD_TYPE, prefix + ":"
+                        + schemaTypeName.getLocalPart());
+
+            } else {
+                childElement.setAttribute(XSD_REF, prefix + ":"
+                        + schemaTypeName.getLocalPart());
+            }
+
+            contextSequence.appendChild(childElement);
+        }
+
+        nComplexType.appendChild(contextSequence);
+        return nComplexType;
+
+    }
+
+    private String getTempPrefix() {
+        return "ns" + nsCount++;
     }
 }