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/02/09 12:00:06 UTC

svn commit: r376259 - in /webservices/axis2/trunk/java/modules: adb/src/org/apache/axis2/databinding/utils/ codegen/src/org/apache/axis2/schema/ codegen/src/org/apache/axis2/schema/template/ wsdl/src/org/apache/axis2/wsdl/builder/wsdl4j/

Author: ajith
Date: Thu Feb  9 03:00:02 2006
New Revision: 376259

URL: http://svn.apache.org/viewcvs?rev=376259&view=rev
Log:
1.Updated the state machines to handle ignorable whitespaces
2.The ADB generated code had a slight problem in the parser position. It's being fixed.
3.SchemaCompiler picked up local elements as global elements. It's being fixed also

Modified:
    webservices/axis2/trunk/java/modules/adb/src/org/apache/axis2/databinding/utils/SimpleArrayReaderStateMachine.java
    webservices/axis2/trunk/java/modules/adb/src/org/apache/axis2/databinding/utils/SimpleElementReaderStateMachine.java
    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
    webservices/axis2/trunk/java/modules/wsdl/src/org/apache/axis2/wsdl/builder/wsdl4j/WSDLPump.java

Modified: webservices/axis2/trunk/java/modules/adb/src/org/apache/axis2/databinding/utils/SimpleArrayReaderStateMachine.java
URL: http://svn.apache.org/viewcvs/webservices/axis2/trunk/java/modules/adb/src/org/apache/axis2/databinding/utils/SimpleArrayReaderStateMachine.java?rev=376259&r1=376258&r2=376259&view=diff
==============================================================================
--- webservices/axis2/trunk/java/modules/adb/src/org/apache/axis2/databinding/utils/SimpleArrayReaderStateMachine.java (original)
+++ webservices/axis2/trunk/java/modules/adb/src/org/apache/axis2/databinding/utils/SimpleArrayReaderStateMachine.java Thu Feb  9 03:00:02 2006
@@ -41,7 +41,7 @@
 
 
     public void setNillable(){
-       nillable = true;
+        nillable = true;
     }
 
     /**
@@ -70,12 +70,12 @@
 
             //test for the nillable attribute
             if (currentState==START_ELEMENT_FOUND_STATE &&
-                     nillable){
-               if (TRUE.equals(reader.getAttributeValue("",NIL))){
-                   list.add(null);
-                   //force the state to be null found
-                   currentState= NULLED_STATE;
-               }
+                    nillable){
+                if (TRUE.equals(reader.getAttributeValue("",NIL))){
+                    list.add(null);
+                    //force the state to be null found
+                    currentState= NULLED_STATE;
+                }
             }
 
             if (currentState==TEXT_FOUND_STATE){
@@ -84,11 +84,11 @@
             }
             //increment the parser only if the  state is
             //not finished
-             if (currentState!=FINISHED_STATE
-                && currentState!= ILLEGAL_STATE){
-               reader.next();
+            if (currentState!=FINISHED_STATE
+                    && currentState!= ILLEGAL_STATE){
+                reader.next();
             }
-          
+
         }while(currentState!=FINISHED_STATE
                 && currentState!= ILLEGAL_STATE);
 
@@ -109,23 +109,23 @@
         if (event== XMLStreamConstants.START_DOCUMENT && currentState==INIT_STATE){
             currentState = STARTED_STATE;
 
-        //start element found at init
+            //start element found at init
         }else  if (event==XMLStreamConstants.START_ELEMENT  && currentState==INIT_STATE){
             if (elementNameToTest.equals(reader.getName())){
                 currentState = START_ELEMENT_FOUND_STATE;
             }else{
                 currentState = STARTED_STATE;
             }
-        //start element found after starting
+            //start element found after starting
         }else if  (event==XMLStreamConstants.START_ELEMENT  && currentState==STARTED_STATE) {
             if (elementNameToTest.equals(reader.getName())){
                 currentState = START_ELEMENT_FOUND_STATE;
             }
-        //characters found after start
+            //characters found after start
         }else if (event==XMLStreamConstants.CHARACTERS && currentState==START_ELEMENT_FOUND_STATE){
             currentState  = TEXT_FOUND_STATE;
 
-         //end element found after characters
+            //end element found after characters
         } else if (event==XMLStreamConstants.END_ELEMENT && currentState==TEXT_FOUND_STATE){
             if (elementNameToTest.equals(reader.getName())){
                 currentState = END_ELEMENT_FOUND_STATE;
@@ -133,30 +133,41 @@
                 currentState = ILLEGAL_STATE;
             }
 
-        //another start element found after end-element
+            //characters found - if this is a characters event that was in the correct place then
+            //it would have been handled already. we need to check whether this is a ignorable
+            //whitespace and if not push the state machine to a illegal state.
+        }else if (event==XMLStreamConstants.CHARACTERS){
+            if (reader.getText().trim().length()==0){
+                //the text is empty - don't change the state
+            }else{
+                //we do NOT handle mixed content
+                currentState = ILLEGAL_STATE;
+            }
+
+            //another start element found after end-element
         }else if (event==XMLStreamConstants.START_ELEMENT && currentState==END_ELEMENT_FOUND_STATE ) {
             if (elementNameToTest.equals(reader.getName())){
                 currentState = START_ELEMENT_FOUND_STATE;
             }else{
                 currentState = FINISHED_STATE;
             }
-        //another end element found after end-element
+            //another end element found after end-element
         }else if (event==XMLStreamConstants.END_ELEMENT && currentState==END_ELEMENT_FOUND_STATE ) {
             currentState = FINISHED_STATE;
-         //end  document found
+            //end  document found
         }else if (event==XMLStreamConstants.END_DOCUMENT){
             currentState = FINISHED_STATE;
 
-        //the element was found to be null and this state was forced.
-        //we are sure here that the parser was at the START_ELEMENT_FOUND_STATE before
-        //being forced. Hence we need to advance the parser upto the end element and
-        //set the state to be end element found
+            //the element was found to be null and this state was forced.
+            //we are sure here that the parser was at the START_ELEMENT_FOUND_STATE before
+            //being forced. Hence we need to advance the parser upto the end element and
+            //set the state to be end element found
         }else if (currentState==NULLED_STATE){
-           while (event!= XMLStreamConstants.END_ELEMENT){
-               event=reader.next();
-           }
-           currentState = END_ELEMENT_FOUND_STATE;
-         //all other combinations are invalid
+            while (event!= XMLStreamConstants.END_ELEMENT){
+                event=reader.next();
+            }
+            currentState = END_ELEMENT_FOUND_STATE;
+            //all other combinations are invalid
         }else{
             currentState = ILLEGAL_STATE;
         }

Modified: webservices/axis2/trunk/java/modules/adb/src/org/apache/axis2/databinding/utils/SimpleElementReaderStateMachine.java
URL: http://svn.apache.org/viewcvs/webservices/axis2/trunk/java/modules/adb/src/org/apache/axis2/databinding/utils/SimpleElementReaderStateMachine.java?rev=376259&r1=376258&r2=376259&view=diff
==============================================================================
--- webservices/axis2/trunk/java/modules/adb/src/org/apache/axis2/databinding/utils/SimpleElementReaderStateMachine.java (original)
+++ webservices/axis2/trunk/java/modules/adb/src/org/apache/axis2/databinding/utils/SimpleElementReaderStateMachine.java Thu Feb  9 03:00:02 2006
@@ -33,6 +33,7 @@
     private int currentState = INIT_STATE;
     private boolean nillable = false;
     private String text="";
+    private String errorMessage = "";
 
     /**
      *
@@ -54,6 +55,7 @@
      */
     public void setElementNameToTest(QName elementNameToTest) {
         this.elementNameToTest = elementNameToTest;
+        
     }
 
     /**
@@ -65,6 +67,7 @@
         currentState = INIT_STATE;
         nillable = false;
         text="";
+        errorMessage = "";
     }
     /**
      * public read method - reads a given reader to extract the text value
@@ -98,7 +101,7 @@
                 && currentState!= ILLEGAL_STATE);
 
         if (currentState==ILLEGAL_STATE){
-            throw new RuntimeException("Illegal state!");
+            throw new RuntimeException("Illegal state!" + errorMessage);
         }
 
     }
@@ -126,19 +129,32 @@
             if (elementNameToTest.equals(reader.getName())){
                 currentState = START_ELEMENT_FOUND_STATE;
             }
-            //characteres found after starting
+            //characteres found after start element
         }else if (event==XMLStreamConstants.CHARACTERS && currentState==START_ELEMENT_FOUND_STATE){
             currentState  = TEXT_FOUND_STATE;
 
+            //characters found - if this is a characters event that was in the correct place then
+            //it would have been handled already. we need to check whether this is a ignorable
+            //whitespace and if not push the state machine to a illegal state.
+        }else if (event==XMLStreamConstants.CHARACTERS){
+            if (reader.getText().trim().length()==0){
+                //the text is empty - don't change the state
+            }else{
+                //we do NOT handle mixed content
+                currentState = ILLEGAL_STATE;
+                errorMessage = "Mixed Content " +reader.getText();  //todo I18n this
+            }
+
             //End element  found after starting This means we've found an empty element like <foo/>
         }else if (event==XMLStreamConstants.END_ELEMENT && currentState==START_ELEMENT_FOUND_STATE){
             //force the text to be empty!
             text = "";
-            
+
             if (elementNameToTest.equals(reader.getName())){
                 currentState = END_ELEMENT_FOUND_STATE;
             }else{
                 currentState = ILLEGAL_STATE;
+                errorMessage = "Wrong element name " +reader.getName();  //todo I18n this
             }
 
             // end element found after characters
@@ -147,6 +163,8 @@
                 currentState = END_ELEMENT_FOUND_STATE;
             }else{
                 currentState = ILLEGAL_STATE;
+                //set the error message
+                errorMessage = "Wrong element name " +reader.getName();  //todo I18n this
             }
 
             //end has been reached
@@ -165,6 +183,7 @@
 
         }else{
             currentState = ILLEGAL_STATE;
+            errorMessage = "Current state is " + currentState ;  //todo I18n this
         }
     }
 

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=376259&r1=376258&r2=376259&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 Thu Feb  9 03:00:02 2006
@@ -65,9 +65,13 @@
     private CompilerOptions options;
     private HashMap processedTypemap;
 
-    //The processedElementMap and the processedElementList have a subtle difference
-    //The writing to the processedElementList happens when an outer element is processed.
+    //the list of processedElements for the outer elements
     private HashMap processedElementMap;
+
+    // keeps a list of child element references per outer element. the content of this
+    // map would be a QName and another hashmap
+    private HashMap processedElementChildrenMap;
+
     private HashMap processedAnonymousComplexTypesMap;
     //we need this map to keep the referenced elements. these elements need to be kept seperate
     //to avoid conflicts
@@ -138,6 +142,7 @@
         processedTypeMetaInfoMap = new HashMap();
         processedElementRefMap = new HashMap();
         nillableElementList = new ArrayList();
+        processedElementChildrenMap = new HashMap();
 
         //load the writer a nd initiliaze the base type
         writer = SchemaPropertyLoader.getBeanWriterInstance();
@@ -200,7 +205,7 @@
             //this is the set of outer elements so we need to generate classes
             //The outermost elements do not contain occurence counts (!) so we do not need
             //to check for arraytypes
-            processElement((XmlSchemaElement) xmlSchemaElement1Iterator.next(), true, schema);
+            processElement((XmlSchemaElement) xmlSchemaElement1Iterator.next(), schema);
         }
 
 
@@ -295,9 +300,26 @@
         processedElementMap.put(xsElt.getQName(), writtenClassName);
     }
 
+    /**
+     * For inner elements
+     * @param xsElt
+     * @param innerElementMap
+     * @param parentSchema
+     * @throws SchemaCompilationException
+     */
+    private void processElement(XmlSchemaElement xsElt,Map innerElementMap,List localNillableList,XmlSchema parentSchema) throws SchemaCompilationException {
+        processElement(xsElt,false,innerElementMap,localNillableList,parentSchema);
+    }
 
