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:
> > This pattern (for one of the jax-rpc handler
> > methods) guarantees that no 
> > matter what copying takes place, your changes will
> > register.  If your 
> > handler decides to do nothing with the message,
> > return null from 
> > whatever you implement for processRequest.  In
> > general it seems that 
> > items retrieved from MessageContext objects are
> > copies, and must be set 
> > back into the context after modification.  This
> > applies to properties 
> > and perhaps other things as well.
> > 
> >     public boolean handleRequest(MessageContext
> > context) {
> >  
> >             SOAPMessageContext soapContext =
> > (SOAPMessageContext) context;
> >             SOAPMessage message =
> > soapContext.getMessage();
> >             SOAPMessage result =
> > processRequest(message);
> >             if (result != null) {
> >                 soapContext.setMessage(result);
> >              }
> >             return true;
> >     }
> > 
> > Jeff
> > 
> > 
> > Jeff Saremi wrote:
> > 
> > >Either there is something i'm not getting or my
> > whole
> > >code/configuration is wrong.
> > >
> > >I'd like to intercept a request using a handler,
> > >change something in that request and then let my
> > >service deal with these changes. However, I
> cannot
> > >this simple, intuitive concept to work! I have
> > spent
> > >over two full days playing with different objects
> > and
> > >different template methods in my service (a
> message
> > >service) all to no avail.
> > >
> > >What i'd like to do is get the XML for the body
> of
> > the
> > >incoming request in my handler, change some
> values
> > in
> > >it, and then let my message service deal with the
> > >modified body. But after extensive testing I
> > realized
> > >that the Body that is passed to my Service and
> the
> > one
> > >i modified in my Handler are completely
> different!
> > >It's as if Axis makes a copy of the incoming
> > request,
> > >before its modified by my Handler and passes that
> > old
> > >copy to my Service.
> > >
> > >Is this true? If not please let me know and i
> will
> > >send you some more code and configuration for you
> > guys
> > >to examine.
> > >
> > >thanks,
> > >jeff
> > >
> > >
> > >  
> > >
> > 
> > 
>  

Reply via email to