Not all added header elements are included in outgoing SOAP header unless run 
under debugger - bug in OMElement caching?
------------------------------------------------------------------------------------------------------------------------

                 Key: AXIS2-928
                 URL: http://issues.apache.org/jira/browse/AXIS2-928
             Project: Apache Axis 2.0 (Axis2)
          Issue Type: Bug
          Components: client-api
    Affects Versions: 1.0
            Reporter: Derek Foster
            Priority: Critical


Hi, folks.

I have two custom headers, CARSLogin and CARSPassword, that are declared and 
used in my WSDL like so:

   <types>
      <xs:schema targetNamespace="http://www.c-corp.com/wsdl/2004-10-01/f";>
         <xs:import namespace="http://www.dummy-temp-address"; 
schemaLocation="F.xsd"/>
         <xs:element name="return" type="xs:string"/>
         <xs:element name="failure" type="xs:string"/>
      </xs:schema>
      <xs:schema targetNamespace="http://www.c-corp.com/wsdl/2004-10-01/C";>
         <xs:element name="CPassword" type="xs:string"/>
         <xs:element name="CLogin" type="xs:string"/>
      </xs:schema>
   </types>

   <message name="FEvent">
      <part name="contents" element="f:full-event-update"/>
   </message>

   <message name="FResponse">
      <part name="return" element="tns:return"/>
   </message>

   <message name="CPassword">
      <part name="CPassword" element="C:CPassword"/>
   </message>

   <message name="CLogin">
      <part name="CLogin" element="C:CLogin"/>
   </message>

   <message name="Failure">
      <part name="faultDetail" element="tns:failure"/>
   </message>

   <portType name="FPortType">
      <documentation>F Port Type</documentation>

      <operation name="acceptFEvent" parameterOrder="contents">
         <input name="acceptFEventRequest" message="tns:FEvent"/>
         <output name="acceptFEventResponse" message="tns:FResponse"/>
         <fault name="Failure" message="tns:Failure"/>
      </operation>

   </portType>

   <binding name="FSoapBinding" type="tns:FPortType">
      <documentation>F Soap Binding</documentation>
      <soap:binding style="document" 
transport="http://schemas.xmlsoap.org/soap/http"/>

      <operation name="acceptFEvent">
         <soap:operation soapAction="acceptFEventAction"/>
         <input>
            <soap:header message="tns:CLogin" part="CLogin" use="literal"/>
            <soap:header message="tns:CPassword" part="CPassword" 
use="literal"/>
            <soap:body use="literal"/>
         </input>
         <output>
            <soap:body use="literal"/>
         </output>
         <fault name="Failure">
            <soap:fault name="Failure" use="literal"/>
         </fault>
      </operation>
   </binding>

Now, when I use WSDL2Java to generate XMLBeans Java code for these, and try to 
write a client that will send a message in this format, I write something like 
this:

      final CLoginDocument login = CLoginDocument.Factory.newInstance();
      login.setCLogin( "testlogin" );
      final CPasswordDocument password = 
CPasswordDocument.Factory.newInstance();
      password.setCPassword( "testpassword" );
      final FServiceStub service = new FServiceStub( null, targetEndpoint );
      final FullEventUpdateDocument fullEventUpdate = 
FullEventUpdateDocument.Factory.newInstance();
      fullEventUpdate.setFullEventUpdate( getSituation() );
      return service.acceptFEvent( fullEventUpdate, login, password );

This seems reasonable, and mostly works. Except that when I look at the SOAP 
output using TCPMon, the SOAP header that is included in the outgoing SOAP 
message contains the CLogin element as expected, but totally omits the 
CPassword element (!). I can find no reason for this. Both were passed to the 
stub, and both are non-null, so both should be included in the output.

When I step through the code in the stub using a debugger, however, then the 
code seems to correctly generate the header including both the login and 
password, as I would expect. So this is a stereotypical "heisenbug" as per the 
Jargon File: everything works fine when I run it under the debugger and watch 
what is happening, but it fails when run normally.

My theory is that the debugger is calling toString() on various items such as 
the SOAP envelope which is constructed to contain both the CLogin and CHeader 
elements. I suspect that calling toString() in this fashion forces the 
underlying OMElements to cache the results of parsing the XML, and that when it 
comes time to generate the SOAP message for output, reading from this cache 
works differently from parsing the header elements directly somehow.

Regardless, this seems like a pretty serious bug in Axis2: If I add multiple 
header elements to a message, I expect that they all should be included in the 
outgoing SOAP message, but that is not happening unless I run the program under 
a debugger. The fact that this is nondeterministic hints at a caching or 
multithreading bug at some level within the Axis architecture, which is quite 
worrisome, since the process of formatting and sending a SOAP message should be 
completely deterministic and repeatable.

Derek


-- 
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators: 
http://issues.apache.org/jira/secure/Administrators.jspa
-
For more information on JIRA, see: http://www.atlassian.com/software/jira

        

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to