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 aj...@apache.org on 2005/10/11 14:54:32 UTC

svn commit: r312869 - in /webservices/axis2/trunk/java/modules/codegen: src/org/apache/axis2/databinding/schema/ test-resources/xsd/ test/org/apache/axis2/databinding/schema/

Author: ajith
Date: Tue Oct 11 05:54:13 2005
New Revision: 312869

URL: http://svn.apache.org/viewcvs?rev=312869&view=rev
Log:
1.Optimized the compiler
2. removed the complex extension support. If we are doing it it has to be done right and at the current state it has a long way to go. It's better to limit ourselves at the start

The schema compiler can handle sequence and all right now. I guess that's enough for a simple schema compiler!

Added:
    webservices/axis2/trunk/java/modules/codegen/test-resources/xsd/simple_element.xsd
    webservices/axis2/trunk/java/modules/codegen/test/org/apache/axis2/databinding/schema/SimpleElementTest.java
Removed:
    webservices/axis2/trunk/java/modules/codegen/test-resources/xsd/complex_extension.xsd
    webservices/axis2/trunk/java/modules/codegen/test/org/apache/axis2/databinding/schema/ComplexExtensionTest.java
Modified:
    webservices/axis2/trunk/java/modules/codegen/src/org/apache/axis2/databinding/schema/JavaBeanWriter.java
    webservices/axis2/trunk/java/modules/codegen/src/org/apache/axis2/databinding/schema/SchemaCompiler.java
    webservices/axis2/trunk/java/modules/codegen/src/org/apache/axis2/databinding/schema/TypeMap.java

Modified: webservices/axis2/trunk/java/modules/codegen/src/org/apache/axis2/databinding/schema/JavaBeanWriter.java
URL: http://svn.apache.org/viewcvs/webservices/axis2/trunk/java/modules/codegen/src/org/apache/axis2/databinding/schema/JavaBeanWriter.java?rev=312869&r1=312868&r2=312869&view=diff
==============================================================================
--- webservices/axis2/trunk/java/modules/codegen/src/org/apache/axis2/databinding/schema/JavaBeanWriter.java (original)
+++ webservices/axis2/trunk/java/modules/codegen/src/org/apache/axis2/databinding/schema/JavaBeanWriter.java Tue Oct 11 05:54:13 2005
@@ -1,6 +1,7 @@
 package org.apache.axis2.databinding.schema;
 
 import org.apache.ws.commons.schema.XmlSchemaComplexType;
+import org.apache.ws.commons.schema.XmlSchemaElement;
 import org.apache.axis2.util.*;
 import org.w3c.dom.Document;
 import org.w3c.dom.Element;
@@ -51,7 +52,14 @@
 
     }
 
