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/12 20:37:21 UTC

[2/5] cxf git commit: (CXF-6148) Added support for basic xsd:choice elements for JS generator. Covered with tests and improved tests. Added log message when not supported exception is raisen.

(CXF-6148) Added support for basic xsd:choice elements for JS generator. Covered with tests and improved tests. Added log message when not supported exception is raisen.


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

Branch: refs/heads/3.0.x-fixes
Commit: 5122b2d0111216d8fcc64dbdbcafd769413d2b5a
Parents: 3c5f5a9
Author: Andrii Nikitiuk <de...@gmail.com>
Authored: Tue Dec 9 20:38:32 2014 +0200
Committer: Daniel Kulp <dk...@apache.org>
Committed: Fri Dec 12 14:37:01 2014 -0500

----------------------------------------------------------------------
 .../apache/cxf/javascript/JavascriptUtils.java  | 12 ++++-
 .../apache/cxf/javascript/Messages.properties   |  3 ++
 .../org/apache/cxf/javascript/ParticleInfo.java | 48 +++++++++++++++++++-
 .../types/SchemaJavascriptBuilder.java          | 28 ++++++++++--
 .../wsdlto/javascript/WSDLToJavaScriptTest.java | 18 +++++++-
 .../tools/wsdlto/javascript/hello_world.wsdl    | 44 ++++++++++++++++++
 6 files changed, 144 insertions(+), 9 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cxf/blob/5122b2d0/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 a1c4ad9..253e586 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
