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

Grzegorz Grzybek edited comment on CXF-5254 at 10/1/13 5:53 PM:
----------------------------------------------------------------

In {{cxf/testutils/src/main/resources/wsdl/type_test/type_test.xsd}} 
(not-generated resourece) there is:
{code:xml}
    <complexType name="CompoundArray">
        <sequence>
            <element maxOccurs="unbounded" minOccurs="0" name="array1"
                     type="string"/>
            <element maxOccurs="unbounded" minOccurs="0" name="array2"
                     type="string"/>
        </sequence>
    </complexType> 
{code}
which translates to the following JAXB class:
{code:java}
public class CompoundArray {

    @Generated(value = "com.sun.tools.xjc.Driver", date = 
"2013-10-01T06:40:47+02:00", comments = "JAXB RI v2.2.6")
    protected List<String> array1;
    @Generated(value = "com.sun.tools.xjc.Driver", date = 
"2013-10-01T06:40:47+02:00", comments = "JAXB RI v2.2.6")
    protected List<String> array2;
...
{code}

However from Juergen's IDL:
{code}
        typedef sequence<string> Strings; 
        typedef sequence<long> Longs;

        struct Deep { 
                long id;
                Strings s1;
        };
{code}
generated WSDL has:
{code:xml}
      <xs:complexType name="repro.Strings">
        <xs:sequence>
          <xs:element maxOccurs="unbounded" minOccurs="0" name="item" 
type="xs:string"/>
        </xs:sequence>
      </xs:complexType> 
...
      <xs:complexType name="repro.Deep">
        <xs:sequence>
          <xs:element name="id" type="xs:int"/>
          <xs:element name="s1" type="repro.Strings"/>
        </xs:sequence>
      </xs:complexType> 
{code}
and *not*:
{code:xml}
      <xs:complexType name="repro.Deep">
        <xs:sequence>
          <xs:element name="id" type="xs:int"/>
          <xs:element name="item" type="xs:string" minOccurs="0" 
maxOccurs="unbounded"/>
        </xs:sequence>
      </xs:complexType> 
{code}
and the resulting JAXB class is:
{code:java}
public class ReproDeep {

