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/11 03:15:33 UTC

svn commit: r603120 - in /incubator/cxf/trunk: rt/javascript/src/main/java/org/apache/cxf/javascript/ rt/javascript/src/main/java/org/apache/cxf/javascript/service/ rt/javascript/src/main/java/org/apache/cxf/javascript/types/ rt/javascript/src/test/jav...

Author: bimargulies
Date: Mon Dec 10 18:15:31 2007
New Revision: 603120

URL: http://svn.apache.org/viewvc?rev=603120&view=rev
Log:
OK, now RPC works and all the stuff that worked before works, too.

Modified:
    incubator/cxf/trunk/rt/javascript/src/main/java/org/apache/cxf/javascript/ElementInfo.java
    incubator/cxf/trunk/rt/javascript/src/main/java/org/apache/cxf/javascript/JavascriptQueryHandler.java
    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/Messages.properties
    incubator/cxf/trunk/rt/javascript/src/main/java/org/apache/cxf/javascript/NamespacePrefixAccumulator.java
    incubator/cxf/trunk/rt/javascript/src/main/java/org/apache/cxf/javascript/XmlSchemaUtils.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
    incubator/cxf/trunk/rt/javascript/src/test/java/org/apache/cxf/javascript/DocLitBareClientTest.java
    incubator/cxf/trunk/rt/javascript/src/test/java/org/apache/cxf/javascript/JavascriptTestUtilities.java
    incubator/cxf/trunk/rt/javascript/src/test/java/org/apache/cxf/javascript/QueryHandlerTest.java
    incubator/cxf/trunk/rt/javascript/src/test/java/org/apache/cxf/javascript/types/SerializationTest.java
    incubator/cxf/trunk/tools/wsdlto/frontend/javascript/src/main/java/org/apache/cxf/tools/wsdlto/javascript/WSDLToJavaScriptProcessor.java

Modified: 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=603120&r1=603119&r2=603120&view=diff
==============================================================================
--- incubator/cxf/trunk/rt/javascript/src/main/java/org/apache/cxf/javascript/ElementInfo.java (original)
+++ incubator/cxf/trunk/rt/javascript/src/main/java/org/apache/cxf/javascript/ElementInfo.java Mon Dec 10 18:15:31 2007
@@ -19,89 +19,227 @@
 
 package org.apache.cxf.javascript;
 
+import java.util.logging.Logger;
+
+import org.apache.cxf.common.i18n.Message;
+import org.apache.cxf.common.logging.LogUtils;
 import org.apache.cxf.common.xmlschema.SchemaCollection;
+import org.apache.ws.commons.schema.XmlSchema;
 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. 
+ * All the information needed to create the JavaScript for an Xml Schema
+ * element.
  */