@@ -338,6 +338,13 @@ public class JavascriptUtils {
     public void generateCodeToSerializeElement(ParticleInfo elementInfo,
                                                String referencePrefix,
                                                SchemaCollection schemaCollection) {
+        if (elementInfo.isGroup()) {
+            for (ParticleInfo childElement : elementInfo.getChildren()) {
+                generateCodeToSerializeElement(childElement, referencePrefix, schemaCollection);
+            }
+            return;
+        }
+
         XmlSchemaType type = elementInfo.getType();
         boolean nillable = elementInfo.isNillable();
         boolean optional = elementInfo.isOptional();
@@ -563,9 +570,10 @@ public class JavascriptUtils {
                                                 contextName, object);
         }
         if (!(object instanceof XmlSchemaElement)
-            && !(object instanceof XmlSchemaAny)) {
+            && !(object instanceof XmlSchemaAny)
+            && !(object instanceof XmlSchemaChoice)) {
             unsupportedConstruct("GROUP_CHILD",
-                                                object.getClass().getSimpleName(), contextName,
+                    object.getClass().getSimpleName(), contextName,
                                                 object);
         }
 

http://git-wip-us.apache.org/repos/asf/cxf/blob/5122b2d0/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 1c08adc..120335f 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
@@ -25,3 +25,6 @@ IMPOSSIBLE_GLOBAL_ITEM= JavaScript limitation: Element or xs:any at {0} used in
 MISSING_TYPE=Type {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}.
+GROUP_ELEMENT_MULTI_OCCURS=Limitation: unsupported group element construct {0} with maxOccours > 1 found.
+GROUP_ELEMENT_ANY=Limitation: unsupported any element inside group element construct {0}
+GROUP_CHILD=Limitation: unsupported construct {0} found in {1}. {2}

http://git-wip-us.apache.org/repos/asf/cxf/blob/5122b2d0/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 c8631bd..445cf96 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
@@ -19,6 +19,8 @@
 
 package org.apache.cxf.javascript;
 
+import java.util.List;
+import java.util.LinkedList;
 import java.util.logging.Logger;
 
 import javax.xml.namespace.QName;
@@ -29,6 +31,8 @@ import org.apache.cxf.common.xmlschema.SchemaCollection;
 import org.apache.cxf.common.xmlschema.XmlSchemaUtils;
 import org.apache.ws.commons.schema.XmlSchema;
 import org.apache.ws.commons.schema.XmlSchemaElement;
+import org.apache.ws.commons.schema.XmlSchemaChoice;
+import org.apache.ws.commons.schema.XmlSchemaChoiceMember;
 import org.apache.ws.commons.schema.XmlSchemaObject;
 import org.apache.ws.commons.schema.XmlSchemaParticle;
 import org.apache.ws.commons.schema.XmlSchemaType;
@@ -47,6 +51,10 @@ public final class ParticleInfo implements ItemInfo {
     // in the RPC case, we can have a type and no element.
     private XmlSchemaType type;
     private boolean empty;
+
+    private boolean isGroup;
+    private List<ParticleInfo> children;
+
     // These are exactly the same values as we find in the XmlSchemaElement.
     // there is no rationalization. But the accessors take care of business.
     private long minOccurs;
@@ -149,6 +157,32 @@ public final class ParticleInfo implements ItemInfo {
                 elementInfo.global = true;
             }
             elementInfo.nillable = ((XmlSchemaElement)realParticle).isNillable();
+        } else if (sequenceParticle instanceof XmlSchemaChoice) {
+            XmlSchemaChoice choice = (XmlSchemaChoice)sequenceParticle;
+
+            if (sequenceParticle.getMaxOccurs() > 1) {
+                Message message = new Message("GROUP_ELEMENT_MULTI_OCCURS", LOG, sequenceParticle
+                        .getClass().getSimpleName());
+                throw new UnsupportedConstruct(message.toString());
+            }
+
+            elementInfo.children = new LinkedList<>();
+
+            List<XmlSchemaChoiceMember> items = choice.getItems();
+            for (XmlSchemaChoiceMember item : items) {
+                XmlSchemaObject schemaObject = (XmlSchemaObject)item;
+                ParticleInfo childParticle = ParticleInfo.forLocalItem(schemaObject, currentSchema, schemaCollection,
+                        prefixAccumulator, contextName);
+
+                if (childParticle.isAny()) {
+                    Message message = new Message("GROUP_ELEMENT_ANY", LOG, sequenceParticle.getClass()
+                            .getSimpleName());
+                    throw new UnsupportedConstruct(message.toString());
+                }
+
+                childParticle.minOccurs = 0;
+                elementInfo.children.add(childParticle);
+            }
         }
 
         elementInfo.minOccurs = sequenceParticle.getMinOccurs();
@@ -199,13 +233,17 @@ public final class ParticleInfo implements ItemInfo {
 
             elementInfo.defaultValue = schemaDefaultValue;
             factorySetupType(element, schemaCollection, elementInfo);
+
+            elementInfo.isGroup = false;
+        } else if (particle instanceof XmlSchemaChoice) {
+            elementInfo.isGroup = true;
         } else { // any
             elementInfo.any = true;
             elementInfo.xmlName = null; // unknown until runtime.
             // TODO: multiple 'any'
             elementInfo.javascriptName = "any";
             elementInfo.type = null; // runtime for any.
-
+            elementInfo.isGroup = false;
         }
     }
 
@@ -325,6 +363,14 @@ public final class ParticleInfo implements ItemInfo {
         this.type = type;
     }
 
+    public boolean isGroup() {
+        return isGroup;
+    }
+
+    public List<ParticleInfo> getChildren() {
+        return children;
+    }
+
     public boolean isEmpty() {
         return empty;
     }

http://git-wip-us.apache.org/repos/asf/cxf/blob/5122b2d0/rt/javascript/javascript-rt/src/main/java/org/apache/cxf/javascript/types/SchemaJavascriptBuilder.java
----------------------------------------------------------------------
diff --git a/rt/javascript/javascript-rt/src/main/java/org/apache/cxf/javascript/types/SchemaJavascriptBuilder.java b/rt/javascript/javascript-rt/src/main/java/org/apache/cxf/javascript/types/SchemaJavascriptBuilder.java
index 403766a..3292672 100755
--- a/rt/javascript/javascript-rt/src/main/java/org/apache/cxf/javascript/types/SchemaJavascriptBuilder.java
+++ b/rt/javascript/javascript-rt/src/main/java/org/apache/cxf/javascript/types/SchemaJavascriptBuilder.java
@@ -156,6 +156,7 @@ public class SchemaJavascriptBuilder {
                     domDeserializerFunction(element.getQName(), complexType);
                 }
             } catch (UnsupportedConstruct usc) {
+                LOG.warning(usc.getMessage());
                 continue; // it could be empty, but the style checker
                 // would complain.
             }
