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 === 

Reply via email to