You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ofbiz.apache.org by ad...@apache.org on 2013/06/05 08:34:51 UTC

svn commit: r1489723 - /ofbiz/trunk/framework/webtools/webapp/webtools/XsdToJava.ftl

Author: adrianc
Date: Wed Jun  5 06:34:50 2013
New Revision: 1489723

URL: http://svn.apache.org/r1489723
Log:
XSD-to-Java improvement - better discovery of child elements.

Modified:
    ofbiz/trunk/framework/webtools/webapp/webtools/XsdToJava.ftl

Modified: ofbiz/trunk/framework/webtools/webapp/webtools/XsdToJava.ftl
URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/webtools/webapp/webtools/XsdToJava.ftl?rev=1489723&r1=1489722&r2=1489723&view=diff
==============================================================================
--- ofbiz/trunk/framework/webtools/webapp/webtools/XsdToJava.ftl (original)
+++ ofbiz/trunk/framework/webtools/webapp/webtools/XsdToJava.ftl Wed Jun  5 06:34:50 2013
@@ -19,6 +19,8 @@ under the License.
 <#assign document = xsdRootElement.getOwnerDocument()>
 <#assign documentElement = document.getDocumentElement()>
 <#assign globalElements = Static["org.ofbiz.base.util.UtilXml"].childElementList(xsdRootElement, "xs:element")>
+<#assign groupElements = Static["org.ofbiz.base.util.UtilXml"].childElementList(xsdRootElement, "xs:group")>
+<#assign globalAttributeGroups = Static["org.ofbiz.base.util.UtilXml"].childElementList(documentElement, "xs:attributeGroup")>
 <#if globalElements?exists>
   <textarea name="java-source" cols="120" rows="50" readonly="readonly">
   <#assign abstractElementNames = []>
@@ -46,19 +48,59 @@ under the License.
 <@writeClass xsdElement />
 </#macro>
 
+<#macro processComplexType complexTypeElement>
+  <#-- TODO: For now we are just accumulating all child elements without regard for indicator type,
+             but that means the Java class will not be able to validate the indicator types (ie: xs:choice).
+             This should be changed to provide better quality Java code, but that might require
+             moving a lot of the parsing code outside the template.
+  -->
+  <#local orderIndicator = Static["org.ofbiz.base.util.UtilXml"].firstChildElement(complexTypeElement, "all")?if_exists>
+  <#if orderIndicator?exists && orderIndicator?has_content>
+    <#local childElements = Static["org.ofbiz.base.util.UtilXml"].childElementList(orderIndicator, "xs:element")>
+    <#list childElements as childElement>
+      <#assign allChildElements = allChildElements + [childElement]>
+    </#list>
+    <#return>
+  </#if>
+  <#local orderIndicator = Static["org.ofbiz.base.util.UtilXml"].firstChildElement(complexTypeElement, "choice")?if_exists>
+  <#if orderIndicator?exists && orderIndicator?has_content>
+    <#local childElements = Static["org.ofbiz.base.util.UtilXml"].childElementList(orderIndicator, "xs:element")>
+    <#list childElements as childElement>
+      <#assign allChildElements = allChildElements + [childElement]>
+    </#list>
+    <#return>
+  </#if>
+  <#local orderIndicator = Static["org.ofbiz.base.util.UtilXml"].firstChildElement(complexTypeElement, "sequence")?if_exists>
+  <#if orderIndicator?exists && orderIndicator?has_content>
+    <#local childElements = Static["org.ofbiz.base.util.UtilXml"].childElementList(orderIndicator, "xs:element")>
+    <#list childElements as childElement>
+      <#assign allChildElements = allChildElements + [childElement]>
+    </#list>
+    <#return>
+  </#if>
+  <#local orderIndicator = Static["org.ofbiz.base.util.UtilXml"].firstChildElement(complexTypeElement, "group")?if_exists>
+  <#if orderIndicator?exists && orderIndicator?has_content>
+    <#local groupName = orderIndicator.getAttribute("ref")>
+    <#list groupElements as groupElement>
+      <#if groupName == groupElement.getAttribute("name")>
+        <@processComplexType groupElement />
+        <#return>
+      </#if>
+    </#list>
+  </#if>
+</#macro>
+
 <#macro writeClass xsdElement>
+<#assign allChildElements = []>
 <#local elementName = xsdElement.getAttribute("name")>
 <#local className = Static["org.ofbiz.base.util.UtilXml"].nodeNameToJavaName(elementName, true)>
 <#local complexTypeElement = Static["org.ofbiz.base.util.UtilXml"].firstChildElement(xsdElement, "complexType")?if_exists>
 <#if complexTypeElement?exists && complexTypeElement?has_content>
   <#local attributeElements = Static["org.ofbiz.base.util.UtilXml"].childElementList(complexTypeElement, "xs:attribute")>
   <#local attributeGroupElements = Static["org.ofbiz.base.util.UtilXml"].childElementList(complexTypeElement, "xs:attributeGroup")>
-  <#local sequenceElement = Static["org.ofbiz.base.util.UtilXml"].firstChildElement(complexTypeElement, "sequence")?if_exists>
+  <@processComplexType complexTypeElement />
 </#if>
-<#if sequenceElement?exists && sequenceElement?has_content>
-  <#local childElements = Static["org.ofbiz.base.util.UtilXml"].childElementList(sequenceElement, "xs:element")>
-</#if>
-<#local globalAttributeGroups = Static["org.ofbiz.base.util.UtilXml"].childElementList(documentElement, "xs:attributeGroup")>
+<#-- TODO: Process an element that references a complex type. -->
 <@classDeclaration xsdElement />
 
 <#-- Class field declarations -->
@@ -80,8 +122,8 @@ under the License.
     </#list>
   </#list>
 </#if>
-<#if childElements?exists>
-  <#list childElements as childElement>
+<#if allChildElements?exists>
+  <#list allChildElements as childElement>
     <@elementFieldDeclaration childElement />
   </#list>
 </#if>
@@ -106,8 +148,8 @@ under the License.
       </#list>
     </#list>
   </#if>
-  <#if childElements?exists>
-    <#list childElements as childElement>
+  <#if allChildElements?exists>
+    <#list allChildElements as childElement>
       <@elementFieldAssignment childElement />
     </#list>
   </#if>
@@ -138,14 +180,14 @@ under the License.
     </#list>
   </#list>
 </#if>
-<#if childElements?exists>
-  <#list childElements as childElement>
+<#if allChildElements?exists>
+  <#list allChildElements as childElement>
     <@elementFieldAccessor childElement />
   </#list>
 </#if>
 <#-- Nested elements/classes -->
-<#if childElements?exists>
-  <#list childElements as childElement>
+<#if allChildElements?exists>
+  <#list allChildElements as childElement>
     <#local elementName = childElement.getAttribute("name")>
     <#if elementName?has_content>
       <#assign allElements = allElements + [childElement]>