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:
> >>    
> >>
> >>>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
> 
=== message truncated === 

Reply via email to