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>