[ 
https://issues.apache.org/jira/browse/CXF-2139?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12693571#action_12693571
 ] 

Juergen Kellerer edited comment on CXF-2139 at 3/29/09 8:49 AM:
----------------------------------------------------------------

.. was a bit to fast with the given HACK, simply using the method from the 
serializer code seems the fix the problem better, the solution I used before 
doesn't cover inheritance. However I'm still not sure if this causes any other 
side effects, it's just a quick HACK that does the trick for me.

public void domDeserializerFunction(QName name, XmlSchemaComplexType type) {
       utils = new JavascriptUtils(code);
       List<XmlSchemaObject> items = XmlSchemaUtils.getContentElements(type, 
xmlSchemaCollection);

       String typeObjectName = nameManager.getJavascriptName(name);
       code.append("function " + typeObjectName + "_deserialize (cxfjsutils, 
element) {\n");
       // create the object we are deserializing into.
       utils.appendLine("var newobject = new " + typeObjectName + "();");
       utils.appendLine("cxfjsutils.trace('element: ' + 
cxfjsutils.traceElementName(element));");
       utils.appendLine("var curElement = 
cxfjsutils.getFirstElementChild(element);");

       utils.appendLine("var item;");

       for (ListIterator<XmlSchemaObject> i = items.listIterator(); 
i.hasNext();) {
              utils.appendLine("cxfjsutils.trace('curElement: ' + 
cxfjsutils.traceElementName(curElement));");
              XmlSchemaObject thing = i.next();
              ParticleInfo itemInfo = ParticleInfo.forLocalItem(thing, 
schemaInfo.getSchema(),
                            xmlSchemaCollection, prefixAccumulator, 
type.getQName());
              if (itemInfo.isAny()) {
                     ParticleInfo nextItem = null;
                     if (i.hasNext()) {
                            XmlSchemaObject nextThing = i.next();
                            nextItem = ParticleInfo.forLocalItem(nextThing, 
schemaInfo.getSchema(),
                                          xmlSchemaCollection, 
prefixAccumulator, type.getQName());
                            // theoretically, you could have two anys with 
different
                            // namespaces.
                            if (nextItem.isAny()) {
                                      unsupportedConstruct("MULTIPLE_ANY", 
type.getQName());
                            }
                     }
                     deserializeAny(type, itemInfo, nextItem);
              } else {
                     deserializeElement(type, thing);
              }
       }
       utils.appendLine("return newobject;");
       code.append("}\n\n");
}

      was (Author: juergenk):
    .. was a bit to fast with the given HACK, simply using the method from the 
serializer code seems the fix the problem better, the solution I used before 
doesn't cover inheritance. However I'm still not sure if this causes any other 
side effects, it's just a quick HACK that does the trick for me.

public void domDeserializerFunction(QName name, XmlSchemaComplexType type) {
       utils = new JavascriptUtils(code);
       List<XmlSchemaObject> items = XmlSchemaUtils.getContentElements(type, 
xmlSchemaCollection);

       String typeObjectName = nameManager.getJavascriptName(name);
       code.append("function " + typeObjectName + "_deserialize (cxfjsutils, 
element) {\n");
       // create the object we are deserializing into.
       utils.appendLine("var newobject = new " + typeObjectName + "();");
       utils.appendLine("cxfjsutils.trace('element: ' + 
cxfjsutils.traceElementName(element));");
                utils.appendLine("var curElement = 
cxfjsutils.getFirstElementChild(element);");

       utils.appendLine("var item;");

       for (ListIterator<XmlSchemaObject> i = items.listIterator(); 
i.hasNext();) {
              utils.appendLine("cxfjsutils.trace('curElement: ' + 
cxfjsutils.traceElementName(curElement));");
              XmlSchemaObject thing = i.next();
              ParticleInfo itemInfo = ParticleInfo.forLocalItem(thing, 
schemaInfo.getSchema(),
                            xmlSchemaCollection, prefixAccumulator, 
type.getQName());
              if (itemInfo.isAny()) {
                     ParticleInfo nextItem = null;
                     if (i.hasNext()) {
                            XmlSchemaObject nextThing = i.next();
                            nextItem = ParticleInfo.forLocalItem(nextThing, 
schemaInfo.getSchema(),
                                          xmlSchemaCollection, 
prefixAccumulator, type.getQName());
                            // theoretically, you could have two anys with 
different
                            // namespaces.
                            if (nextItem.isAny()) {
                                      unsupportedConstruct("MULTIPLE_ANY", 
type.getQName());
                            }
                     }
                     deserializeAny(type, itemInfo, nextItem);
              } else {
                     deserializeElement(type, thing);
              }
       }
utils.appendLine("return newobject;");
code.append("}\n\n");
}
  
> Deserializer for complex types is not created inside the generated JavaScript 
> client code
> -----------------------------------------------------------------------------------------
>
>                 Key: CXF-2139
>                 URL: https://issues.apache.org/jira/browse/CXF-2139
>             Project: CXF
>          Issue Type: Bug
>          Components: JavaScript Client
>    Affects Versions: 2.1.4, 2.2
>         Environment: Java 1.6, ANT based build script
>            Reporter: Juergen Kellerer
>
> The JavaScript client code generator successfully creates serializers and 
> deserializers for first level soap requests and response objects. Serializing 
> code is also created for complex types but the deserializer code is not 
> created.
> Digging down the code it seems that the problem is in the class 
> "org.apache.cxf.javascript.types.SchemaJavascriptBuilder" the following HACK 
> made the JS client work correctly:
> ----
>     public void domDeserializerFunction(QName name, XmlSchemaComplexType 
> type) {
>         utils = new JavascriptUtils(code);
>         XmlSchemaSequence sequence = null;
>         sequence = XmlSchemaUtils.getSequence(type);
>         // HACK, use alternate way to get sequence
>         if (sequence.getItems().getCount() == 0) {
>                 XmlSchemaSequence s = XmlSchemaUtils.getContentSequence(type);
>                 if (s != null) {
>                         System.err.println("HACK-applied, generating 
> deserializer for " + name);
>                         sequence = s;
>                 }
>         }
>         // HACK-END, use alternate way to get sequence
>         String typeObjectName = nameManager.getJavascriptName(name);
> ---

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.

Reply via email to