-
-
+    /**
+     * For outer elements
+     * @param xsElt
+     * @param parentSchema
+     * @throws SchemaCompilationException
+     */
+    private void processElement(XmlSchemaElement xsElt,XmlSchema parentSchema) throws SchemaCompilationException {
+        processElement(xsElt,true,null,null,parentSchema);
+    }
     /**
      * Process and Element
      *
@@ -307,7 +329,7 @@
      * @param isArray-  flag saying whether the elements represents an array
      * @throws SchemaCompilationException
      */
-    private void processElement(XmlSchemaElement xsElt, boolean isOuter,XmlSchema parentSchema) throws SchemaCompilationException {
+    private void processElement(XmlSchemaElement xsElt, boolean isOuter,Map innerElementMap,List localNillableList, XmlSchema parentSchema) throws SchemaCompilationException {
 
         //The processing element logic seems to be quite simple. Look at the relevant schema type
         //for each and every element and process that accordingly.
@@ -326,19 +348,20 @@
 
             if (!isOuter) {
                 String className = findClassName(schemaType.getQName(), isArray(xsElt));
-                this.processedElementMap.put(xsElt.getQName(), className);
+                //since this is a inner element we should add it to the inner element map
+                innerElementMap.put(xsElt.getQName(), className);
+            }else{
+                this.processedElementList.add(xsElt.getQName());
             }
 
-            this.processedElementList.add(xsElt.getQName());
         }else if (xsElt.getRefName()!=null){
 
             //process the referenced type. It could be thought that the referenced element replaces this
             //element
 
             XmlSchemaElement referencedElement = parentSchema.getElementByName(xsElt.getRefName());
-            processElement(referencedElement,
-                    true, //if the element is referenced, then it should be one of the outer (global) ones
-                    parentSchema);
+            //if the element is referenced, then it should be one of the outer (global) ones
+            processElement(referencedElement, parentSchema);
 
             //no outer check required here. If the element is having a ref, then it is definitely
             //not an outer element.
@@ -353,14 +376,20 @@
             //this specifically happens with xsd:anyType.
             if (!isOuter) {
                 String className = findClassName(xsElt.getSchemaTypeName(), isArray(xsElt));
-                this.processedElementMap.put(xsElt.getQName(), className);
+                innerElementMap.put(xsElt.getQName(), className);
+            }else{
+                this.processedElementList.add(xsElt.getQName());
             }
-            this.processedElementList.add(xsElt.getQName());
+
         }
 
         //add this elements QName to the nillable group if it has the  nillable attribute
         if (xsElt.isNillable()){
-            this.nillableElementList.add(xsElt.getQName());
+            if (isOuter){
+                this.nillableElementList.add(xsElt.getQName());
+            }else{
+                localNillableList.add(xsElt.getQName());
+            }
         }
 
     }