    protected int id;
    @XmlElement(required = true)
    protected ReproStrings s1;
{code}
that's why JAXB expects {{s1}} element and that's why I thought 
{{CorbaSequenceEventProducer}} would be better than 
{{CorbaPrimitiveSequenceEventProducer}}.

at runtime however (in {{if ((obj instanceof CorbaSequenceHandler) ...}} 
condition) I can't however distinguish between these two cases.

I don't think cxf-corbatools-maven-plugin should _unwrap_:
{code:xml}
<xs:element name="s1" type="repro.Strings"/>
{code}
into
{code:xml}
<xs:element name="item" type="xs:string" minOccurs="0" maxOccurs="unbounded"/>
{code}

When I've changed the generated {{org.apache.type_test.types1.CompoundArray}} 
(in {{cxf-testutils}}) from:
{code:java}
public class CompoundArray {

    @Generated(value = "com.sun.tools.xjc.Driver", date = 
"2013-10-01T06:40:47+02:00", comments = "JAXB RI v2.2.6")
    protected List<String> array1;
    @Generated(value = "com.sun.tools.xjc.Driver", date = 
"2013-10-01T06:40:47+02:00", comments = "JAXB RI v2.2.6")
    protected List<String> array2;
{code}
to:
{code:java}
public class CompoundArray {

    @Generated(value = "com.sun.tools.xjc.Driver", date = 
"2013-10-01T06:40:47+02:00", comments = "JAXB RI v2.2.6")
    @XmlElementWrapper(name = "array1")
    protected List<String> array1;
    @Generated(value = "com.sun.tools.xjc.Driver", date = 
"2013-10-01T06:40:47+02:00", comments = "JAXB RI v2.2.6")
    @XmlElementWrapper(name = "array2")
    protected List<String> array2;
{code}
(to simulate explicit complex types for CORBA sequences with 
{{@XmlElementWrapper}}), both CXF tests and Juergen's case worked fine.

Maybe just change {{CompoundArray}} complex type in 
{{/cxf-testutils/src/main/resources/wsdl/type_test/type_test.xsd}}, so it 
refers to explicitely defined complexTypes for both sequences? It doesn't seem 
to be generated after all...

regards
Grzegorz Grzybek


was (Author: gzres):
In {{cxf/testutils/src/main/resources/wsdl/type_test/type_test.xsd}} 
(not-generated resourece) there is:
{code:xml}
    <complexType name="CompoundArray">
        <sequence>
            <element maxOccurs="unbounded" minOccurs="0" name="array1"
                     type="string"/>
            <element maxOccurs="unbounded" minOccurs="0" name="array2"
                     type="string"/>
        </sequence>
    </complexType> 
{code}
which translates to the following JAXB class:
{code:java}
public class CompoundArray {

    @Generated(value = "com.sun.tools.xjc.Driver", date = 
"2013-10-01T06:40:47+02:00", comments = "JAXB RI v2.2.6")
    protected List<String> array1;
    @Generated(value = "com.sun.tools.xjc.Driver", date = 
"2013-10-01T06:40:47+02:00", comments = "JAXB RI v2.2.6")
    protected List<String> array2;
...
{code}

However from Juergen's IDL:
{code}
        typedef sequence<string> Strings; 
        typedef sequence<long> Longs;

        struct Deep { 
                long id;
                Strings s1;
        };
{code}
generated WSDL has:
{code:xml}
      <xs:complexType name="repro.Strings">
        <xs:sequence>
          <xs:element maxOccurs="unbounded" minOccurs="0" name="item" 
type="xs:string"/>
        </xs:sequence>
      </xs:complexType> 
...
      <xs:complexType name="repro.Deep">
        <xs:sequence>
          <xs:element name="id" type="xs:int"/>
          <xs:element name="s1" type="repro.Strings"/>
        </xs:sequence>
      </xs:complexType> 
{code}
and *not*:
{code:xml}
      <xs:complexType name="repro.Deep">
        <xs:sequence>
          <xs:element name="id" type="xs:int"/>
          <xs:element name="item" type="xs:string" minOccurs="0" 
maxOccurs="unbounded"/>
        </xs:sequence>
      </xs:complexType> 
{code}
and the resulting JAXB class is:
{code:java}
public class ReproDeep {

    protected int id;
    @XmlElement(required = true)
    protected ReproStrings s1;
{code}
that's why JAXB expects {{s1}} element and that's why I thought 
{{CorbaSequenceEventProducer}} would be better than 
{{CorbaPrimitiveSequenceEventProducer}}.

at runtime however (in {{if ((obj instanceof CorbaSequenceHandler) ...}} 
condition) I can't however distinguish between these two cases.

I don't think cxf-corbatools-maven-plugin should _unwrap_:
{code:xml}
<xs:element name="s1" type="repro.Strings"/>
{code}
into
{code:xml}
<xs:element name="item" type="xs:string" minOccurs="0" maxOccurs="unbounded"/>
{code}

When I've changed the generated {{org.apache.type_test.types1.CompoundArray}} 
(in {{cxf-testutils}}) from:
{code:java}
public class CompoundArray {

    @Generated(value = "com.sun.tools.xjc.Driver", date = 
"2013-10-01T06:40:47+02:00", comments = "JAXB RI v2.2.6")
    protected List<String> array1;
    @Generated(value = "com.sun.tools.xjc.Driver", date = 
"2013-10-01T06:40:47+02:00", comments = "JAXB RI v2.2.6")
    protected List<String> array2;
{code}
to:
{code:java}
public class CompoundArray {

    @Generated(value = "com.sun.tools.xjc.Driver", date = 
"2013-10-01T06:40:47+02:00", comments = "JAXB RI v2.2.6")
    @XmlElementWrapper(name = "array1")
    protected List<String> array1;
    @Generated(value = "com.sun.tools.xjc.Driver", date = 
"2013-10-01T06:40:47+02:00", comments = "JAXB RI v2.2.6")
    @XmlElementWrapper(name = "array2")
    protected List<String> array2;
{code}
(to simulate explicit complex types for CORBA sequences with 
{{@XmlElementWrapper}}), both CXF tests and Juergen's case worked fine.

Maybe just change {{CompoundArray}} complex type in 
{{/cxf-testutils/src/main/resources/wsdl/type_test/type_test.xsd}}, so it 
refers to explicitely defined complexTypes for both sequences? Tt doesn't seem 
to be generated after all...

regards
Grzegorz Grzybek

> Unmarshall exception if a sequence<string> is used in a struct.
> ---------------------------------------------------------------
>
>                 Key: CXF-5254
>                 URL: https://issues.apache.org/jira/browse/CXF-5254
>             Project: CXF
>          Issue Type: Bug
>          Components: CORBA Binding
>    Affects Versions: 2.7.5, 2.7.6
>         Environment: JAVA7 / Windows 7
>            Reporter: Juergen Bockhorn
>            Priority: Blocker
>         Attachments: CorbaBugRepro.zip
>
>
> A server function returns a struct. This struct contains another struct which 
> contains a sequence<string>. Calling this method with a CXF/Corba-Client 
> leads to an unmarshall exception:
> {code}
> Warnung: Interceptor for 
> {http://cxf.apache.org/bindings/corba/idl/repro}repro.ServiceCORBAService#{http://cxf.apache.org/bindings/corba/idl/repro}getFirst
>  has thrown exception, unwinding now
> org.apache.cxf.interceptor.Fault: Unmarshalling Error: unerwartetes Element 
> (URI:"", lokal:"item"). Erwartete Elemente sind 
> <{http://cxf.apache.org/bindings/corba/idl/repro}id>,<{http://cxf.apache.org/bindings/corba/idl/repro}s1>
>  
>       at 
> org.apache.cxf.jaxb.JAXBEncoderDecoder.unmarshall(JAXBEncoderDecoder.java:808)
>       at 
> org.apache.cxf.jaxb.JAXBEncoderDecoder.unmarshall(JAXBEncoderDecoder.java:629)
>       at org.apache.cxf.jaxb.io.DataReaderImpl.read(DataReaderImpl.java:157)
>       at 
> org.apache.cxf.interceptor.BareInInterceptor.handleMessage(BareInInterceptor.java:138)
> ...
> {code}
> (sorry for german).
> Using a pure CORBA-client works.
> I will attach a repro project to this issue if I have figured out how it 
> works :-)



--
This message was sent by Atlassian JIRA
(v6.1#6144)

Reply via email to