-public class ElementInfo {
+public final class ElementInfo {
+    private static final Logger LOG = LogUtils.getL7dLogger(ElementInfo.class);
     private String utilsVarName;
-    private XmlSchemaElement element; 
-    private String elementJavascriptName;
-    private String elementXmlName;
-    private SchemaCollection xmlSchemaCollection;
-    private String referencingURI;
+    private XmlSchemaElement element;
+    private String javascriptName;
+    private String xmlName;
     private XmlSchemaType containingType;
     // in the RPC case, we can have a type and no element.
     private XmlSchemaType type;
     private boolean empty;
-    
-    public ElementInfo(XmlSchemaElement element, XmlSchemaType type, String partJavascriptVar,
-                       String elementXmlRef, boolean empty) {
-        this.element = element;
-        this.type = type;
-        this.elementJavascriptName = partJavascriptVar;
-        this.elementXmlName = elementXmlRef;
-        this.empty = empty;
+    // These are exactly the same values as we find in the XmlSchemaElement.
+    // there is no rationalization.
+    private long minOccurs;
+    private long maxOccurs;
+
+    private ElementInfo() {
+    }
+
+    public static ElementInfo forGlobalElement(XmlSchemaElement element, String javascriptPrefix,
+                                               XmlSchema currentSchema, SchemaCollection schemaCollection,
+                                               NamespacePrefixAccumulator prefixAccumulator) {
+        ElementInfo elementInfo = new ElementInfo();
+        elementInfo.element = element;
+        elementInfo.minOccurs = element.getMinOccurs();
+        elementInfo.maxOccurs = element.getMaxOccurs();
+
+        factoryCommon(element, 
+                     true,
+                     javascriptPrefix,
+                     currentSchema, 
+                     schemaCollection, 
+                     prefixAccumulator, 
+                     elementInfo);
+        return elementInfo;
     }
     
-    public ElementInfo() {
+    /**
+     * Create element information for a part element. For a part, the JavaScript and Element names are 
+     * calculated in advance, and the element itself might be null! In that case, the minOccurs
+     * and maxOccurs are conventional. 
+     * @param element the element, or null
+     * @param schemaCollection the schema collection, for resolving types.
+     * @param javascriptName javascript variable name
+     * @param xmlElementName xml element string
+     * @return
+     */
+    public static ElementInfo forPartElement(XmlSchemaElement element,
+                                             SchemaCollection schemaCollection,
+                                             String javascriptName,
+                                             String xmlElementName) {
+        ElementInfo elementInfo = new ElementInfo();
+        elementInfo.element = element;
+        if (element == null) {
+            elementInfo.minOccurs = 1;
+            elementInfo.maxOccurs = 1;
+        } else {
+            elementInfo.minOccurs = element.getMinOccurs();
+            elementInfo.maxOccurs = element.getMaxOccurs();
+            factorySetupType(element, schemaCollection, elementInfo);
+        }
+        elementInfo.javascriptName = javascriptName;
+        elementInfo.xmlName = xmlElementName;
+        
+        return elementInfo;
+    }
+
+    public static ElementInfo forLocalElement(XmlSchemaElement sequenceElement, 
+                                              String javascriptPrefix,
+                                              XmlSchema currentSchema, 
+                                              SchemaCollection schemaCollection,
+                                              NamespacePrefixAccumulator prefixAccumulator) {
+        ElementInfo elementInfo = new ElementInfo();
+        XmlSchemaElement realElement = sequenceElement;
+        boolean global = false;
+
+        if (sequenceElement.getRefName() != null) {
+            XmlSchemaElement refElement = schemaCollection.getElementByQName(sequenceElement.getRefName());
+            if (refElement == null) {
+                Message message = new Message("ELEMENT_DANGLING_REFERENCE", LOG, sequenceElement.getQName(),
+                                              sequenceElement.getRefName());
+                throw new UnsupportedConstruct(message.toString());
+            }
+
+            realElement = refElement;
+
+        }
+        elementInfo.minOccurs = sequenceElement.getMinOccurs();
+        elementInfo.maxOccurs = sequenceElement.getMaxOccurs();
+        
+        factoryCommon(realElement, 
+                     global, 
+                     javascriptPrefix,
+                     currentSchema, 
+                     schemaCollection, 
+                     prefixAccumulator, 
+                     elementInfo);
+        
+        elementInfo.element = realElement;
+
+        return elementInfo;
+    }
+
+    private static void factoryCommon(XmlSchemaElement element, 
+                                      boolean global,
+                                      String javascriptPrefix,
+                                      XmlSchema currentSchema,
+                                      SchemaCollection schemaCollection,
+                                      NamespacePrefixAccumulator prefixAccumulator, 
+                                      ElementInfo elementInfo) {
+        String elementNamespaceURI = element.getQName().getNamespaceURI();
+        boolean elementNoNamespace = "".equals(elementNamespaceURI);
+
+        XmlSchema elementSchema = null;
+        if (!elementNoNamespace) {
+            elementSchema = schemaCollection.getSchemaByTargetNamespace(elementNamespaceURI);
+            if (elementSchema == null) {
+                throw new RuntimeException("Missing schema " + elementNamespaceURI);
+            }
+        }
+
+        boolean qualified = !elementNoNamespace
+                            && XmlSchemaUtils.isElementQualified(element, true, currentSchema, elementSchema);
+        elementInfo.xmlName = prefixAccumulator.xmlElementString(element, qualified);
+        
+        factorySetupType(element, schemaCollection, elementInfo);
+        
+        // we are assuming here that we are not dealing, in close proximity,
+        // with elements with identical local names and different namespaces.
+        elementInfo.javascriptName = javascriptPrefix + element.getQName().getLocalPart();
+    }
+
+    private static void factorySetupType(XmlSchemaElement element, SchemaCollection schemaCollection,
+                                         ElementInfo elementInfo) {
+        elementInfo.type = element.getSchemaType();
+        if (elementInfo.type == null) {
+            elementInfo.type = schemaCollection.getTypeByQName(element.getSchemaTypeName());
+            if (elementInfo.type == null) {
+                throw new RuntimeException("null type");
+            }
+        }
     }
 
     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;
+        return javascriptName;
     }
-    public void setElementJavascriptName(String elementJavascriptName) {
-        this.elementJavascriptName = elementJavascriptName;
+    
+    public void setElementJavascriptName(String name) {
+        javascriptName = name;
     }
+
     public String getElementXmlName() {
-        return elementXmlName;
+        return xmlName;
     }
+
     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;
+        this.xmlName = elementXmlName;
     }
+
     public XmlSchemaType getContainingType() {
         return containingType;
     }
+
     public void setContainingType(XmlSchemaType containingType) {
         this.containingType = containingType;
     }
+
     public XmlSchemaType getType() {
         return type;
     }
+
     public void setType(XmlSchemaType type) {
         this.type = type;
     }
+
     public boolean isEmpty() {
         return empty;
     }
+
     public void setEmpty(boolean empty) {
         this.empty = empty;
     }
+
+    public long getMinOccurs() {
+        return minOccurs;
+    }
+
+    public long getMaxOccurs() {
+        return maxOccurs;
+    }
+
+    public boolean isArray() {
+        return maxOccurs > 1;
+    }
+    
+    public boolean isOptional() {
+        return minOccurs == 0 && maxOccurs == 1;
+    }
+
 }

Modified: incubator/cxf/trunk/rt/javascript/src/main/java/org/apache/cxf/javascript/JavascriptQueryHandler.java
URL: http://svn.apache.org/viewvc/incubator/cxf/trunk/rt/javascript/src/main/java/org/apache/cxf/javascript/JavascriptQueryHandler.java?rev=603120&r1=603119&r2=603120&view=diff
==============================================================================
--- incubator/cxf/trunk/rt/javascript/src/main/java/org/apache/cxf/javascript/JavascriptQueryHandler.java (original)
+++ incubator/cxf/trunk/rt/javascript/src/main/java/org/apache/cxf/javascript/JavascriptQueryHandler.java Mon Dec 10 18:15:31 2007
@@ -132,7 +132,7 @@
             try {
                 for (SchemaInfo schema : schemata) {
                     SchemaJavascriptBuilder builder = new SchemaJavascriptBuilder(serviceInfo
-                        .getXmlSchemaCollection(), prefixManager, nameManager, schema);
+                        .getXmlSchemaCollection(), prefixManager, nameManager);
                     String allThatJavascript = builder.generateCodeForSchema(schema);
                     writer.append(allThatJavascript);
                 }

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=603120&r1=603119&r2=603120&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 Mon Dec 10 18:15:31 2007
@@ -27,14 +27,15 @@
 
 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;
 
 /**
- * 
+ * A set of functions that assist in JavaScript generation. This includes functions
+ * for appending strings of JavaScript to a buffer as well as some type utilities.
  */
 public class JavascriptUtils {
     private static final String NL = "\n";
@@ -191,25 +192,14 @@
         return token;
     }
     
-    public void generateCodeToSerializeElement(ElementInfo elementInfo) {
-        XmlSchemaElement element = elementInfo.getElement();
+    public void generateCodeToSerializeElement(ElementInfo elementInfo,
+                                               SchemaCollection schemaCollection) {
         XmlSchemaType type = elementInfo.getType();
-        boolean nillable = element == null || elementInfo.getElement().isNillable();
-        boolean optional = element == null || XmlSchemaUtils.isParticleOptional(elementInfo.getElement());
-        boolean array = element != null && XmlSchemaUtils.isParticleArray(elementInfo.getElement());
-        
-        XmlSchemaType elType = type;
-        // perhaps push this up into the callers.
-        if (elType == null) {
-            XmlSchemaUtils.getElementType(elementInfo.getXmlSchemaCollection(),
-                                          elementInfo.getReferencingURI(),
-                                          elementInfo.getElement(), 
-                                          elementInfo.getContainingType());
-            if (elType == null) {
-                throw new UnsupportedConstruct("Null type");
-            }
-        }
-
+        boolean nillable = elementInfo.getElement() != null 
+            && elementInfo.getElement().isNillable();
+        boolean optional = elementInfo.isOptional();
+        boolean array = elementInfo.isArray();
+        
         // first question: optional?
         if (optional) {
             startIf(elementInfo.getElementJavascriptName() + " != null");
@@ -241,13 +231,13 @@
         }
         
         // now for the thing itself.
-        if (elType instanceof XmlSchemaComplexType) {
+        if (type instanceof XmlSchemaComplexType) {
             // it has a value
             appendExpression(elementInfo.getElementJavascriptName() + ".serialize(" 
                              + elementInfo.getUtilsVarName() + ", '" 
                              + elementInfo.getElementXmlName() + "')");
         } else { // simple type
-            QName typeName = elType.getQName();
+            QName typeName = type.getQName();
             appendString("<" + elementInfo.getElementXmlName() + ">");
             // warning: this assumes that ordinary Javascript serialization is all we need.
             // except for &gt; ad all of that.

Modified: incubator/cxf/trunk/rt/javascript/src/main/java/org/apache/cxf/javascript/Messages.properties
URL: http://svn.apache.org/viewvc/incubator/cxf/trunk/rt/javascript/src/main/java/org/apache/cxf/javascript/Messages.properties?rev=603120&r1=603119&r2=603120&view=diff
==============================================================================
--- incubator/cxf/trunk/rt/javascript/src/main/java/org/apache/cxf/javascript/Messages.properties (original)
+++ incubator/cxf/trunk/rt/javascript/src/main/java/org/apache/cxf/javascript/Messages.properties Mon Dec 10 18:15:31 2007
@@ -22,7 +22,7 @@
 NULL_PARTICLE=JavaScript limitation: Type {0} has no particle. {1} 
 NON_ELEMENT_CHILD=JavaScript limitation: Non-Element sequence member {0} of {1}. {2}
 ABSTRACT_ELEMENT=JavaScript limitation: Abstract element {0} of {1}. {2}
-ELEMENT_HAS_NO_TYPE= Element {0} has no type in the schema. {1}
-ELEMENT_TYPE_MISSING= Element {0} references type {1} which is not defined.
-
+ELEMENT_HAS_NO_TYPE=Element {0} has no type in the schema. {1}
+ELEMENT_TYPE_MISSING=Element {0} references type {1} which is not defined.
+ELEMENT_SCHEMA_MISSING=Element {0} contained in missing schema.
 

Modified: incubator/cxf/trunk/rt/javascript/src/main/java/org/apache/cxf/javascript/NamespacePrefixAccumulator.java
URL: http://svn.apache.org/viewvc/incubator/cxf/trunk/rt/javascript/src/main/java/org/apache/cxf/javascript/NamespacePrefixAccumulator.java?rev=603120&r1=603119&r2=603120&view=diff
==============================================================================
--- incubator/cxf/trunk/rt/javascript/src/main/java/org/apache/cxf/javascript/NamespacePrefixAccumulator.java (original)
+++ incubator/cxf/trunk/rt/javascript/src/main/java/org/apache/cxf/javascript/NamespacePrefixAccumulator.java Mon Dec 10 18:15:31 2007
@@ -27,7 +27,6 @@
 import javax.xml.namespace.QName;
 
 import org.apache.cxf.common.xmlschema.SchemaCollection;
-import org.apache.cxf.service.model.SchemaInfo;
 import org.apache.ws.commons.schema.XmlSchemaElement;
 
 public class NamespacePrefixAccumulator {
@@ -76,24 +75,19 @@
     
     /**
      * This function obtains a name, perhaps namespace-qualified, for an element.
-     * It also maintains a Map that records all the prefixes used in the course
-     * of working on a single serializer function (and thus a single complex-type-element
-     * XML element) which is used for namespace prefix management.
-     * @param element
-     * @param namespaceMap
+     * @param element the element.
+     * @param qualified whether to qualify.
      * @return
      */
-    public String xmlElementString(SchemaInfo schemaInfo, XmlSchemaElement element) {
-        String namespaceURI = XmlSchemaUtils.getElementQualifier(schemaInfo, element);
-        if ("".equals(namespaceURI)) {
-            return element.getName(); // use the non-qualified name.
-        } else {
+    public String xmlElementString(XmlSchemaElement element, boolean qualified) {
+        if (qualified) {
             // What if there were a prefix in the element's qname? This is not apparently 
             // something that happens in this environment.
-            String prefix = getPrefix(namespaceURI);
-            collect(prefix, namespaceURI);
+            String prefix = getPrefix(element.getQName().getNamespaceURI());
+            collect(prefix, element.getQName().getNamespaceURI());
             return prefix + ":" + element.getName();
         }
+        return element.getName(); // use the non-qualified name.
     }
     
     public String xmlElementString(QName name) { // used with part concrete names

Modified: incubator/cxf/trunk/rt/javascript/src/main/java/org/apache/cxf/javascript/XmlSchemaUtils.java
URL: http://svn.apache.org/viewvc/incubator/cxf/trunk/rt/javascript/src/main/java/org/apache/cxf/javascript/XmlSchemaUtils.java?rev=603120&r1=603119&r2=603120&view=diff
==============================================================================
--- incubator/cxf/trunk/rt/javascript/src/main/java/org/apache/cxf/javascript/XmlSchemaUtils.java (original)
+++ incubator/cxf/trunk/rt/javascript/src/main/java/org/apache/cxf/javascript/XmlSchemaUtils.java Mon Dec 10 18:15:31 2007
@@ -26,8 +26,8 @@
 import org.apache.cxf.common.i18n.Message;
 import org.apache.cxf.common.logging.LogUtils;
 import org.apache.cxf.common.xmlschema.SchemaCollection;
-import org.apache.cxf.service.model.SchemaInfo;
 import org.apache.cxf.wsdl.WSDLConstants;
+import org.apache.ws.commons.schema.XmlSchema;
 import org.apache.ws.commons.schema.XmlSchemaComplexType;
 import org.apache.ws.commons.schema.XmlSchemaElement;
 import org.apache.ws.commons.schema.XmlSchemaForm;
@@ -167,40 +167,54 @@
         return type instanceof XmlSchemaComplexType;
     }
     
-    public static boolean isElementNameQualified(XmlSchemaElement element, SchemaInfo schemaInfo) {
+    public static boolean isElementNameQualified(XmlSchemaElement element, XmlSchema schema) {
+        if (element.getRefName() != null) {
+            throw new RuntimeException("isElementNameQualified on element with ref=");
+        }
         if (element.getForm().equals(QUALIFIED)) {
             return true;
         }
         if (element.getForm().equals(UNQUALIFIED)) {
             return false;
         }
-        return schemaInfo.getSchema().getElementFormDefault().equals(QUALIFIED);
+        return schema.getElementFormDefault().equals(QUALIFIED);
     }
     
     /**
-     * Return an empty string if this element should be unqualified in XML
-     * or the namespace URI if it should be qualified. 
-     * @param element
-     * @return
+     * due to a bug, feature, or just plain oddity of JAXB, it isn't good enough to just check the 
+     * for of an element and of its schema. If schema 'a' (default unqualified) has a complex type
+     * with an element with a ref= to schema (b) (default unqualified), JAXB seems to expect to
+     * see a qualifier, anyway.
+     * <br/>
+     * So, if the element is local to a complex type, all we care about is the default element form of the
+     * schema and the local form of the element.
+     * <br/>
+     * If, on the other hand, the element is global, we might need to compare namespaces. 
+     * <br/>
+     * @param element the element.
+     * @param global if this element is a global element (complex type ref= to it, or in a part)
+     * @param localSchema the schema of the complex type containing the reference, 
+     * only used for the 'odd case'.
+     * @param elementSchema the schema for the element.
+     * @return if the element needs to be qualified.
      */
-    public static String getElementQualifier(SchemaInfo schemaInfo, XmlSchemaElement element) {
-        QName qname;
-        boolean forceQualification = false;
-        // JAXB ends up with no form='qualified', but we qualify anyway if the namespace don't
-        // match.
+    public static boolean isElementQualified(XmlSchemaElement element,
+                                             boolean global,
+                                             XmlSchema localSchema,
+                                             XmlSchema elementSchema) {
+        if (element.getQName() == null) {
+            throw new RuntimeException("getSchemaQualifier on anonymous element.");
+        }
         if (element.getRefName() != null) {
-            qname = element.getRefName();
-            forceQualification = !qname.getNamespaceURI().equals(schemaInfo.getNamespaceURI());
-        } else {
-            qname = element.getQName();
+            throw new RuntimeException("getSchemaQualified on the 'from' side of ref=.");
         }
-        // some elements don't have qnames, only local names.
-        // one hopes that we aren't called upon to produce a qualified form for such an element, though
-        // perhaps we're supposed to pull the TNS out of a hat.
-        if (forceQualification || isElementNameQualified(element, schemaInfo)) {
-            return qname.getNamespaceURI();
+            
+
+        if (global) {
+            return isElementNameQualified(element, elementSchema)
+                || !(element.getQName().getNamespaceURI().equals(localSchema.getTargetNamespace()));
         } else {
-            return "";
+            return isElementNameQualified(element, elementSchema);
         }
     }
     

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=603120&r1=603119&r2=603120&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 Mon Dec 10 18:15:31 2007
@@ -74,7 +74,6 @@
     private Set<MessageInfo> inputMessagesWithNameConflicts;
     private Set<MessageInfo> outputMessagesWithNameConflicts;
     private SchemaCollection xmlSchemaCollection;
-    private String serviceTargetNamespace;
     
     private boolean isWrapped;
     // facts about the wrapper when there is one.
@@ -149,8 +148,6 @@
         utils.appendLine("this._onsuccess = null;");
         utils.appendLine("this._onerror = null;");
         code.append("}\n\n");
-
-        serviceTargetNamespace = serviceInfo.getTargetNamespace();
     }
 
     private String getFunctionGlobalName(QName itemName, String itemType) {
@@ -439,8 +436,8 @@
             + "_serializeInput";
 
         code.append("function " + serializerFunctionGlobalName + "(cxfutils, args) {\n");
-        String wrapperXmlElementName = null; 
 
+        String wrapperXmlElementName = null; 
         // for the wrapped case, we can name the object for Javascript after whatever we like.
         // we could use the wrapped part, or we could use a conventional name.
         if (isWrapped) {
@@ -469,17 +466,14 @@
         utils.setXmlStringAccumulator("xml");
         
         if (isWrapped) {
-            ElementInfo elementInfo = new ElementInfo();
+            ElementInfo elementInfo = ElementInfo.forPartElement(inputWrapperElement,
+                                                                 xmlSchemaCollection,
+                                                                 "wrapperObj",
+                                                                 wrapperXmlElementName);
+
             elementInfo.setContainingType(null);
-            elementInfo.setElement(inputWrapperElement);
-            elementInfo.setType(inputWrapperElement.getSchemaType());
-            elementInfo.setElementJavascriptName("wrapperObj");
-            elementInfo.setElementXmlName(wrapperXmlElementName);
-            elementInfo.setReferencingURI(serviceTargetNamespace);
             elementInfo.setUtilsVarName("cxfutils");
-            elementInfo.setXmlSchemaCollection(xmlSchemaCollection);
-
-            utils.generateCodeToSerializeElement(elementInfo);
+            utils.generateCodeToSerializeElement(elementInfo, xmlSchemaCollection);
         } else {
             String operationXmlElement = null;
             if (isRPC) {
@@ -501,16 +495,14 @@
             // (though if the same sort of thing happens elsewhere due to an XmlRootElement,
             // the JavaScript programmer is stuck with the situation). 
             for (ElementInfo ean : unwrappedElementsAndNames) {
-                ElementInfo elementInfo = new ElementInfo();
+                ElementInfo elementInfo = ElementInfo.forPartElement(ean.getElement(),
+                                                                     xmlSchemaCollection,
+                                                                     "args[" + px + "]",
+                                                                     ean.getElementXmlName());
                 elementInfo.setContainingType(null);
-                elementInfo.setElement(ean.getElement());
                 elementInfo.setType(ean.getType());
-                elementInfo.setElementJavascriptName("args[" + px + "]");
-                elementInfo.setElementXmlName(ean.getElementXmlName());
-                elementInfo.setReferencingURI(serviceTargetNamespace);
                 elementInfo.setUtilsVarName("cxfutils");
-                elementInfo.setXmlSchemaCollection(xmlSchemaCollection);
-                utils.generateCodeToSerializeElement(elementInfo);
+                utils.generateCodeToSerializeElement(elementInfo, xmlSchemaCollection);
                 px++;
             }
             if (isRPC) {
@@ -609,14 +601,21 @@
                         element.setSchemaType(xmlSchemaCollection
                                                   .getTypeByQName(element.getSchemaTypeName()));
                     }
+                    type = element.getSchemaType();
                 }
             }
             
             String partJavascriptVar = 
                 JavascriptUtils.javaScriptNameToken(mpi.getConcreteName().getLocalPart());
             String elementXmlRef = prefixAccumulator.xmlElementString(mpi.getConcreteName());
-
-            elements.add(new ElementInfo(element, type, partJavascriptVar, elementXmlRef, empty));
+            ElementInfo elementInfo = ElementInfo.forPartElement(element,
+                                                                 xmlSchemaCollection,
+                                                                 partJavascriptVar, 
+                                                                 elementXmlRef);        
+            // the type may have been recalculated above.
+            elementInfo.setType(type);
+            elementInfo.setEmpty(empty);
+            elements.add(elementInfo);
         }
     }
     

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=603120&r1=603119&r2=603120&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 Mon Dec 10 18:15:31 2007
@@ -35,6 +35,7 @@
 import org.apache.cxf.javascript.UnsupportedConstruct;
 import org.apache.cxf.javascript.XmlSchemaUtils;
 import org.apache.cxf.service.model.SchemaInfo;
+import org.apache.ws.commons.schema.XmlSchema;
 import org.apache.ws.commons.schema.XmlSchemaComplexType;
 import org.apache.ws.commons.schema.XmlSchemaElement;
 import org.apache.ws.commons.schema.XmlSchemaObject;
@@ -55,20 +56,19 @@
     
     private SchemaCollection xmlSchemaCollection;
     private NameManager nameManager;
-    private SchemaInfo schemaInfo;
     private NamespacePrefixAccumulator prefixAccumulator;
+    private SchemaInfo schemaInfo;
     
     public SchemaJavascriptBuilder(SchemaCollection schemaCollection,
                                    NamespacePrefixAccumulator prefixAccumulator,
-                                   NameManager nameManager, 
-                                   SchemaInfo schemaInfo) {
+                                   NameManager nameManager) {
         this.xmlSchemaCollection = schemaCollection;
         this.nameManager = nameManager;
-        this.schemaInfo = schemaInfo;
         this.prefixAccumulator = prefixAccumulator;
     }
     
     public String generateCodeForSchema(SchemaInfo schema) {
+        schemaInfo = schema;
         StringBuffer code = new StringBuffer();
         code.append("//\n");
         code.append("// Definitions for schema: " + schema.getNamespaceURI());
@@ -273,36 +273,19 @@
 
         // XML Schema, please meet Iterable (not).
         for (int i = 0; i < sequence.getItems().getCount(); i++) {
-            XmlSchemaElement elChild = (XmlSchemaElement)sequence.getItems().getItem(i);
-            if (elChild.isAbstract()) {
-                XmlSchemaUtils.unsupportedConstruct("ABSTRACT_ELEMENT", elChild.getName(), type);
+            XmlSchemaElement sequenceElement = (XmlSchemaElement)sequence.getItems().getItem(i);
+            if (sequenceElement.isAbstract()) {
+                XmlSchemaUtils.unsupportedConstruct("ABSTRACT_ELEMENT", sequenceElement.getName(), type);
             }
             
-            // assume that no lunatic has created multiple elements that differ only by namespace.
-            // or, perhaps, detect that when generating the parser?
-            if (elChild.getRefName() != null) {
-                XmlSchemaElement refElement = xmlSchemaCollection.getElementByQName(elChild.getRefName());
-                if (refElement == null) {
-                    Message message = new Message("ELEMENT_DANGLING_REFERENCE", LOG,
-                                                  elChild.getQName(),
-                                                  elChild.getRefName());
-                    throw new UnsupportedConstruct(message.toString());
-                }
-                elChild = refElement;
-            }
-            String elementName = elementPrefix + elChild.getName();
-            String elementXmlRef = prefixAccumulator.xmlElementString(schemaInfo, elChild);
-            
-            ElementInfo elementInfo = new ElementInfo();
+            ElementInfo elementInfo = ElementInfo.forLocalElement(sequenceElement, 
+                                                                  elementPrefix, 
+                                                                  schemaInfo.getSchema(),
+                                                                  xmlSchemaCollection, 
+                                                                  prefixAccumulator);
             elementInfo.setContainingType(type);
-            elementInfo.setElement(elChild);
-            elementInfo.setElementJavascriptName(elementName);
-            elementInfo.setElementXmlName(elementXmlRef);
-            elementInfo.setReferencingURI(null);
             elementInfo.setUtilsVarName("cxfjsutils");
-            elementInfo.setXmlSchemaCollection(xmlSchemaCollection);
-            elementInfo.setType(elChild.getSchemaType());
-            utils.generateCodeToSerializeElement(elementInfo);
+            utils.generateCodeToSerializeElement(elementInfo, xmlSchemaCollection);
         }
     }
     /**
@@ -344,27 +327,56 @@
                                                     thing.getClass().getSimpleName(), type);
             }
             
-            XmlSchemaElement elChild = (XmlSchemaElement)thing;
-            XmlSchemaType elType = XmlSchemaUtils.getElementType(xmlSchemaCollection, null, elChild, type);
+            boolean global = false;
+            XmlSchemaElement sequenceElement = (XmlSchemaElement)thing;
+            XmlSchemaElement realElement = sequenceElement;
+            
+            if (sequenceElement.getRefName() != null) {
+                XmlSchemaElement refElement = 
+                    xmlSchemaCollection.getElementByQName(sequenceElement.getRefName());
+                if (refElement == null) {
+                    throw new RuntimeException("Dangling reference");
+                }
+                realElement = refElement;
+                global = true;
+            }
+            
+            XmlSchemaType elType = XmlSchemaUtils.getElementType(xmlSchemaCollection, 
+                                                                 null, realElement, type);
             boolean simple = elType instanceof XmlSchemaSimpleType;
 
-            String accessorName = "set" + StringUtils.capitalize(elChild.getName()); 
+            String accessorName = "set" + StringUtils.capitalize(realElement.getName()); 
             // For optional or an array, we need to check if the element is the 
             // one we want.
             
-            String elementName = elChild.getName();
+            String elementName = realElement.getName();
             utils.appendLine("cxfjsutils.trace('processing " + elementName + "');");
-            String elementNamespaceURI = XmlSchemaUtils.getElementQualifier(schemaInfo, elChild);
+            String elementNamespaceURI = realElement.getQName().getNamespaceURI();
+            boolean elementNoNamespace = "".equals(elementNamespaceURI);
+            XmlSchema elementSchema = null;
+            if (!elementNoNamespace) {
+                elementSchema = xmlSchemaCollection.getSchemaByTargetNamespace(elementNamespaceURI);
+            }
+            boolean qualified = !elementNoNamespace
+                && XmlSchemaUtils.isElementQualified(realElement, 
+                                                  global, 
+                                                  schemaInfo.getSchema(),
+                                                  elementSchema);
             
+            if (!qualified) {
+                elementNamespaceURI = "";
+            }
+                
             String valueTarget = "item";
 
-            if (XmlSchemaUtils.isParticleOptional(elChild) || XmlSchemaUtils.isParticleArray(elChild)) {
+            if (XmlSchemaUtils.isParticleOptional(sequenceElement) 
+                || XmlSchemaUtils.isParticleArray(sequenceElement)) {
                 utils.startIf("curElement != null && cxfjsutils.isNodeNamedNS(curElement, '" 
                               + elementNamespaceURI 
                               + "', '" 
                               + elementName
                               + "')");
-                if (XmlSchemaUtils.isParticleArray(elChild)) {
+                if (XmlSchemaUtils.isParticleArray(sequenceElement)) {
                     utils.appendLine("item = [];");
                     utils.startDo();
                     valueTarget = "arrayItem";
@@ -387,21 +399,22 @@
             }
              
             utils.endBlock(); // the if for the nil.
-            if (XmlSchemaUtils.isParticleArray(elChild)) {
+            if (XmlSchemaUtils.isParticleArray(sequenceElement)) {
                 utils.appendLine("item.push(arrayItem);");
                 utils.appendLine("curElement = cxfjsutils.getNextElementSibling(curElement);");
                 utils.endBlock();
                 utils.appendLine("  while(curElement != null && cxfjsutils.isNodeNamedNS(curElement, '" 
                                   + elementNamespaceURI + "', '" 
-                                  + elChild.getName() + "'));");
+                                  + sequenceElement.getName() + "'));");
             }
             utils.appendLine("newobject." + accessorName + "(item);");
-            if (!XmlSchemaUtils.isParticleArray(elChild)) {
+            if (!XmlSchemaUtils.isParticleArray(sequenceElement)) {
                 utils.startIf("curElement != null");
                 utils.appendLine("curElement = cxfjsutils.getNextElementSibling(curElement);");
                 utils.endBlock();
             }
-            if (XmlSchemaUtils.isParticleOptional(elChild) || XmlSchemaUtils.isParticleArray(elChild)) {
+            if (XmlSchemaUtils.isParticleOptional(sequenceElement) 
+                || XmlSchemaUtils.isParticleArray(sequenceElement)) {
                 utils.endBlock();
             }
         }

Modified: incubator/cxf/trunk/rt/javascript/src/test/java/org/apache/cxf/javascript/DocLitBareClientTest.java
URL: http://svn.apache.org/viewvc/incubator/cxf/trunk/rt/javascript/src/test/java/org/apache/cxf/javascript/DocLitBareClientTest.java?rev=603120&r1=603119&r2=603120&view=diff
==============================================================================
--- incubator/cxf/trunk/rt/javascript/src/test/java/org/apache/cxf/javascript/DocLitBareClientTest.java (original)
+++ incubator/cxf/trunk/rt/javascript/src/test/java/org/apache/cxf/javascript/DocLitBareClientTest.java Mon Dec 10 18:15:31 2007
@@ -215,7 +215,6 @@
         return null;
     }
     
-    @org.junit.Ignore
     @Test
     public void callFunctionWithBeans() {
         LOG.info("about to call beanFunctionTest");
@@ -226,7 +225,6 @@
         });
     }
 
-    @org.junit.Ignore
     @Test
     public void callCompliant() {
         LOG.info("about to call compliant");

Modified: incubator/cxf/trunk/rt/javascript/src/test/java/org/apache/cxf/javascript/JavascriptTestUtilities.java
URL: http://svn.apache.org/viewvc/incubator/cxf/trunk/rt/javascript/src/test/java/org/apache/cxf/javascript/JavascriptTestUtilities.java?rev=603120&r1=603119&r2=603120&view=diff
==============================================================================
--- incubator/cxf/trunk/rt/javascript/src/test/java/org/apache/cxf/javascript/JavascriptTestUtilities.java (original)
+++ incubator/cxf/trunk/rt/javascript/src/test/java/org/apache/cxf/javascript/JavascriptTestUtilities.java Mon Dec 10 18:15:31 2007
@@ -354,7 +354,7 @@
             .getXmlSchemaCollection());
         for (SchemaInfo schema : schemata) {
             SchemaJavascriptBuilder builder = new SchemaJavascriptBuilder(serviceInfo
-                .getXmlSchemaCollection(), prefixManager, nameManager, schema);
+                .getXmlSchemaCollection(), prefixManager, nameManager);
             String allThatJavascript = builder.generateCodeForSchema(schema);
             readStringIntoRhino(allThatJavascript, schema.toString() + ".js");
         }

Modified: incubator/cxf/trunk/rt/javascript/src/test/java/org/apache/cxf/javascript/QueryHandlerTest.java
URL: http://svn.apache.org/viewvc/incubator/cxf/trunk/rt/javascript/src/test/java/org/apache/cxf/javascript/QueryHandlerTest.java?rev=603120&r1=603119&r2=603120&view=diff
==============================================================================
--- incubator/cxf/trunk/rt/javascript/src/test/java/org/apache/cxf/javascript/QueryHandlerTest.java (original)
+++ incubator/cxf/trunk/rt/javascript/src/test/java/org/apache/cxf/javascript/QueryHandlerTest.java Mon Dec 10 18:15:31 2007
@@ -94,7 +94,6 @@
         return js.toString();
     }
     
-    @org.junit.Ignore
     @Test
     public void hwQueryTest() throws Exception {
         URL endpointURL = new URL(hwEndpoint.getAddress()  + "?js");

Modified: incubator/cxf/trunk/rt/javascript/src/test/java/org/apache/cxf/javascript/types/SerializationTest.java
URL: http://svn.apache.org/viewvc/incubator/cxf/trunk/rt/javascript/src/test/java/org/apache/cxf/javascript/types/SerializationTest.java?rev=603120&r1=603119&r2=603120&view=diff
==============================================================================
--- incubator/cxf/trunk/rt/javascript/src/test/java/org/apache/cxf/javascript/types/SerializationTest.java (original)
+++ incubator/cxf/trunk/rt/javascript/src/test/java/org/apache/cxf/javascript/types/SerializationTest.java Mon Dec 10 18:15:31 2007
@@ -120,7 +120,6 @@
     }
 
     @Test
-    @org.junit.Ignore
     public void testSerialization() throws Exception {
         setupClientAndRhino("simple-dlwu-proxy-factory");
 
@@ -202,7 +201,7 @@
             new NamespacePrefixAccumulator(serviceInfo.getXmlSchemaCollection());
         for (SchemaInfo schema : schemata) {
             SchemaJavascriptBuilder builder = new SchemaJavascriptBuilder(serviceInfo
-                .getXmlSchemaCollection(), prefixAccumulator, nameManager, schema);
+                .getXmlSchemaCollection(), prefixAccumulator, nameManager);
             String allThatJavascript = builder.generateCodeForSchema(schema);
             assertNotNull(allThatJavascript);
             testUtilities.readStringIntoRhino(allThatJavascript, schema.toString() + ".js");

Modified: incubator/cxf/trunk/tools/wsdlto/frontend/javascript/src/main/java/org/apache/cxf/tools/wsdlto/javascript/WSDLToJavaScriptProcessor.java
URL: http://svn.apache.org/viewvc/incubator/cxf/trunk/tools/wsdlto/frontend/javascript/src/main/java/org/apache/cxf/tools/wsdlto/javascript/WSDLToJavaScriptProcessor.java?rev=603120&r1=603119&r2=603120&view=diff
==============================================================================
--- incubator/cxf/trunk/tools/wsdlto/frontend/javascript/src/main/java/org/apache/cxf/tools/wsdlto/javascript/WSDLToJavaScriptProcessor.java (original)
+++ incubator/cxf/trunk/tools/wsdlto/frontend/javascript/src/main/java/org/apache/cxf/tools/wsdlto/javascript/WSDLToJavaScriptProcessor.java Mon Dec 10 18:15:31 2007
@@ -66,8 +66,9 @@
             BufferedWriter writer = new BufferedWriter(outputStreamWriter);
                 
             for (SchemaInfo schema : schemata) {
-                SchemaJavascriptBuilder jsBuilder = new SchemaJavascriptBuilder(serviceInfo
-                    .getXmlSchemaCollection(), prefixManager, nameManager, schema);
+                SchemaJavascriptBuilder jsBuilder = 
+                    new SchemaJavascriptBuilder(serviceInfo
+                    .getXmlSchemaCollection(), prefixManager, nameManager);
                 String allThatJavascript = jsBuilder.generateCodeForSchema(schema);
                 writer.append(allThatJavascript);
             }