You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tuscany.apache.org by Simon Laws <si...@googlemail.com> on 2008/12/16 15:20:56 UTC

[1.x] Wrapped interface problem

Anyone know why the WSDL generator produces wrapper elements that seem to be
nillable by default, e.g.

<xs:schema targetNamespace="http://www.example.org/CreditCardPayment/"
version="1.0">
<xs:element name="authorize" nillable="true" type="tns:AuthorizeType"/>
<xs:element name="authorizeResponse" nillable="true"
type="tns:AuthorizeResponseType"/>
−
<xs:complexType name="CreditCardDetailsType">
−
<xs:sequence>
<xs:element minOccurs="0" name="CreditCardType"
type="tns:CreditCardTypeType"/>
<xs:element minOccurs="0" name="CreditCardNumber" type="xs:string"/>
<xs:element minOccurs="0" name="ExpMonth" type="xs:int"/>
<xs:element minOccurs="0" name="ExpYear" type="xs:int"/>
<xs:element minOccurs="0" name="CardOwner" type="tns:PayerType"/>
<xs:element minOccurs="0" name="CVV2" type="xs:string"/>
</xs:sequence>

I've bee struggling with this for a while and in my particular case this is
a top down scenario and hence the java interface is originally generated
from WSDL using wsimport. The java interface has some JAXWS annotations but
looks OK to me.

