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 aj...@apache.org on 2006/03/01 07:10:43 UTC

svn commit: r381914 - in /webservices/axis2/trunk/java/modules/codegen/src/org/apache/axis2/schema: SchemaCompiler.java template/ADBBeanTemplate.xsl

Author: ajith
Date: Tue Feb 28 22:10:41 2006
New Revision: 381914

URL: http://svn.apache.org/viewcvs?rev=381914&view=rev
Log:
Adding proper support for xs:any. Now an OMElement (or an OMElement array) will be generated for the xs:any. This is not tested fully.

Modified:
    webservices/axis2/trunk/java/modules/codegen/src/org/apache/axis2/schema/SchemaCompiler.java
    webservices/axis2/trunk/java/modules/codegen/src/org/apache/axis2/schema/template/ADBBeanTemplate.xsl

Modified: webservices/axis2/trunk/java/modules/codegen/src/org/apache/axis2/schema/SchemaCompiler.java
URL: http://svn.apache.org/viewcvs/webservices/axis2/trunk/java/modules/codegen/src/org/apache/axis2/schema/SchemaCompiler.java?rev=381914&r1=381913&r2=381914&view=diff
==============================================================================
--- webservices/axis2/trunk/java/modules/codegen/src/org/apache/axis2/schema/SchemaCompiler.java (original)
+++ webservices/axis2/trunk/java/modules/codegen/src/org/apache/axis2/schema/SchemaCompiler.java Tue Feb 28 22:10:41 2006
@@ -68,7 +68,8 @@
     //the list of processedElements for the outer elements
     private HashMap processedElementMap;
 
-     private HashMap processedAnonymousComplexTypesMap;
+    private HashMap processedAnonymousComplexTypesMap;
+
     //we need this map to keep the referenced elements. these elements need to be kept seperate
     //to avoid conflicts
     private HashMap processedElementRefMap;
@@ -83,20 +84,25 @@
     //
     private ArrayList processedElementList;
 
-    //
+    //a list of nillable elements - used to generate code
+    //for nillable elements
     private List nillableElementList;
-
     private BeanWriter writer = null;
-
     private Map baseSchemaTypeMap = null;
 
-    private static final String ANY_ELEMENT_FIELD_NAME = "extraElements";
-    private static final String EXTRA_ATTRIBUTE_FIELD_NAME = "extraAttributes";
+    // a list of externally identified QNames to be processed. This becomes
+    // useful when  only a list of external elements need to be processed
+
+    public static final String ANY_ELEMENT_FIELD_NAME = "extraElement";
+    public static final String EXTRA_ATTRIBUTE_FIELD_NAME = "extraAttributes";
 
     public static final String DEFAULT_CLASS_NAME = OMElement.class.getName();
     public static final String DEFAULT_CLASS_ARRAY_NAME = "org.apache.ws.commons.om.OMElement[]";
 
 
