[
http://jira.codehaus.org/browse/XFIRE-866?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel#action_94046
]
Swati Achar commented on XFIRE-866:
-----------------------------------
As a workaround ( if you dont wish to change XFire code ) :
This works for me :
//ServiceImpl
public XMLStreamReader echo( MessageContext pMessageContext )
{
return pMessageContext.getInMessage().getXMLStreamReader();
}
Cheers,
Swati
> The MessageBinding solution incorrectly advances the cursor of
> XMLStreamReader message during the client/server XFire transport.
> --------------------------------------------------------------------------------------------------------------------------------
>
> Key: XFIRE-866
> URL: http://jira.codehaus.org/browse/XFIRE-866
> Project: XFire
> Issue Type: Bug
> Components: Core
> Affects Versions: 1.2.3
> Reporter: Scott Seixas
> Assignee: Dan Diephouse
>
> I am developing a solution using XFire that uses MessageBinding to transport
> the entire XML input from the XFire client to my defined service as an
> XMLStreamReader object. However, during the transport of this
> XMLStreamReader object the parser's cursor is incorrectly advanced.
> To clarify the issue further, consider the below implementation:
> //ServiceImpl
> public XMLStreamReader echo( XMLStreamReader reader )
> {
> return reader;
> }
> //Client Program
> AnnotationServiceFactory factory = new AnnotationServiceFactory(new
> Jsr181WebAnnotations(), xfire.getTransportManager(), new
> MessageBindingProvider());
> factory.setStyle("message");
> Service test = factory.create(TestService.class);
> URL u = new URL("http://localhost/test.xml");
> InputStream in = u.openStream();
> XMLStreamReader parser = STAXUtils.createXMLStreamReader( in , null, null );
> XFireProxyFactory serviceFactory = new XFireProxyFactory();
> TestService service = (TestService) serviceFactory.create( test,
> "http://localhost/services/TestService");
> XMLStreamReader output = service.echo( parser );
> In this example if the test.xml input document originally looked like
> <A><B><C><D></D></C></B></A>
> Then the XML output would look like
> <C><D></D></C>
> (i.e. the cursor is currently pointing to <C>)
> This occurs because the XMLStreamReader message advances its cursor one
> element during the SOAPBodyHandler on the XFire server side prior to calling
> the service and again on the XFire client side prior to returning back to the
> client program.
> The desired behavior is that the XMLStreamReader input/output should not have
> its cursor advance past the root element of the original document during the
> transport of this stream. Thus, the output XMLStreamReader object should
> have its cursor on the root element <A> and not on <C>.
> The errant logic is in the loop on the bottom of the readMessage method in
> the org.codehaus.xfire.service.binding.MessageBinding class. The code in
> this loop is implemented as seen below:
> //Errant Logic
> for ( Iterator itr = msg.getMessageParts().iterator(); itr.hasNext(); )
> {
> MessagePartInfo p = (MessagePartInfo) itr.next();
> params.add( service.getBindingProvider().readParameter(p,
> message.getXMLStreamReader(), context) );
> nextEvent(message.getXMLStreamReader());
> }
> When p is a XMLStreamReader type then the readParameter method simply returns
> the XMLStreamReader object of the message. Thus, the params list contains a
> reference to the message's XMLStreamReader object. However, the next line of
> code advances the cursor of the message's XMLStreamReader which advances the
> object reference in the params list.
> This advances seems to be unnecessary because there is only one message part
> to iterate through.
> I have fixed this locally (see below) by modifying the logic to advance the
> cursor of the message only if there exist a next message part. If the loop
> is currently handling the last message part, then there is no reason to
> advance the cursor. Of course, since the MessageBinding approach is meant to
> treat the entire SOAP Body XML as a single input/output, you could also
> remove the loop and the nextEvent call all together and implement the logic
> under the assumption that the MessageBinding only has a single message body
> part.
> //My fix
> for (Iterator itr = msg.getMessageParts().iterator(); itr.hasNext(); )
> {
> MessagePartInfo p = (MessagePartInfo) itr.next();
> params.add( service.getBindingProvider().readParameter(p,
> message.getXMLStreamReader(), context) );
> if( itr.hasNext() ) nextEvent(message.getXMLStreamReader());
> }
> //Potential fix
> Iterator itr = msg.getMessageParts().iterator;
> MessagePartInfo p = (MessagePartInfo) itr.next();
> params.add( service.getBindingProvider().readParameter(p,
> message.getXMLStreamReader(), context) );
> if( itr.hasNext() ) throw new Exception( "Too many parameters for
> MessageBinding");
> The work to implement this fix is trivial, but the end result is quite
> powerful as it preserves the context of the XMLStreamReader object during
> transport when it is the input/output parameter of a MessageBinding
> implementation.
> Regards,
> Scott Seixas
> Software Engineer
> CA - Clarity Division, BSO (formerly Niku)
> 650.298.5923
> [EMAIL PROTECTED]
--
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators:
http://jira.codehaus.org/secure/Administrators.jspa
-
For more information on JIRA, see: http://www.atlassian.com/software/jira
---------------------------------------------------------------------
To unsubscribe from this list please visit:
http://xircles.codehaus.org/manage_email