public interface CreditCardPayment {
    /**
     *
     * @param amount
     * @param creditCard
     * @return
     *     returns java.lang.String
     */
    @WebMethod(action = "http://www.example.org/CreditCardPayment/authorize
")
    @WebResult(name = "Status", targetNamespace = "")
    @RequestWrapper(localName = "authorize", targetNamespace = "
http://www.example.org/CreditCardPayment/", className =
"payment.creditcard.AuthorizeType")
    @ResponseWrapper(localName = "authorizeResponse", targetNamespace = "
http://www.example.org/CreditCardPayment/", className =
"payment.creditcard.AuthorizeResponseType")
    public String authorize(
        @WebParam(name = "CreditCard", targetNamespace = "")
        CreditCardDetailsType creditCard,
        @WebParam(name = "Amount", targetNamespace = "")
        float amount);
}

When this gets pulled back into tuscany the wrapper element has a nillable
XML element. I assuming because the XMLType class defaults it to "true"

public class XMLType {
    public static final XMLType UNKNOWN = new XMLType(null, null);
    protected QName element;
    protected QName type;
    protected boolean nillable = true;
    protected boolean many = false;

Anyone know why?

Am still trying to trace this through the actual generation to see if it
gets set anywhere.

Regards

Simon

Re: [1.x] Wrapped interface problem

Posted by Raymond Feng <en...@gmail.com>.
Thank you for trying it out. I agree with you that it's probably a  
JAXB-RI bug. I suggest that we open a bug on java.net.

Sent from my iPod

On Dec 17, 2008, at 9:06 PM, "Scott Kurz" <sc...@gmail.com> wrote:

> Simon,
>
> I was able to recreate this outside of Tuscany using a Java 6 JRE  
> with a call to JAXBContext.generateSchemas().
>
> (I only borrowed from Tuscany the JAXBTypeHelper$DOMResolver which I  
> don't think matters... but the exact way the SchemaOutputResolver is  
> used seems a bit odd).
>
> Anyway my wrapper elements were created with nillable="true", though  
> the JAXB spec says the default should be false as far as I can tell  
> (plus that's what we started with in the original XSD).
>
> Apparently wsgen is doing something more than simply relying on this  
> generateSchemas() method.. I wonder if this is a bug in the JAXB RI?
>
> Scott

Re: [1.x] Wrapped interface problem

Posted by Scott Kurz <sc...@gmail.com>.
Simon,

I was able to recreate this outside of Tuscany using a Java 6 JRE with a
call to JAXBContext.generateSchemas().

(I only borrowed from Tuscany the JAXBTypeHelper$DOMResolver which I don't
think matters... but the exact way the SchemaOutputResolver is used seems a
bit odd).

Anyway my wrapper elements were created with nillable="true", though the
JAXB spec says the default should be false as far as I can tell (plus that's
what we started with in the original XSD).

Apparently wsgen is doing something more than simply relying on this
generateSchemas() method.. I wonder if this is a bug in the JAXB RI?

Scott

Re: [1.x] Wrapped interface problem

Posted by Simon Laws <si...@googlemail.com>.
On Tue, Dec 16, 2008 at 6:11 PM, Simon Laws <si...@googlemail.com>wrote:

>
>
> On Tue, Dec 16, 2008 at 6:01 PM, Simon Laws <si...@googlemail.com>wrote:
>
>>
>>
>> On Tue, Dec 16, 2008 at 4:54 PM, Raymond Feng <en...@gmail.com>wrote:
>>
>>> You are right. Method
>>> org.apache.tuscany.sca.binding.ws.wsdlgen.Interface2WSDLGenerator.generate(Interface,
>>> WSDLDefinition)
>>> line 395:
>>>
>>> if (element.isNillable()) {
>>>   xsElement.setAttribute("nillable", "true");
>>> }
>>>
>>> We need to set the wrapper element nillable to false after line 389.
>>>
>>> Thanks,
>>> Raymond
>>>
>>>
>>> From: Simon Laws
>>> Sent: Tuesday, December 16, 2008 6:20 AM
>>> To: tuscany-dev
>>> Subject: [1.x] Wrapped interface problem
>>>
>>>
>>>
>>> Anyone know why the WSDL generator produces wrapper elements that seem to
>>> be nillable by default, e.g.
>>>
>>> <xs:schema targetNamespace="http://www.example.org/CreditCardPayment/"
>>> version="1.0">
>>> <xs:element name="authorize" nillable="true" type="tns:AuthorizeType"/>
>>> <xs:element name="authorizeResponse" nillable="true"
>>> type="tns:AuthorizeResponseType"/>
>>> −
>>> <xs:complexType name="CreditCardDetailsType">
>>> −
>>> <xs:sequence>
>>> <xs:element minOccurs="0" name="CreditCardType"
>>> type="tns:CreditCardTypeType"/>
>>> <xs:element minOccurs="0" name="CreditCardNumber" type="xs:string"/>
>>> <xs:element minOccurs="0" name="ExpMonth" type="xs:int"/>
>>> <xs:element minOccurs="0" name="ExpYear" type="xs:int"/>
>>> <xs:element minOccurs="0" name="CardOwner" type="tns:PayerType"/>
>>> <xs:element minOccurs="0" name="CVV2" type="xs:string"/>
>>> </xs:sequence>
>>>
>>> I've bee struggling with this for a while and in my particular case this
>>> is a top down scenario and hence the java interface is originally generated
>>> from WSDL using wsimport. The java interface has some JAXWS annotations but
>>> looks OK to me.
>>>
>>> public interface CreditCardPayment {
>>>   /**
>>>    *
>>>    * @param amount
>>>    * @param creditCard
>>>    * @return
>>>    *     returns java.lang.String
>>>    */
>>>   @WebMethod(action = "
>>> http://www.example.org/CreditCardPayment/authorize")
>>>   @WebResult(name = "Status", targetNamespace = "")
>>>   @RequestWrapper(localName = "authorize", targetNamespace = "
>>> http://www.example.org/CreditCardPayment/", className =
>>> "payment.creditcard.AuthorizeType")
>>>   @ResponseWrapper(localName = "authorizeResponse", targetNamespace = "
>>> http://www.example.org/CreditCardPayment/", className =
>>> "payment.creditcard.AuthorizeResponseType")
>>>   public String authorize(
>>>       @WebParam(name = "CreditCard", targetNamespace = "")
>>>       CreditCardDetailsType creditCard,
>>>       @WebParam(name = "Amount", targetNamespace = "")
>>>       float amount);
>>> }
>>>
>>> When this gets pulled back into tuscany the wrapper element has a
>>> nillable XML element. I assuming because the XMLType class defaults it to
>>> "true"
>>>
>>> public class XMLType {
>>>   public static final XMLType UNKNOWN = new XMLType(null, null);
>>>   protected QName element;
>>>   protected QName type;
>>>   protected boolean nillable = true;
>>>   protected boolean many = false;
>>>
>>> Anyone know why?
>>>
>>> Am still trying to trace this through the actual generation to see if it
>>> gets set anywhere.
>>>
>>> Regards
>>>
>>> Simon
>>>
>>
>> I agree that that does look wrong but I have a feeling that the problem is
>> a little more involved than that. Debugging through the code it doesn't seem
>> to reach this line as the wrapper type in question is already part of the
>> JAXB context cache. When the JAXB context is constructed it's given a
>> package name and it seems that the context uses this to populate itself.
>> Hence it has already pulled in the types before we get to the Tuscany code
>> that generated the wrapper type manually. Anyhow that's how it's looking
>> just now but I still need to look some more.
>>
>> Simon
>>
>
> Another update...
>
> Roundtripping through wsgen works OK and produces wrapper elements without
> the nillable flag set so it must be something in our code.
>
> <xs:schema version="1.0" targetNamespace="http://creditcard.payment/"
> xmlns:tns="http://creditcard.payment/" xmlns:xs="
> http://www.w3.org/2001/XMLSchema" xmlns:ns1="
> http://www.example.org/CreditCardPayment/">
>
>   <xs:import namespace="http://www.example.org/CreditCardPayment/"
> schemaLocation="CreditCardPaymentWSImplService_schema1.xsd"/>
>
>   <xs:element name="authorize" type="tns:authorize"/>
>
>   <xs:element name="authorizeResponse" type="tns:authorizeResponse"/>
>
>   <xs:complexType name="authorize">
>     <xs:sequence>
>       <xs:element name="arg0" type="ns1:CreditCardDetailsType"
> minOccurs="0"/>
>       <xs:element name="arg1" type="xs:float"/>
>     </xs:sequence>
>   </xs:complexType>
>
>   <xs:complexType name="authorizeResponse">
>     <xs:sequence>
>       <xs:element name="return" type="xs:string" minOccurs="0"/>
>     </xs:sequence>
>   </xs:complexType>
> </xs:schema>
>
> I did confirm that that it doesn't pass through the code that Raymond
> pointed to in this case.
>
> Simon
>

As far as I can tell the nillable flags are being set by default by the JAXB
context when it reads in the classes associated with package
payment.creditcard. It then subsequently writes them out when asked to
serialize the schema. I have raised TUSCANY-2757 to track this problem.

Simon

Re: [1.x] Wrapped interface problem

Posted by Simon Laws <si...@googlemail.com>.
On Tue, Dec 16, 2008 at 6:01 PM, Simon Laws <si...@googlemail.com>wrote:

>
>
> On Tue, Dec 16, 2008 at 4:54 PM, Raymond Feng <en...@gmail.com> wrote:
>
>> You are right. Method
>> org.apache.tuscany.sca.binding.ws.wsdlgen.Interface2WSDLGenerator.generate(Interface,
>> WSDLDefinition)
>> line 395:
>>
>> if (element.isNillable()) {
>>   xsElement.setAttribute("nillable", "true");
>> }
>>
>> We need to set the wrapper element nillable to false after line 389.
>>
>> Thanks,
>> Raymond
>>
>>
>> From: Simon Laws
>> Sent: Tuesday, December 16, 2008 6:20 AM
>> To: tuscany-dev
>> Subject: [1.x] Wrapped interface problem
>>
>>
>>
>> Anyone know why the WSDL generator produces wrapper elements that seem to
>> be nillable by default, e.g.
>>
>> <xs:schema targetNamespace="http://www.example.org/CreditCardPayment/"
>> version="1.0">
>> <xs:element name="authorize" nillable="true" type="tns:AuthorizeType"/>
>> <xs:element name="authorizeResponse" nillable="true"
>> type="tns:AuthorizeResponseType"/>
>> −
>> <xs:complexType name="CreditCardDetailsType">
>> −
>> <xs:sequence>
>> <xs:element minOccurs="0" name="CreditCardType"
>> type="tns:CreditCardTypeType"/>
>> <xs:element minOccurs="0" name="CreditCardNumber" type="xs:string"/>
>> <xs:element minOccurs="0" name="ExpMonth" type="xs:int"/>
>> <xs:element minOccurs="0" name="ExpYear" type="xs:int"/>
>> <xs:element minOccurs="0" name="CardOwner" type="tns:PayerType"/>
>> <xs:element minOccurs="0" name="CVV2" type="xs:string"/>
>> </xs:sequence>
>>
>> I've bee struggling with this for a while and in my particular case this
>> is a top down scenario and hence the java interface is originally generated
>> from WSDL using wsimport. The java interface has some JAXWS annotations but
>> looks OK to me.
>>
>> public interface CreditCardPayment {
>>   /**
>>    *
>>    * @param amount
>>    * @param creditCard
>>    * @return
>>    *     returns java.lang.String
>>    */
>>   @WebMethod(action = "http://www.example.org/CreditCardPayment/authorize
>> ")
>>   @WebResult(name = "Status", targetNamespace = "")
>>   @RequestWrapper(localName = "authorize", targetNamespace = "
>> http://www.example.org/CreditCardPayment/", className =
>> "payment.creditcard.AuthorizeType")
>>   @ResponseWrapper(localName = "authorizeResponse", targetNamespace = "
>> http://www.example.org/CreditCardPayment/", className =
>> "payment.creditcard.AuthorizeResponseType")
>>   public String authorize(
>>       @WebParam(name = "CreditCard", targetNamespace = "")
>>       CreditCardDetailsType creditCard,
>>       @WebParam(name = "Amount", targetNamespace = "")
>>       float amount);
>> }
>>
>> When this gets pulled back into tuscany the wrapper element has a nillable
>> XML element. I assuming because the XMLType class defaults it to "true"
>>
>> public class XMLType {
>>   public static final XMLType UNKNOWN = new XMLType(null, null);
>>   protected QName element;
>>   protected QName type;
>>   protected boolean nillable = true;
>>   protected boolean many = false;
>>
>> Anyone know why?
>>
>> Am still trying to trace this through the actual generation to see if it
>> gets set anywhere.
>>
>> Regards
>>
>> Simon
>>
>
> I agree that that does look wrong but I have a feeling that the problem is
> a little more involved than that. Debugging through the code it doesn't seem
> to reach this line as the wrapper type in question is already part of the
> JAXB context cache. When the JAXB context is constructed it's given a
> package name and it seems that the context uses this to populate itself.
> Hence it has already pulled in the types before we get to the Tuscany code
> that generated the wrapper type manually. Anyhow that's how it's looking
> just now but I still need to look some more.
>
> Simon
>

Another update...

Roundtripping through wsgen works OK and produces wrapper elements without
the nillable flag set so it must be something in our code.

<xs:schema version="1.0" targetNamespace="http://creditcard.payment/"
xmlns:tns="http://creditcard.payment/" xmlns:xs="
http://www.w3.org/2001/XMLSchema" xmlns:ns1="
http://www.example.org/CreditCardPayment/">

  <xs:import namespace="http://www.example.org/CreditCardPayment/"
schemaLocation="CreditCardPaymentWSImplService_schema1.xsd"/>

  <xs:element name="authorize" type="tns:authorize"/>

  <xs:element name="authorizeResponse" type="tns:authorizeResponse"/>

  <xs:complexType name="authorize">
    <xs:sequence>
      <xs:element name="arg0" type="ns1:CreditCardDetailsType"
minOccurs="0"/>
      <xs:element name="arg1" type="xs:float"/>
    </xs:sequence>
  </xs:complexType>

  <xs:complexType name="authorizeResponse">
    <xs:sequence>
      <xs:element name="return" type="xs:string" minOccurs="0"/>
    </xs:sequence>
  </xs:complexType>
</xs:schema>

I did confirm that that it doesn't pass through the code that Raymond
pointed to in this case.

Simon

Re: [1.x] Wrapped interface problem

Posted by Simon Laws <si...@googlemail.com>.
On Tue, Dec 16, 2008 at 4:54 PM, Raymond Feng <en...@gmail.com> wrote:

> You are right. Method
> org.apache.tuscany.sca.binding.ws.wsdlgen.Interface2WSDLGenerator.generate(Interface,
> WSDLDefinition)
> line 395:
>
> if (element.isNillable()) {
>   xsElement.setAttribute("nillable", "true");
> }
>
> We need to set the wrapper element nillable to false after line 389.
>
> Thanks,
> Raymond
>
>
> From: Simon Laws
> Sent: Tuesday, December 16, 2008 6:20 AM
> To: tuscany-dev
> Subject: [1.x] Wrapped interface problem
>
>
>
> Anyone know why the WSDL generator produces wrapper elements that seem to
> be nillable by default, e.g.
>
> <xs:schema targetNamespace="http://www.example.org/CreditCardPayment/"
> version="1.0">
> <xs:element name="authorize" nillable="true" type="tns:AuthorizeType"/>
> <xs:element name="authorizeResponse" nillable="true"
> type="tns:AuthorizeResponseType"/>
> −
> <xs:complexType name="CreditCardDetailsType">
> −
> <xs:sequence>
> <xs:element minOccurs="0" name="CreditCardType"
> type="tns:CreditCardTypeType"/>
> <xs:element minOccurs="0" name="CreditCardNumber" type="xs:string"/>
> <xs:element minOccurs="0" name="ExpMonth" type="xs:int"/>
> <xs:element minOccurs="0" name="ExpYear" type="xs:int"/>
> <xs:element minOccurs="0" name="CardOwner" type="tns:PayerType"/>
> <xs:element minOccurs="0" name="CVV2" type="xs:string"/>
> </xs:sequence>
>
> I've bee struggling with this for a while and in my particular case this is
> a top down scenario and hence the java interface is originally generated
> from WSDL using wsimport. The java interface has some JAXWS annotations but
> looks OK to me.
>
> public interface CreditCardPayment {
>   /**
>    *
>    * @param amount
>    * @param creditCard
>    * @return
>    *     returns java.lang.String
>    */
>   @WebMethod(action = "http://www.example.org/CreditCardPayment/authorize
> ")
>   @WebResult(name = "Status", targetNamespace = "")
>   @RequestWrapper(localName = "authorize", targetNamespace = "
> http://www.example.org/CreditCardPayment/", className =
> "payment.creditcard.AuthorizeType")
>   @ResponseWrapper(localName = "authorizeResponse", targetNamespace = "
> http://www.example.org/CreditCardPayment/", className =
> "payment.creditcard.AuthorizeResponseType")
>   public String authorize(
>       @WebParam(name = "CreditCard", targetNamespace = "")
>       CreditCardDetailsType creditCard,
>       @WebParam(name = "Amount", targetNamespace = "")
>       float amount);
> }
>
> When this gets pulled back into tuscany the wrapper element has a nillable
> XML element. I assuming because the XMLType class defaults it to "true"
>
> public class XMLType {
>   public static final XMLType UNKNOWN = new XMLType(null, null);
>   protected QName element;
>   protected QName type;
>   protected boolean nillable = true;
>   protected boolean many = false;
>
> Anyone know why?
>
> Am still trying to trace this through the actual generation to see if it
> gets set anywhere.
>
> Regards
>
> Simon
>

I agree that that does look wrong but I have a feeling that the problem is a
little more involved than that. Debugging through the code it doesn't seem
to reach this line as the wrapper type in question is already part of the
JAXB context cache. When the JAXB context is constructed it's given a
package name and it seems that the context uses this to populate itself.
Hence it has already pulled in the types before we get to the Tuscany code
that generated the wrapper type manually. Anyhow that's how it's looking
just now but I still need to look some more.

Simon

Re: [1.x] Wrapped interface problem

Posted by Raymond Feng <en...@gmail.com>.
You are right. Method 
org.apache.tuscany.sca.binding.ws.wsdlgen.Interface2WSDLGenerator.generate(Interface, 
WSDLDefinition)
line 395:

if (element.isNillable()) {
    xsElement.setAttribute("nillable", "true");
}

We need to set the wrapper element nillable to false after line 389.

Thanks,
Raymond


From: Simon Laws
Sent: Tuesday, December 16, 2008 6:20 AM
To: tuscany-dev
Subject: [1.x] Wrapped interface problem


Anyone know why the WSDL generator produces wrapper elements that seem to be 
nillable by default, e.g.

<xs:schema targetNamespace="http://www.example.org/CreditCardPayment/" 
version="1.0">
<xs:element name="authorize" nillable="true" type="tns:AuthorizeType"/>
<xs:element name="authorizeResponse" nillable="true" 
type="tns:AuthorizeResponseType"/>
−
<xs:complexType name="CreditCardDetailsType">
−
<xs:sequence>
<xs:element minOccurs="0" name="CreditCardType" 
type="tns:CreditCardTypeType"/>
<xs:element minOccurs="0" name="CreditCardNumber" type="xs:string"/>
<xs:element minOccurs="0" name="ExpMonth" type="xs:int"/>
<xs:element minOccurs="0" name="ExpYear" type="xs:int"/>
<xs:element minOccurs="0" name="CardOwner" type="tns:PayerType"/>
<xs:element minOccurs="0" name="CVV2" type="xs:string"/>
</xs:sequence>

I've bee struggling with this for a while and in my particular case this is 
a top down scenario and hence the java interface is originally generated 
from WSDL using wsimport. The java interface has some JAXWS annotations but 
looks OK to me.

public interface CreditCardPayment {
    /**
     *
     * @param amount
     * @param creditCard
     * @return
     *     returns java.lang.String
     */
    @WebMethod(action = 
"http://www.example.org/CreditCardPayment/authorize")
    @WebResult(name = "Status", targetNamespace = "")
    @RequestWrapper(localName = "authorize", targetNamespace = 
"http://www.example.org/CreditCardPayment/", className = 
"payment.creditcard.AuthorizeType")
    @ResponseWrapper(localName = "authorizeResponse", targetNamespace = 
"http://www.example.org/CreditCardPayment/", className = 
"payment.creditcard.AuthorizeResponseType")
    public String authorize(
        @WebParam(name = "CreditCard", targetNamespace = "")
        CreditCardDetailsType creditCard,
        @WebParam(name = "Amount", targetNamespace = "")
        float amount);
}

When this gets pulled back into tuscany the wrapper element has a nillable 
XML element. I assuming because the XMLType class defaults it to "true"

public class XMLType {
    public static final XMLType UNKNOWN = new XMLType(null, null);
    protected QName element;
    protected QName type;
    protected boolean nillable = true;
    protected boolean many = false;

Anyone know why?

Am still trying to trace this through the actual generation to see if it 
gets set anywhere.

Regards

Simon