Ah, sorry I misunderstood you - terminology mismatch.

- by XML you apparently meant a string representation of some XML.  I
thought when you referred to transforming/conversion of XML into
SOAPBodyElement that you meant transforming some DOM-type representation of
XML into a SOAPBodyElement (which would just be a wrapper), not that you
meant transforming (parsing) a string of bytes that represent XML into a DOM
within a SOAPBodyELement...

- by XML Document, I meant a DOM representation of an XML document (to me a
string is just a string, not XML, until you parse it with an XML parser :-)

What I was referring to was that if I have a DOM representation of a
Document or an Element subtree, and I tell the Call object that I want
Document style (via setOperationStyle()), then I would rather be able to
just call invoke() passing that Element or Document without having to wrap
it in SOAPBodyElement just to implicitly tell the Call.invoke() code that I
want SOAP Document (AXIS Message) style, since I already explicitly told it
I wanted "document" style, and I'm passing something (eg, Document or
Element) that could just as easily be the contents of the SOAP envelope body
as a SOAPBodyElement can...

-----Original Message-----
From: Naresh Bhatia [mailto:[EMAIL PROTECTED]
Sent: Monday, February 24, 2003 6:11 PM
To: [EMAIL PROTECTED]
Subject: RE: Accessing the XML in the SOAP message body directly


Hi Mike,

You wrote that:
> You're not actually "transform"ing it to a SOAPBodyElement, it's just
being "wrapped" in a SOAPBodyElement...

Well, if you look at the SOAPBodyElement code, the text of the XML
document IS being transformed to a DOM:

The constructor SOAPBodyElement(InputStream input) calls
  super( getDocumentElement(input) )
    - which first converts the input file to a DOM
    - it then sends the DOM to the super's constructor
      where it is saved in MessageElement.elementRep

When the time comes to send the body on the wire, I imagine that the DOM
is reconverted to XML. I feel that this is totally unnecessaty for a
message style service. When I use this option I am essentially telling
Axis that I am supplying the XML and don't mess with it!

What I am thinking is that MessageElement keep an attribute called, say
xmlDoc, which is of type String. If this attribute is initialized, Axis
would not look at elementRep and simply send the xmlDoc on the wire.
Developers, could you please comment on this approach? I may be totally
wrong on this, but I need your input.

Thanks.
Naresh.

-----Original Message-----
From: Mike Burati [mailto:[EMAIL PROTECTED] 
Sent: Monday, February 24, 2003 2:34 PM
To: '[EMAIL PROTECTED]'
Subject: RE: Accessing the XML in the SOAP message body directly



> So the question still remains - is there any way to insert my own XML 
> into
the SOAP body
> - without Axis having to transform it to SOAPBodyElement and back.

You're not actually "transform"ing it to a SOAPBodyElement, it's just
being "wrapped" in a SOAPBodyElement...

But I agree with your intent - it would be nice to be able to take an
XML Document object and just pass it across the wire in a SOAP Document
style call.

It appears (at least in 1.1beta source which I happen to have handy),
that the AXIS Client Call object is basing it's Message vs RPC style
decision on whether or not the arguments are all SOAPBodyElement or not,
as shown in the following code snippet from Call.invoke(Object[] params)

    /* First see if we're dealing with Messaging instead of RPC. */
    /* If ALL of the params are SOAPBodyElements then we're doing */
    /* Messaging, otherwise just fall through to normal RPC processing.
*/
 
/********************************************************************/
    SOAPEnvelope env = null ;
    int i ;
    for ( i = 0 ; params != null && i < params.length ; i++ )
        if ( !(params[i] instanceof SOAPBodyElement) ) break ;


What would be nice is if you could set 
    call.setOperationStyle("document");
and then
    call.invoke(new Object[] { myDOMDocument });

and have it serialize the Document as the body contents, and make an
outgoing SOAP Document style (AXIS message style) call, serializing the
DOM Document as the SOAP Body, rather than forcing the use of
SOAPBodyElement and implicitly determining that it's SOAP
Message/Document style based on a known type of all the arguments...

Unfortunately, if you do that, because it's only checking for
SOAPBodyElement arguments and ignoring the setOperationStyle() property,
you will get a No Operation Specified (as if it were an RPC operation)
even if you explicitly set the operation style to Document.  Is this a
design decision of AXIS (eg, an unexpected behavior forced by JAX-RPC
compliance) or is this just a bug (that it ignores operation style and
only decides between messaging vs RPC based on existence of
SOAPBodyElement args)?

..Mike





-----Original Message-----
From: Naresh Bhatia [mailto:[EMAIL PROTECTED]
Sent: Monday, February 24, 2003 12:58 PM
To: [EMAIL PROTECTED]
Subject: RE: Accessing the XML in the SOAP message body directly


Interesting approach - try to send the XML as an attachment! That's a
good workaround for me to keep in mind. However, I still prefer to send
the XML in the SOAP body. This allows me to include the associated
schema in the WSDL and then clients could choose to deserialize the body
however they think is appropriate. So the question still remains - is
there any way to insert my own XML into the SOAP body - without Axis
having to transform it to SOAPBodyElement and back.
 
Thanks.
Naresh
 
-----Original Message-----
From: Ghershony, Arie [mailto:[EMAIL PROTECTED] 
Sent: Monday, February 24, 2003 12:04 PM
To: '[EMAIL PROTECTED]'
Subject: RE: Accessing the XML in the SOAP message body directly


  hi,
I did an example of a clinet attach a document, then receive the same
document back from the server. what showld be different in the code if a
client want to receive the document from the the service only.  
 
this is the piece of  code to add an attachment:  what showld be
different if it is only receiving a file instead of attaching and
receiving?
 
if(doTheDIME)
            call.setProperty(call.ATTACHMENT_ENCAPSULATION_FORMAT,
              call.ATTACHMENT_ENCAPSULATION_FORMAT_DIME);


        Object ret = call.invoke( new Object[] {
                    dhSource
                } 
            ); //Add the attachment.
 
 
thanks,
Aria

-----Original Message-----
From: Naresh Bhatia 
Sent: Friday, February 21, 2003 7:44 PM
To: [EMAIL PROTECTED]
Subject: Accessing the XML in the SOAP message body directly


I am using the Axis "Message" style service to populate the SOAP body
myself. My payload originates in an XML file, which I read into a
SOAPBodyElement. When I invoke the call, Axis obviously reconverts the
SOAPBodyElement into XML and sends it out to the server:
        SOAPBodyElement[] params = new SOAPBodyElement[1]; 
        params[0] = new SOAPBodyElement(new
FileInputStream("message.xml"));

        ... 
        Vector resultElements = (Vector)call.invoke(params); 
Is there any way to avoid these unnecessay conversions from XML to
SOAPBodyElement and back? There is a similar problem with the returned
result - I don't want Axis to convert the XML returned in the response
message, I want to access the XML directly. Ah, and of course, the same
problem on the server side! Where do I start? Thanks, 
Naresh 

Reply via email to