On 9/5/07, ant elder <[EMAIL PROTECTED]> wrote:
>
> On 9/2/07, Simon Laws <[EMAIL PROTECTED]> wrote:
> >
> > On 8/31/07, Simon Laws <[EMAIL PROTECTED]> wrote:
> > >
> > >
> > >
> > > On 8/31/07, Raymond Feng <[EMAIL PROTECTED]> wrote:
> > > >
> > > > Hi,
> > > >
> > > > The operation.getInput() cannot be null to qualify for the wrapper
> > > > style.
> > > > There must be a part in the input message corresponding to the
> > operation
> > > > name:
> > > >
> > > > input
> > > >     --- message
> > > >         --- part (only one part)
> > > >                 --- element (the element name should be the same as
> > the
> > > > operation name)
> > > >
> > > > The element should look like this:
> > > >
> > > > <element name="myMethod">
> > > >     <complexType>
> > > >         <sequence/> <!-- an empty sequence -->
> > > >     </complexType>
> > > > </element>
> > > >
> > > > Thanks,
> > > > Raymond
> > > >
> > > > ----- Original Message -----
> > > > From: "Simon Laws" <[EMAIL PROTECTED]>
> > > > To: "tuscany-dev" <[email protected]>
> > > > Sent: Friday, August 31, 2007 10:34 AM
> > > > Subject: Wrapper style test in WSDL processing?
> > > >
> > > >
> > > > > There is a test to determine whether a WSDL operation follows the
> > > > > "wrapped"
> > > > > style in accordance with JAX-WS 2.0 spec.  See
> > > > > WSDLOperationIntrospectorImpl
> > > > > (
> > > > >
> > > >
> >
> http://svn.apache.org/repos/asf/incubator/tuscany/java/sca/modules/interface-wsdl/src/main/java/org/apache/tuscany/sca/interfacedef/wsdl/impl/WSDLOperationIntrospectorImpl.java
> > > > > )
> > > > >
> > > > > The code is currently
> > > > >
> > > > >    public boolean isWrapperStyle() throws InvalidWSDLException {
> > > > >        if (wrapperStyle == null) {
> > > > >            wrapperStyle =
> > > > >                wrapper.getInputChildElements() != null && (
> > > > > operation.getOutput() == null || wrapper
> > > > >                    .getOutputChildElements() != null);
> > > > >        }
> > > > >        return wrapperStyle;
> > > > >    }
> > > > >
> > > > > Which doesn't seem to cater for the case where there may be no
> input
> > > > > parameters. I'm diving into this code now to see if I can work out
> > > > what it
> > > > > means but if anyone has any insight I would appreciate it.
> > > > >
> > > > > Needless to say I have a scenario where I am trying to auto
> generate
> > > > WSDL
> > > > > for a method with the signature
> > > > >
> > > > > String myMethod()
> > > > >
> > > > > And it's complaining that it's not wrapped.
> > > > >
> > > > > Simon
> > > > >
> > > >
> > > >
> > > >
> ---------------------------------------------------------------------
> > > > To unsubscribe, e-mail: [EMAIL PROTECTED]
> > > > For additional commands, e-mail: [EMAIL PROTECTED]
> > > >
> > > > What you are saying sounds right to me, I.e. you can validly have no
> > > parameters in your method but in this case it should build an empty
> > sequence
> > >
> > >
> > > <element name="myMethod">
> > >     <complexType>
> > >         <sequence/> <!-- an empty sequence -->
> > >     </complexType>
> > > </element>
> > >
> > > And have this as the single input type. I'm deeper into the code now
> > > looking for why this isn't the case.
> > >
> > > Thanks Raymond
> > >
> > > Simon
> > >
> > I've done a bit more investigation now. For the signature
> >
> > String foo()
> >
> > Axis2 Java2WSDL generates
> >
> >     <wsdl:types>
> >         <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema";
> >             attributeFormDefault="qualified"
> > elementFormDefault="qualified"
> >             targetNamespace="http://test/xsd";>
> >             <xs:element name="fooResponse">
> >                 <xs:complexType>
> >                     <xs:sequence>
> >                         <xs:element name="return" nillable="true"
> >                             type="xs:string" />
> >                     </xs:sequence>
> >                 </xs:complexType>
> >             </xs:element>
> >         </xs:schema>
> >     </wsdl:types>
> >     <wsdl:message name="fooMessage" />
> >     <wsdl:message name="fooResponseMessage">
> >         <wsdl:part name="part1" element="ns:fooResponse" />
> >     </wsdl:message>
> >
> > So in our code when it comes to testing for wrapped it returns false
> > because
> > this doesn't match the algorithm that was presented earlier in this
> > thread,
> > i.e. there is no part of the input message corresponding to the message
> > name. So when you try this in Tuscany is throws an exception saying that
> > the
> > operation is not wrapped.
> >
> > It would be inconvenient for us to not support operations with no
> > parameters. As the wsdl generation process assumes that the target
> > operations will be generated as wrapped operations here's what I did..
> >
> > 1/ Changed the isWrapperStyle  test (in WSDLOperationIntrospectorImpl)
> to
> > read.
> >
> >     public boolean isWrapperStyle() throws InvalidWSDLException {
> >         if (wrapperStyle == null) {
> >             wrapperStyle =
> >                 (operation.getInput
> > ().getMessage().getParts().values().size()
> > == 0 ||wrapper.getInputChildElements() != null) &&
> >                 (operation.getOutput() == null ||
> > wrapper.getOutputChildElements() != null);
> >         }
> >         return wrapperStyle;
> >     }
> >
> > I.e. I'm letting it pass if there are no input parts at all which I
> > believe
> > is valid according the the JAX-WS 2.0 spec
> >
> > 2/ Fixed the getWrapperInfo method to take account of the case where
> there
> > are no input params
> >
> >                 if (in != null) {
> >                     for (XmlSchemaElement e : getInputChildElements()) {
> >                         inChildren.add(getElementInfo(e));
> >                     }
> >                 }
> >
> > 3/ Fixed the Axis2 binding to properly deal with the case when no
> > parameters
> > are present in Axis2ServiceInOutSyncMessageReceiver.
> >
> >     public void invokeBusinessLogic(MessageContext inMC, MessageContext
> > outMC) throws AxisFault {
> >         try {
> >             OMElement requestOM = inMC.getEnvelope
> > ().getBody().getFirstElement();
> >             Object[] args = null;
> >
> >             if (requestOM != null) {
> >                 args = new Object[] {requestOM};
> >             }
> >
> > The Axis2ServiceInMessageReceiver needs the same fix if we go with this.
> >
> > This works with the forward message relying on the soap action to
> > indentify
> > the correct operation.
> >
> > I haven't checked this in as the code seems to have been carefully
> crafted
> > to assume that there will always be an input parameter. Can someone
> > explain
> > why this is thought to be the case?
>
>
> If there's no objections very soon then how about just doing this fix for
> now so Tuscany tolerates the Axis2 way for now (and something similar for
> TUSCANY-1658)?
>
>    ...ant
>
I have the fix for the null parameter case sitting here on my pc so I'll
commit it later if no one shouts.

Simon

Reply via email to