You are viewing a plain text version of this content. The canonical link for it is here.
Posted to axis-cvs@ws.apache.org by aj...@apache.org on 2006/03/30 08:47:13 UTC
svn commit: r390010 -
/webservices/axis2/trunk/java/modules/codegen/src/org/apache/axis2/schema/template/ADBBeanTemplate.xsl
Author: ajith
Date: Wed Mar 29 22:47:13 2006
New Revision: 390010
URL: http://svn.apache.org/viewcvs?rev=390010&view=rev
Log:
Adding the choice particle support (with chuck's help)
1. Added two sets of templates to support choice based deserialization and sequence based deserialization
Modified:
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/template/ADBBeanTemplate.xsl
URL: http://svn.apache.org/viewcvs/webservices/axis2/trunk/java/modules/codegen/src/org/apache/axis2/schema/template/ADBBeanTemplate.xsl?rev=390010&r1=390009&r2=390010&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 Wed Mar 29 22:47:13 2006
@@ -33,6 +33,8 @@
<xsl:variable name="name"><xsl:value-of select="@name"/></xsl:variable>
<xsl:variable name="choice"><xsl:value-of select="@choice"/></xsl:variable>
+ <xsl:variable name="isType" select="@type"/>
+ <xsl:variable name="anon" select="@anon"/>
<!-- write the class header. this should be done only when unwrapped -->
<xsl:if test="not(not(@unwrapped) or (@skip-write))">
@@ -161,8 +163,11 @@
<!-- we special case the 'array' scenario and generate a convenience
method for adding elements one by one to the array. The
current implementation is somewhat inefficient but
- gets the job done-->
+ gets the job done.Since a primitive cannot be
+ treated as an object it has to be ignored!
+ -->
+ <xsl:if test="not(@primitive)">
/**
* Auto generated add method for the array for convenience
* @param param <xsl:value-of select="$basePropertyType"/>
@@ -179,6 +184,7 @@
new <xsl:value-of select="$basePropertyType"/>[list.size()]);
}
+ </xsl:if>
<!-- end of special casing for the array-->
</xsl:when>
@@ -343,336 +349,631 @@
}
- /**
- * utility method to http://www.w3.org/2001/XMLSchema-instance
- */
- /**
+
+
+ <xsl:choose>
+ <xsl:when test="@choice">
+
+ <!-- start of template for choice/all. Select either for the
+ presence of choice or the absence of ordered
+ -->
+ /**
* Factory class that keeps the parse method
*/
public static class Factory{
+
+
+ // This is horrible, but the OM implementation of getElementText() does not obey the proper contract. Specifically, it does
+ // does not advance the reader to the END_ELEMENT. This bug is triggered by calls to getElementText() unpredictably, e.g. it
+ // happens with outer (document) elements, but not with inner elements. The root bug is in OMStAXWrapper.java, which is now part
+ // of commons and so cannot just be fixed in axis2. This method should be removed and the calls to it below replaced with
+ // simple calls to getElementText() as soon as this serious bug can be fixed.
+ private static String getElementTextProperly(javax.xml.stream.XMLStreamReader reader) throws java.lang.Exception {
+ String value = reader.getElementText();
+ while (!reader.isEndElement())
+ reader.next();
+ return value;
+ }
+
/**
* static method to create the object
*/
public static <xsl:value-of select="$name"/> parse(javax.xml.stream.XMLStreamReader reader) throws java.lang.Exception{
- <xsl:value-of select="$name"/> object = new <xsl:value-of select="$name"/>();
- try {
- int event = reader.getEventType();
-
- //event better be a START_ELEMENT. if not we should go up to the start element here
- while (event!= javax.xml.stream.XMLStreamReader.START_ELEMENT) {
- event = reader.next();
- }
-
- <xsl:if test="not(@type)">
- if (!MY_QNAME.equals(reader.getName())){
- throw new Exception("Wrong QName");
- }
- </xsl:if>
-
- <xsl:if test="@nillable">
- if ("true".equals(reader.getAttributeValue("http://www.w3.org/2001/XMLSchema-instance","nil"))){
- return null;
- }
- </xsl:if>
-
- <!-- populate attributes here!!!. The attributes are part of an element, not part of a
- type -->
- <xsl:for-each select="property[@attribute]">
- <xsl:variable name="propertyName"><xsl:value-of select="@name"/></xsl:variable>
- <xsl:variable name="propertyType"><xsl:value-of select="@type"/></xsl:variable>
- <xsl:variable name="shortTypeName"><xsl:value-of select="@shorttypename"/></xsl:variable>
- <xsl:variable name="javaName"><xsl:value-of select="@javaname"></xsl:value-of></xsl:variable>
- <xsl:variable name="namespace"><xsl:value-of select="@nsuri"/></xsl:variable>
- <xsl:variable name="attribName">tempAttrib<xsl:value-of select="$propertyName"/></xsl:variable>
+ <xsl:value-of select="$name"/> object = new <xsl:value-of select="$name"/>();
+ try {
+ // We should already be at our outer StartElement, but make sure
+ while (!reader.isStartElement())
+ reader.next();
- java.lang.String <xsl:value-of select="$attribName"/> =
- reader.getAttributeValue("<xsl:value-of select="$namespace"/>","<xsl:value-of select="$propertyName"/>");
- if (<xsl:value-of select="$attribName"/>!=null){
- object.set<xsl:value-of select="$javaName"/>(
- org.apache.axis2.databinding.utils.ConverterUtil.convertTo<xsl:value-of select="$shortTypeName"/>(
- <xsl:value-of select="$attribName"/>));
- }
+ <xsl:if test="@nillable">
+ if ("true".equals(reader.getAttributeValue("http://www.w3.org/2001/XMLSchema-instance","nil"))){
+ return null;
+ }
+ </xsl:if>
- </xsl:for-each>
+ <!-- populate attributes here!!!. The attributes are part of an element, not part of a type -->
+ <xsl:for-each select="property[@attribute]">
+ <xsl:variable name="propertyName"><xsl:value-of select="@name"/></xsl:variable>
+ <xsl:variable name="propertyType"><xsl:value-of select="@type"/></xsl:variable>
+ <xsl:variable name="shortTypeName"><xsl:value-of select="@shorttypename"/></xsl:variable>
+ <xsl:variable name="javaName"><xsl:value-of select="@javaname"></xsl:value-of></xsl:variable>
+ <xsl:variable name="namespace"><xsl:value-of select="@nsuri"/></xsl:variable>
+ <xsl:variable name="attribName">tempAttrib<xsl:value-of select="$propertyName"/></xsl:variable>
- <!-- Now reloop and populate the code for non-attribute values-->
- <xsl:for-each select="property[not(@attribute)]">
- <xsl:variable name="propertyName"><xsl:value-of select="@name"/></xsl:variable>
- <xsl:variable name="propertyType"><xsl:value-of select="@type"/></xsl:variable>
- <xsl:variable name="shortTypeName"><xsl:value-of select="@shorttypename"/></xsl:variable>
- <xsl:variable name="javaName"><xsl:value-of select="@javaname"></xsl:value-of></xsl:variable>
- <xsl:variable name="listName">list<xsl:value-of select="position()"/></xsl:variable>
- <xsl:variable name="loopBoolName">loopDone<xsl:value-of select="position()"/></xsl:variable>
- <xsl:variable name="startQname">startQname<xsl:value-of select="position()"/></xsl:variable>
- <xsl:variable name="stateMachineName">stateMachine<xsl:value-of select="position()"/></xsl:variable>
- <xsl:variable name="builderName">builder<xsl:value-of select="position()"/></xsl:variable>
- <xsl:variable name="basePropertyType"><xsl:value-of select="@arrayBaseType"/></xsl:variable>
- <xsl:variable name="namespace"><xsl:value-of select="@nsuri"/></xsl:variable>
- <xsl:variable name="min"><xsl:value-of select="@minOccurs"/></xsl:variable>
+ java.lang.String <xsl:value-of select="$attribName"/> =
+ reader.getAttributeValue("<xsl:value-of select="$namespace"/>","<xsl:value-of select="$propertyName"/>");
+ if (<xsl:value-of select="$attribName"/>!=null){
+ object.set<xsl:value-of select="$javaName"/>(
+ org.apache.axis2.databinding.utils.ConverterUtil.convertTo<xsl:value-of select="$shortTypeName"/>(
+ <xsl:value-of select="$attribName"/>));
+ }
+ </xsl:for-each>
- <xsl:choose>
- <!-- Start of array handling code -->
- <xsl:when test="@array">
- <xsl:choose>
- <xsl:when test="@ours">
- <!-- Somebody put the magic number 5000 here. I wonder who did that! -->
- java.util.ArrayList <xsl:value-of select="$listName"/> = new java.util.ArrayList();
- <!-- Start of Array handling of ADB classes -->
- boolean <xsl:value-of select="$loopBoolName"/>=false;
- javax.xml.namespace.QName <xsl:value-of select="$startQname"/> = new javax.xml.namespace.QName(
- "<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
- && <xsl:value-of select="$startQname"/>.equals(reader.getName())){
- //we are at the first element
- <xsl:value-of select="$loopBoolName"/> = true;
- <xsl:if test="$min=0">
- }else if (javax.xml.stream.XMLStreamConstants.END_ELEMENT == event
- && !<xsl:value-of select="$startQname"/>.equals(reader.getName())){
- //we've found an end element that does not belong to this type
- //since this can occur zero times, this may well be empty.So return
- //the empty object
- return object;
+ <xsl:if test="$isType or $anon">
+ <!-- Skip the outer start element in order to process the subelements. -->
+ reader.next();
+ </xsl:if> <!-- If we are not a type and not an element with anonymous type, then we are an element with one property for our named type. -->
+ <!-- Our single named-type property applies to our entire outer element, so don't skip it. -->
+ <!-- First loop creates arrayLists for handling arrays -->
+ <xsl:for-each select="property">
+ <xsl:if test="@array">
+ java.util.ArrayList list<xsl:value-of select="position()"/> = new java.util.ArrayList();
+ </xsl:if>
+ </xsl:for-each>
+ while(!reader.isEndElement()) {
+ if (reader.isStartElement()){
+ <!-- Now reloop and populate the code -->
+ <xsl:for-each select="property">
+ <xsl:variable name="propertyName"><xsl:value-of select="@name"/></xsl:variable>
+ <xsl:variable name="propertyType"><xsl:value-of select="@type"/></xsl:variable>
+ <xsl:variable name="shortTypeName"><xsl:value-of select="@shorttypename"/></xsl:variable>
+ <xsl:variable name="javaName"><xsl:value-of select="@javaname"></xsl:value-of></xsl:variable>
+ <xsl:variable name="listName">list<xsl:value-of select="position()"/></xsl:variable>
+ <xsl:variable name="loopBoolName">loopDone<xsl:value-of select="position()"/></xsl:variable>
+ <xsl:variable name="startQname">startQname<xsl:value-of select="position()"/></xsl:variable>
+ <xsl:variable name="stateMachineName">stateMachine<xsl:value-of select="position()"/></xsl:variable>
+ <xsl:variable name="builderName">builder<xsl:value-of select="position()"/></xsl:variable>
+ <xsl:variable name="basePropertyType"><xsl:value-of select="@arrayBaseType"/></xsl:variable>
+ <xsl:variable name="namespace"><xsl:value-of select="@nsuri"/></xsl:variable>
+ <xsl:variable name="min"><xsl:value-of select="@minOccurs"/></xsl:variable>
- </xsl:if>
- }else{
+ <xsl:if test="position()>1">else</xsl:if> if ("<xsl:value-of select="$propertyName"/>".equals(reader.getLocalName())){
+ <xsl:choose>
+ <xsl:when test="@array">
+ <!-- We must be a named type or element with anonymous type. -->
+ <!-- Elements with a named type have a single simple (non-array) property for their type -->
+ // Process the array and step past its final element's end.
+ <xsl:variable name="basePropertyType"><xsl:value-of select="@arrayBaseType"/></xsl:variable>
+ <xsl:choose>
+ <xsl:when test="@ours">
+ <xsl:value-of select="$listName"/>.add(<xsl:value-of select="$basePropertyType"/>.Factory.parse(reader));
+ //loop until we find a start element that is not part of this array
+ boolean <xsl:value-of select="$loopBoolName"/> = false;
+ while(!<xsl:value-of select="$loopBoolName"/>){
+ // We should be at the end element, but make sure
+ while (!reader.isEndElement())
+ reader.next();
+ // Step out of this element
+ reader.next();
+ if (reader.isEndElement()){
+ //two continuous end elements means we are exiting the xml structure
+ <xsl:value-of select="$loopBoolName"/> = true;
+ } else if (reader.isStartElement()){
+ if ("<xsl:value-of select="$propertyName"/>".equals(reader.getLocalName())){
+ <xsl:value-of select="$listName"/>.add(<xsl:value-of select="$basePropertyType"/>.Factory.parse(reader));
+ }else{
+ <xsl:value-of select="$loopBoolName"/> = true;
+ }
+ }
+ }
+ // call the converter utility to convert and set the array
+ object.set<xsl:value-of select="$javaName"/>((<xsl:value-of select="$propertyType"/>)
+ org.apache.axis2.databinding.utils.ConverterUtil.convertToArray(
+ <xsl:value-of select="$basePropertyType"/>.class,
+ <xsl:value-of select="$listName"/>));
+ </xsl:when>
+ <xsl:when test="@default">
+ boolean <xsl:value-of select="$loopBoolName"/>=false;
+ javax.xml.namespace.QName <xsl:value-of select="$startQname"/> = new javax.xml.namespace.QName(
+ "<xsl:value-of select="$namespace"/>",
+ "<xsl:value-of select="$propertyName"/>");
+
+ while (!<xsl:value-of select="$loopBoolName"/>){
+ event = reader.getEventType();
+ if (javax.xml.stream.XMLStreamConstants.START_ELEMENT == event
+ && <xsl:value-of select="$startQname"/>.equals(reader.getName())){
+
+ <!-- if-block that handles nillable -->
+ <xsl:if test="@nillable">
+ if ("true".equals(reader.getAttributeValue("http://www.w3.org/2001/XMLSchema-instance","nil"))){
+ <xsl:value-of select="$listName"/>.add(null);
+ }else{
+ </xsl:if>
+
+ // We need to wrap the reader so that it produces a fake START_DOCUEMENT event
+ 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"/>);
+
+ <xsl:value-of select="$listName"/>.add(<xsl:value-of select="$builderName"/>.getOMElement());
+ <xsl:if test="@nillable">}</xsl:if>
+ } else if (javax.xml.stream.XMLStreamConstants.START_ELEMENT == event &&
+ !<xsl:value-of select="$startQname"/>.equals(reader.getName())){
+ <xsl:value-of select="$loopBoolName"/> = true;
+ }else if (javax.xml.stream.XMLStreamConstants.END_ELEMENT == event &&
+ !<xsl:value-of select="$startQname"/>.equals(reader.getName())){
+ <xsl:value-of select="$loopBoolName"/> = true;
+ }else if (javax.xml.stream.XMLStreamConstants.END_DOCUMENT == event){
+ <xsl:value-of select="$loopBoolName"/> = true;
+ }else{
+ reader.next();
+ }
+
+ }
+
+ object.set<xsl:value-of select="$javaName"/>((<xsl:value-of select="$propertyType"/>)
+ org.apache.axis2.databinding.utils.ConverterUtil.convertToArray(
+ <xsl:value-of select="$basePropertyType"/>.class,<xsl:value-of select="$listName"/>));
+
+ </xsl:when>
+ <!-- End of Array handling of ADB classes -->
+ <xsl:otherwise>
+ <xsl:value-of select="$listName"/>.add(getElementTextProperly(reader));
+ //loop until we find a start element that is not part of this array
+ boolean <xsl:value-of select="$loopBoolName"/> = false;
+ while(!<xsl:value-of select="$loopBoolName"/>){
+ // Ensure we are at the EndElement
+ while (!reader.isEndElement()){
+ reader.next();
+ }
+ // Step out of this element
+ reader.next();
+ if (reader.isEndElement()){
+ //two continuous end elements means we are exiting the xml structure
+ <xsl:value-of select="$loopBoolName"/> = true;
+ }else if (reader.isStartElement()){
+ if ("<xsl:value-of select="$propertyName"/>".equals(reader.getLocalName())){
+ <xsl:value-of select="$listName"/>.add(getElementTextProperly(reader));
+ }else{
+ <xsl:value-of select="$loopBoolName"/> = true;
+ }
+ }
+ }
+ // call the converter utility to convert and set the array
+ object.set<xsl:value-of select="$javaName"/>((<xsl:value-of select="$propertyType"/>)
+ org.apache.axis2.databinding.utils.ConverterUtil.convertToArray(
+ <xsl:value-of select="$basePropertyType"/>.class,
+ <xsl:value-of select="$listName"/>));
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:when test="@ours">
+ object.set<xsl:value-of select="$javaName"/>(<xsl:value-of select="$propertyType"/>.Factory.parse(reader));
+ <xsl:if test="$isType or $anon"> <!-- This is a subelement property to be consumed -->
reader.next();
- }
+ </xsl:if>
+ </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-->
+ <!--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_DOCUMENT 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:if test="$isType or $anon"> <!-- This is a subelement property to be consumed -->
+ reader.next();
+ </xsl:if>
+ </xsl:when>
+ <!-- end of adb type handling code -->
+ <!-- start of OMelement handling -->
+ <xsl:when test="@default">
+ boolean <xsl:value-of select="$loopBoolName"/> = false;
+ javax.xml.namespace.QName <xsl:value-of select="$startQname"/> = new javax.xml.namespace.QName(
+ "<xsl:value-of select="$namespace"/>",
+ "<xsl:value-of select="$propertyName"/>");
+
+ while(!<xsl:value-of select="$loopBoolName"/>){
+ if (reader.isStartElement() && <xsl:value-of select="$startQname"/>.equals(reader.getName())){
+ <xsl:value-of select="$loopBoolName"/> = true;
+ }else{
+ reader.next();
+ }
+ }
+
+ <!-- todo put the code here for nillable -->
+ // 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:if test="$isType or $anon"> <!-- This is a subelement property to be consumed -->
+ reader.next();
+ </xsl:if>
+ </xsl:when>
+ <!-- end of OMelement handling -->
+ <!-- start of the simple types handling -->
+ <xsl:otherwise>
+ String content = getElementTextProperly(reader);
+ object.set<xsl:value-of select="$javaName"/>(
+ org.apache.axis2.databinding.utils.ConverterUtil.convertTo<xsl:value-of select="$shortTypeName"/>(content));
+ <xsl:if test="$isType or $anon"> <!-- This is a subelement property to be consumed -->
+ reader.next();
+ </xsl:if>
+ </xsl:otherwise>
+ </xsl:choose>
- }
+ }
- //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
- && <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.START_ELEMENT == event
- && !<xsl:value-of select="$startQname"/>.equals(reader.getName())){
- <xsl:value-of select="$loopBoolName"/> = true;
- }else if (javax.xml.stream.XMLStreamConstants.END_ELEMENT == event &&
- !<xsl:value-of select="$startQname"/>.equals(reader.getName())){
- <xsl:value-of select="$loopBoolName"/> = true;
- }else{
- reader.next();
- }
+ </xsl:for-each>
+ else
+ // A start element we are not expecting indicates an invalid parameter was passed
+ throw new java.lang.RuntimeException("Unexpected subelement " + reader.getLocalName());
+ } else reader.next(); <!-- At neither a start nor an end element, skip it -->
- }
+ }
- object.set<xsl:value-of select="$javaName"/>(
- (<xsl:value-of select="$propertyType"/>)
- org.apache.axis2.databinding.utils.ConverterUtil.convertToArray(
- <xsl:value-of select="$basePropertyType"/>.class,<xsl:value-of select="$listName"/>));
+ } catch (javax.xml.stream.XMLStreamException e) {
+ throw new java.lang.Exception(e);
+ }
- //move to the next event, probably past the last end_element event
- reader.next();
- </xsl:when>
- <xsl:when test="@default">
- <!-- Somebody put the magic number 5000 here. I wonder who did that! -->
- java.util.ArrayList <xsl:value-of select="$listName"/> = new java.util.ArrayList();
- boolean <xsl:value-of select="$loopBoolName"/>=false;
- javax.xml.namespace.QName <xsl:value-of select="$startQname"/> = new javax.xml.namespace.QName(
- "<xsl:value-of select="$namespace"/>",
- "<xsl:value-of select="$propertyName"/>");
- <xsl:variable name="internalLoopVar"><xsl:value-of select="$loopBoolName"/>_internal</xsl:variable>
- boolean <xsl:value-of select="$internalLoopVar"/> = false;
-
- while(!<xsl:value-of select="$internalLoopVar"/>){
- if (reader.isStartElement() && <xsl:value-of select="$startQname"/>.equals(reader.getName())){
- <xsl:value-of select="$internalLoopVar"/> = true;
- }else{
- reader.next();
- }
- }
+ return object;
+ }
- while (!<xsl:value-of select="$loopBoolName"/>){
- event = reader.getEventType();
- if (javax.xml.stream.XMLStreamConstants.START_ELEMENT == event
- && <xsl:value-of select="$startQname"/>.equals(reader.getName())){
-
- <!-- if-block that handles nillable -->
- <xsl:if test="@nillable">
- if ("true".equals(reader.getAttributeValue("http://www.w3.org/2001/XMLSchema-instance","nil"))){
- <xsl:value-of select="$listName"/>.add(null);
- }else{
- </xsl:if>
+ }//end of factory class
- // We need to wrap the reader so that it produces a fake START_DOCUEMENT event
- 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"/>);
-
- <xsl:value-of select="$listName"/>.add(<xsl:value-of select="$builderName"/>.getOMElement());
- <xsl:if test="@nillable">}</xsl:if>
- } else if (javax.xml.stream.XMLStreamConstants.START_ELEMENT == event &&
- !<xsl:value-of select="$startQname"/>.equals(reader.getName())){
- <xsl:value-of select="$loopBoolName"/> = true;
- }else if (javax.xml.stream.XMLStreamConstants.END_ELEMENT == event &&
- !<xsl:value-of select="$startQname"/>.equals(reader.getName())){
- <xsl:value-of select="$loopBoolName"/> = true;
- }else if (javax.xml.stream.XMLStreamConstants.END_DOCUMENT == event){
- <xsl:value-of select="$loopBoolName"/> = true;
- }else{
- reader.next();
- }
+ <!-- end of template for choice/all -->
+ </xsl:when>
+ <!--
+ Start of the template that generates the factory class for the sequence
+ we select this template if the ordered attribute is present
+ -->
+ <xsl:otherwise>
- }
+ /**
+ * Factory class that keeps the parse method
+ */
+ public static class Factory{
- object.set<xsl:value-of select="$javaName"/>(
- (<xsl:value-of select="$propertyType"/>)
- org.apache.axis2.databinding.utils.ConverterUtil.convertToArray(
- <xsl:value-of select="$basePropertyType"/>.class,<xsl:value-of select="$listName"/>));
+ /**
+ * static method to create the object
+ */
+ public static <xsl:value-of select="$name"/> parse(javax.xml.stream.XMLStreamReader reader) throws java.lang.Exception{
+ <xsl:value-of select="$name"/> object = new <xsl:value-of select="$name"/>();
+ try {
+ int event = reader.getEventType();
+
+ //event better be a START_ELEMENT. if not we should go up to the start element here
+ while (event!= javax.xml.stream.XMLStreamReader.START_ELEMENT) {
+ event = reader.next();
+ }
+
+ <xsl:if test="not(@type)">
+ if (!MY_QNAME.equals(reader.getName())){
+ throw new Exception("Wrong QName");
+ }
+ </xsl:if>
+
+ <xsl:if test="@nillable">
+ if ("true".equals(reader.getAttributeValue("http://www.w3.org/2001/XMLSchema-instance","nil"))){
+ return null;
+ }
+ </xsl:if>
+ <!-- populate attributes here!!!. The attributes are part of an element, not part of a
+ type -->
+ <xsl:for-each select="property[@attribute]">
+ <xsl:variable name="propertyName"><xsl:value-of select="@name"/></xsl:variable>
+ <xsl:variable name="propertyType"><xsl:value-of select="@type"/></xsl:variable>
+ <xsl:variable name="shortTypeName"><xsl:value-of select="@shorttypename"/></xsl:variable>
+ <xsl:variable name="javaName"><xsl:value-of select="@javaname"></xsl:value-of></xsl:variable>
+ <xsl:variable name="namespace"><xsl:value-of select="@nsuri"/></xsl:variable>
+ <xsl:variable name="attribName">tempAttrib<xsl:value-of select="$propertyName"/></xsl:variable>
+
+ java.lang.String <xsl:value-of select="$attribName"/> =
+ reader.getAttributeValue("<xsl:value-of select="$namespace"/>","<xsl:value-of select="$propertyName"/>");
+ if (<xsl:value-of select="$attribName"/>!=null){
+ object.set<xsl:value-of select="$javaName"/>(
+ org.apache.axis2.databinding.utils.ConverterUtil.convertTo<xsl:value-of select="$shortTypeName"/>(
+ <xsl:value-of select="$attribName"/>));
+ }
- </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();
- <xsl:value-of select="$stateMachineName"/>.setElementNameToTest(new javax.xml.namespace.QName(
- "<xsl:value-of select="$namespace"/>",
- "<xsl:value-of select="$propertyName"/>"));
- <xsl:if test="@nillable">
- <xsl:value-of select="$stateMachineName"/>.setNillable();
- </xsl:if>
- <xsl:value-of select="$stateMachineName"/>.read(reader);
- java.lang.String[] textArray = <xsl:value-of select="$stateMachineName"/>.getTextArray();
- object.set<xsl:value-of select="$javaName"/>(
- (<xsl:value-of select="$propertyType"/>)
- org.apache.axis2.databinding.utils.ConverterUtil.convertToArray(
- <xsl:value-of select="$basePropertyType"/>.class,<xsl:value-of select="$stateMachineName"/>.getTextArray()));
+ </xsl:for-each>
- <!-- end of Array handling of simple types -->
- </xsl:otherwise>
- </xsl:choose>
- </xsl:when>
- <!-- end of array handling -->
+ <!-- Now reloop and populate the code for non-attribute values-->
+ <xsl:for-each select="property[not(@attribute)]">
+ <xsl:variable name="propertyName"><xsl:value-of select="@name"/></xsl:variable>
+ <xsl:variable name="propertyType"><xsl:value-of select="@type"/></xsl:variable>
+ <xsl:variable name="shortTypeName"><xsl:value-of select="@shorttypename"/></xsl:variable>
+ <xsl:variable name="javaName"><xsl:value-of select="@javaname"></xsl:value-of></xsl:variable>
+ <xsl:variable name="listName">list<xsl:value-of select="position()"/></xsl:variable>
+ <xsl:variable name="loopBoolName">loopDone<xsl:value-of select="position()"/></xsl:variable>
+ <xsl:variable name="startQname">startQname<xsl:value-of select="position()"/></xsl:variable>
+ <xsl:variable name="stateMachineName">stateMachine<xsl:value-of select="position()"/></xsl:variable>
+ <xsl:variable name="builderName">builder<xsl:value-of select="position()"/></xsl:variable>
+ <xsl:variable name="basePropertyType"><xsl:value-of select="@arrayBaseType"/></xsl:variable>
+ <xsl:variable name="namespace"><xsl:value-of select="@nsuri"/></xsl:variable>
+ <xsl:variable name="min"><xsl:value-of select="@minOccurs"/></xsl:variable>
- <!-- start of adb handling-->
- <xsl:when test="@ours">
- object.set<xsl:value-of select="$javaName"/>(
- <xsl:value-of select="$propertyType"/>.Factory.parse(reader));
+ <xsl:choose>
+ <!-- Start of array handling code -->
+ <xsl:when test="@array">
+ <xsl:choose>
+ <xsl:when test="@ours">
+ <!-- Somebody put the magic number 5000 here. I wonder who did that! -->
+ java.util.ArrayList <xsl:value-of select="$listName"/> = new java.util.ArrayList();
+ <!-- Start of Array handling of ADB classes -->
+ boolean <xsl:value-of select="$loopBoolName"/>=false;
+ javax.xml.namespace.QName <xsl:value-of select="$startQname"/> = new javax.xml.namespace.QName(
+ "<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
+ && <xsl:value-of select="$startQname"/>.equals(reader.getName())){
+ //we are at the first element
+ <xsl:value-of select="$loopBoolName"/> = true;
+ <xsl:if test="$min=0">
+ }else if (javax.xml.stream.XMLStreamConstants.END_ELEMENT == event
+ && !<xsl:value-of select="$startQname"/>.equals(reader.getName())){
+ //we've found an end element that does not belong to this type
+ //since this can occur zero times, this may well be empty.So return
+ //the empty object
+ return object;
+
+ </xsl:if>
+ }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
+ && <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.START_ELEMENT == event
+ && !<xsl:value-of select="$startQname"/>.equals(reader.getName())){
+ <xsl:value-of select="$loopBoolName"/> = true;
+ }else if (javax.xml.stream.XMLStreamConstants.END_ELEMENT == event &&
+ !<xsl:value-of select="$startQname"/>.equals(reader.getName())){
+ <xsl:value-of select="$loopBoolName"/> = true;
+ }else{
+ reader.next();
+ }
+
+ }
+
+ object.set<xsl:value-of select="$javaName"/>(
+ (<xsl:value-of select="$propertyType"/>)
+ org.apache.axis2.databinding.utils.ConverterUtil.convertToArray(
+ <xsl:value-of select="$basePropertyType"/>.class,<xsl:value-of select="$listName"/>));
+
+ //move to the next event, probably past the last end_element event
+ reader.next();
+ </xsl:when>
+ <xsl:when test="@default">
+ <!-- Somebody put the magic number 5000 here. I wonder who did that! -->
+ java.util.ArrayList <xsl:value-of select="$listName"/> = new java.util.ArrayList();
+ boolean <xsl:value-of select="$loopBoolName"/>=false;
+ javax.xml.namespace.QName <xsl:value-of select="$startQname"/> = new javax.xml.namespace.QName(
+ "<xsl:value-of select="$namespace"/>",
+ "<xsl:value-of select="$propertyName"/>");
+ <xsl:variable name="internalLoopVar"><xsl:value-of select="$loopBoolName"/>_internal</xsl:variable>
+ boolean <xsl:value-of select="$internalLoopVar"/> = false;
+
+ while(!<xsl:value-of select="$internalLoopVar"/>){
+ if (reader.isStartElement() && <xsl:value-of select="$startQname"/>.equals(reader.getName())){
+ <xsl:value-of select="$internalLoopVar"/> = true;
+ }else{
+ reader.next();
+ }
+ }
+
+ while (!<xsl:value-of select="$loopBoolName"/>){
+ event = reader.getEventType();
+ if (javax.xml.stream.XMLStreamConstants.START_ELEMENT == event
+ && <xsl:value-of select="$startQname"/>.equals(reader.getName())){
+
+ <!-- if-block that handles nillable -->
+ <xsl:if test="@nillable">
+ if ("true".equals(reader.getAttributeValue("http://www.w3.org/2001/XMLSchema-instance","nil"))){
+ <xsl:value-of select="$listName"/>.add(null);
+ }else{
+ </xsl:if>
+
+ // We need to wrap the reader so that it produces a fake START_DOCUEMENT event
+ 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"/>);
+
+ <xsl:value-of select="$listName"/>.add(<xsl:value-of select="$builderName"/>.getOMElement());
+ <xsl:if test="@nillable">}</xsl:if>
+ } else if (javax.xml.stream.XMLStreamConstants.START_ELEMENT == event &&
+ !<xsl:value-of select="$startQname"/>.equals(reader.getName())){
+ <xsl:value-of select="$loopBoolName"/> = true;
+ }else if (javax.xml.stream.XMLStreamConstants.END_ELEMENT == event &&
+ !<xsl:value-of select="$startQname"/>.equals(reader.getName())){
+ <xsl:value-of select="$loopBoolName"/> = true;
+ }else if (javax.xml.stream.XMLStreamConstants.END_DOCUMENT == event){
+ <xsl:value-of select="$loopBoolName"/> = true;
+ }else{
+ reader.next();
+ }
+
+ }
+
+ object.set<xsl:value-of select="$javaName"/>(
+ (<xsl:value-of select="$propertyType"/>)
+ org.apache.axis2.databinding.utils.ConverterUtil.convertToArray(
+ <xsl:value-of select="$basePropertyType"/>.class,<xsl:value-of select="$listName"/>));
+
+
+ </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();
+ <xsl:value-of select="$stateMachineName"/>.setElementNameToTest(new javax.xml.namespace.QName(
+ "<xsl:value-of select="$namespace"/>",
+ "<xsl:value-of select="$propertyName"/>"));
+ <xsl:if test="@nillable">
+ <xsl:value-of select="$stateMachineName"/>.setNillable();
+ </xsl:if>
+ <xsl:value-of select="$stateMachineName"/>.read(reader);
+ java.lang.String[] textArray = <xsl:value-of select="$stateMachineName"/>.getTextArray();
+ object.set<xsl:value-of select="$javaName"/>(
+ (<xsl:value-of select="$propertyType"/>)
+ org.apache.axis2.databinding.utils.ConverterUtil.convertToArray(
+ <xsl:value-of select="$basePropertyType"/>.class,<xsl:value-of select="$stateMachineName"/>.getTextArray()));
+
+ <!-- end of Array handling of simple types -->
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <!-- end of array handling -->
+ <!-- start of adb handling-->
+ <xsl:when test="@ours">
- </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-->
- 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();
- }
- }
+ object.set<xsl:value-of select="$javaName"/>(
+ <xsl:value-of select="$propertyType"/>.Factory.parse(reader));
- <!--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>
- <!-- end of adb type handling code -->
- <!-- start of OMelement handling -->
- <xsl:when test="@default">
- boolean <xsl:value-of select="$loopBoolName"/> = false;
- javax.xml.namespace.QName <xsl:value-of select="$startQname"/> = new javax.xml.namespace.QName(
- "<xsl:value-of select="$namespace"/>",
- "<xsl:value-of select="$propertyName"/>");
-
- while(!<xsl:value-of select="$loopBoolName"/>){
- if (reader.isStartElement() && <xsl:value-of select="$startQname"/>.equals(reader.getName())){
- <xsl:value-of select="$loopBoolName"/> = true;
- }else{
- reader.next();
- }
- }
- <!-- todo put the code here for nillable -->
- // 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>
+
+ <!-- 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-->
+ 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>
+ <!-- end of adb type handling code -->
+ <!-- start of OMelement handling -->
+ <xsl:when test="@default">
+ boolean <xsl:value-of select="$loopBoolName"/> = false;
+ javax.xml.namespace.QName <xsl:value-of select="$startQname"/> = new javax.xml.namespace.QName(
+ "<xsl:value-of select="$namespace"/>",
+ "<xsl:value-of select="$propertyName"/>");
+
+ while(!<xsl:value-of select="$loopBoolName"/>){
+ if (reader.isStartElement() && <xsl:value-of select="$startQname"/>.equals(reader.getName())){
+ <xsl:value-of select="$loopBoolName"/> = true;
+ }else{
+ reader.next();
+ }
+ }
+
+ <!-- todo put the code here for nillable -->
+ // 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());
+
+ //step one more event from the current position
+ reader.next();
+ </xsl:when>
+ <!-- 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(
+ "<xsl:value-of select="$namespace"/>",
+ "<xsl:value-of select="$propertyName"/>");
+ <xsl:value-of select="$stateMachineName"/>.setElementNameToTest(<xsl:value-of select="$startQname"/>);
+ <xsl:if test="@nillable">
+ <xsl:value-of select="$stateMachineName"/>.setNillable();
+ </xsl:if>
+ <xsl:value-of select="$stateMachineName"/>.read(reader);
+ object.set<xsl:value-of select="$javaName"/>(
+ <xsl:choose>
+ <xsl:when test="@nillable and not(@primitive)">
+ <xsl:value-of select="$stateMachineName"/>.getText()==null?null:
+ org.apache.axis2.databinding.utils.ConverterUtil.convertTo<xsl:value-of select="$shortTypeName"/>(
+ <xsl:value-of select="$stateMachineName"/>.getText()));
+ </xsl:when>
+ <xsl:otherwise>
+ org.apache.axis2.databinding.utils.ConverterUtil.convertTo<xsl:value-of select="$shortTypeName"/>(
+ <xsl:value-of select="$stateMachineName"/>.getText()));
+ </xsl:otherwise>
+ </xsl:choose>
- //step one more event from the current position
- reader.next();
- </xsl:when>
- <!-- 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(
- "<xsl:value-of select="$namespace"/>",
- "<xsl:value-of select="$propertyName"/>");
- <xsl:value-of select="$stateMachineName"/>.setElementNameToTest(<xsl:value-of select="$startQname"/>);
- <xsl:if test="@nillable">
- <xsl:value-of select="$stateMachineName"/>.setNillable();
- </xsl:if>
- <xsl:value-of select="$stateMachineName"/>.read(reader);
- object.set<xsl:value-of select="$javaName"/>(
- <xsl:choose>
- <xsl:when test="@nillable and not(@primitive)">
- <xsl:value-of select="$stateMachineName"/>.getText()==null?null:
- org.apache.axis2.databinding.utils.ConverterUtil.convertTo<xsl:value-of select="$shortTypeName"/>(
- <xsl:value-of select="$stateMachineName"/>.getText()));
- </xsl:when>
- <xsl:otherwise>
- org.apache.axis2.databinding.utils.ConverterUtil.convertTo<xsl:value-of select="$shortTypeName"/>(
- <xsl:value-of select="$stateMachineName"/>.getText()));
- </xsl:otherwise>
- </xsl:choose>
+ </xsl:otherwise>
+ <!-- end of simple type handling -->
- </xsl:otherwise>
- <!-- end of simple type handling -->
+ </xsl:choose>
- </xsl:choose>
+ </xsl:for-each>
+ } catch (javax.xml.stream.XMLStreamException e) {
+ throw new java.lang.Exception(e);
+ }
+
+ return object;
+ }
+ }//end of factory class
- </xsl:for-each>
- } catch (javax.xml.stream.XMLStreamException e) {
- throw new java.lang.Exception(e);
- }
- return object;
+ <!-- end of the template -->
+
+ </xsl:otherwise>
+ </xsl:choose>
}
- }//end of factory class
+ <!-- end of main template -->
+ </xsl:template>
+
- }
- </xsl:template>
</xsl:stylesheet>