You are viewing a plain text version of this content. The canonical link for it is here.
Posted to scm@geronimo.apache.org by dj...@apache.org on 2005/04/02 05:57:32 UTC

svn commit: r159756 - in geronimo/trunk/modules/axis-builder/src: java/org/apache/geronimo/axis/builder/ test-resources/schema/ test/org/apache/geronimo/axis/builder/

Author: djencks
Date: Fri Apr  1 19:57:31 2005
New Revision: 159756

URL: http://svn.apache.org/viewcvs?view=rev&rev=159756
Log:
Fix a classloading problem and improve conformance to 'qname' generation rules for anonymous types and subelements

Added:
    geronimo/trunk/modules/axis-builder/src/test-resources/schema/schema2.xsd
    geronimo/trunk/modules/axis-builder/src/test-resources/schema/schema3.xsd
Modified:
    geronimo/trunk/modules/axis-builder/src/java/org/apache/geronimo/axis/builder/HeavyweightOperationDescBuilder.java
    geronimo/trunk/modules/axis-builder/src/java/org/apache/geronimo/axis/builder/WSDescriptorParser.java
    geronimo/trunk/modules/axis-builder/src/test/org/apache/geronimo/axis/builder/ParsingTest.java

Modified: geronimo/trunk/modules/axis-builder/src/java/org/apache/geronimo/axis/builder/HeavyweightOperationDescBuilder.java
URL: http://svn.apache.org/viewcvs/geronimo/trunk/modules/axis-builder/src/java/org/apache/geronimo/axis/builder/HeavyweightOperationDescBuilder.java?view=diff&r1=159755&r2=159756
==============================================================================
--- geronimo/trunk/modules/axis-builder/src/java/org/apache/geronimo/axis/builder/HeavyweightOperationDescBuilder.java (original)
+++ geronimo/trunk/modules/axis-builder/src/java/org/apache/geronimo/axis/builder/HeavyweightOperationDescBuilder.java Fri Apr  1 19:57:31 2005
@@ -176,13 +176,13 @@
             String args = "(";
             for (int i = 0; i < paramTypes.length; i++) {
                 args += paramTypes[i].getName();
-                if (i < paramTypes.length-1){
+                if (i < paramTypes.length - 1){
                     args += ",";
                 }
             }
             args += ")";
             
-            throw new DeploymentException("Mapping references non-existent method in service-endpoint: " + methodName+ args);
+            throw new DeploymentException("Mapping references non-existent method in service-endpoint: " + methodName + args);
         }
 
         operationDesc.setMethod(method);

Modified: geronimo/trunk/modules/axis-builder/src/java/org/apache/geronimo/axis/builder/WSDescriptorParser.java
URL: http://svn.apache.org/viewcvs/geronimo/trunk/modules/axis-builder/src/java/org/apache/geronimo/axis/builder/WSDescriptorParser.java?view=diff&r1=159755&r2=159756
==============================================================================
--- geronimo/trunk/modules/axis-builder/src/java/org/apache/geronimo/axis/builder/WSDescriptorParser.java (original)
+++ geronimo/trunk/modules/axis-builder/src/java/org/apache/geronimo/axis/builder/WSDescriptorParser.java Fri Apr  1 19:57:31 2005
@@ -18,20 +18,32 @@
 
 import java.io.IOException;
 import java.io.InputStream;
+import java.lang.reflect.Method;
 import java.math.BigDecimal;
 import java.math.BigInteger;
+import java.net.MalformedURLException;
 import java.net.URI;
 import java.net.URISyntaxException;
 import java.net.URL;
-import java.net.MalformedURLException;
-import java.util.*;
+import java.util.ArrayList;
+import java.util.Calendar;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
 import java.util.jar.JarFile;
-import java.lang.reflect.Method;
-import javax.wsdl.*;
+import javax.wsdl.Definition;
+import javax.wsdl.Import;
+import javax.wsdl.Operation;
+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.UnknownExtensibilityElement;
-import javax.wsdl.extensions.soap.SOAPAddress;
 import javax.wsdl.extensions.schema.Schema;
+import javax.wsdl.extensions.soap.SOAPAddress;
 import javax.wsdl.factory.WSDLFactory;
 import javax.wsdl.xml.WSDLLocator;
 import javax.wsdl.xml.WSDLReader;
@@ -59,6 +71,7 @@
 import javax.xml.rpc.holders.StringHolder;
 
 import org.apache.geronimo.common.DeploymentException;
+import org.apache.geronimo.deployment.util.DeploymentUtil;
 import org.apache.geronimo.kernel.ClassLoading;
 import org.apache.geronimo.schema.SchemaConversionUtils;
 import org.apache.geronimo.xbeans.j2ee.ExceptionMappingType;
