You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cxf.apache.org by dk...@apache.org on 2014/12/17 20:36:41 UTC

cxf git commit: [CXF-6162] Added support for group reference elements with nested sequence/choice elements. Also allowed nested sequence elements (still no support of choice/sequence with maxOccurs > 1)

Repository: cxf
Updated Branches:
  refs/heads/master 5e865b3f5 -> 4cd282670


[CXF-6162] Added support for group reference elements with nested sequence/choice elements. Also allowed nested sequence elements (still no support of choice/sequence with maxOccurs > 1)


Project: http://git-wip-us.apache.org/repos/asf/cxf/repo
Commit: http://git-wip-us.apache.org/repos/asf/cxf/commit/4cd28267
Tree: http://git-wip-us.apache.org/repos/asf/cxf/tree/4cd28267
Diff: http://git-wip-us.apache.org/repos/asf/cxf/diff/4cd28267

Branch: refs/heads/master
Commit: 4cd28267092129b3ea456fc436dd2a4f210b365f
Parents: 5e865b3
Author: Andrii Nikitiuk <de...@gmail.com>
Authored: Wed Dec 17 16:20:37 2014 +0200
Committer: Daniel Kulp <dk...@apache.org>
Committed: Wed Dec 17 14:36:31 2014 -0500

----------------------------------------------------------------------
 .../apache/cxf/javascript/JavascriptUtils.java  | 28 +++++++-
 .../apache/cxf/javascript/Messages.properties   |  4 ++
 .../org/apache/cxf/javascript/ParticleInfo.java | 67 ++++++++++++++++++--
 .../tools/wsdlto/javascript/hello_world.wsdl    | 48 ++++++++++++++
 4 files changed, 139 insertions(+), 8 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cxf/blob/4cd28267/rt/javascript/javascript-rt/src/main/java/org/apache/cxf/javascript/JavascriptUtils.java
----------------------------------------------------------------------
diff --git a/rt/javascript/javascript-rt/src/main/java/org/apache/cxf/javascript/JavascriptUtils.java b/rt/javascript/javascript-rt/src/main/java/org/apache/cxf/javascript/JavascriptUtils.java
index 253e586..c22cd9c 100755
--- a/rt/javascript/javascript-rt/src/main/java/org/apache/cxf/javascript/JavascriptUtils.java
+++ b/rt/javascript/javascript-rt/src/main/java/org/apache/cxf/javascript/JavascriptUtils.java
@@ -38,6 +38,7 @@ import org.apache.cxf.common.xmlschema.SchemaCollection;
 import org.apache.cxf.common.xmlschema.XmlSchemaUtils;
 import org.apache.cxf.databinding.source.mime.MimeAttribute;
 import org.apache.cxf.wsdl.WSDLConstants;
+import org.apache.ws.commons.schema.XmlSchema;
 import org.apache.ws.commons.schema.XmlSchemaAll;
 import org.apache.ws.commons.schema.XmlSchemaAnnotated;
 import org.apache.ws.commons.schema.XmlSchemaAny;
@@ -49,6 +50,8 @@ import org.apache.ws.commons.schema.XmlSchemaComplexType;
 import org.apache.ws.commons.schema.XmlSchemaContent;
 import org.apache.ws.commons.schema.XmlSchemaContentModel;
 import org.apache.ws.commons.schema.XmlSchemaElement;
+import org.apache.ws.commons.schema.XmlSchemaGroup;
+import org.apache.ws.commons.schema.XmlSchemaGroupRef;
 import org.apache.ws.commons.schema.XmlSchemaObject;
 import org.apache.ws.commons.schema.XmlSchemaParticle;
 import org.apache.ws.commons.schema.XmlSchemaSequence;