-    public void write(XmlSchemaComplexType complexType, Map typeMap, BeanWriterMetaInfoHolder metainf) throws SchemaCompilationException{
+    /**
+     *
+     * @param complexType
+     * @param typeMap
+     * @param metainf
+     * @throws SchemaCompilationException
+     */
+    public String write(XmlSchemaComplexType complexType, Map typeMap, BeanWriterMetaInfoHolder metainf) throws SchemaCompilationException{
 
         try {
             //determine the package for this type.
@@ -83,10 +91,71 @@
                 Element property = XSLTUtils.addChildElement(model,"property",rootElt);
                 name = (QName)qNameIterator.next();
                 XSLTUtils.addAttribute(model,"name",name.getLocalPart(),property);
-                XSLTUtils.addAttribute(model,"type",metainf.getJavaClassNameForElement(name),property);
-                if (typeMap.containsKey(metainf.getSchemaQNameForElement(name))){
-                    XSLTUtils.addAttribute(model,"ours","yes",property); //todo introduce a better name for this
+                String javaClassNameForElement = metainf.getJavaClassNameForElement(name);
+                if (javaClassNameForElement==null){
+                    throw new SchemaCompilationException("Type missing!");
                 }
+                XSLTUtils.addAttribute(model,"type",javaClassNameForElement,property);
+            }
+
+            //create the file
+            OutputStream out = createOutFile(packageName,className);
+            //parse with the template and create the files
+            parse(model,out);
+            //return the fully qualified class name
+            return packageName+"."+className;
+
+        }catch (SchemaCompilationException e) {
+            throw e;
+        }catch (Exception e) {
+            throw new SchemaCompilationException(e);
+        }
+
+
+    }
+
+    /**
+     *
+     * @param element
+     * @param typeMap
+     * @param metainf
+     * @return
+     * @throws SchemaCompilationException
+     */
+    public String write(XmlSchemaElement element, Map typeMap, BeanWriterMetaInfoHolder metainf) throws SchemaCompilationException{
+
+        try {
+            //determine the package for this type.
+            QName qName = element.getQName();
+            String packageName = URLProcessor.getNameSpaceFromURL(qName.getNamespaceURI());
+            String className = qName.getLocalPart();
+
+            if (!templateLoaded){
+                loadTemplate();
+            }
+
+            //create the model
+            Document model= XSLTUtils.getDocument();
+
+            //make the XML
+            Element rootElt = XSLTUtils.addChildElement(model,"bean",model);
+            XSLTUtils.addAttribute(model,"name",className,rootElt);
+            XSLTUtils.addAttribute(model,"package",packageName,rootElt);
+            XSLTUtils.addAttribute(model,"nsuri",qName.getNamespaceURI(),rootElt);
+            XSLTUtils.addAttribute(model,"nsprefix",qName.getPrefix(),rootElt);
+
+            // go in the loop and add the part elements
+            Iterator qNameIterator = metainf.getElementQNameIterator();
+
+            QName name;
+            while (qNameIterator.hasNext()) {
+                Element property = XSLTUtils.addChildElement(model,"property",rootElt);
+                name = (QName)qNameIterator.next();
+                XSLTUtils.addAttribute(model,"name",name.getLocalPart(),property);
+                XSLTUtils.addAttribute(model,"type",metainf.getJavaClassNameForElement(name),property);
+//                if (typeMap.containsKey(metainf.getSchemaQNameForElement(name))){
+//                    XSLTUtils.addAttribute(model,"ours","yes",property); //todo introduce a better name for this
+//                }
 
             }
 
@@ -94,13 +163,13 @@
             OutputStream out = createOutFile(packageName,className);
             //parse with the template and create the files
             parse(model,out);
+            return packageName+"."+className;
         } catch (Exception e) {
             throw new SchemaCompilationException(e);
         }
 
 
     }
-
 
 
     /** A bit of code from the code generator. We are better off using the template

Modified: webservices/axis2/trunk/java/modules/codegen/src/org/apache/axis2/databinding/schema/SchemaCompiler.java
URL: http://svn.apache.org/viewcvs/webservices/axis2/trunk/java/modules/codegen/src/org/apache/axis2/databinding/schema/SchemaCompiler.java?rev=312869&r1=312868&r2=312869&view=diff
==============================================================================
--- webservices/axis2/trunk/java/modules/codegen/src/org/apache/axis2/databinding/schema/SchemaCompiler.java (original)
+++ webservices/axis2/trunk/java/modules/codegen/src/org/apache/axis2/databinding/schema/SchemaCompiler.java Tue Oct 11 05:54:13 2005
@@ -4,10 +4,7 @@
 import org.apache.axis2.util.URLProcessor;
 
 import javax.xml.namespace.QName;
-import java.util.List;
-import java.util.Iterator;
-import java.util.HashMap;
-import java.util.Map;
+import java.util.*;
 import java.io.IOException;
 /*
  * Copyright 2004,2005 The Apache Software Foundation.
@@ -29,6 +26,7 @@
 
     private CompilerOptions options;
     private HashMap processedTypemap;
+    private HashMap processedElementmap;
     private JavaBeanWriter writer;
 
     private Map baseSchemaTypeMap = TypeMap.getTypeMap();
@@ -48,6 +46,7 @@
             }
 
             this.processedTypemap = new HashMap();
+            this.processedElementmap = new HashMap();
 
             this.writer = new JavaBeanWriter(this.options.getOutputLocation());
 
@@ -98,6 +97,8 @@
             processElement((XmlSchemaElement)xmlSchemaElementIterator.next());
         }
 
+
+
     }
 
     /**
@@ -109,11 +110,31 @@
         //for each and every element and process that accordingly.
         //this means that any unused type definitions would not be generated!
         XmlSchemaType schemaType = xsElt.getSchemaType();
-        if (schemaType!=null){
-            processSchema(schemaType);
+        if (processedElementmap.containsKey(xsElt.getQName())){
+            return;
+        }
+        if (schemaType==null){
+            throw new SchemaCompilationException("Schema type not found!");
         }
+        processSchema(schemaType);
+        QName qName = schemaType.getQName();
 
         //write a class for this element
+        BeanWriterMetaInfoHolder metainf = new BeanWriterMetaInfoHolder();
+        //there can be only one schema type
+        String className = "";
+        if (processedTypemap.containsKey(qName)){
+            className =  processedTypemap.get(qName).toString();
+        }else if (baseSchemaTypeMap.containsKey(qName)){
+            className =  baseSchemaTypeMap.get(qName).toString();
+        }else{
+            //throw an exception here
+        }
+        metainf.addElementInfo(xsElt.getQName(),qName,className);
+
+        String fullyQualifiedClassName = writer.write(xsElt,processedTypemap,metainf);
+        processedElementmap.put(xsElt.getQName(),fullyQualifiedClassName);
+
 
     }
 
@@ -132,7 +153,8 @@
      */
     private void processComplexSchemaType(XmlSchemaComplexType complexType) throws SchemaCompilationException{
 
-        if (processedTypemap.containsKey(complexType.getQName())){
+        if (processedTypemap.containsKey(complexType.getQName())
+                || baseSchemaTypeMap.containsKey(complexType.getQName())){
             return;
         }
 
@@ -145,83 +167,82 @@
             //Process the particle
             processParticle(particle, metaInfHolder);
         }else{
-            XmlSchemaContentModel contentModel = complexType.getContentModel();
-            if (contentModel!=null){
-                XmlSchemaContent content =  (contentModel).getContent();
-                if (content instanceof XmlSchemaComplexContentExtension){
-                    XmlSchemaComplexContentExtension xmlSchemaComplexContentExtension = (XmlSchemaComplexContentExtension) content;
-                    processParticle(xmlSchemaComplexContentExtension.getParticle(),metaInfHolder);
-                    metaInfHolder.setExtension(true);
-                    metaInfHolder.setExtensionClassName(
-                            getJavaClassNameFromComplexTypeQName(
-                                    xmlSchemaComplexContentExtension.getBaseTypeName()));
-                }
-
-
-            }
+            // Process the other types - Say the complex content, extensions and so on
         }
 
         //write the class. This type mapping would have been populated right now
-        writer.write(complexType,processedTypemap,metaInfHolder);
-        processedTypemap.put(complexType.getQName(),"");
+        String fullyQualifiedClassName = writer.write(complexType,processedTypemap,metaInfHolder);
+        processedTypemap.put(complexType.getQName(),fullyQualifiedClassName);
 
         //populate the type mapping with the elements
 
     }
 
     private void processParticle(XmlSchemaParticle particle, //particle being processed
-                                BeanWriterMetaInfoHolder metainfHolder // metainf holder
+                                 BeanWriterMetaInfoHolder metainfHolder // metainf holder
     ) throws SchemaCompilationException {
         if (particle instanceof XmlSchemaSequence ){
             XmlSchemaObjectCollection items = ((XmlSchemaSequence)particle).getItems();
-            int count = items.getCount();
-            for (int i = 0; i < count; i++) {
-                XmlSchemaObject item = items.getItem(i);
-                if (item instanceof XmlSchemaElement){
-                    //recursively process the element
-                    XmlSchemaElement xsElt = (XmlSchemaElement) item;
-                    processElement(xsElt);
-                    //add this to the processed element list
-                    QName schemaTypeQName = xsElt.getSchemaType().getQName();
-                    Class clazz = (Class)baseSchemaTypeMap.get(schemaTypeQName);
-                    if (clazz!=null){
-                        metainfHolder.addElementInfo(xsElt.getQName(),
-                                                     xsElt.getSchemaTypeName()
-                                                     ,clazz.getName());
-                    }else{
-                         metainfHolder.addElementInfo(xsElt.getQName(),
-                                                     xsElt.getSchemaTypeName()
-                                                     ,getJavaClassNameFromComplexTypeQName(schemaTypeQName));
-                    }
-                }else if (item instanceof XmlSchemaComplexContent){
-                    // process the extension
-                    XmlSchemaContent content = ((XmlSchemaComplexContent)item).getContent();
-                    if (content instanceof XmlSchemaComplexContentExtension){
-                        processParticle(((XmlSchemaComplexContentExtension)content).getParticle(),metainfHolder);
-                    }else if (content instanceof XmlSchemaComplexContentRestriction){
-                        //handle complex restriction
-                    }
-                    //handle the other types here
-                }
-
-
-            }
-            //set the ordered flag in the metainf holder
-            metainfHolder.setOrdered(true);
+            process(items, metainfHolder,true);
         }else if (particle instanceof XmlSchemaAll){
-            //handle the all !
+            XmlSchemaObjectCollection items = ((XmlSchemaAll)particle).getItems();
+            process(items, metainfHolder,false);
 
         }else if (particle instanceof XmlSchemaChoice){
             //handle the choice!
         }
     }
 
+    private void process(XmlSchemaObjectCollection items,
+                         BeanWriterMetaInfoHolder metainfHolder,
+                         boolean order) throws SchemaCompilationException {
+        int count = items.getCount();
+        List processedElements = new ArrayList();
+
+        for (int i = 0; i < count; i++) {
+            XmlSchemaObject item = items.getItem(i);
+            if (item instanceof XmlSchemaElement){
+                //recursively process the element
+                XmlSchemaElement xsElt = (XmlSchemaElement) item;
+                processElement(xsElt);
+                processedElements.add(xsElt);
+            }else if (item instanceof XmlSchemaComplexContent){
+                // process the extension
+                XmlSchemaContent content = ((XmlSchemaComplexContent)item).getContent();
+                if (content instanceof XmlSchemaComplexContentExtension){
+                    // handle the complex extension
+                }else if (content instanceof XmlSchemaComplexContentRestriction){
+                    //handle complex restriction
+                }
+                //handle the other types here
+            }
+
+
+        }
+
+        // loop through the processed items and add them to the matainf object
+        int processedCount = processedElements.size();
+        for (int i = 0; i < processedCount; i++) {
+            XmlSchemaElement elt = (XmlSchemaElement)processedElements.get(i);
+            String clazzName = (String)processedElementmap.get(elt.getQName());
+            metainfHolder.addElementInfo(elt.getQName(),
+                    elt.getSchemaTypeName()
+                    ,clazzName);
+
+        }
+        //set the ordered flag in the metainf holder
+        metainfHolder.setOrdered(order);
+    }
+
     /**
      * Handle the simple content
      * @param simpleType
      */
     private void processSimpleSchemaType(XmlSchemaSimpleType simpleType){
-        //nothing to here yet
+        //nothing to here yet. just populate the processed type map with this
+        //the class Name would be from the base type map!
+        QName qName = simpleType.getQName();
+        processedTypemap.put(qName,baseSchemaTypeMap.get(qName));
     }
 
 

Modified: webservices/axis2/trunk/java/modules/codegen/src/org/apache/axis2/databinding/schema/TypeMap.java
URL: http://svn.apache.org/viewcvs/webservices/axis2/trunk/java/modules/codegen/src/org/apache/axis2/databinding/schema/TypeMap.java?rev=312869&r1=312868&r2=312869&view=diff
==============================================================================
--- webservices/axis2/trunk/java/modules/codegen/src/org/apache/axis2/databinding/schema/TypeMap.java (original)
+++ webservices/axis2/trunk/java/modules/codegen/src/org/apache/axis2/databinding/schema/TypeMap.java Tue Oct 11 05:54:13 2005
@@ -29,31 +29,31 @@
 
     static{
 // If SOAP 1.1 over the wire, map wrapper classes to XSD primitives.
-        addTypemapping(SchemaConstants.XSD_STRING, java.lang.String.class);
-        addTypemapping(SchemaConstants.XSD_BOOLEAN, java.lang.Boolean.class);
-        addTypemapping(SchemaConstants.XSD_DOUBLE, java.lang.Double.class);
-        addTypemapping(SchemaConstants.XSD_FLOAT, java.lang.Float.class);
-        addTypemapping(SchemaConstants.XSD_INT, java.lang.Integer.class);
-        addTypemapping(SchemaConstants.XSD_INTEGER, java.math.BigInteger.class
+        addTypemapping(SchemaConstants.XSD_STRING, java.lang.String.class.getName());
+        addTypemapping(SchemaConstants.XSD_BOOLEAN, java.lang.Boolean.class.getName());
+        addTypemapping(SchemaConstants.XSD_DOUBLE, java.lang.Double.class.getName());
+        addTypemapping(SchemaConstants.XSD_FLOAT, java.lang.Float.class.getName());
+        addTypemapping(SchemaConstants.XSD_INT, java.lang.Integer.class.getName());
+        addTypemapping(SchemaConstants.XSD_INTEGER, java.math.BigInteger.class.getName()
         );
-        addTypemapping(SchemaConstants.XSD_DECIMAL, java.math.BigDecimal.class
+        addTypemapping(SchemaConstants.XSD_DECIMAL, java.math.BigDecimal.class.getName()
         );
-        addTypemapping(SchemaConstants.XSD_LONG, java.lang.Long.class);
-        addTypemapping(SchemaConstants.XSD_SHORT, java.lang.Short.class);
-        addTypemapping(SchemaConstants.XSD_BYTE, java.lang.Byte.class);
+        addTypemapping(SchemaConstants.XSD_LONG, java.lang.Long.class.getName());
+        addTypemapping(SchemaConstants.XSD_SHORT, java.lang.Short.class.getName());
+        addTypemapping(SchemaConstants.XSD_BYTE, java.lang.Byte.class.getName());
 
         // The XSD Primitives are mapped to java primitives.
-        addTypemapping(SchemaConstants.XSD_BOOLEAN, boolean.class);
-        addTypemapping(SchemaConstants.XSD_DOUBLE, double.class);
-        addTypemapping(SchemaConstants.XSD_FLOAT, float.class);
-        addTypemapping(SchemaConstants.XSD_INT, int.class);
-        addTypemapping(SchemaConstants.XSD_LONG, long.class);
-        addTypemapping(SchemaConstants.XSD_SHORT, short.class);
-        addTypemapping(SchemaConstants.XSD_BYTE, byte.class);
+        addTypemapping(SchemaConstants.XSD_BOOLEAN, boolean.class.getName());
+        addTypemapping(SchemaConstants.XSD_DOUBLE, double.class.getName());
+        addTypemapping(SchemaConstants.XSD_FLOAT, float.class.getName());
+        addTypemapping(SchemaConstants.XSD_INT, int.class.getName());
+        addTypemapping(SchemaConstants.XSD_LONG, long.class.getName());
+        addTypemapping(SchemaConstants.XSD_SHORT, short.class.getName());
+        addTypemapping(SchemaConstants.XSD_BYTE, byte.class.getName());
 
     }
-    private static void addTypemapping(QName name,Class clazz) {
-        typeMap.put( name,clazz);
+    private static void addTypemapping(QName name,String str) {
+        typeMap.put( name,str);
     }
 
 

Added: webservices/axis2/trunk/java/modules/codegen/test-resources/xsd/simple_element.xsd
URL: http://svn.apache.org/viewcvs/webservices/axis2/trunk/java/modules/codegen/test-resources/xsd/simple_element.xsd?rev=312869&view=auto
==============================================================================
--- webservices/axis2/trunk/java/modules/codegen/test-resources/xsd/simple_element.xsd (added)
+++ webservices/axis2/trunk/java/modules/codegen/test-resources/xsd/simple_element.xsd Tue Oct 11 05:54:13 2005
@@ -0,0 +1,18 @@
+<schema targetNamespace="http://soapinterop.org/xsd"
+        xmlns="http://www.w3.org/2001/XMLSchema"
+        xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
+        xmlns:xsd="http://www.w3.org/2001/XMLSchema"
+        xmlns:xsd1="http://soapinterop.org/xsd"
+        elementFormDefault="qualified">
+    <complexType name="SOAPStruct">
+        <all>
+            <element name="varFloat" type="xsd:float"/>
+            <element name="varInt" type="xsd:int"/>
+            <element name="varString" type="xsd:string"/>
+        </all>
+    </complexType>
+    <element name="echoStringParam" type="xsd:string"/>
+    <element name="echoStringReturn" type="xsd:string"/>
+    <element name="echoStructParam" type="xsd1:SOAPStruct"/>
+    <element name="echoStructReturn" type="xsd1:SOAPStruct"/>
+</schema>
\ No newline at end of file

Added: webservices/axis2/trunk/java/modules/codegen/test/org/apache/axis2/databinding/schema/SimpleElementTest.java
URL: http://svn.apache.org/viewcvs/webservices/axis2/trunk/java/modules/codegen/test/org/apache/axis2/databinding/schema/SimpleElementTest.java?rev=312869&view=auto
==============================================================================
--- webservices/axis2/trunk/java/modules/codegen/test/org/apache/axis2/databinding/schema/SimpleElementTest.java (added)
+++ webservices/axis2/trunk/java/modules/codegen/test/org/apache/axis2/databinding/schema/SimpleElementTest.java Tue Oct 11 05:54:13 2005
@@ -0,0 +1,23 @@
+package org.apache.axis2.databinding.schema;
+/*
+ * Copyright 2004,2005 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+public class SimpleElementTest extends AbstractSchemaCompilerTester {
+    protected void setUp() throws Exception {
+        this.fileName = "test-resources/xsd/simple_element.xsd";
+        super.setUp();
+    }
+}