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 [EMAIL PROTECTED] http://www.modelworks.com voice: 425 488 5686 fax: 425 488 3986 -----Original Message----- From: [EMAIL PROTECTED] [mailto:[EMAIL PROTECTED] Sent: Tuesday, February 28, 2006 10:11 PM To: [EMAIL PROTECTED] 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>