@@ -73,7 +86,9 @@
 import org.apache.geronimo.xbeans.j2ee.WebserviceDescriptionType;
 import org.apache.geronimo.xbeans.j2ee.WebservicesDocument;
 import org.apache.geronimo.xbeans.j2ee.WebservicesType;
-import org.apache.geronimo.deployment.util.DeploymentUtil;
+import org.apache.xmlbeans.SchemaField;
+import org.apache.xmlbeans.SchemaGlobalElement;
+import org.apache.xmlbeans.SchemaParticle;
 import org.apache.xmlbeans.SchemaType;
 import org.apache.xmlbeans.SchemaTypeSystem;
 import org.apache.xmlbeans.XmlBeans;
@@ -81,11 +96,6 @@
 import org.apache.xmlbeans.XmlException;
 import org.apache.xmlbeans.XmlObject;
 import org.apache.xmlbeans.XmlOptions;
-import org.apache.xmlbeans.SchemaField;
-import org.apache.xmlbeans.SchemaParticle;
-import org.apache.xmlbeans.SchemaGlobalElement;
-import org.w3.x2001.xmlSchema.ComplexType;
-import org.w3.x2001.xmlSchema.SchemaDocument;
 import org.w3c.dom.Element;
 import org.xml.sax.InputSource;
 
@@ -134,6 +144,7 @@
     /**
      * Parses a webservice.xml file and returns a map PortInfo instances indexed by the
      * corresponding ejb-link or servlet-link element .
+     *
      * @param webservicesType
      * @param moduleFile
      * @param isEJB
@@ -191,13 +202,13 @@
                     throw new DeploymentException("No WSDL Port definition for port-component " + portComponentName);
                 }
 
-                ServiceEndpointInterfaceMappingType seiMapping = (ServiceEndpointInterfaceMappingType)seiMappings.get(seiInterfaceName);
+                ServiceEndpointInterfaceMappingType seiMapping = (ServiceEndpointInterfaceMappingType) seiMappings.get(seiInterfaceName);
 
                 URL wsdlURL = null;
                 try {
                     wsdlURL = DeploymentUtil.createJarURL(moduleFile, webserviceDescription.getWsdlFile().getStringValue().trim());
                 } catch (MalformedURLException e) {
-                    throw new DeploymentException("Invalid WSDL URL: "+webserviceDescription.getWsdlFile().getStringValue().trim(), e);
+                    throw new DeploymentException("Invalid WSDL URL: " + webserviceDescription.getWsdlFile().getStringValue().trim(), e);
                 }
 
                 PortInfo portInfo = new PortInfo(portComponentName, portQName, definition, javaWsdlMapping, seiInterfaceName, handlers, port, seiMapping, wsdlURL);
@@ -213,15 +224,14 @@
 
     /**
      * Gets a map of all the javax.wsdl.Port instance in the WSDL definition keyed by the port's QName
-     *
+     * <p/>
      * WSDL 1.1 spec: 2.6 "The name attribute provides a unique name among all ports defined within in the enclosing WSDL document."
      *
      * @param definition
      * @return
-     * @throws DeploymentException
      */
 
