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