axis-java-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "David Green-Lank (JIRA)" <j...@apache.org>
Subject [jira] [Issue Comment Edited] (AXIS2-5071) Failure to populate all members of an xs:sequence in a SOAP header
Date Fri, 10 Jun 2011 17:21:59 GMT

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

David Green-Lank edited comment on AXIS2-5071 at 6/10/11 5:21 PM:
------------------------------------------------------------------

After spending some time getting the AXIS source code and debugging this, I have narrowed
it down to the following code in Stub#addHeader():

        OMNode omNode = null;

        // add child elements
        for (Iterator iter = omElementToadd.getChildren(); iter.hasNext();){
             omNode = (OMNode) iter.next(); // after this line executes, iter.hasNext() returns
true (and unintentionally resolves the issue due to a side effect)
             soapHeaderBlock.addChild(omNode); // after this line executes, iter.hasNext()
returns false
        }

So adding the omNode to the SOAP header causes a side effect on the iterator, and the <password>
element is never added.

My guess is that when an omNode is added to a new parent, it's removed from the old parent,
and therefore, when the <username> element is added to the header, the <password>
element shifts to position #0, and therefore iter.hasNext() returns false since there is no
child at index 1 anymore. But that's just a guess, I didn't download the axiom source code.

The following replacement code resolves the issue:

        // add child elements. make a safe copy first, since adding the OMNode to the SOAP
envelope causes a side
        // effect on the iterator
        List<OMNode> nodesToAdd = new ArrayList<OMNode>();
        for (Iterator iter = omElementToadd.getChildren(); iter.hasNext();){
            OMNode omNode = (OMNode) iter.next();
            nodesToAdd.add( omNode );
        }
        for ( OMNode omNode : nodesToAdd ) {
            soapHeaderBlock.addChild( omNode );
        }


      was (Author: milliway@gmail.com):
    After spending some time getting the AXIS source code and debugging this, I have narrowed
it down to the following code in Stub#addHeader():

        OMNode omNode = null;

        // add child elements
        for (Iterator iter = omElementToadd.getChildren(); iter.hasNext();){
             omNode = (OMNode) iter.next(); // after this line executes, iter.hasNext() returns
true
             soapHeaderBlock.addChild(omNode); // after this line executes, iter.hasNext()
returns false
        }

So adding the omNode to the SOAP header causes a side effect on the iterator, and the <password>
element is never added.

My guess is that when an omNode is added to a new parent, it's removed from the old parent,
and therefore, when the <username> element is added to the header, the <password>
element shifts to position #0, and therefore iter.hasNext() returns false since there is no
child at index 1 anymore. But that's just a guess, I didn't download the axiom source code.

The following replacement code resolves the issue:

        // add child elements. make a safe copy first, since adding the OMNode to the SOAP
envelope causes a side
        // effect on the iterator
        List<OMNode> nodesToAdd = new ArrayList<OMNode>();
        for (Iterator iter = omElementToadd.getChildren(); iter.hasNext();){
            OMNode omNode = (OMNode) iter.next();
            nodesToAdd.add( omNode );
        }
        for ( OMNode omNode : nodesToAdd ) {
            soapHeaderBlock.addChild( omNode );
        }

  
> Failure to populate all members of an xs:sequence in a SOAP header
> ------------------------------------------------------------------
>
>                 Key: AXIS2-5071
>                 URL: https://issues.apache.org/jira/browse/AXIS2-5071
>             Project: Axis2
>          Issue Type: Bug
>    Affects Versions: 1.6.0
>         Environment: MacOSX Leopard, Apache AXIS 1.6.0, Java 1.6.0_24
>            Reporter: David Green-Lank
>         Attachments: Screen shot 2011-06-10 at 8.11.15 AM.png, mytest.wsdl
>
>
> There is a soap header declared in the wsdl that points to an element:
>       <xs:element name="authentication">
>         <xs:complexType>
>           <xs:sequence>
>             <xs:element name="username" type="xs:string"/>
>             <xs:element name="password" type="xs:string"/>
>           </xs:sequence>
>           <xs:anyAttribute namespace="##other"/>
>         </xs:complexType>
>       </xs:element>
> After running "sh wsdl2java.sh -uri <uri>" to create stubs, and I populate that
element with:
>     MyTestServiceStub stub = new MyTestServiceStub();
>     MyTestServiceStub.Authentication auth = new MyTestServiceStub.Authentication();
>     auth.setUsername( "username" );
>     auth.setPassword( "password" );
>     stub.operation( new MyTestServiceStub.Operation(), auth, null );
> The following SOAP envelope is sent:
> <?xml version='1.0' encoding='UTF-8'?><soapenv:Envelope xmlns:soapenv="http://www.w3.org/2003/05/soap-envelope"><soapenv:Header><ns1:authentication
xmlns:ns1="urn:mytest" soapenv:mustUnderstand="false"><ns1:username>username</ns1:username></ns1:authentication></soapenv:Header><soapenv:Body><ns1:operation
xmlns:ns1="urn:mytest" /></soapenv:Body></soapenv:Envelope>
> Notice the supplied password element is missing.
> Screenshot attached.

--
This message is automatically generated by JIRA.
For more information on JIRA, see: http://www.atlassian.com/software/jira

---------------------------------------------------------------------
To unsubscribe, e-mail: java-dev-unsubscribe@axis.apache.org
For additional commands, e-mail: java-dev-help@axis.apache.org


Mime
View raw message