-    public static Map getPortMap(Definition definition) throws DeploymentException {
+    public static Map getPortMap(Definition definition) {
         HashMap ports = new HashMap();
         Collection services = definition.getServices().values();
         for (Iterator iterator = services.iterator(); iterator.hasNext();) {
@@ -409,16 +419,13 @@
         }
         SchemaType schemaType = element.getType();
         qnameMap.put(elementKey, schemaType);
-        //check if it's an array
-        if (element.getMaxOccurs() != null && element.getMaxOccurs().intValue() > 1) {
-            //this is at least rule 3.a.  If refs get the element name from the ref, it will handle 3.b also.
-            int minOccurs = element.getMinOccurs() == null ? 1 : element.getMinOccurs().intValue();
-            int maxOccurs = element.getMaxOccurs().intValue();
-            String arrayQNameLocalName = elementQNameLocalName + "[" + minOccurs + "," + maxOccurs + "]";
-            QName arrayName = new QName(elementNamespace, arrayQNameLocalName);
-            SchemaTypeKey arrayKey = new SchemaTypeKey(arrayName, true, false, true);
-            //TODO not clear we want the schemaType as the value
-            qnameMap.put(arrayKey, schemaType);
+//        new Exception("Adding: " + elementKey.getqName().getLocalPart()).printStackTrace();
+        //check if it's an array. maxOccurs is null if unbounded
+        //element should always be a SchemaParticle... this is a workaround for XMLBEANS-137
+        if (element instanceof SchemaParticle) {
+            addArrayForms((SchemaParticle) element, elementKey.getqName(), qnameMap, schemaType);
+        } else {
+            System.out.println("element is not a schemaParticle! " + element);
         }
         //now, name for type.  Rule 1.b, type inside an element
         String typeQNameLocalPart = ">" + elementQNameLocalName;
@@ -430,6 +437,7 @@
     private static void addSchemaType(QName typeQName, SchemaType schemaType, boolean anonymous, Map qnameMap) {
         SchemaTypeKey typeKey = new SchemaTypeKey(typeQName, false, schemaType.isSimpleType(), anonymous);
         qnameMap.put(typeKey, schemaType);
+//        new Exception("Adding: " + typeKey.getqName().getLocalPart()).printStackTrace();
         //TODO xmlbeans recommends using summary info from getElementProperties and getAttributeProperties instead of traversing the content model by hand.
         SchemaParticle schemaParticle = schemaType.getContentModel();
         if (schemaParticle != null) {
@@ -446,21 +454,16 @@
             if (element != null) {
                 addElement(element, key, qnameMap);
             } else {
-                //it may be a ref or a built in type.  If it's an array (maxOccurs >1) form a type for it.
-                int maxOccurs = schemaParticle.getMaxOccurs() == null ? 1 : schemaParticle.getMaxOccurs().intValue();
-                if (maxOccurs > 1) {
-                    int minOccurs = schemaParticle.getMinOccurs() == null ? 1 : schemaParticle.getMinOccurs().intValue();
-                    QName elementName = schemaParticle.getName();
-                    String arrayQNameLocalName = elementName.getLocalPart() + "[" + minOccurs + "," + maxOccurs + "]";
-                    String elementNamespace = elementName.getNamespaceURI();
-                    if (elementNamespace == null || elementNamespace.equals("")) {
-                        elementNamespace = key.getqName().getNamespaceURI();
-                    }
-                    QName arrayName = new QName(elementNamespace, arrayQNameLocalName);
-                    SchemaTypeKey arrayKey = new SchemaTypeKey(arrayName, true, false, true);
-                    //TODO not clear we want the schemaType as the value
-                    qnameMap.put(arrayKey, elementType);
-                }
+                QName keyQName = key.getqName();
+                //TODO I can't distinguish between 3.a and 3.b, so generate names both ways.
+                //3.b
+                String localPart = schemaParticle.getName().getLocalPart();
+                QName elementName = new QName(keyQName.getNamespaceURI(), localPart);
+                addArrayForms(schemaParticle, elementName, qnameMap, elementType);
+                //3.a
+                localPart = keyQName.getLocalPart() + ">" + schemaParticle.getName().getLocalPart();
+                elementName = new QName(keyQName.getNamespaceURI(), localPart);
+                addArrayForms(schemaParticle, elementName, qnameMap, elementType);
             }
         } else {
             SchemaParticle[] children = schemaParticle.getParticleChildren();
@@ -471,9 +474,36 @@
         }
     }
 
+    private static void addArrayForms(SchemaParticle schemaParticle, QName keyName, Map qnameMap, SchemaType elementType) {
+        //it may be a ref or a built in type.  If it's an array (maxOccurs >1) form a type for it.
+        if (schemaParticle.getIntMaxOccurs() > 1) {
+            String maxOccurs = schemaParticle.getMaxOccurs() == null ? "unbounded" : "" + schemaParticle.getIntMaxOccurs();
+            int minOccurs = schemaParticle.getIntMinOccurs();
+            QName elementName = schemaParticle.getName();
+            String arrayQNameLocalName = keyName.getLocalPart() + "[" + minOccurs + "," + maxOccurs + "]";
+            String elementNamespace = elementName.getNamespaceURI();
+            if (elementNamespace == null || elementNamespace.equals("")) {
+                elementNamespace = keyName.getNamespaceURI();
+            }
+            QName arrayName = new QName(elementNamespace, arrayQNameLocalName);
+            SchemaTypeKey arrayKey = new SchemaTypeKey(arrayName, false, false, true);
+            //TODO not clear we want the schemaType as the value
+            qnameMap.put(arrayKey, elementType);
+//            new Exception("Adding: " + arrayKey.getqName().getLocalPart()).printStackTrace();
+            if (minOccurs == 1) {
+                arrayQNameLocalName = keyName.getLocalPart() + "[," + maxOccurs + "]";
+                arrayName = new QName(elementNamespace, arrayQNameLocalName);
+                arrayKey = new SchemaTypeKey(arrayName, false, false, true);
+                //TODO not clear we want the schemaType as the value
+                qnameMap.put(arrayKey, elementType);
+            }
+        }
+    }
+
     /**
      * Find all the complex types in the previously constructed schema analysis.
      * Put them in a map from complex type QName to schema fragment.
+     *
      * @param schemaTypeKeyToSchemaTypeMap
      * @return
      */
@@ -573,6 +603,12 @@
                 }
                 Class holder = (Class) rpcHolderClasses.get(paramJavaType);
                 if (holder != null) {
+                    try {
+                        //TODO use class names in map or make sure we are in the correct classloader to start with.
+                        holder = ClassLoading.loadClass(holder.getName(), classLoader);
+                    } catch (ClassNotFoundException e) {
+                        throw new DeploymentException("could not load holder type in correct classloader", e);
+                    }
                     return holder;
                 }
                 //Otherwise, the holder must be in:

Added: geronimo/trunk/modules/axis-builder/src/test-resources/schema/schema2.xsd
URL: http://svn.apache.org/viewcvs/geronimo/trunk/modules/axis-builder/src/test-resources/schema/schema2.xsd?view=auto&rev=159756
==============================================================================
--- geronimo/trunk/modules/axis-builder/src/test-resources/schema/schema2.xsd (added)
+++ geronimo/trunk/modules/axis-builder/src/test-resources/schema/schema2.xsd Fri Apr  1 19:57:31 2005
@@ -0,0 +1,19 @@
+<?xml version="1.0"?>
+<schema targetNamespace="http://stock"
+       xmlns="http://www.w3.org/2001/XMLSchema">
+
+    <element name="GetLastTradePrice">
+        <complexType>
+            <sequence>
+                <element name="tickerSymbol" type="string"/>
+            </sequence>
+        </complexType>
+    </element>
+    <element name="GetLastTradePriceOutput">
+        <complexType>
+            <sequence>
+                <element name="price" type="float"/>
+            </sequence>
+        </complexType>
+    </element>
+</schema>

Added: geronimo/trunk/modules/axis-builder/src/test-resources/schema/schema3.xsd
URL: http://svn.apache.org/viewcvs/geronimo/trunk/modules/axis-builder/src/test-resources/schema/schema3.xsd?view=auto&rev=159756
==============================================================================
--- geronimo/trunk/modules/axis-builder/src/test-resources/schema/schema3.xsd (added)
+++ geronimo/trunk/modules/axis-builder/src/test-resources/schema/schema3.xsd Fri Apr  1 19:57:31 2005
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<schema targetNamespace="http://arraytest"
+    xmlns="http://www.w3.org/2001/XMLSchema">
+    <complexType name="StringArray">
+        <sequence>
+            <element name="value" type="string" nillable="true" minOccurs="0" maxOccurs="unbounded"/>
+        </sequence>
+    </complexType>
+</schema>

Modified: geronimo/trunk/modules/axis-builder/src/test/org/apache/geronimo/axis/builder/ParsingTest.java
URL: http://svn.apache.org/viewcvs/geronimo/trunk/modules/axis-builder/src/test/org/apache/geronimo/axis/builder/ParsingTest.java?view=diff&r1=159755&r2=159756
==============================================================================
--- geronimo/trunk/modules/axis-builder/src/test/org/apache/geronimo/axis/builder/ParsingTest.java (original)
+++ geronimo/trunk/modules/axis-builder/src/test/org/apache/geronimo/axis/builder/ParsingTest.java Fri Apr  1 19:57:31 2005
@@ -17,6 +17,7 @@
 package org.apache.geronimo.axis.builder;
 
 import java.io.File;
+import java.io.IOException;
 import java.util.Collection;
 import java.util.ArrayList;
 import java.util.Map;
@@ -40,6 +41,26 @@
 
     public void testSchema1() throws Exception {
         File schema1 = new File(basedir, "src/test-resources/schema/schema1.xsd");
+        System.out.println("SCHEMA 1");
+        Map map = parse(schema1);
+        assertEquals(13, map.size());
+    }
+
+    public void testSchema2() throws Exception {
+        File schema1 = new File(basedir, "src/test-resources/schema/schema2.xsd");
+        System.out.println("SCHEMA 2");
+        Map map = parse(schema1);
+        assertEquals(4, map.size());
+    }
+
+    public void testSchema3() throws Exception {
+        File schema1 = new File(basedir, "src/test-resources/schema/schema3.xsd");
+        System.out.println("SCHEMA 3");
+        Map map = parse(schema1);
+        assertEquals(3, map.size());
+    }
+
+    private Map parse(File schema1) throws IOException, XmlException, DeploymentException {
         XmlObject xmlObject = SchemaConversionUtils.parse(schema1.toURL());
         Collection errors = new ArrayList();
         XmlOptions xmlOptions = new XmlOptions();
@@ -60,6 +81,7 @@
             Map.Entry entry = (Map.Entry) iterator.next();
             System.out.println(entry.getKey() + " --> " + entry.getValue());
         }
-        assertEquals(9, map.size());
+        return map;
     }
+
 }