Jeff, I haven't gone through the entire discussion, but the problem might be linked to http://issues.apache.org/jira/browse/AXIS-1469 See if it helps.
Thanks, Ashutosh -----Original Message----- From: Jeff Saremi [mailto:[EMAIL PROTECTED] Sent: Monday, April 25, 2005 8:47 PM To: axis-user@ws.apache.org Subject: Re: communication between the Handler and the Service It did not make any difference. or I don't how when and where to call it. I called saveChanges() after the modifications to the body but the Service still printed the old body xml. jeff --- Jeff Saremi <[EMAIL PROTECTED]> wrote: > I think I used that one too. But let me give it > another try and get back to you. > jeff > > > > > --- Jeff Greif <[EMAIL PROTECTED]> wrote: > > > Have you noticed the method saveChanges on > > SOAPMessage? > > Jeff > > > > Jeff Saremi wrote: > > > > >So i played more with this and here's what i > found > > >out: > > >- In the handler, the changes to the message, > > envelope > > >and body will all get saved and passed to the > > Service > > >afterwards > > >- Any chnages to the nodes inside the body are > > allowed > > >to be made and displayed while in the handler but > > >beyond that none of those changes make it! > > > > > >** some where in the handler ** > > >public void invoke(MessageContext context) { > > > ... > > > Node someNode = > > >body.getElementsByTagName("MyNodeName").item(0); > > > >someNode.appendChild( > > > >body.getOwnerDocument().createTextNode("someTextForMyNode")); > > > // print the body now > > > // the oputput will include the new text node > > > > > > System.out.println(XMLUtils.ElementToString(body)); > > > > > > // out of desperation you can do the following > > > // which should not be needed > > > // but they won't help you with the new Node > > > // being added to the body and hence being > passed > > > // to your Service down the chain > > > envelope.removeBody(); > > > envelope.setBody(body); > > > Message newMessage = new Message(envelope); > > > messageContext.setRequestMessage(newMessage); > > > > > >} > > > > > >** some time later inside the Service ** > > >public Element[] service(Element[] elements) { > > > for (int i = 0; i < elements.length; i++) { > > > // print the elements to your hearts content > > > // you will not see any traces of the > textnode > > > // you added in your handler > > > // all you see is the original elements > > > System.out.println( > > > XMLUtils.ElementToString(elements[i])); > > > } > > > return elements; > > >} > > > > > >jeff > > > > > > --- Jeff Saremi <[EMAIL PROTECTED]> wrote: > > > > > > > > >>I should have explained more about what i'm > doing. > > I > > >>don't know where this processRequest() method > is. > > It > > >>looks like there are two or more Handler > concepts > > >>within Axis. The Handler that i'm talking about > > are > > >>the ones you specify in the "requestFlow" or > > >>"responseFlow" chains: > > >> > > >> <service name="MyService" style="message"> > > >> <parameter name="className" > value="MyService" > > /> > > >> <parameter name="allowedMethods" > > value="service" > > >>/> > > >> <requestFlow> > > >> <handler type="java:MyHandler"/> > > >> </requestFlow> > > >> </service> > > >> > > >>Here's the method that MyHandler overrides. The > > code > > >>below is just to point out the problem -- this > is > > >>not > > >>how i'm planning on writing my final code: > > >> > > >>public class WARPHandler extends BasicHandler { > > >>public void invoke(MessageContext context) > throws > > >>AxisFault { > > >> try { > > >> Message message = context.getRequestMessage(); > > >> SOAPEnvelope envelope = > > message.getSOAPEnvelope(); > > >> SOAPBody body = envelope.getBody(); > > >> // do some modification to the elements in the > > >>body > > >> // ... > > >> System.out.println( > > >> "Is Body referenced? " + > > >> (body == > context.getMessage().getSOAPBody())); > > >> MyService.bodyElementInHandler = > > >>body.getFirstChild(); > > >> } catch (Exception e) { > > >> e.printStackTrace(); > > >> AxisFault.makeFault(e); > > >> } > > >>} > > >>} > > >> > > >>And the Service gets the Body document or > elements > > >>or > > >>the SOAPEnvelope after the Handler is done with > > it: > > >> > > >>public class MyService { > > >> public static Object bodyElementInHandler; > > >> public Document service(Document bodyElement) > { > > >> // the bodyElement here has none of the > > changes > > >> // that were made to it in the Handler! > > >> System.out.println( > > >> "bodies are not the same: " + > > >> (bodyElementInHandler == bodyElement)); > > >> return bodyElement; > > >> } > > >>} > > >> > > >>In the invoke() method of the Handler i tried to > > >>show > > >>that the Body that I got is not a copy of what > is > > in > > >>the Message and ultimately in the > MessageContext. > > It > > >>is just a refernce to it. Therefore > modifications > > to > > >>this Body or its subelements need not be set > again > > >>in > > >>the Message. However, regardless of it being a > > copy > > >>or > > >>a reference I also set the CurrentMessage of > > >>MessageContext to a new Message (i have not > shown > > >>this > > >>part of the code here). > > >>Then I set a static variable in my Service just > > for > > >>the sake of comparison. > > >>In the service() method of MyService I compare > the > > >>passed document to the reference set by the > > Handler. > > >>These two objects, even though they display the > > same > > >>XML structure are not the same. the body that > was > > >>passed to the service() method is the old > version > > of > > >>the body in the SOAPEnvelope. And this is what > > >>frustrates me beyond reason. > > >> > > >>I'd appreciate if someone could explain why this > > is > > >>happenning. > > >>thanks > > >> > > >> > > >> > > >>--- Jeff Greif <[EMAIL PROTECTED]> > > wrote: > > >> > === message truncated ===