@@ -189,7 +190,7 @@ public class SchemaJavascriptBuilder {
         for (XmlSchemaObject thing : items) {
             ParticleInfo itemInfo = ParticleInfo.forLocalItem(thing, xmlSchema, xmlSchemaCollection,
                                                               prefixAccumulator, type.getQName());
-            constructOneItem(type, elementPrefix, typeObjectName, itemInfo);
+            constructItem(type, elementPrefix, typeObjectName, itemInfo);
         }
 
         for (XmlSchemaAnnotated thing : attrs) {
@@ -202,6 +203,18 @@ public class SchemaJavascriptBuilder {
         code.append(accessors.toString());
     }
 
+    private void constructItem(XmlSchemaComplexType type, final String elementPrefix,
+                               String typeObjectName, ParticleInfo itemInfo) {
+        if (!itemInfo.isGroup()) {
+            constructOneItem(type, elementPrefix, typeObjectName, itemInfo);
+            return;
+        }
+
+        for (ParticleInfo childInfo : itemInfo.getChildren()) {
+            constructItem(type, elementPrefix, typeObjectName, childInfo);
+        }
+    }
+
     private void constructOneItem(XmlSchemaComplexType type, final String elementPrefix,
                                   String typeObjectName, ItemInfo itemInfo) {
 
@@ -396,7 +409,7 @@ public class SchemaJavascriptBuilder {
                 }
                 deserializeAny(type, itemInfo, nextItem);
             } else {
-                deserializeElement(type, contentElement);
+                deserializeElement(type, itemInfo);
             }
         }
         utils.appendLine("return newobject;");
@@ -528,9 +541,14 @@ public class SchemaJavascriptBuilder {
         utils.appendLine("newobject.setAny(anyHolder);");
     }
 
-    private void deserializeElement(XmlSchemaComplexType type, XmlSchemaObject thing) {
-        ParticleInfo itemInfo = ParticleInfo.forLocalItem(thing, xmlSchema, xmlSchemaCollection,
-                                                          prefixAccumulator, type.getQName());
+    private void deserializeElement(XmlSchemaComplexType type, ParticleInfo itemInfo) {
+        if (itemInfo.isGroup()) {
+            for (ParticleInfo childElement : itemInfo.getChildren()) {
+                deserializeElement(type, childElement);
+            }
+            return;
+        }
+
         XmlSchemaType itemType = itemInfo.getType();
         boolean simple = itemType instanceof XmlSchemaSimpleType
                          || JavascriptUtils.notVeryComplexType(itemType);

http://git-wip-us.apache.org/repos/asf/cxf/blob/5122b2d0/tools/wsdlto/frontend/javascript/src/test/java/org/apache/cxf/tools/wsdlto/javascript/WSDLToJavaScriptTest.java
----------------------------------------------------------------------
diff --git a/tools/wsdlto/frontend/javascript/src/test/java/org/apache/cxf/tools/wsdlto/javascript/WSDLToJavaScriptTest.java b/tools/wsdlto/frontend/javascript/src/test/java/org/apache/cxf/tools/wsdlto/javascript/WSDLToJavaScriptTest.java
index 15af869..872661c 100644
--- a/tools/wsdlto/frontend/javascript/src/test/java/org/apache/cxf/tools/wsdlto/javascript/WSDLToJavaScriptTest.java
+++ b/tools/wsdlto/frontend/javascript/src/test/java/org/apache/cxf/tools/wsdlto/javascript/WSDLToJavaScriptTest.java
@@ -32,7 +32,17 @@ import org.junit.Test;
  * 
  */
 public class WSDLToJavaScriptTest extends ProcessorTestBase {
-    
+
+    public int countChar(String text, char symbol) {
+        int count = 0;
+        for (int i = 0; i < text.length(); i++) {
+            if (text.charAt(i) == symbol) {
+                count++;
+            }
+        }
+        return count;
+    }
+
     // just run with a minimum of fuss.
     @Test
     public void testGeneration() throws Exception {
@@ -52,6 +62,9 @@ public class WSDLToJavaScriptTest extends ProcessorTestBase {
         FileInputStream fis = new FileInputStream(resultFile);
         String javascript = IOUtils.readStringFromStream(fis);
         assertTrue(javascript.contains("xmlns:murble='http://apache.org/hello_world_soap_http'"));
+        assertEquals("Number of '{' does not match number of '}' in generated JavaScript.",
+                countChar(javascript, '{'),
+                countChar(javascript, '}'));
     }
    
     @Test
@@ -72,6 +85,9 @@ public class WSDLToJavaScriptTest extends ProcessorTestBase {
         FileInputStream fis = new FileInputStream(resultFile);
         String javascript = IOUtils.readStringFromStream(fis);
         assertTrue(javascript.contains("xmlns:murble='http://apache.org/hello_world_soap_http'"));
+        assertEquals("Number of '{' does not match number of '}' in generated JavaScript.",
+                countChar(javascript, '{'),
+                countChar(javascript, '}'));
     }
    
 }

http://git-wip-us.apache.org/repos/asf/cxf/blob/5122b2d0/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 0378931..35c6baf 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
@@ -154,6 +154,30 @@ under the License.
                     <attribute name="id" type="int"/>
                 </complexType>
             </element>
+            <element name="testChoice">
+                <complexType>
+                    <sequence>
+                        <element name="arg0" type="string"/>
+                        <element name="arg1" type="string"/>
+                        <choice>
+                            <element name="arg2" type="string"/>
+                            <element name="arg3" type="string"/>
+                        </choice>
+                    </sequence>
+                </complexType>
+            </element>
+            <element name="testChoiceResponse">
+                <complexType>
+                    <sequence>
+                        <element name="arg0" type="string"/>
+                        <element name="arg1" type="string"/>
+                        <choice>
+                            <element name="arg2" type="string"/>
+                            <element name="arg3" type="string"/>
+                        </choice>
+                    </sequence>
+                </complexType>
+            </element>
         </schema>
     </wsdl:types>
     <wsdl:message name="sayHiRequest">
@@ -207,6 +231,13 @@ under the License.
     <wsdl:message name="testDocLitBareResponse">
         <wsdl:part name="out" element="x1:BareDocumentResponse"/>
     </wsdl:message>
+    <wsdl:message name="testChoiceRequest">
+        <wsdl:part name="in" element="x1:testChoice"/>
+    </wsdl:message>
+    <wsdl:message name="testChoiceResponse">
+        <wsdl:part name="out" element="x1:testChoiceResponse"/>
+    </wsdl:message>
+
     <wsdl:portType name="Greeter">
         <wsdl:operation name="sayHi">
             <wsdl:input name="sayHiRequest" message="tns:sayHiRequest"/>
@@ -237,6 +268,10 @@ under the License.
             <wsdl:fault name="NoSuchCodeLitFault" message="tns:NoSuchCodeLitFault"/>
             <wsdl:fault name="BadRecordLitFault" message="tns:BadRecordLitFault"/>
         </wsdl:operation>
+        <wsdl:operation name="testChoice">
+            <wsdl:input name="testChoiceRequest" message="tns:testChoiceRequest"/>
+            <wsdl:output name="testChoiceResponse" message="tns:testChoiceResponse"/>
+        </wsdl:operation>
     </wsdl:portType>
     <wsdl:portType name="DocLitBare">
         <wsdl:operation name="testDocLitBare">
@@ -312,6 +347,15 @@ under the License.
                 <soap:fault name="BadRecordLitFault" use="literal"/>
             </wsdl:fault>
         </wsdl:operation>
+        <wsdl:operation name="testChoice">
+            <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"/>