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: [email protected]
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 ===