Hi Dan,

Yes, that makes sense, agree.
Utility method is more elegant solution with less overhead.

For example we can extend org.apache.cxf.attachment.AttachmentUtil with 
proposed addXOPElement() utility methods.

@Alekhya: does it make sense for you? Patch is welcome :)

Regards,
Andrei.

> -----Original Message-----
> From: Daniel Kulp [mailto:[email protected]]
> Sent: Mittwoch, 26. Februar 2014 17:30
> To: [email protected]
> Cc: Gumudavelli, Alekhya
> Subject: Re: Query on CXF dispatch client with MTOM
> 
> 
> On Feb 26, 2014, at 8:34 AM, Andrei Shakirin <[email protected]> wrote:
> 
> > Hi Dan,
> >
> > From other side, attachments itself are correctly transferred by using MTOM
> and Dispatch interface.
> > What is missing is only xop:include elements in the message payload.
> > Do you think it can be useful extension to provide interceptor checking for
> specific configuration property and inserts xop:include elements (for example
> based on XPath)?
> 
> We could, yes, but I'm struggling to figure out an advantage to doing that
> compared to just creating the proper messages up front.   Doing this would
> involve a bit of configuration for each client as you'd have to add in an
> interceptor, configure in the the needed XPaths, there would be quite a bit of
> performance overhead of evaluating xpaths and traversing over the structure.
> 
> To me, it just makes more sense to have a set of utility methods that can be
> used while that message is being built like:
> 
> void addXOPElement(SOAPMessage msg, SOAPElement parent, QName qn,
> DataSource src); void addXOPElement(SOAPMessage msg, SOAPElement
> parent, QName qn, String mimeType, byte[]);
> 
> (with multiple variants of the last parameters such as Image, Source, DOM,
> etc... as needed)
> 
> The utility methods would attach the data do the SOAPMessage as an
> attachment (creating a CID, headers, etc...),  create the element, create the
> child xop:include, and fill in the attributes.
> 
> Basically, if they were willing to have to call a "setOptimized(true)" on a
> custom SOAPElement, I'm not sure why they wouldn't be able to call a utility
> method that would actually do the optimization.
> 
> Any time you have to do some sort of transformation of the message during the
> streaming/marshaling, you're going to have some level of overhead.   If that
> overhead is easily avoided, does it make sense to do so?
> 
> Dan
> 
> 
> 
> 
> 
> >
> > Regards,
> > Andrei.
> >
> >> -----Original Message-----
> >> From: Daniel Kulp [mailto:[email protected]]
> >> Sent: Mittwoch, 26. Februar 2014 14:16
> >> To: [email protected]; Gumudavelli, Alekhya
> >> Subject: Re: Query on CXF dispatch client with MTOM
> >>
> >>
> >> I guess the more precise wording is that CXF implements "Support for
> MTOM".
> >> CXF doesn't process any of the XML to generate the xop:include or process
> the
> >> include elements.   What CXF provides is support to setup the messaging
> >> payload to allow for attachments and callbacks for the Databindings
> >> to add attachments or read attachments.  It's up to the various data 
> >> bindings
> to figure
> >> out if and how they implement the mtom portions.   JAXB and Aegis both
> >> support mtom.   SDO and XMLBeans do not.     Basically, it provides 
> >> "Support
> >> for MTOM", but doesn't implement mtom stuff itself except for Aegis
> >> as that's fully part of CXF.
> >>
> >> For the Dispatch using SOAPMessage or Source, it goes through via the
> >> "Source" data binding which pretty much copies the data directly through.
> It
> >> does absolutely no xop:include processing at all.  It doesn't even really 
> >> look
> into
> >> the contents of the XML at all.   It just copies the XML events onto the 
> >> wire
> >> directly.
> >>
> >>
> >> Dan
> >>
> >>
> >>
> >>
> >> On Feb 26, 2014, at 5:56 AM, Gumudavelli, Alekhya
> >> <[email protected]> wrote:
> >>
> >>> Hi Dan, Andrei,
> >>>
> >>> Referring to below message from you, it indicates that core CXF has
> >>> support
> >> for MTOM. It is just that dispatch API does not have pointers to look
> >> for such a config.
> >>> If we try to expose that functionality which is already present in
> >>> CXF somehow, we can achieve our goal. Isn't it?  (We don't have to
> >>> use SAAJ api )
> >> I have gone through CXF code from svn and did not find any specific
> >> handling of <xop includes> anywhere. I could only find code snippets
> >> that set content type to application/xop+xml.
> >>> If what I assumed is right, could you point me to the classes that
> >>> implement
> >> it.
> >>>
> >>> "I got the issue now, sorry for delay.
> >>> The problem is that if you use WSDL or Java first approaches, you
> >>> say CXF
> >> where inject a reference to sending binary data:
> >>>
> >>> -          for WSDL using <element name="attachinfo"
> type="xsd:base64Binary"
> >> xmime:expectedContentTypes="application/octet-stream"/>
> >>>
> >>> -          for java using annotation:
> >>>
> >>>   @XmlMimeType("application/octet-stream")
> >>>
> >>>   protected DataHandler imageData;
> >>>
> >>> In case of using Dispatch interface and SOAPMessage, user is
> >>> responsible to
> >> build complete SOAP message and, as a result, to insert <xop:Include
> >> href> element.
> >>> Currently CXF has no information where this element should be added
> >>> in
> >> SOAPMessage body.
> >>>
> >>> I think that could be a useful extension to provide additional
> >>> property for
> >> example in form of XPath and automate that for SOAPMessage as well.
> >>> Patch is welcome.
> >>> "
> >>>
> >>> Regards,
> >>> Alekhya
> >>>
> >>> From: Daniel Kulp [mailto:[email protected]]
> >>> Sent: Thursday, February 20, 2014 11:03 PM
> >>> To: [email protected]; Gumudavelli, Alekhya
> >>> Subject: Re: Query on CXF dispatch client with MTOM
> >>>
> >>>
> >>> On Feb 20, 2014, at 3:55 AM, Gumudavelli, Alekhya
> >>
> <[email protected]<mailto:[email protected]
> >> o
> >> m>> wrote:
> >>>
> >>>
> >>> hi Andrei,
> >>> We are using JAXWS's SOAPElement to build the envelope. And in order
> >>> to
> >> MTOM optimize it, we need some class CXFSOAPElement in CXF api which
> >> would have an "optimize()" method.
> >>>
> >>> Likely not possible.   The SOAPElement things are very specific to 
> >>> whatever
> >> SAAJ implementation that is picked up.  Creation of the SOAPElements
> >> should be done via the factory (usually the SOAPEnvelope/SOAPBody or via
> the
> >> Document object) that the SAAJ implementation provides.   It's very 
> >> possible
> >> that whatever implementation that is picked up would reject adding
> >> any SOAPElement that wasn't created via it's own factories.  (others
> >> may "copy" the element over to one of it's own and thus loose the
> >> custom methods anyway)
> >>>
> >>>
> >>>
> >>> optimize() on an element is expected to do the following -
> >>>
> >>> 1.       Extract the attachment included within the SOAP message body and
> >> send it as separate attachment part along with SOAP message.
> >>> 2.       Add an <xop:include href> element inside the element, this would
> refer
> >> to the attachment part.
> >>>
> >>> Developer must not add attachments as parts. Instead, CXF must be
> >> intelligent enough to extract them and put <xop:include href>'s
> >> wherever necessary.
> >>> I understand that these are not currently supported in CXF and a
> >>> patch if
> >> provided by anybody must implement the above steps. Let me know if my
> >> understanding is right.
> >>>
> >>> I don't see how the above can be done at all.   As I said, CXF is happy 
> >>> to use
> >> whatever SAAJ implementation we find with whatever restrictions that
> >> may place.
> >>>
> >>>
> >>> Since the SAAJ stuff implements the DOM API's, you could likely do a
> >> element.setUserData(...)  to stick a key on it.     This could be checked 
> >> at
> >> read/write time to figure out how to handle it.   However, I would NOT have
> >> this check done by default in CXF as doing a lookup for every element
> >> at write time would slow things down for the 99% of the time that this is 
> >> not
> needed.
> >> It would likely be easiest to just have a static utility method that
> >> would take the SOAPMessage object in, walks through the full dom
> >> checking that property, replaces it with an include element, takes the data
> and creates an attachment,
> >> sticks that on the SOAPMessage, etc...    You *MIGHT* be able to create a
> CXF
> >> interceptor that would grab the saaj model and pass to that method to
> >> handle that.  Not really sure.
> >>>
> >>> The next optimization beyond that would be to subclass the
> >> W3CDOMStreamReader we have and perform that operation at the
> >> appropriate reading events.   Pass in a StaxSource with that reader as the
> type
> >> instead of the DOM.    I'm not 100% sure this would always work as we do
> some
> >> levels of optimizations if we see the DOMStreamReader.
> >>>
> >>>
> >>> The other thing to think about is on the return side.   If the service 
> >>> returns
> an
> >> MTOM message, we won't do anything with it either .  The SOAPMessage
> >> returned from the Dispatch will have the xop:includes and the attachments
> will
> >> be as attachments.   You'll need to do processing of the xops  yourself.
> >>>
> >>>
> >>> Dan
> >>>
> >>>
> >>>
> >>> Thanks,
> >>> Alekhya
> >>>
> >>> From: Andrei Shakirin [mailto:[email protected]]
> >>> Sent: Thursday, February 20, 2014 1:43 PM
> >>> To: [email protected]<mailto:[email protected]>
> >>> Cc: Gumudavelli, Alekhya
> >>> Subject: RE: Query on CXF dispatch client with MTOM
> >>>
> >>> Hi,
> >>>
> >>> I got the issue now, sorry for delay.
> >>> The problem is that if you use WSDL or Java first approaches, you
> >>> say CXF
> >> where inject a reference to sending binary data:
> >>> -          for WSDL using <element name="attachinfo"
> type="xsd:base64Binary"
> >> xmime:expectedContentTypes="application/octet-stream"/>
> >>> -          for java using annotation:
> >>>   @XmlMimeType("application/octet-stream")
> >>>   protected DataHandler imageData;
> >>>
> >>> In case of using Dispatch interface and SOAPMessage, user is
> >>> responsible to
> >> build complete SOAP message and, as a result, to insert <xop:Include
> >> href> element.
> >>> Currently CXF has no information where this element should be added
> >>> in
> >> SOAPMessage body.
> >>>
> >>> I think that could be a useful extension to provide additional
> >>> property for
> >> example in form of XPath and automate that for SOAPMessage as well.
> >>> Patch is welcome.
> >>>
> >>> Regards,
> >>> Andrei.
> >>>
> >>>
> >>> From: Gumudavelli, Alekhya [mailto:[email protected]]
> >>> Sent: Dienstag, 18. Februar 2014 13:53
> >>> To: Andrei Shakirin;
> >>> [email protected]<mailto:[email protected]>
> >>> Subject: RE: Query on CXF dispatch client with MTOM
> >>> Importance: High
> >>>
> >>> Hi Andrei,
> >>> Any update on this. I raised a JIRA item on the same last week.
> >>> Could
> >> someone please look into it.
> >>> https://issues.apache.org/jira/browse/CXF-5560
> >>> Let me know if you need more details on the issue.
> >>>
> >>> Regards,
> >>> Alekhya
> >>>
> >>> From: Gumudavelli, Alekhya
> >>> Sent: Thursday, February 13, 2014 11:42 AM
> >>> To: Andrei Shakirin;
> >>> [email protected]<mailto:[email protected]>
> >>> Subject: RE: Query on CXF dispatch client with MTOM
> >>>
> >>> Hi,
> >>>
> >>> I am attaching the client and service that I am using.
> >>> MTOMClient.java is a
> >> standalone Java program that I wrote to connect to a service that I
> >> got from CXF samples apache-cxf-3.0.0-milestone1.rar
> >>> ( apache-cxf-3.0.0-milestone1\samples\mtom ).   links.txt is the file I am
> >> trying to send as an MTOM attachment.
> >>>
> >>> I am also attaching MTOMClientBase64.java. It sends a base64 encoded
> >>> data
> >> of the attachment.
> >>>
> >>> Regards,
> >>> Alekhya
> >>>
> >>> From: Andrei Shakirin [mailto:[email protected]]
> >>> Sent: Wednesday, February 12, 2014 9:43 PM
> >>> To: [email protected]<mailto:[email protected]>
> >>> Cc: Gumudavelli, Alekhya
> >>> Subject: RE: Query on CXF dispatch client with MTOM
> >>>
> >>> Hi,
> >>>
> >>> Interesting. Any chance to create a small test case to reproduce that?
> >>>
> >>> Regards,
> >>> Andrei.
> >>>
> >>> From: Gumudavelli, Alekhya [mailto:[email protected]]
> >>> Sent: Mittwoch, 12. Februar 2014 14:26
> >>> To: Andrei Shakirin;
> >>> [email protected]<mailto:[email protected]>
> >>> Subject: RE: Query on CXF dispatch client with MTOM
> >>>
> >>> Hi,
> >>> I don't find any difference between my client code and
> >> https://svn.apache.org/repos/asf/cxf/branches/2.7.x-
> >> fixes/systests/jaxws/src/test/java/org/apache/cxf/systest/swa/ClientS
> >> erverSwa Test.java except that I am doing an additional setting
> >> MTOMEnabled property to true.
> >>>
> >>> Can you give me any MTOM specific sample test (not just SWA). I
> >>> would like
> >> to try that out directly. I had searched in cxf/systest/ repository
> >> but could not find any. I see that all MTOM tests in the repo use stubs and
> not dispatch API.
> >>>
> >>> Or can you point me to the internal CXF code / class that takes care
> >>> of adding
> >> <xop include> element. I would like to debug and understand why is it
> >> not xop'ing it.
> >>> We are revamping our entire stack to use CXF and this issue is
> >>> hindering us
> >> from implementing MTOM with CXF, one of the important features for
> clients.
> >>>
> >>> Thanks much for the quick responses Andrei!
> >>>
> >>> Alekhya
> >>>
> >>> From: Andrei Shakirin [mailto:[email protected]]
> >>> Sent: Tuesday, February 11, 2014 11:06 PM
> >>> To: [email protected]<mailto:[email protected]>
> >>> Cc: Gumudavelli, Alekhya
> >>> Subject: RE: Query on CXF dispatch client with MTOM
> >>>
> >>> Hi,
> >>>
> >>> It is quite difficult to say what exactly wrong without your test case.
> >>> Could you run the system test I referenced in last mail and try to
> >>> find the
> >> difference between test and your code?
> >>>
> >>> Regards,
> >>> Andrei.
> >>>
> >>> From: Gumudavelli, Alekhya [mailto:[email protected]]
> >>> Sent: Dienstag, 11. Februar 2014 12:54
> >>> To: Andrei Shakirin;
> >>> [email protected]<mailto:[email protected]>
> >>> Subject: RE: Query on CXF dispatch client with MTOM
> >>>
> >>> Hi Andrei,
> >>> I am doing exactly the way you are referring. The service is not
> >>> able to
> >> recognize attachment.
> >>>
> >>> Below is my service method . It fails to process attachment as the
> >>> parameter
> >> "attachinfo" does not hold the attachment we have sent. This works
> >> well if I manually insert <attachinfo> element by linking it with 
> >> content-id.
> >>>
> >>> public void testDataHandler(Holder<String> name, Holder<DataHandler>
> >> attachinfo) {
> >>>               if(attachinfo.value==null)
> >>>                               {System.out.println("attachinfo.value
> >>> is null");  //This gets
> >> executed
> >>>                               return;}
> >>>               InputStream mtomIn = attachinfo.value.getInputStream();
> >>>              ByteArrayOutputStream out = new
> >>> ByteArrayOutputStream(); and so on....
> >>>
> >>> Also, in the below line we can use any random name to set content id. 
> >>> Isn't
> it?
> >>>
> >>> att.setContentId("<attach1=c187f5da-fa5d-4ab9-81db-
> >> 33c2bb855201@apache
> >>> .org<mailto:attach1=c187f5da-fa5d-4ab9-81db-
> >> [email protected]>>"
> >>> );
> >>>
> >>> Could you please help me out with this issue
> >>>
> >>>
> >>> Below is the screenshot of my request in TCP mon -
> >>>
> >>>
> >>>
> >>>
> >>> Regards,
> >>> Alekhya
> >>>
> >>> From: Andrei Shakirin [mailto:[email protected]]
> >>> Sent: Monday, February 10, 2014 9:57 PM
> >>> To: [email protected]<mailto:[email protected]>
> >>> Cc: Gumudavelli, Alekhya
> >>> Subject: RE: Query on CXF dispatch client with MTOM
> >>>
> >>> Hi,
> >>>
> >>> I do not think that you should add MTOM <include> manually.
> >>>
> >>> It should be enough to activate MTOM and add attachment part in
> >>> following
> >> way:
> >>>
> >>>       DataHandler dh1 = new DataHandler(new
> >>> ByteArrayDataSource(bigBytes, "text/plain"));
> >>>
> >>>       AttachmentPart att = msg.createAttachmentPart(dh1);
> >>>       att.setContentId("<attach1=c187f5da-fa5d-4ab9-81db-
> >> [email protected]<mailto:attach1=c187f5da-fa5d-4ab9-81db-
> >> [email protected]>>");
> >>>       msg.addAttachmentPart(att);
> >>>
> >>> See the testSwaTypesWithDispatchAPI() in
> >> https://svn.apache.org/repos/asf/cxf/branches/2.7.x-
> >> fixes/systests/jaxws/src/test/java/org/apache/cxf/systest/swa/ClientS
> >> erverSwa
> >> Test.java for details.
> >>>
> >>> Regards,
> >>> Andrei.
> >>>
> >>>
> >>> From: Gumudavelli, Alekhya [mailto:[email protected]]
> >>> Sent: Montag, 10. Februar 2014 08:36
> >>> To: Andrei Shakirin
> >>> Cc: [email protected]<mailto:[email protected]>
> >>> Subject: Query on CXF dispatch client with MTOM
> >>>
> >>> Hi Andrei, team
> >>>
> >>> I am writing a CXF client with MTOM by using dynamic dispatch style
> >>> of
> >> service invocation. I understand that dynamic dispatch requires
> >> request message to be constructed manually.
> >>> But I would like to avoid manual insertion of <inc:include href> XOP
> >>> element
> >> in the SOAP message to enable MTOM.
> >>>
> >>> I am currently doing the following steps to generate a CXF mtom client
> >>> 1.       Enable MTOM using
> >>>
> >>> ((SOAPBinding)binding).setMTOMEnabled(true);
> >>>
> >>> 2.       Construct SOAP request message programmatically
> >>>
> >>> SOAPMessage request = MessageFactory.newInstance().createMessage();
> >>> //create attachment and add it to request AttachmentPart attach =
> >>> request.createAttachmentPart(new DataHandler(new
> >>
> FileDataSource("F:\\CXF3\\CXF3\\src\\me.bmp<smb://CXF3/CXF3/src/me.bm
> >> p>
> >> ")));
> >>>     attach.setContentId("image");
> >>> request.addAttachmentPart(attach);
> >>>
> >>> SOAPElement operation = body.addChildElement("testDataHandler", "typ",
> >>>          "http://cxf.apache.org/mime/types";);
> >>>
> >>> /*Here, I am creating the SOAP body with appropriate nodes needed
> >>> for MTOM - <inc:include href="image". . . */
> >>>
> >>> SOAPElement value1 = operation.addChildElement("attachinfo",
> >>> "tns","http://cxf.apache.org/mime/types";);
> >>> SOAPElement xop =
> >>> value1.addChildElement("Include","inc","http://www.w3.org/2004/08/xo
> >>> p/ include"); xop.addAttribute(QName.valueOf("href"),"cid:image");
> >>>
> >>> Generated request message :
> >>> <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/";
> >> xmlns:typ="http://cxf.apache.org/mime/types";>
> >>>  <soapenv:Header
> >> xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"/>
> >>>  <soap:Body>
> >>>  <typ:testDataHandler>
> >>> <tns:attachinfo
> >>> xmlns:tns="http://cxf.apache.org/mime/types";><inc:Include
> >>> xmlns:inc="http://www.w3.org/2004/08/xop/include";
> >>> href="cid:image"/></tns:attachinfo>
> >>> </typ:testDataHandler>
> >>> </soap:Body>
> >>> </soap:Envelope>
> >>>
> >>> The above request works well. However, manual inclusion of DOM
> >>> elements
> >> like this does not appear clean and maintainable. Could you tell me
> >> how else can we achieve this to generate the request dynamically?
> >>>
> >>> I have the same issue with SWA CXF dispatch client where I am
> >>> including
> >> <cid:image> node programmatically which I want to avoid.
> >>>
> >>> Thanks,
> >>> Alekhya Gumudavelli
> >>>
> >>> --
> >>> Daniel Kulp
> >>> [email protected]<mailto:[email protected]> - http://dankulp.com/blog
> >>> Talend Community Coder -
> >>> http://coders.talend.com<http://coders.talend.com/>
> >>>
> >>
> >> --
> >> Daniel Kulp
> >> [email protected] - http://dankulp.com/blog Talend Community Coder -
> >> http://coders.talend.com
> >
> 
> --
> Daniel Kulp
> [email protected] - http://dankulp.com/blog Talend Community Coder -
> http://coders.talend.com

Reply via email to