You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cxf.apache.org by bi...@apache.org on 2007/12/05 19:03:40 UTC

svn commit: r601452 - in /incubator/cxf/trunk/rt/javascript/src/main/java/org/apache/cxf/javascript: ElementInfo.java JavascriptUtils.java service/ServiceJavascriptBuilder.java types/SchemaJavascriptBuilder.java

Author: bimargulies
Date: Wed Dec  5 10:03:40 2007
New Revision: 601452

URL: http://svn.apache.org/viewvc?rev=601452&view=rev
Log:
A week has seven days (max) and a CXF Java method has seven parameters (max). Doesn't anyone in here read 
Terry Prachet? Remodularize to introduce a bean with, yes, eight items in it to allow dealing with top-level
parts that are arrays.

Added:
    incubator/cxf/trunk/rt/javascript/src/main/java/org/apache/cxf/javascript/ElementInfo.java
Modified:
    incubator/cxf/trunk/rt/javascript/src/main/java/org/apache/cxf/javascript/JavascriptUtils.java
    incubator/cxf/trunk/rt/javascript/src/main/java/org/apache/cxf/javascript/service/ServiceJavascriptBuilder.java
    incubator/cxf/trunk/rt/javascript/src/main/java/org/apache/cxf/javascript/types/SchemaJavascriptBuilder.java

Added: incubator/cxf/trunk/rt/javascript/src/main/java/org/apache/cxf/javascript/ElementInfo.java
URL: http://svn.apache.org/viewvc/incubator/cxf/trunk/rt/javascript/src/main/java/org/apache/cxf/javascript/ElementInfo.java?rev=601452&view=auto
==============================================================================
--- incubator/cxf/trunk/rt/javascript/src/main/java/org/apache/cxf/javascript/ElementInfo.java (added)
+++ incubator/cxf/trunk/rt/javascript/src/main/java/org/apache/cxf/javascript/ElementInfo.java Wed Dec  5 10:03:40 2007
@@ -0,0 +1,88 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.cxf.javascript;
+
+import org.apache.cxf.common.xmlschema.SchemaCollection;
+import org.apache.ws.commons.schema.XmlSchemaElement;
+import org.apache.ws.commons.schema.XmlSchemaType;
+
+/**
+ * All the information needed to create the JavaScript for an Xml Schema element. 
+ */
+public class ElementInfo {
+    private String utilsVarName;
+    private XmlSchemaElement element; 
+    private String elementJavascriptName;
+    private String elementXmlName;
+    private SchemaCollection xmlSchemaCollection;
+    private String referencingURI;
+    private XmlSchemaType containingType;
+    private boolean partElement;
+    
+    public String getUtilsVarName() {
+        return utilsVarName;
+    }
+    public void setUtilsVarName(String utilsVarName) {
+        this.utilsVarName = utilsVarName;
+    }
+    public XmlSchemaElement getElement() {
+        return element;
+    }
+    public void setElement(XmlSchemaElement element) {
+        this.element = element;
+    }
+    public String getElementJavascriptName() {
+        return elementJavascriptName;
+    }
+    public void setElementJavascriptName(String elementJavascriptName) {
+        this.elementJavascriptName = elementJavascriptName;
+    }
+    public String getElementXmlName() {
+        return elementXmlName;
+    }
+    public void setElementXmlName(String elementXmlName) {
+        this.elementXmlName = elementXmlName;
+    }
+    public SchemaCollection getXmlSchemaCollection() {
+        return xmlSchemaCollection;
+    }
+    public void setXmlSchemaCollection(SchemaCollection xmlSchemaCollection) {
+        this.xmlSchemaCollection = xmlSchemaCollection;
+    }
+    public String getReferencingURI() {
+        return referencingURI;
+    }
+    public void setReferencingURI(String referencingURI) {
+        this.referencingURI = referencingURI;
+    }
+    public XmlSchemaType getContainingType() {
+        return containingType;
+    }
+    public void setContainingType(XmlSchemaType containingType) {
+        this.containingType = containingType;
+    }
+    public boolean isPartElement() {
+        return partElement;
+    }
+    public void setPartElement(boolean partElement) {
+        this.partElement = partElement;
+    }
+
+}