@@ -562,16 +565,37 @@ public class JavascriptUtils {
      * throw. We're not ready for groups yet.
      * @param object
      */
-    public static XmlSchemaParticle getObjectParticle(XmlSchemaObject object, QName contextName) {
+    public static XmlSchemaParticle getObjectParticle(XmlSchemaObject object, QName contextName,
+                                                      XmlSchema currentSchema) {
 
         if (!(object instanceof XmlSchemaParticle)) {
             unsupportedConstruct("NON_PARTICLE_CHILD",
                                                 object.getClass().getSimpleName(),
                                                 contextName, object);
         }
+
+        if (object instanceof XmlSchemaGroupRef) {
+            QName groupName = ((XmlSchemaGroupRef) object).getRefName();
+            XmlSchemaGroup group = currentSchema.getGroupByName(groupName);
+            if (group == null) {
+                unsupportedConstruct("MISSING_GROUP",
+                        groupName.toString(), contextName, null);
+            }
+
+            XmlSchemaParticle groupParticle = group.getParticle();
+
+            if (!(groupParticle instanceof XmlSchemaSequence)) {
+                unsupportedConstruct("GROUP_REF_UNSUPPORTED_TYPE",
+                        groupParticle.getClass().getSimpleName(), contextName, groupParticle);
+            }
+
+            return groupParticle;
+        }
+
         if (!(object instanceof XmlSchemaElement)
             && !(object instanceof XmlSchemaAny)
-            && !(object instanceof XmlSchemaChoice)) {
+            && !(object instanceof XmlSchemaChoice)
+            && !(object instanceof XmlSchemaSequence)) {
             unsupportedConstruct("GROUP_CHILD",
                     object.getClass().getSimpleName(), contextName,
                                                 object);

http://git-wip-us.apache.org/repos/asf/cxf/blob/4cd28267/rt/javascript/javascript-rt/src/main/java/org/apache/cxf/javascript/Messages.properties
----------------------------------------------------------------------
diff --git a/rt/javascript/javascript-rt/src/main/java/org/apache/cxf/javascript/Messages.properties b/rt/javascript/javascript-rt/src/main/java/org/apache/cxf/javascript/Messages.properties
index 120335f..4dea1b0 100644
--- a/rt/javascript/javascript-rt/src/main/java/org/apache/cxf/javascript/Messages.properties
+++ b/rt/javascript/javascript-rt/src/main/java/org/apache/cxf/javascript/Messages.properties
@@ -23,8 +23,12 @@ ABSTRACT_ELEMENT=JavaScript limitation: Abstract element {0} of {1}. {2}
 ELEMENT_SCHEMA_MISSING=Element {0} contained in missing schema.
 IMPOSSIBLE_GLOBAL_ITEM= JavaScript limitation: Element or xs:any at {0} used in a context that requires a global name, but it, and its type, are anonymous.
 MISSING_TYPE=Type {0} is missing from the WSDL schema for element {1}. {2}
+MISSING_GROUP=Group {0} is missing from the WSDL schema for element {1}. {2}
 ELEMENT_DANGLING_REFERENCE= Element {0} refers to undefined element {1}.
 UNSUPPORTED_ATTRIBUTE_ITEM= Unsupported {0} in {1}.
+SEQUENCE_ELEMENT_MULTI_OCCURS=Limitation: unsupported sequence element construct {0} with maxOccours > 1 found.
 GROUP_ELEMENT_MULTI_OCCURS=Limitation: unsupported group element construct {0} with maxOccours > 1 found.
+SEQUENCE_ELEMENT_ANY=Limitation: unsupported any element inside nested sequence element construct {0}
 GROUP_ELEMENT_ANY=Limitation: unsupported any element inside group element construct {0}
 GROUP_CHILD=Limitation: unsupported construct {0} found in {1}. {2}
+GROUP_REF_UNSUPPORTED_TYPE=Limitation: unsupported group type {0} found ref in {1}. Only allowed xs:sequence with default maxOccurs.
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/cxf/blob/4cd28267/rt/javascript/javascript-rt/src/main/java/org/apache/cxf/javascript/ParticleInfo.java
----------------------------------------------------------------------
diff --git a/rt/javascript/javascript-rt/src/main/java/org/apache/cxf/javascript/ParticleInfo.java b/rt/javascript/javascript-rt/src/main/java/org/apache/cxf/javascript/ParticleInfo.java
index 6fee422..0d36566 100644
--- a/rt/javascript/javascript-rt/src/main/java/org/apache/cxf/javascript/ParticleInfo.java
+++ b/rt/javascript/javascript-rt/src/main/java/org/apache/cxf/javascript/ParticleInfo.java
@@ -35,6 +35,8 @@ import org.apache.ws.commons.schema.XmlSchemaChoiceMember;
 import org.apache.ws.commons.schema.XmlSchemaElement;
 import org.apache.ws.commons.schema.XmlSchemaObject;
 import org.apache.ws.commons.schema.XmlSchemaParticle;
+import org.apache.ws.commons.schema.XmlSchemaSequence;
+import org.apache.ws.commons.schema.XmlSchemaSequenceMember;
 import org.apache.ws.commons.schema.XmlSchemaType;
 import org.apache.ws.commons.schema.constants.Constants;
 
@@ -139,10 +141,13 @@ public final class ParticleInfo implements ItemInfo {
                                             SchemaCollection schemaCollection,
                                             NamespacePrefixAccumulator prefixAccumulator, QName contextName) {
         XmlSchemaParticle sequenceParticle =
-            JavascriptUtils.getObjectParticle(sequenceObject, contextName);
+            JavascriptUtils.getObjectParticle(sequenceObject, contextName, currentSchema);
         ParticleInfo elementInfo = new ParticleInfo();
         XmlSchemaParticle realParticle = sequenceParticle;
 
+        elementInfo.setMinOccurs(sequenceParticle.getMinOccurs());
+        elementInfo.setMaxOccurs(sequenceParticle.getMaxOccurs());
+
         if (sequenceParticle instanceof XmlSchemaElement) {
             XmlSchemaElement sequenceElement = (XmlSchemaElement)sequenceParticle;
 
@@ -170,7 +175,8 @@ public final class ParticleInfo implements ItemInfo {
 
             List<XmlSchemaChoiceMember> items = choice.getItems();
             for (XmlSchemaChoiceMember item : items) {
-                XmlSchemaObject schemaObject = (XmlSchemaObject)item;
+                XmlSchemaObject schemaObject = JavascriptUtils.getObjectParticle((XmlSchemaObject)item, contextName,
+                        currentSchema);
                 ParticleInfo childParticle = ParticleInfo.forLocalItem(schemaObject, currentSchema, schemaCollection,
                         prefixAccumulator, contextName);
 
@@ -180,13 +186,40 @@ public final class ParticleInfo implements ItemInfo {
                     throw new UnsupportedConstruct(message.toString());
                 }
 
-                childParticle.minOccurs = 0;
+                childParticle.setMinOccurs(0);
                 elementInfo.children.add(childParticle);
             }
-        }
+        } else if (sequenceParticle instanceof XmlSchemaSequence) {
+            XmlSchemaSequence nestedSequence = (XmlSchemaSequence)sequenceParticle;
 
-        elementInfo.minOccurs = sequenceParticle.getMinOccurs();
-        elementInfo.maxOccurs = sequenceParticle.getMaxOccurs();
+            if (sequenceParticle.getMaxOccurs() > 1) {
+                Message message = new Message("SEQUENCE_ELEMENT_MULTI_OCCURS", LOG, sequenceParticle
+                        .getClass().getSimpleName());
+                throw new UnsupportedConstruct(message.toString());
+            }
+
+            elementInfo.children = new LinkedList<>();
+
+            List<XmlSchemaSequenceMember> items = nestedSequence.getItems();
+            for (XmlSchemaSequenceMember item : items) {
+                XmlSchemaObject schemaObject = JavascriptUtils.getObjectParticle((XmlSchemaObject)item, contextName,
+                        currentSchema);
+                ParticleInfo childParticle = ParticleInfo.forLocalItem(schemaObject, currentSchema, schemaCollection,
+                        prefixAccumulator, contextName);
+
+                if (childParticle.isAny()) {
+                    Message message = new Message("SEQUENCE_ELEMENT_ANY", LOG, sequenceParticle.getClass()
+                            .getSimpleName());
+                    throw new UnsupportedConstruct(message.toString());
+                }
+
+                if (sequenceParticle.getMinOccurs() == 0) {
+                    childParticle.setMinOccurs(0);
+                }
+                elementInfo.children.add(childParticle);
+            }
+
+        }
 
         factoryCommon(realParticle, currentSchema, schemaCollection, prefixAccumulator, elementInfo);
 
@@ -237,6 +270,8 @@ public final class ParticleInfo implements ItemInfo {
             elementInfo.isGroup = false;
         } else if (particle instanceof XmlSchemaChoice) {
             elementInfo.isGroup = true;
+        } else if (particle instanceof XmlSchemaSequence) {
+            elementInfo.isGroup = true;
         } else { // any
             elementInfo.any = true;
             elementInfo.xmlName = null; // unknown until runtime.
@@ -383,10 +418,30 @@ public final class ParticleInfo implements ItemInfo {
         return minOccurs;
     }
 
+    private void setMinOccurs(long value) {
+        minOccurs = value;
+
+        if (isGroup()) {
+            for (ParticleInfo child : getChildren()) {
+                child.setMinOccurs(value);
+            }
+        }
+    }
+
     public long getMaxOccurs() {
         return maxOccurs;
     }
 
+    private void setMaxOccurs(long value) {
+        maxOccurs = value;
+
+        if (isGroup()) {
+            for (ParticleInfo child : getChildren()) {
+                child.setMaxOccurs(value);
+            }
+        }
+    }
+
     public boolean isArray() {
         return maxOccurs > 1;
     }

http://git-wip-us.apache.org/repos/asf/cxf/blob/4cd28267/tools/wsdlto/frontend/javascript/src/test/resources/org/apache/cxf/tools/wsdlto/javascript/hello_world.wsdl
----------------------------------------------------------------------
diff --git a/tools/wsdlto/frontend/javascript/src/test/resources/org/apache/cxf/tools/wsdlto/javascript/hello_world.wsdl b/tools/wsdlto/frontend/javascript/src/test/resources/org/apache/cxf/tools/wsdlto/javascript/hello_world.wsdl
index 35c6baf..c342321 100644
--- a/tools/wsdlto/frontend/javascript/src/test/resources/org/apache/cxf/tools/wsdlto/javascript/hello_world.wsdl
+++ b/tools/wsdlto/frontend/javascript/src/test/resources/org/apache/cxf/tools/wsdlto/javascript/hello_world.wsdl
@@ -178,6 +178,35 @@ under the License.
                     </sequence>
                 </complexType>
             </element>
+            <element name="testGroup">
+                <complexType>
+                    <sequence>
+                        <group ref="x1:testGroup1"/>
+                    </sequence>
+                </complexType>
+            </element>
+            <element name="testGroupResponse">
+                <complexType>
+                    <sequence>
+                        <choice>
+                            <group ref="x1:testGroup1"/>
+                            <group ref="x1:testGroup2"/>
+                        </choice>
+                    </sequence>
+                </complexType>
+            </element>
+            <group name="testGroup1">
+                <sequence>
+                    <element name="arg0" type="string"/>
+                    <element name="arg1" type="string"/>
+                </sequence>
+            </group>
+            <group name="testGroup2">
+                <sequence>
+                    <element name="arg2" type="string"/>
+                    <element name="arg3" type="string"/>
+                </sequence>
+            </group>
         </schema>
     </wsdl:types>
     <wsdl:message name="sayHiRequest">
@@ -237,6 +266,12 @@ under the License.
     <wsdl:message name="testChoiceResponse">
         <wsdl:part name="out" element="x1:testChoiceResponse"/>
     </wsdl:message>
+    <wsdl:message name="testGroupRequest">
+        <wsdl:part name="in" element="x1:testGroup"/>
+    </wsdl:message>
+    <wsdl:message name="testGroupResponse">
+        <wsdl:part name="out" element="x1:testGroupResponse"/>
+    </wsdl:message>
 
     <wsdl:portType name="Greeter">
         <wsdl:operation name="sayHi">
@@ -272,6 +307,10 @@ under the License.
             <wsdl:input name="testChoiceRequest" message="tns:testChoiceRequest"/>
             <wsdl:output name="testChoiceResponse" message="tns:testChoiceResponse"/>
         </wsdl:operation>
+        <wsdl:operation name="testGroup">
+            <wsdl:input name="testGroupRequest" message="tns:testGroupRequest"/>
+            <wsdl:output name="testGroupResponse" message="tns:testGroupResponse"/>
+        </wsdl:operation>
     </wsdl:portType>
     <wsdl:portType name="DocLitBare">
         <wsdl:operation name="testDocLitBare">
@@ -356,6 +395,15 @@ under the License.
                 <soap:body use="literal"/>
             </wsdl:output>
         </wsdl:operation>
+        <wsdl:operation name="testGroup">
+            <soap:operation style="document"/>
+            <wsdl:input>
+                <soap:body use="literal"/>
+            </wsdl:input>
+            <wsdl:output>
+                <soap:body use="literal"/>
+            </wsdl:output>
+        </wsdl:operation>
     </wsdl:binding>
     <wsdl:binding name="Doc_Lit_Bare_SOAPBinding" type="tns:DocLitBare">
         <soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>