@@ -713,7 +742,10 @@
                          boolean order,
                          XmlSchema parentSchema) throws SchemaCompilationException {
         int count = items.getCount();
-        Map processedElements = new HashMap();
+        Map processedElementArrayStatusMap = new HashMap();
+        Map processedElementTypeMap = new HashMap();
+        List localNillableList = new ArrayList();
+
         Map elementOrderMap = new HashMap();
 
         for (int i = 0; i < count; i++) {
@@ -724,8 +756,8 @@
                 XmlSchemaElement xsElt = (XmlSchemaElement) item;
 
                 boolean isArray = isArray(xsElt);
-                processElement(xsElt, false,parentSchema); //we know for sure this is not an outer type
-                processedElements.put(xsElt, (isArray) ? Boolean.TRUE : Boolean.FALSE);
+                processElement(xsElt, processedElementTypeMap,localNillableList,parentSchema); //we know for sure this is not an outer type
+                processedElementArrayStatusMap.put(xsElt, (isArray) ? Boolean.TRUE : Boolean.FALSE);
                 if (order) {
                     //we need to keep the order of the elements. So push the elements to another
                     //hashmap with the order number
@@ -744,29 +776,29 @@
         }
 
         // loop through the processed items and add them to the matainf object
-        Iterator processedElementsIterator = processedElements.keySet().iterator();
+        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){ //probably this is referenced
-                clazzName = (String) processedElementMap.get(elt.getQName());
+            if (elt.getQName()!=null){
+                clazzName = (String) processedElementTypeMap.get(elt.getQName());
                 qName = elt.getQName();
                 metainfHolder.registerMapping(qName,
                         elt.getSchemaTypeName()
                         , clazzName,
-                        ((Boolean) processedElements.get(elt)).booleanValue() ?
+                        ((Boolean) processedElementArrayStatusMap.get(elt)).booleanValue() ?
                                 SchemaConstants.ANY_ARRAY_TYPE :
                                 SchemaConstants.ELEMENT_TYPE);
-            }else{
+            }else{ //probably this is referenced
                 clazzName = (String)processedElementRefMap.get(elt.getRefName());
                 qName = elt.getRefName();
                 metainfHolder.registerMapping(qName,
                         parentSchema.getElementByName(elt.getRefName()).getSchemaTypeName()
                         , clazzName,
-                        ((Boolean) processedElements.get(elt)).booleanValue() ?
+                        ((Boolean) processedElementArrayStatusMap.get(elt)).booleanValue() ?
                                 SchemaConstants.ANY_ARRAY_TYPE :
                                 SchemaConstants.ELEMENT_TYPE);
             }
@@ -785,7 +817,7 @@
             }
 
             //get the nillable state and register that on the metainf holder
-            if (nillableElementList.contains(elt.getQName())){
+            if (localNillableList.contains(elt.getQName())){
                 metainfHolder.registerNillableQName(elt.getQName());
             }
 

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=376259&r1=376258&r2=376259&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 Thu Feb  9 03:00:02 2006
@@ -323,13 +323,31 @@
                                     "<xsl:value-of select="$namespace"/>",
                                     "<xsl:value-of select="$propertyName"/>");
 
+                             // Find the first element
+                             while (!<xsl:value-of select="$loopBoolName"/>){
+                                    event = reader.getEventType();
+                                    if (javax.xml.stream.XMLStreamConstants.START_ELEMENT == event
+                                            &amp;&amp; <xsl:value-of select="$startQname"/>.equals(reader.getName())){
+                                       //we are at the first element
+                                        <xsl:value-of select="$loopBoolName"/> = true;
+                                    }else{
+                                        reader.next();
+                                    }
+
+                                }
+
+                                //Now loop and populate the array
+                                <xsl:value-of select="$loopBoolName"/> = false;
                                 while (!<xsl:value-of select="$loopBoolName"/>){
                                     event = reader.getEventType();
                                     if (javax.xml.stream.XMLStreamConstants.START_ELEMENT == event
                                             &amp;&amp; <xsl:value-of select="$startQname"/>.equals(reader.getName())){
                                        <xsl:value-of select="$listName"/>.add(<xsl:value-of select="$basePropertyType"/>.Factory.parse(reader));
-                                    } else if (javax.xml.stream.XMLStreamConstants.END_ELEMENT == event &amp;&amp;
-                                        <xsl:value-of select="$startQname"/>.equals(reader.getName())){
+                                    }else if (javax.xml.stream.XMLStreamConstants.START_ELEMENT == event
+                                            &amp;&amp; !<xsl:value-of select="$startQname"/>.equals(reader.getName())){
+                                       <xsl:value-of select="$loopBoolName"/> = true;
+                                    }else if (javax.xml.stream.XMLStreamConstants.END_ELEMENT == event &amp;&amp;
+                                        !<xsl:value-of select="$startQname"/>.equals(reader.getName())){
                                         <xsl:value-of select="$loopBoolName"/> = true;
                                     }else{
                                         reader.next();
@@ -406,6 +424,13 @@
                         </xsl:when>
                         <!-- End of Array handling of ADB classes -->
                         <xsl:otherwise>
+                            <xsl:if test="position()>1">
+                                // Move to a start element
+                                event = reader.getEventType();
+                                while (event!= javax.xml.stream.XMLStreamReader.START_ELEMENT) {
+                                    event = reader.next();
+                                }
+                            </xsl:if>
                            <!-- Start of Array handling of simple types -->
                             org.apache.axis2.databinding.utils.SimpleArrayReaderStateMachine <xsl:value-of select="$stateMachineName"/> = new
                                                             org.apache.axis2.databinding.utils.SimpleArrayReaderStateMachine();
@@ -430,8 +455,10 @@
               <xsl:when test="@ours">
                   <!--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));
+                  object.set<xsl:value-of select="$javaName"/>(<xsl:value-of select="$propertyType"/>.Factory.parse(
+                  reader));
+
+
               </xsl:when>
               <!-- end of adb type handling code -->
               <!-- start of OMelement handling -->
@@ -462,6 +489,13 @@
               <!-- end of OMelement handling -->
               <!-- start of the simple types handling -->
               <xsl:otherwise>
+                  <xsl:if test="position()>1">
+                      // Move to a start element
+                      event = reader.getEventType();
+                      while (event!= javax.xml.stream.XMLStreamReader.START_ELEMENT) {
+                        event = reader.next();
+                      }
+                  </xsl:if>
                 org.apache.axis2.databinding.utils.SimpleElementReaderStateMachine <xsl:value-of select="$stateMachineName"/>
                   = new org.apache.axis2.databinding.utils.SimpleElementReaderStateMachine();
                 javax.xml.namespace.QName <xsl:value-of select="$startQname"/> = new javax.xml.namespace.QName(

Modified: webservices/axis2/trunk/java/modules/wsdl/src/org/apache/axis2/wsdl/builder/wsdl4j/WSDLPump.java
URL: http://svn.apache.org/viewcvs/webservices/axis2/trunk/java/modules/wsdl/src/org/apache/axis2/wsdl/builder/wsdl4j/WSDLPump.java?rev=376259&r1=376258&r2=376259&view=diff
==============================================================================
--- webservices/axis2/trunk/java/modules/wsdl/src/org/apache/axis2/wsdl/builder/wsdl4j/WSDLPump.java (original)
+++ webservices/axis2/trunk/java/modules/wsdl/src/org/apache/axis2/wsdl/builder/wsdl4j/WSDLPump.java Thu Feb  9 03:00:02 2006
@@ -193,6 +193,9 @@
                             ExtensionConstants.SCHEMA);
                     wsdlTypes.addExtensibilityElement(schemaExtensibilityElement);
                     schemaExtensibilityElement.setElement(schemaElement);
+
+
+
                 }
             }
 
@@ -489,11 +492,11 @@
 
             Message message = wsdl4jInputMessage.getMessage();
             if (null != message) {
-                //wrapping has to be done on per message basis
-
                 wsdlInputMessage.setElementQName(
-                        this.generateReferenceQname(wrappedInputName
-                                ,message,findWrapppable(message)));
+                        this.generateReferenceQname(
+                                wrappedInputName
+                                ,message,
+                                findWrapppable(message)));
                 this.copyExtensibleElements(
                         (message).getExtensibilityElements(),
                         wsdlInputMessage, null);