Modified: incubator/cxf/trunk/rt/javascript/src/main/java/org/apache/cxf/javascript/JavascriptUtils.java
URL: http://svn.apache.org/viewvc/incubator/cxf/trunk/rt/javascript/src/main/java/org/apache/cxf/javascript/JavascriptUtils.java?rev=601452&r1=601451&r2=601452&view=diff
==============================================================================
--- incubator/cxf/trunk/rt/javascript/src/main/java/org/apache/cxf/javascript/JavascriptUtils.java (original)
+++ incubator/cxf/trunk/rt/javascript/src/main/java/org/apache/cxf/javascript/JavascriptUtils.java Wed Dec  5 10:03:40 2007
@@ -27,10 +27,8 @@
 
 import javax.xml.namespace.QName;
 
-import org.apache.cxf.common.xmlschema.SchemaCollection;
 import org.apache.cxf.wsdl.WSDLConstants;
 import org.apache.ws.commons.schema.XmlSchemaComplexType;
-import org.apache.ws.commons.schema.XmlSchemaElement;
 import org.apache.ws.commons.schema.XmlSchemaSimpleType;
 import org.apache.ws.commons.schema.XmlSchemaType;
 
@@ -192,44 +190,42 @@
         return token;
     }
     
-    public void generateCodeToSerializeElement(String utilsVarName,
-                                               XmlSchemaElement element, 
-                                               String elementJavascriptName,
-                                               String elementXmlName,
-                                               SchemaCollection xmlSchemaCollection,
-                                               String referencingURI,
-                                               XmlSchemaType containingType) {
-        boolean nillable = element.isNillable();
-        boolean optional = XmlSchemaUtils.isParticleOptional(element);
+    public void generateCodeToSerializeElement(ElementInfo elementInfo) {
+        boolean nillable = elementInfo.getElement().isNillable();
+        boolean optional = XmlSchemaUtils.isParticleOptional(elementInfo.getElement());
         
         XmlSchemaType elType = 
-            XmlSchemaUtils.getElementType(xmlSchemaCollection, referencingURI, element, containingType);
+            XmlSchemaUtils.getElementType(elementInfo.getXmlSchemaCollection(),
+                                          elementInfo.getReferencingURI(),
+                                          elementInfo.getElement(), 
+                                          elementInfo.getContainingType());
         
         // first question: optional?
         if (optional) {
-            startIf(elementJavascriptName + " != null");
+            startIf(elementInfo.getElementJavascriptName() + " != null");
         }
         
         // nillable and optional would be very strange together.
         // and nillable in the array case applies to the elements.
-        if (nillable && !XmlSchemaUtils.isParticleArray(element)) {
-            startIf(elementJavascriptName + " == null");
-            appendString("<" + elementXmlName + " " + XmlSchemaUtils.NIL_ATTRIBUTES + "/>");
+        if (nillable && !XmlSchemaUtils.isParticleArray(elementInfo.getElement())) {
+            startIf(elementInfo.getElementJavascriptName() + " == null");
+            appendString("<" + elementInfo.getElementXmlName() + " " + XmlSchemaUtils.NIL_ATTRIBUTES + "/>");
             appendElse();
         }
 
-        if (XmlSchemaUtils.isParticleArray(element)) {
+        if (XmlSchemaUtils.isParticleArray(elementInfo.getElement())) {
             // protected against null in arrays.
-            startIf(elementJavascriptName + " != null");
-            startFor("var ax = 0", "ax < " +  elementJavascriptName + ".length", "ax ++");
-            elementJavascriptName = elementJavascriptName + "[ax]";
+            startIf(elementInfo.getElementJavascriptName() + " != null");
+            startFor("var ax = 0", "ax < " +  elementInfo.getElementJavascriptName() + ".length", "ax ++");
+            elementInfo.setElementJavascriptName(elementInfo.getElementJavascriptName() + "[ax]");
             // we need an extra level of 'nil' testing here. Or do we, depending on the type structure?
             // Recode and fiddle appropriately.
-            startIf(elementJavascriptName + " == null");
+            startIf(elementInfo.getElementJavascriptName() + " == null");
             if (nillable) {
-                appendString("<" + elementXmlName + " " + XmlSchemaUtils.NIL_ATTRIBUTES + "/>");
+                appendString("<" + elementInfo.getElementXmlName() 
+                             + " " + XmlSchemaUtils.NIL_ATTRIBUTES + "/>");
             } else {
-                appendString("<" + elementXmlName + "/>");                    
+                appendString("<" + elementInfo.getElementXmlName() + "/>");                    
             }
             appendElse();
         }
@@ -237,33 +233,35 @@
         // now for the thing itself.
         if (elType instanceof XmlSchemaComplexType) {
             // it has a value
-            appendExpression(elementJavascriptName + ".serialize(" 
-                                     + utilsVarName + ", '" 
-                                     + elementXmlName + "')");
+            appendExpression(elementInfo.getElementJavascriptName() + ".serialize(" 
+                             + elementInfo.getUtilsVarName() + ", '" 
+                             + elementInfo.getElementXmlName() + "')");
         } else { // simple type
             QName typeName = elType.getQName();
-            appendString("<" + elementXmlName + ">");
+            appendString("<" + elementInfo.getElementXmlName() + ">");
             // warning: this assumes that ordinary Javascript serialization is all we need.
             // except for &gt; ad all of that.
             if (isStringSimpleType(typeName)) {
-                appendExpression(utilsVarName + ".escapeXmlEntities(" + elementJavascriptName + ")");
+                appendExpression(elementInfo.getUtilsVarName() 
+                                 + ".escapeXmlEntities(" 
+                                 + elementInfo.getElementJavascriptName() + ")");
             } else {
-                appendExpression(elementJavascriptName);
+                appendExpression(elementInfo.getElementJavascriptName());
             }
-            appendString("</" + elementXmlName + ">");
+            appendString("</" + elementInfo.getElementXmlName() + ">");
         }
         
-        if (XmlSchemaUtils.isParticleArray(element)) {
+        if (XmlSchemaUtils.isParticleArray(elementInfo.getElement())) {
             endBlock(); // for the extra level of nil checking, which might be wrong.
             endBlock(); // for the for loop.
             endBlock(); // the null protection.
         }
         
-        if (nillable && !XmlSchemaUtils.isParticleArray(element)) {
+        if (nillable && !XmlSchemaUtils.isParticleArray(elementInfo.getElement())) {
             endBlock();
         }
         
-        if (XmlSchemaUtils.isParticleOptional(element)) {
+        if (XmlSchemaUtils.isParticleOptional(elementInfo.getElement())) {
             endBlock();
         }
 

Modified: incubator/cxf/trunk/rt/javascript/src/main/java/org/apache/cxf/javascript/service/ServiceJavascriptBuilder.java
URL: http://svn.apache.org/viewvc/incubator/cxf/trunk/rt/javascript/src/main/java/org/apache/cxf/javascript/service/ServiceJavascriptBuilder.java?rev=601452&r1=601451&r2=601452&view=diff
==============================================================================
--- incubator/cxf/trunk/rt/javascript/src/main/java/org/apache/cxf/javascript/service/ServiceJavascriptBuilder.java (original)
+++ incubator/cxf/trunk/rt/javascript/src/main/java/org/apache/cxf/javascript/service/ServiceJavascriptBuilder.java Wed Dec  5 10:03:40 2007
@@ -37,6 +37,7 @@
 import org.apache.cxf.common.logging.LogUtils;
 import org.apache.cxf.common.util.StringUtils;
 import org.apache.cxf.common.xmlschema.SchemaCollection;
+import org.apache.cxf.javascript.ElementInfo;
 import org.apache.cxf.javascript.JavascriptUtils;
 import org.apache.cxf.javascript.NameManager;
 import org.apache.cxf.javascript.NamespacePrefixAccumulator;
@@ -478,24 +479,37 @@
         utils.setXmlStringAccumulator("xml");
         
         if (isWrapped) {
-            utils.generateCodeToSerializeElement("cxfutils", 
-                                                 inputWrapperElement, 
-                                                 "wrapperObj",
-                                                 wrapperXmlElementName,
-                                                 xmlSchemaCollection, 
-                                                 serviceTargetNamespace,
-                                                 null);
+            ElementInfo elementInfo = new ElementInfo();
+            elementInfo.setContainingType(null);
+            elementInfo.setElement(inputWrapperElement);
+            elementInfo.setElementJavascriptName("wrapperObj");
+            elementInfo.setElementXmlName(wrapperXmlElementName);
+            elementInfo.setReferencingURI(serviceTargetNamespace);
+            elementInfo.setUtilsVarName("cxfutils");
+            elementInfo.setXmlSchemaCollection(xmlSchemaCollection);
+            elementInfo.setPartElement(true);
+
+            utils.generateCodeToSerializeElement(elementInfo);
         } else {
             int px = 0;
             // Multiple parts violates WS-I, but we can still do them.
+            // Parts are top-level elements. As such, they cannot, directly, be arrays.
+            // If a part is declared as an array type, the schema has a non-array element
+            // with a complex type consisting of an element with array bounds. We don't 
+            // want the JavasSript programmer to have to concoct an extra level of object
+            // (though if the same sort of thing happens elsewhere due to an XmlRootElement,
+            // the JavaScript programmer is stuck with the situation). 
             for (ElementAndNames ean : unwrappedElementsAndNames) {
-                utils.generateCodeToSerializeElement("cxfutils",
-                                                     ean.getElement(),
-                                                     "args[" + px + "]",
-                                                     ean.getXmlName(),
-                                                     xmlSchemaCollection,
-                                                     serviceTargetNamespace,
-                                                     null);
+                ElementInfo elementInfo = new ElementInfo();
+                elementInfo.setContainingType(null);
+                elementInfo.setElement(ean.getElement());
+                elementInfo.setElementJavascriptName("args[" + px + "]");
+                elementInfo.setElementXmlName(ean.getXmlName());
+                elementInfo.setReferencingURI(serviceTargetNamespace);
+                elementInfo.setUtilsVarName("cxfutils");
+                elementInfo.setXmlSchemaCollection(xmlSchemaCollection);
+                elementInfo.setPartElement(true);
+                utils.generateCodeToSerializeElement(elementInfo);
                 px++;
             }
         }

Modified: incubator/cxf/trunk/rt/javascript/src/main/java/org/apache/cxf/javascript/types/SchemaJavascriptBuilder.java
URL: http://svn.apache.org/viewvc/incubator/cxf/trunk/rt/javascript/src/main/java/org/apache/cxf/javascript/types/SchemaJavascriptBuilder.java?rev=601452&r1=601451&r2=601452&view=diff
==============================================================================
--- incubator/cxf/trunk/rt/javascript/src/main/java/org/apache/cxf/javascript/types/SchemaJavascriptBuilder.java (original)
+++ incubator/cxf/trunk/rt/javascript/src/main/java/org/apache/cxf/javascript/types/SchemaJavascriptBuilder.java Wed Dec  5 10:03:40 2007
@@ -27,6 +27,7 @@
 import org.apache.cxf.common.logging.LogUtils;
 import org.apache.cxf.common.util.StringUtils;
 import org.apache.cxf.common.xmlschema.SchemaCollection;
+import org.apache.cxf.javascript.ElementInfo;
 import org.apache.cxf.javascript.JavascriptUtils;
 import org.apache.cxf.javascript.NameManager;
 import org.apache.cxf.javascript.NamespacePrefixAccumulator;
@@ -239,8 +240,16 @@
             String elementName = elementPrefix + elChild.getName();
             String elementXmlRef = prefixAccumulator.xmlElementString(schemaInfo, elChild);
             
-            utils.generateCodeToSerializeElement("cxfjsutils", elChild, elementName, 
-                                                 elementXmlRef, xmlSchemaCollection, null, type);
+            ElementInfo elementInfo = new ElementInfo();
+            elementInfo.setContainingType(type);
+            elementInfo.setElement(elChild);
+            elementInfo.setElementJavascriptName(elementName);
+            elementInfo.setElementXmlName(elementXmlRef);
+            elementInfo.setReferencingURI(null);
+            elementInfo.setUtilsVarName("cxfjsutils");
+            elementInfo.setXmlSchemaCollection(xmlSchemaCollection);
+            elementInfo.setPartElement(false);
+            utils.generateCodeToSerializeElement(elementInfo);
         }
     }
     /**