Hello Andreas,

Going through the source of the axiom-impl-1.2.9 [OMTextImpl], I came across 
the following -

    /**
     * Receiving binary can happen as either MTOM attachments or as Base64 Text 
In the case of
     * Base64 user has to explicitly specify that the content is binary, before 
calling
     * getDataHandler(), getInputStream()....
     */
     setBinary(Boolean value) {
     ...
     }

Perhaps the API is designed to be used this way...?

--------
anirban


-----Original Message-----
From: Anirban Majumdar 
Sent: Wednesday, October 13, 2010 11:41 AM
To: 'commons-dev@ws.apache.org'
Subject: RE: Axis2/Axiom handling SOAP MTOM/non-MTOM attachments

I'm using Axiom 1.2.9. 
Andreas - the reason I might need to do set the binary flag is perhaps because 
my Axiom based client is not for a particular web-service application. This 
client is pretty much acting as a 'proxy'. However, it's supposed to do a bit 
more than a proxy. It is supposed to transform all out-bound messages from 
web-services to a standard format. When it receives requests in the standard 
format, it again needs to transform them back to the particular web-service's 
format. For handling attachments, it adopts a mime-type agnostic approach, and 
treats all attachments as binary data. 

I'm assuming that since the Axiom client does not work w/ ADB generated 
bindings so it can't be sure how to treat the attachment data, and hence, I 
explicitly need to set the binary flag to 'true'. I'm working at the raw SOAP 
message level w/ Axiom. However, if you feel that Axiom should not need to be 
instructed about the binary flag, then I'm wrong and have no clue :]

Let me know if there's any other information I can help you w/. Since the 
client is a generic implementation, I could send it across to you if you want 
to take a look.

Thanks,
--------
anirban

-----Original Message-----
From: Andreas Veithen [mailto:andreas.veit...@gmail.com] 
Sent: Wednesday, October 13, 2010 2:27 AM
To: commons-dev@ws.apache.org
Subject: Re: Axis2/Axiom handling SOAP MTOM/non-MTOM attachments

If you need to explicitly set binary=true, then there is something
wrong. What version of Axiom and Axis2 do you use?

Andreas

On Tue, Oct 12, 2010 at 14:52, Anirban Majumdar
<anirban.majum...@altair.com> wrote:
> Hello,
>
> I just figured that I need to invoke .setBinary(true) to have it working for 
> me. Strangely enough this information has not been relayed in most of the 
> tutorials describing how to write clients to handle attachments.
>
> Thanks for providing the initial direction!
> --------
> anirban
>
>
> -----Original Message-----
> From: Anirban Majumdar
> Sent: Tuesday, October 12, 2010 3:02 PM
> To: commons-dev@ws.apache.org
> Subject: RE: Axis2/Axiom handling SOAP MTOM/non-MTOM attachments
>
> Hello Andreas,
>
> Thanks for the reply. The part about MTOM/XOP pre-processing makes sense.
>
> Considering your example -
> <ns:document><xop:Include href="cid:xxxx@yyyy"/></ns:document>
>
> I followed your suggestion and looked for a child node under the OMElement 
> represent ns:document. And there I found a OMTextImpl instance. I believe I 
> made a mistake in the method I was invoking on the OMElement. I was simply 
> doing getFirstElement, whereas I should've done getFirstOMChild.
>
> Having done the above, now I'm witnessing another problem in constructing a 
> file from the binary data -
> What I do is -
>          OMText tNode = (OMText) elem.getFirstOMChild();       #1
>        System.out.println(tNode.getContentID());               #2
>          DataHandler dh = tNode.getDataHandler();              #3
>
> At #2 I get the content ID fine. However, at #3, I'm getting a 
> NullPointerException. Using TCPMon I can see that the attachment is coming 
> through fine with a content-type "application/octet-stream". I hope I'm not 
> looking over some detail this time too :/
>
>
> Thanks,
> --------
> anirban
>
> -----Original Message-----
> From: Andreas Veithen [mailto:andreas.veit...@gmail.com]
> Sent: Monday, October 11, 2010 11:33 PM
> To: commons-dev@ws.apache.org
> Subject: Re: Axis2/Axiom handling SOAP MTOM/non-MTOM attachments
>
> In Axiom, MTOM/XOP processing happens before building the nodes.
> Therefore you will never see OMElement instances for xop:Include
> elements (there were some cases in Axiom 1.2.8 where one could still
> see xop:Include elements in XMLStreamReaders returned by Axiom, but in
> 1.2.9 XOP is now always decoded consistently in all cases). Instead,
> Axiom will generate an OMText instance from which a DataHandler with
> the content can be retrieved. If the document or part of it is
> serialized, then the optimized content will indeed be base64 encoded
> and inlined, unless a properly configured OMOutputFormat is passed to
> the serialize method. You can't cast an OMElement to an OMText node
> since they represent two different node types. Probably you are simply
> looking at the wrong node.
>
> To make this clearer, let's consider the following input document fragment:
>
> <ns:document><xop:Include href="cid:xxxx@yyyy"/></ns:document>
>
> You will get an OMElement describing ns:document, with a single OMText
> child that gives you the DataHandler.
>
> Hope this helps.
>
> Andreas
>
> On Mon, Oct 11, 2010 at 16:28, Anirban Majumdar
> <anirban.majum...@altair.com> wrote:
>> After looking around and trying different suggested solutions, I'm
>> writing this. The 2 most common solutions suggested to extract binary
>> data from a MTOM/non-MTOM SOAP message are:
>>
>> 1.      Retrieve the OMText node, and use the dataHandler instance
>> present within it
>> 2.      Find the OMElement node which contains the 'href' attribute. Get
>> the 'cid:xxxxx' value, and use the 'xxxxx' part to retrieve the
>> attachment from the attachment map present in the message context
>> instance.
>>
>> The problem I'm facing is that my client application indicates that the
>> SOAP response message is MTOM [I determined this using the isDoingMTOM()
>> method of the message context instance]. However, there are no OMElement
>> nodes which contain the 'href' attribute. On printing the SOAP envelope,
>> I found that the binary data is present inline within the body. So I
>> tried the OMText node approach to get the data, but whenever I try to
>> cast the OMElement to the corresponding OMText node, I keep getting a
>> classCastException.
>>
>> Can someone point out what I'm missing out on?
>>
>>
>>
>>
>>
>> --------
>>
>> anirban
>>
>>
>>
>>
>

Reply via email to