+
+
+
     /**
      * @return the processes element map
      * includes the Qname of the element as the key and a
@@ -106,6 +112,7 @@
         return processedElementMap;
     }
 
+
     /**
      * @return a map of Qname vs models. A model can be anything,
      * ranging from a DOM document to a stream. This is taken from the
@@ -129,6 +136,7 @@
             this.options = options;
         }
 
+        //instantiate the maps
         processedTypemap = new HashMap();
         processedElementMap = new HashMap();
         simpleTypesMap = new HashMap();
@@ -139,7 +147,7 @@
         processedElementRefMap = new HashMap();
         nillableElementList = new ArrayList();
 
-        //load the writer a nd initiliaze the base type
+        //load the writer and initiliaze the base types
         writer = SchemaPropertyLoader.getBeanWriterInstance();
         writer.init(this.options);
 
@@ -192,8 +200,11 @@
                 }
             }
         }
+
+
         //select all the elements. We generate the code for types
-        //only if the elements refer them!!!
+        //only if the elements refer them!!! regardless of the fact that
+        //we have a list of elementnames, we'll need to process all the elements
         XmlSchemaObjectTable elements = schema.getElements();
         Iterator xmlSchemaElement1Iterator = elements.getValues();
         while (xmlSchemaElement1Iterator.hasNext()) {
@@ -215,6 +226,7 @@
             writeElement((XmlSchemaElement) xmlSchemaElement2Iterator.next());
         }
 
+
         if (options.isWrapClasses()) {
             writer.writeBatch();
         }
@@ -276,7 +288,7 @@
                     className);
 
 
-        }else{
+        }else if (schemaType != null){  //the named type should have been handled already
 
             //we are going to special case the anonymous complex type. Our algorithm for dealing
             //with it is to generate a single object that has the complex content inside. Really the
@@ -284,6 +296,10 @@
             //First copy the schema types content into the metainf holder
             metainf = (BeanWriterMetaInfoHolder) this.processedAnonymousComplexTypesMap.get(xsElt);
             metainf.setAnonymous(true);
+        }else{
+            //this means we did not find any schema type associated with the particular element. we
+            //should be throwing an exception here
+            throw new SchemaCompilationException("no type!!");//todo i18n this
         }
 
         if (nillableElementList.contains(xsElt.getQName())){
@@ -669,12 +685,13 @@
             //todo - Handle simple type restriction here
         }
     }
+
     /**
      * Handle any attribute
-     *
      * @param metainf
      */
     private void processAnyAttribute(BeanWriterMetaInfoHolder metainf) {
+
         //The best thing we can do here is to add a set of OMAttributes
         metainf.registerMapping(new QName(EXTRA_ATTRIBUTE_FIELD_NAME),
                 null,
@@ -683,6 +700,8 @@
 
     }
 
+
+
     /**
      * Process the attribute
      *
@@ -761,7 +780,13 @@
 
                 //handle xsd:any ! We place an OMElement in the generated class
             } else if (item instanceof XmlSchemaAny) {
-                processAny((XmlSchemaAny) item, metainfHolder);
+                XmlSchemaAny any = (XmlSchemaAny) item;
+                processAny(any, processedElementTypeMap);
+                //any can also be inside a sequence
+                if (order) {
+                    elementOrderMap.put(any, new Integer(i));
+                }
+                 processedElementArrayStatusMap.put(any, Boolean.FALSE);
             } else {
                 //there may be other types to be handled here. Add them
                 //when we are ready
@@ -774,48 +799,77 @@
         Iterator processedElementsIterator = processedElementArrayStatusMap.keySet().iterator();
         int startingItemNumberOrder = metainfHolder.getOrderStartPoint();
         while (processedElementsIterator.hasNext()) {
-            XmlSchemaElement elt = (XmlSchemaElement) processedElementsIterator.next();
-            String clazzName;
-            QName qName;
-
-            if (elt.getQName()!=null){
-                clazzName = (String) processedElementTypeMap.get(elt.getQName());
-                qName = elt.getQName();
-                metainfHolder.registerMapping(qName,
-                        elt.getSchemaTypeName()
-                        , clazzName,
-                        ((Boolean) processedElementArrayStatusMap.get(elt)).booleanValue() ?
-                                SchemaConstants.ANY_ARRAY_TYPE :
-                                SchemaConstants.ELEMENT_TYPE);
-            }else{ //probably this is referenced
-                clazzName = (String)processedElementRefMap.get(elt.getRefName());
-                qName = elt.getRefName();
-                metainfHolder.registerMapping(qName,
-                        parentSchema.getElementByName(elt.getRefName()).getSchemaTypeName()
-                        , clazzName,
-                        ((Boolean) processedElementArrayStatusMap.get(elt)).booleanValue() ?
-                                SchemaConstants.ANY_ARRAY_TYPE :
-                                SchemaConstants.ELEMENT_TYPE);
-            }
+            Object child = processedElementsIterator.next();
+
+            // process the XmlSchemaElement
+            if (child instanceof XmlSchemaElement){
+                XmlSchemaElement elt = (XmlSchemaElement) child;
+                String clazzName;
+                QName qName;
+
+                if (elt.getQName()!=null){
+                    clazzName = (String) processedElementTypeMap.get(elt.getQName());
+                    qName = elt.getQName();
+                    metainfHolder.registerMapping(qName,
+                            elt.getSchemaTypeName()
+                            , clazzName,
+                            ((Boolean) processedElementArrayStatusMap.get(elt)).booleanValue() ?
+                                    SchemaConstants.ANY_ARRAY_TYPE :
+                                    SchemaConstants.ELEMENT_TYPE);
+                }else{ //probably this is referenced
+                    clazzName = (String)processedElementRefMap.get(elt.getRefName());
+                    qName = elt.getRefName();
+                    metainfHolder.registerMapping(qName,
+                            parentSchema.getElementByName(elt.getRefName()).getSchemaTypeName()
+                            , clazzName,
+                            ((Boolean) processedElementArrayStatusMap.get(elt)).booleanValue() ?
+                                    SchemaConstants.ANY_ARRAY_TYPE :
+                                    SchemaConstants.ELEMENT_TYPE);
+                }
+
+
+
+                //register the occurence counts
+                metainfHolder.addMaxOccurs(qName, elt.getMaxOccurs());
+                metainfHolder.addMinOccurs(qName, elt.getMinOccurs());
+                //we need the order to be preserved. So record the order also
+                if (order) {
+                    //record the order in the metainf holder
+                    Integer integer = (Integer) elementOrderMap.get(elt);
+                    metainfHolder.registerQNameIndex(qName,
+                            startingItemNumberOrder + integer.intValue());
+                }
 
+                //get the nillable state and register that on the metainf holder
+                if (localNillableList.contains(elt.getQName())){
+                    metainfHolder.registerNillableQName(elt.getQName());
+                }
+
+                // process the XMLSchemaAny
+            }else if (child instanceof XmlSchemaAny){
+                XmlSchemaAny any = (XmlSchemaAny)child;
+
+                //since there is only one element here it does not matter
+                //for the constant. However the problem occurs if the users
+                //uses the same name for an element decalration
+                QName anyElementFieldName = new QName(ANY_ELEMENT_FIELD_NAME);
+                metainfHolder.registerMapping(anyElementFieldName,
+                        null,
+                        DEFAULT_CLASS_NAME,
+                        SchemaConstants.ANY);
+                metainfHolder.addMaxOccurs(anyElementFieldName,any.getMaxOccurs());
+                metainfHolder.addMinOccurs(anyElementFieldName,any.getMinOccurs());
+                if (order) {
+                    //record the order in the metainf holder for the any
+                    Integer integer = (Integer) elementOrderMap.get(any);
+                    metainfHolder.registerQNameIndex(anyElementFieldName,
+                            startingItemNumberOrder + integer.intValue());
+                }
 
 
-            //register the occurence counts
-            metainfHolder.addMaxOccurs(qName, elt.getMaxOccurs());
-            metainfHolder.addMinOccurs(qName, elt.getMinOccurs());
-            //we need the order to be preserved. So record the order also
-            if (order) {
-                //record the order in the metainf holder
-                Integer integer = (Integer) elementOrderMap.get(elt);
-                metainfHolder.registerQNameIndex(qName,
-                        startingItemNumberOrder + integer.intValue());
-            }
-
-            //get the nillable state and register that on the metainf holder
-            if (localNillableList.contains(elt.getQName())){
-                metainfHolder.registerNillableQName(elt.getQName());
             }
 
+
         }
 
         //set the ordered flag in the metainf holder
@@ -828,15 +882,8 @@
      * @param any
      * @param metainf
      */
-    private void processAny(XmlSchemaAny any, BeanWriterMetaInfoHolder metainf) {
-        //handle the minoccurs/maxoccurs here.
-        //However since the any element does not have a name
-        //we need to put a name here
-        metainf.registerMapping(new QName(ANY_ELEMENT_FIELD_NAME),
-                null,
-                DEFAULT_CLASS_NAME,
-                SchemaConstants.ANY_TYPE);
-
+    private void processAny(XmlSchemaAny any, Map processedElementTypeMap) {
+        processedElementTypeMap.put(new QName(ANY_ELEMENT_FIELD_NAME),any);
     }
 
     /**

Modified: webservices/axis2/trunk/java/modules/codegen/src/org/apache/axis2/schema/template/ADBBeanTemplate.xsl
URL: http://svn.apache.org/viewcvs/webservices/axis2/trunk/java/modules/codegen/src/org/apache/axis2/schema/template/ADBBeanTemplate.xsl?rev=381914&r1=381913&r2=381914&view=diff
==============================================================================
--- webservices/axis2/trunk/java/modules/codegen/src/org/apache/axis2/schema/template/ADBBeanTemplate.xsl (original)
+++ webservices/axis2/trunk/java/modules/codegen/src/org/apache/axis2/schema/template/ADBBeanTemplate.xsl Tue Feb 28 22:10:41 2006
@@ -168,7 +168,7 @@
 
                     <xsl:if test="$min=0 or $choice"> if (<xsl:value-of select="$settingTracker"/>){</xsl:if>
                     <xsl:choose>
-                        <xsl:when test="@ours or @any or @default or @array">
+                        <xsl:when test="@ours or @default or @array">
                             elementList.add(new javax.xml.namespace.QName("<xsl:value-of select="$namespace"/>",
                                                                       "<xsl:value-of select="$propertyName"/>"));
                             <!-- Arraylist can handle null's -->
@@ -185,6 +185,12 @@
                                 </xsl:otherwise>
                             </xsl:choose>
                         </xsl:when>
+                        <!-- handle any-->
+                         <xsl:when test="@any">
+                             <!--todo Not sure whether this is right-->
+                            elementList.add(null);
+                            elementList.add(<xsl:value-of select="$varName"/>);
+                        </xsl:when>
                         <xsl:otherwise>
                              elementList.add(new javax.xml.namespace.QName("<xsl:value-of select="$namespace"/>",
                                                                       "<xsl:value-of select="$propertyName"/>"));
@@ -464,11 +470,41 @@
                     </xsl:choose>
              </xsl:when>
              <!--  end of array handling -->
+
+             <!-- start of adb handling-->
               <xsl:when test="@ours">
+
+                  object.set<xsl:value-of select="$javaName"/>(
+                  <xsl:value-of select="$propertyType"/>.Factory.parse(reader));
+
+
+              </xsl:when>
+
+              <!-- start of any handling. Any can also be @default so we need to
+        handle the any case before default! -->
+              <xsl:when test="@any">
                   <!--No concerns of being nillable here. if it's ours and if the nillable attribute was present
                       we would have outputted a null already-->
-                  object.set<xsl:value-of select="$javaName"/>(<xsl:value-of select="$propertyType"/>.Factory.parse(
-                  reader));
+                   boolean <xsl:value-of select="$loopBoolName"/> = false;
+                   //move to the start element
+                   while(!<xsl:value-of select="$loopBoolName"/>){
+                    if (reader.isStartElement()){
+                        <xsl:value-of select="$loopBoolName"/> = true;
+                    }else{
+                        reader.next();
+                    }
+                }
+
+                   <!--This can be any element and we may not know the name. so we pick the name of the
+                   element from the parser-->  
+                //use the QName from the parser as the name for the builder
+                javax.xml.namespace.QName <xsl:value-of select="$startQname"/> = reader.getName();
+
+                // We need to wrap the reader so that it produces a fake START_DOCUEMENT event
+                // this is needed by the builder classes
+                org.apache.axis2.databinding.utils.NamedStaxOMBuilder <xsl:value-of select="$builderName"/> = new org.apache.axis2.databinding.utils.NamedStaxOMBuilder(
+                        new org.apache.axis2.util.StreamWrapper(reader),<xsl:value-of select="$startQname"/>);
+                object.set<xsl:value-of select="$javaName"/>(<xsl:value-of select="$builderName"/>.getOMElement());
 
 
               </xsl:when>



RE: svn commit: r381914 - in /webservices/axis2/trunk/java/modules/codegen/src/org/apache/axis2/schema: SchemaCompiler.java template/ADBBeanTemplate.xsl

Posted by Chet Murphy <cm...@modelworks.com>.
How do I get off this list? I have unsubscribed from all the axis lists, but I am still getting these messages.

Thanks,

Chet Murphy
Modelworks Software
cmurphy@modelworks.com
http://www.modelworks.com
voice: 425 488 5686
fax: 425 488 3986 

-----Original Message-----
From: ajith@apache.org [mailto:ajith@apache.org]
Sent: Tuesday, February 28, 2006 10:11 PM
To: axis2-cvs@ws.apache.org
Subject: svn commit: r381914 - in
/webservices/axis2/trunk/java/modules/codegen/src/org/apache/axis2/schem
a: SchemaCompiler.java template/ADBBeanTemplate.xsl


Author: ajith
Date: Tue Feb 28 22:10:41 2006
New Revision: 381914

URL: http://svn.apache.org/viewcvs?rev=381914&view=rev
Log:
Adding proper support for xs:any. Now an OMElement (or an OMElement array) will be generated for the xs:any. This is not tested fully.

Modified:
    webservices/axis2/trunk/java/modules/codegen/src/org/apache/axis2/schema/SchemaCompiler.java
    webservices/axis2/trunk/java/modules/codegen/src/org/apache/axis2/schema/template/ADBBeanTemplate.xsl

Modified: webservices/axis2/trunk/java/modules/codegen/src/org/apache/axis2/schema/SchemaCompiler.java
URL: http://svn.apache.org/viewcvs/webservices/axis2/trunk/java/modules/codegen/src/org/apache/axis2/schema/SchemaCompiler.java?rev=381914&r1=381913&r2=381914&view=diff
==============================================================================
--- webservices/axis2/trunk/java/modules/codegen/src/org/apache/axis2/schema/SchemaCompiler.java (original)
+++ webservices/axis2/trunk/java/modules/codegen/src/org/apache/axis2/schema/SchemaCompiler.java Tue Feb 28 22:10:41 2006
@@ -68,7 +68,8 @@
     //the list of processedElements for the outer elements
     private HashMap processedElementMap;
 
-     private HashMap processedAnonymousComplexTypesMap;
+    private HashMap processedAnonymousComplexTypesMap;
+
     //we need this map to keep the referenced elements. these elements need to be kept seperate
     //to avoid conflicts
     private HashMap processedElementRefMap;
@@ -83,20 +84,25 @@
     //
     private ArrayList processedElementList;
 
-    //
+    //a list of nillable elements - used to generate code
+    //for nillable elements
     private List nillableElementList;
-
     private BeanWriter writer = null;
-
     private Map baseSchemaTypeMap = null;
 
-    private static final String ANY_ELEMENT_FIELD_NAME = "extraElements";
-    private static final String EXTRA_ATTRIBUTE_FIELD_NAME = "extraAttributes";
+    // a list of externally identified QNames to be processed. This becomes
+    // useful when  only a list of external elements need to be processed
+
+    public static final String ANY_ELEMENT_FIELD_NAME = "extraElement";
+    public static final String EXTRA_ATTRIBUTE_FIELD_NAME = "extraAttributes";
 
     public static final String DEFAULT_CLASS_NAME = OMElement.class.getName();
     public static final String DEFAULT_CLASS_ARRAY_NAME = "org.apache.ws.commons.om.OMElement[]";
 
 
+
+
+
     /**
      * @return the processes element map
      * includes the Qname of the element as the key and a
@@ -106,6 +112,7 @@
         return processedElementMap;
     }
 
+
     /**
      * @return a map of Qname vs models. A model can be anything,
      * ranging from a DOM document to a stream. This is taken from the
@@ -129,6 +136,7 @@
             this.options = options;
         }
 
+        //instantiate the maps
         processedTypemap = new HashMap();
         processedElementMap = new HashMap();
         simpleTypesMap = new HashMap();
@@ -139,7 +147,7 @@
         processedElementRefMap = new HashMap();
         nillableElementList = new ArrayList();
 
-        //load the writer a nd initiliaze the base type
+        //load the writer and initiliaze the base types
         writer = SchemaPropertyLoader.getBeanWriterInstance();
         writer.init(this.options);
 
@@ -192,8 +200,11 @@
                 }
             }
         }
+
+
         //select all the elements. We generate the code for types
-        //only if the elements refer them!!!
+        //only if the elements refer them!!! regardless of the fact that
+        //we have a list of elementnames, we'll need to process all the elements
         XmlSchemaObjectTable elements = schema.getElements();
         Iterator xmlSchemaElement1Iterator = elements.getValues();
         while (xmlSchemaElement1Iterator.hasNext()) {
@@ -215,6 +226,7 @@
             writeElement((XmlSchemaElement) xmlSchemaElement2Iterator.next());
         }
 
+
         if (options.isWrapClasses()) {
             writer.writeBatch();
         }
@@ -276,7 +288,7 @@
                     className);
 
 
-        }else{
+        }else if (schemaType != null){  //the named type should have been handled already
 
             //we are going to special case the anonymous complex type. Our algorithm for dealing
             //with it is to generate a single object that has the complex content inside. Really the
@@ -284,6 +296,10 @@
             //First copy the schema types content into the metainf holder
             metainf = (BeanWriterMetaInfoHolder) this.processedAnonymousComplexTypesMap.get(xsElt);
             metainf.setAnonymous(true);
+        }else{
+            //this means we did not find any schema type associated with the particular element. we
+            //should be throwing an exception here
+            throw new SchemaCompilationException("no type!!");//todo i18n this
         }
 
         if (nillableElementList.contains(xsElt.getQName())){
@@ -669,12 +685,13 @@
             //todo - Handle simple type restriction here
         }
     }
+
     /**
      * Handle any attribute
-     *
      * @param metainf
      */
     private void processAnyAttribute(BeanWriterMetaInfoHolder metainf) {
+
         //The best thing we can do here is to add a set of OMAttributes
         metainf.registerMapping(new QName(EXTRA_ATTRIBUTE_FIELD_NAME),
                 null,
@@ -683,6 +700,8 @@
 
     }
 
+
+
     /**
      * Process the attribute
      *
@@ -761,7 +780,13 @@
 
                 //handle xsd:any ! We place an OMElement in the generated class
             } else if (item instanceof XmlSchemaAny) {
-                processAny((XmlSchemaAny) item, metainfHolder);
+                XmlSchemaAny any = (XmlSchemaAny) item;
+                processAny(any, processedElementTypeMap);
+                //any can also be inside a sequence
+                if (order) {
+                    elementOrderMap.put(any, new Integer(i));
+                }
+                 processedElementArrayStatusMap.put(any, Boolean.FALSE);
             } else {
                 //there may be other types to be handled here. Add them
                 //when we are ready
@@ -774,48 +799,77 @@
         Iterator processedElementsIterator = processedElementArrayStatusMap.keySet().iterator();
         int startingItemNumberOrder = metainfHolder.getOrderStartPoint();
         while (processedElementsIterator.hasNext()) {
-            XmlSchemaElement elt = (XmlSchemaElement) processedElementsIterator.next();
-            String clazzName;
-            QName qName;
-
-            if (elt.getQName()!=null){
-                clazzName = (String) processedElementTypeMap.get(elt.getQName());
-                qName = elt.getQName();
-                metainfHolder.registerMapping(qName,
-                        elt.getSchemaTypeName()
-                        , clazzName,
-                        ((Boolean) processedElementArrayStatusMap.get(elt)).booleanValue() ?
-                                SchemaConstants.ANY_ARRAY_TYPE :
-                                SchemaConstants.ELEMENT_TYPE);
-            }else{ //probably this is referenced
-                clazzName = (String)processedElementRefMap.get(elt.getRefName());
-                qName = elt.getRefName();
-                metainfHolder.registerMapping(qName,
-                        parentSchema.getElementByName(elt.getRefName()).getSchemaTypeName()
-                        , clazzName,
-                        ((Boolean) processedElementArrayStatusMap.get(elt)).booleanValue() ?
-                                SchemaConstants.ANY_ARRAY_TYPE :
-                                SchemaConstants.ELEMENT_TYPE);
-            }
+            Object child = processedElementsIterator.next();
+
+            // process the XmlSchemaElement
+            if (child instanceof XmlSchemaElement){
+                XmlSchemaElement elt = (XmlSchemaElement) child;
+                String clazzName;
+                QName qName;
+
+                if (elt.getQName()!=null){
+                    clazzName = (String) processedElementTypeMap.get(elt.getQName());
+                    qName = elt.getQName();
+                    metainfHolder.registerMapping(qName,
+                            elt.getSchemaTypeName()
+                            , clazzName,
+                            ((Boolean) processedElementArrayStatusMap.get(elt)).booleanValue() ?
+                                    SchemaConstants.ANY_ARRAY_TYPE :
+                                    SchemaConstants.ELEMENT_TYPE);
+                }else{ //probably this is referenced
+                    clazzName = (String)processedElementRefMap.get(elt.getRefName());
+                    qName = elt.getRefName();
+                    metainfHolder.registerMapping(qName,
+                            parentSchema.getElementByName(elt.getRefName()).getSchemaTypeName()
+                            , clazzName,
+                            ((Boolean) processedElementArrayStatusMap.get(elt)).booleanValue() ?
+                                    SchemaConstants.ANY_ARRAY_TYPE :
+                                    SchemaConstants.ELEMENT_TYPE);
+                }
+
+
+
+                //register the occurence counts
+                metainfHolder.addMaxOccurs(qName, elt.getMaxOccurs());
+                metainfHolder.addMinOccurs(qName, elt.getMinOccurs());
+                //we need the order to be preserved. So record the order also
+                if (order) {
+                    //record the order in the metainf holder
+                    Integer integer = (Integer) elementOrderMap.get(elt);
+                    metainfHolder.registerQNameIndex(qName,
+                            startingItemNumberOrder + integer.intValue());
+                }
 
+                //get the nillable state and register that on the metainf holder
+                if (localNillableList.contains(elt.getQName())){
+                    metainfHolder.registerNillableQName(elt.getQName());
+                }
+
+                // process the XMLSchemaAny
+            }else if (child instanceof XmlSchemaAny){
+                XmlSchemaAny any = (XmlSchemaAny)child;
+
+                //since there is only one element here it does not matter
+                //for the constant. However the problem occurs if the users
+                //uses the same name for an element decalration
+                QName anyElementFieldName = new QName(ANY_ELEMENT_FIELD_NAME);
+                metainfHolder.registerMapping(anyElementFieldName,
+                        null,
+                        DEFAULT_CLASS_NAME,
+                        SchemaConstants.ANY);
+                metainfHolder.addMaxOccurs(anyElementFieldName,any.getMaxOccurs());
+                metainfHolder.addMinOccurs(anyElementFieldName,any.getMinOccurs());
+                if (order) {
+                    //record the order in the metainf holder for the any
+                    Integer integer = (Integer) elementOrderMap.get(any);
+                    metainfHolder.registerQNameIndex(anyElementFieldName,
+                            startingItemNumberOrder + integer.intValue());
+                }
 
 
-            //register the occurence counts
-            metainfHolder.addMaxOccurs(qName, elt.getMaxOccurs());
-            metainfHolder.addMinOccurs(qName, elt.getMinOccurs());
-            //we need the order to be preserved. So record the order also
-            if (order) {
-                //record the order in the metainf holder
-                Integer integer = (Integer) elementOrderMap.get(elt);
-                metainfHolder.registerQNameIndex(qName,
-                        startingItemNumberOrder + integer.intValue());
-            }
-
-            //get the nillable state and register that on the metainf holder
-            if (localNillableList.contains(elt.getQName())){
-                metainfHolder.registerNillableQName(elt.getQName());
             }
 
+
         }
 
         //set the ordered flag in the metainf holder
@@ -828,15 +882,8 @@
      * @param any
      * @param metainf
      */
-    private void processAny(XmlSchemaAny any, BeanWriterMetaInfoHolder metainf) {
-        //handle the minoccurs/maxoccurs here.
-        //However since the any element does not have a name
-        //we need to put a name here
-        metainf.registerMapping(new QName(ANY_ELEMENT_FIELD_NAME),
-                null,
-                DEFAULT_CLASS_NAME,
-                SchemaConstants.ANY_TYPE);
-
+    private void processAny(XmlSchemaAny any, Map processedElementTypeMap) {
+        processedElementTypeMap.put(new QName(ANY_ELEMENT_FIELD_NAME),any);
     }
 
     /**

Modified: webservices/axis2/trunk/java/modules/codegen/src/org/apache/axis2/schema/template/ADBBeanTemplate.xsl
URL: http://svn.apache.org/viewcvs/webservices/axis2/trunk/java/modules/codegen/src/org/apache/axis2/schema/template/ADBBeanTemplate.xsl?rev=381914&r1=381913&r2=381914&view=diff
==============================================================================
--- webservices/axis2/trunk/java/modules/codegen/src/org/apache/axis2/schema/template/ADBBeanTemplate.xsl (original)
+++ webservices/axis2/trunk/java/modules/codegen/src/org/apache/axis2/schema/template/ADBBeanTemplate.xsl Tue Feb 28 22:10:41 2006
@@ -168,7 +168,7 @@
 
                     <xsl:if test="$min=0 or $choice"> if (<xsl:value-of select="$settingTracker"/>){</xsl:if>
                     <xsl:choose>
-                        <xsl:when test="@ours or @any or @default or @array">
+                        <xsl:when test="@ours or @default or @array">
                             elementList.add(new javax.xml.namespace.QName("<xsl:value-of select="$namespace"/>",
                                                                       "<xsl:value-of select="$propertyName"/>"));
                             <!-- Arraylist can handle null's -->
@@ -185,6 +185,12 @@
                                 </xsl:otherwise>
                             </xsl:choose>
                         </xsl:when>
+                        <!-- handle any-->
+                         <xsl:when test="@any">
+                             <!--todo Not sure whether this is right-->
+                            elementList.add(null);
+                            elementList.add(<xsl:value-of select="$varName"/>);
+                        </xsl:when>
                         <xsl:otherwise>
                              elementList.add(new javax.xml.namespace.QName("<xsl:value-of select="$namespace"/>",
                                                                       "<xsl:value-of select="$propertyName"/>"));
@@ -464,11 +470,41 @@
                     </xsl:choose>
              </xsl:when>
              <!--  end of array handling -->
+
+             <!-- start of adb handling-->
               <xsl:when test="@ours">
+
+                  object.set<xsl:value-of select="$javaName"/>(
+                  <xsl:value-of select="$propertyType"/>.Factory.parse(reader));
+
+
+              </xsl:when>
+
+              <!-- start of any handling. Any can also be @default so we need to
+        handle the any case before default! -->
+              <xsl:when test="@any">
                   <!--No concerns of being nillable here. if it's ours and if the nillable attribute was present
                       we would have outputted a null already-->
-                  object.set<xsl:value-of select="$javaName"/>(<xsl:value-of select="$propertyType"/>.Factory.parse(
-                  reader));
+                   boolean <xsl:value-of select="$loopBoolName"/> = false;
+                   //move to the start element
+                   while(!<xsl:value-of select="$loopBoolName"/>){
+                    if (reader.isStartElement()){
+                        <xsl:value-of select="$loopBoolName"/> = true;
+                    }else{
+                        reader.next();
+                    }
+                }
+
+                   <!--This can be any element and we may not know the name. so we pick the name of the
+                   element from the parser-->  
+                //use the QName from the parser as the name for the builder
+                javax.xml.namespace.QName <xsl:value-of select="$startQname"/> = reader.getName();
+
+                // We need to wrap the reader so that it produces a fake START_DOCUEMENT event
+                // this is needed by the builder classes
+                org.apache.axis2.databinding.utils.NamedStaxOMBuilder <xsl:value-of select="$builderName"/> = new org.apache.axis2.databinding.utils.NamedStaxOMBuilder(
+                        new org.apache.axis2.util.StreamWrapper(reader),<xsl:value-of select="$startQname"/>);
+                object.set<xsl:value-of select="$javaName"/>(<xsl:value-of select="$builderName"/>.getOMElement());
 
 
               </xsl:when>




RE: svn commit: r381914 - in /webservices/axis2/trunk/java/modules/codegen/src/org/apache/axis2/schema: SchemaCompiler.java template/ADBBeanTemplate.xsl

Posted by Chet Murphy <cm...@modelworks.com>.
How do I get off this list? I have unsubscribed from all the axis lists, but I am still getting these messages.

Thanks,

Chet Murphy
Modelworks Software
cmurphy@modelworks.com
http://www.modelworks.com
voice: 425 488 5686
fax: 425 488 3986 

-----Original Message-----
From: ajith@apache.org [mailto:ajith@apache.org]
Sent: Tuesday, February 28, 2006 10:11 PM
To: axis2-cvs@ws.apache.org
Subject: svn commit: r381914 - in
/webservices/axis2/trunk/java/modules/codegen/src/org/apache/axis2/schem
a: SchemaCompiler.java template/ADBBeanTemplate.xsl


Author: ajith
Date: Tue Feb 28 22:10:41 2006
New Revision: 381914

URL: http://svn.apache.org/viewcvs?rev=381914&view=rev
Log:
Adding proper support for xs:any. Now an OMElement (or an OMElement array) will be generated for the xs:any. This is not tested fully.

Modified:
    webservices/axis2/trunk/java/modules/codegen/src/org/apache/axis2/schema/SchemaCompiler.java
    webservices/axis2/trunk/java/modules/codegen/src/org/apache/axis2/schema/template/ADBBeanTemplate.xsl

Modified: webservices/axis2/trunk/java/modules/codegen/src/org/apache/axis2/schema/SchemaCompiler.java
URL: http://svn.apache.org/viewcvs/webservices/axis2/trunk/java/modules/codegen/src/org/apache/axis2/schema/SchemaCompiler.java?rev=381914&r1=381913&r2=381914&view=diff
==============================================================================
--- webservices/axis2/trunk/java/modules/codegen/src/org/apache/axis2/schema/SchemaCompiler.java (original)
+++ webservices/axis2/trunk/java/modules/codegen/src/org/apache/axis2/schema/SchemaCompiler.java Tue Feb 28 22:10:41 2006
@@ -68,7 +68,8 @@
     //the list of processedElements for the outer elements
     private HashMap processedElementMap;
 
-     private HashMap processedAnonymousComplexTypesMap;
+    private HashMap processedAnonymousComplexTypesMap;
+
     //we need this map to keep the referenced elements. these elements need to be kept seperate
     //to avoid conflicts
     private HashMap processedElementRefMap;
@@ -83,20 +84,25 @@
     //
     private ArrayList processedElementList;
 
-    //
+    //a list of nillable elements - used to generate code
+    //for nillable elements
     private List nillableElementList;
-
     private BeanWriter writer = null;
-
     private Map baseSchemaTypeMap = null;
 
-    private static final String ANY_ELEMENT_FIELD_NAME = "extraElements";
-    private static final String EXTRA_ATTRIBUTE_FIELD_NAME = "extraAttributes";
+    // a list of externally identified QNames to be processed. This becomes
+    // useful when  only a list of external elements need to be processed
+
+    public static final String ANY_ELEMENT_FIELD_NAME = "extraElement";
+    public static final String EXTRA_ATTRIBUTE_FIELD_NAME = "extraAttributes";
 
     public static final String DEFAULT_CLASS_NAME = OMElement.class.getName();
     public static final String DEFAULT_CLASS_ARRAY_NAME = "org.apache.ws.commons.om.OMElement[]";
 
 
+
+
+
     /**
      * @return the processes element map
      * includes the Qname of the element as the key and a
@@ -106,6 +112,7 @@
         return processedElementMap;
     }
 
+
     /**
      * @return a map of Qname vs models. A model can be anything,
      * ranging from a DOM document to a stream. This is taken from the
@@ -129,6 +136,7 @@
             this.options = options;
         }
 
+        //instantiate the maps
         processedTypemap = new HashMap();
         processedElementMap = new HashMap();
         simpleTypesMap = new HashMap();
@@ -139,7 +147,7 @@
         processedElementRefMap = new HashMap();
         nillableElementList = new ArrayList();
 
-        //load the writer a nd initiliaze the base type
+        //load the writer and initiliaze the base types
         writer = SchemaPropertyLoader.getBeanWriterInstance();
         writer.init(this.options);
 
@@ -192,8 +200,11 @@
                 }
             }
         }
+
+
         //select all the elements. We generate the code for types
-        //only if the elements refer them!!!
+        //only if the elements refer them!!! regardless of the fact that
+        //we have a list of elementnames, we'll need to process all the elements
         XmlSchemaObjectTable elements = schema.getElements();
         Iterator xmlSchemaElement1Iterator = elements.getValues();
         while (xmlSchemaElement1Iterator.hasNext()) {
@@ -215,6 +226,7 @@
             writeElement((XmlSchemaElement) xmlSchemaElement2Iterator.next());
         }
 
+
         if (options.isWrapClasses()) {
             writer.writeBatch();
         }
@@ -276,7 +288,7 @@
                     className);
 
 
-        }else{
+        }else if (schemaType != null){  //the named type should have been handled already
 
             //we are going to special case the anonymous complex type. Our algorithm for dealing
             //with it is to generate a single object that has the complex content inside. Really the
@@ -284,6 +296,10 @@
             //First copy the schema types content into the metainf holder
             metainf = (BeanWriterMetaInfoHolder) this.processedAnonymousComplexTypesMap.get(xsElt);
             metainf.setAnonymous(true);
+        }else{
+            //this means we did not find any schema type associated with the particular element. we
+            //should be throwing an exception here
+            throw new SchemaCompilationException("no type!!");//todo i18n this
         }
 
         if (nillableElementList.contains(xsElt.getQName())){
@@ -669,12 +685,13 @@
             //todo - Handle simple type restriction here
         }
     }
+
     /**
      * Handle any attribute
-     *
      * @param metainf
      */
     private void processAnyAttribute(BeanWriterMetaInfoHolder metainf) {
+
         //The best thing we can do here is to add a set of OMAttributes
         metainf.registerMapping(new QName(EXTRA_ATTRIBUTE_FIELD_NAME),
                 null,
@@ -683,6 +700,8 @@
 
     }
 
+
+
     /**
      * Process the attribute
      *
@@ -761,7 +780,13 @@
 
                 //handle xsd:any ! We place an OMElement in the generated class
             } else if (item instanceof XmlSchemaAny) {
-                processAny((XmlSchemaAny) item, metainfHolder);
+                XmlSchemaAny any = (XmlSchemaAny) item;
+                processAny(any, processedElementTypeMap);
+                //any can also be inside a sequence
+                if (order) {
+                    elementOrderMap.put(any, new Integer(i));
+                }
+                 processedElementArrayStatusMap.put(any, Boolean.FALSE);
             } else {
                 //there may be other types to be handled here. Add them
                 //when we are ready
@@ -774,48 +799,77 @@
         Iterator processedElementsIterator = processedElementArrayStatusMap.keySet().iterator();
         int startingItemNumberOrder = metainfHolder.getOrderStartPoint();
         while (processedElementsIterator.hasNext()) {
-            XmlSchemaElement elt = (XmlSchemaElement) processedElementsIterator.next();
-            String clazzName;
-            QName qName;
-
-            if (elt.getQName()!=null){
-                clazzName = (String) processedElementTypeMap.get(elt.getQName());
-                qName = elt.getQName();
-                metainfHolder.registerMapping(qName,
-                        elt.getSchemaTypeName()
-                        , clazzName,
-                        ((Boolean) processedElementArrayStatusMap.get(elt)).booleanValue() ?
-                                SchemaConstants.ANY_ARRAY_TYPE :
-                                SchemaConstants.ELEMENT_TYPE);
-            }else{ //probably this is referenced
-                clazzName = (String)processedElementRefMap.get(elt.getRefName());
-                qName = elt.getRefName();
-                metainfHolder.registerMapping(qName,
-                        parentSchema.getElementByName(elt.getRefName()).getSchemaTypeName()
-                        , clazzName,
-                        ((Boolean) processedElementArrayStatusMap.get(elt)).booleanValue() ?
-                                SchemaConstants.ANY_ARRAY_TYPE :
-                                SchemaConstants.ELEMENT_TYPE);
-            }
+            Object child = processedElementsIterator.next();
+
+            // process the XmlSchemaElement
+            if (child instanceof XmlSchemaElement){
+                XmlSchemaElement elt = (XmlSchemaElement) child;
+                String clazzName;
+                QName qName;
+
+                if (elt.getQName()!=null){
+                    clazzName = (String) processedElementTypeMap.get(elt.getQName());
+                    qName = elt.getQName();
+                    metainfHolder.registerMapping(qName,
+                            elt.getSchemaTypeName()
+                            , clazzName,
+                            ((Boolean) processedElementArrayStatusMap.get(elt)).booleanValue() ?
+                                    SchemaConstants.ANY_ARRAY_TYPE :
+                                    SchemaConstants.ELEMENT_TYPE);
+                }else{ //probably this is referenced
+                    clazzName = (String)processedElementRefMap.get(elt.getRefName());
+                    qName = elt.getRefName();
+                    metainfHolder.registerMapping(qName,
+                            parentSchema.getElementByName(elt.getRefName()).getSchemaTypeName()
+                            , clazzName,
+                            ((Boolean) processedElementArrayStatusMap.get(elt)).booleanValue() ?
+                                    SchemaConstants.ANY_ARRAY_TYPE :
+                                    SchemaConstants.ELEMENT_TYPE);
+                }
+
+
+
+                //register the occurence counts
+                metainfHolder.addMaxOccurs(qName, elt.getMaxOccurs());
+                metainfHolder.addMinOccurs(qName, elt.getMinOccurs());
+                //we need the order to be preserved. So record the order also
+                if (order) {
+                    //record the order in the metainf holder
+                    Integer integer = (Integer) elementOrderMap.get(elt);
+                    metainfHolder.registerQNameIndex(qName,
+                            startingItemNumberOrder + integer.intValue());
+                }
 
+                //get the nillable state and register that on the metainf holder
+                if (localNillableList.contains(elt.getQName())){
+                    metainfHolder.registerNillableQName(elt.getQName());
+                }
+
+                // process the XMLSchemaAny
+            }else if (child instanceof XmlSchemaAny){
+                XmlSchemaAny any = (XmlSchemaAny)child;
+
+                //since there is only one element here it does not matter
+                //for the constant. However the problem occurs if the users
+                //uses the same name for an element decalration
+                QName anyElementFieldName = new QName(ANY_ELEMENT_FIELD_NAME);
+                metainfHolder.registerMapping(anyElementFieldName,
+                        null,
+                        DEFAULT_CLASS_NAME,
+                        SchemaConstants.ANY);
+                metainfHolder.addMaxOccurs(anyElementFieldName,any.getMaxOccurs());
+                metainfHolder.addMinOccurs(anyElementFieldName,any.getMinOccurs());
+                if (order) {
+                    //record the order in the metainf holder for the any
+                    Integer integer = (Integer) elementOrderMap.get(any);
+                    metainfHolder.registerQNameIndex(anyElementFieldName,
+                            startingItemNumberOrder + integer.intValue());
+                }
 
 
-            //register the occurence counts
-            metainfHolder.addMaxOccurs(qName, elt.getMaxOccurs());
-            metainfHolder.addMinOccurs(qName, elt.getMinOccurs());
-            //we need the order to be preserved. So record the order also
-            if (order) {
-                //record the order in the metainf holder
-                Integer integer = (Integer) elementOrderMap.get(elt);
-                metainfHolder.registerQNameIndex(qName,
-                        startingItemNumberOrder + integer.intValue());
-            }
-
-            //get the nillable state and register that on the metainf holder
-            if (localNillableList.contains(elt.getQName())){
-                metainfHolder.registerNillableQName(elt.getQName());
             }
 
+
         }
 
         //set the ordered flag in the metainf holder
@@ -828,15 +882,8 @@
      * @param any
      * @param metainf
      */
-    private void processAny(XmlSchemaAny any, BeanWriterMetaInfoHolder metainf) {
-        //handle the minoccurs/maxoccurs here.
-        //However since the any element does not have a name
-        //we need to put a name here
-        metainf.registerMapping(new QName(ANY_ELEMENT_FIELD_NAME),
-                null,
-                DEFAULT_CLASS_NAME,
-                SchemaConstants.ANY_TYPE);
-
+    private void processAny(XmlSchemaAny any, Map processedElementTypeMap) {
+        processedElementTypeMap.put(new QName(ANY_ELEMENT_FIELD_NAME),any);
     }
 
     /**

Modified: webservices/axis2/trunk/java/modules/codegen/src/org/apache/axis2/schema/template/ADBBeanTemplate.xsl
URL: http://svn.apache.org/viewcvs/webservices/axis2/trunk/java/modules/codegen/src/org/apache/axis2/schema/template/ADBBeanTemplate.xsl?rev=381914&r1=381913&r2=381914&view=diff
==============================================================================
--- webservices/axis2/trunk/java/modules/codegen/src/org/apache/axis2/schema/template/ADBBeanTemplate.xsl (original)
+++ webservices/axis2/trunk/java/modules/codegen/src/org/apache/axis2/schema/template/ADBBeanTemplate.xsl Tue Feb 28 22:10:41 2006
@@ -168,7 +168,7 @@
 
                     <xsl:if test="$min=0 or $choice"> if (<xsl:value-of select="$settingTracker"/>){</xsl:if>
                     <xsl:choose>
-                        <xsl:when test="@ours or @any or @default or @array">
+                        <xsl:when test="@ours or @default or @array">
                             elementList.add(new javax.xml.namespace.QName("<xsl:value-of select="$namespace"/>",
                                                                       "<xsl:value-of select="$propertyName"/>"));
                             <!-- Arraylist can handle null's -->
@@ -185,6 +185,12 @@
                                 </xsl:otherwise>
                             </xsl:choose>
                         </xsl:when>
+                        <!-- handle any-->
+                         <xsl:when test="@any">
+                             <!--todo Not sure whether this is right-->
+                            elementList.add(null);
+                            elementList.add(<xsl:value-of select="$varName"/>);
+                        </xsl:when>
                         <xsl:otherwise>
                              elementList.add(new javax.xml.namespace.QName("<xsl:value-of select="$namespace"/>",
                                                                       "<xsl:value-of select="$propertyName"/>"));
@@ -464,11 +470,41 @@
                     </xsl:choose>
              </xsl:when>
              <!--  end of array handling -->
+
+             <!-- start of adb handling-->
               <xsl:when test="@ours">
+
+                  object.set<xsl:value-of select="$javaName"/>(
+                  <xsl:value-of select="$propertyType"/>.Factory.parse(reader));
+
+
+              </xsl:when>
+
+              <!-- start of any handling. Any can also be @default so we need to
+        handle the any case before default! -->
+              <xsl:when test="@any">
                   <!--No concerns of being nillable here. if it's ours and if the nillable attribute was present
                       we would have outputted a null already-->
-                  object.set<xsl:value-of select="$javaName"/>(<xsl:value-of select="$propertyType"/>.Factory.parse(
-                  reader));
+                   boolean <xsl:value-of select="$loopBoolName"/> = false;
+                   //move to the start element
+                   while(!<xsl:value-of select="$loopBoolName"/>){
+                    if (reader.isStartElement()){
+                        <xsl:value-of select="$loopBoolName"/> = true;
+                    }else{
+                        reader.next();
+                    }
+                }
+
+                   <!--This can be any element and we may not know the name. so we pick the name of the
+                   element from the parser-->  
+                //use the QName from the parser as the name for the builder
+                javax.xml.namespace.QName <xsl:value-of select="$startQname"/> = reader.getName();
+
+                // We need to wrap the reader so that it produces a fake START_DOCUEMENT event
+                // this is needed by the builder classes
+                org.apache.axis2.databinding.utils.NamedStaxOMBuilder <xsl:value-of select="$builderName"/> = new org.apache.axis2.databinding.utils.NamedStaxOMBuilder(
+                        new org.apache.axis2.util.StreamWrapper(reader),<xsl:value-of select="$startQname"/>);
+                object.set<xsl:value-of select="$javaName"/>(<xsl:value-of select="$builderName"/>.getOMElement());
 
 
               </xsl:when>