Wasn't aware of that feature. Just what I need. Thanks a lot!!!

On Thu, Apr 22, 2010 at 12:08 PM, Daniel Kulp <[email protected]> wrote:

> On Thursday 22 April 2010 12:00:16 pm Thomas Koenig wrote:
> > Thanks for the quick reply.
> >
> > So, is there any other way that MTOM attachments are made available
> through
> > the Dispatch SPI (i.e. I don't want to do JAXB data binding).
>
> Normally, you would add a field like:
>
> @Resource
> WebServiceContext ctx;
>
> which CXF would inject in.    In your invoke method, you would do:
>
> ctx.getMessageContext().get(MessageContext.INBOUND_MESSAGE_ATTACHMENTS);
>
> which would return a java.util.Map<String,DataHandler>.   From that map,
> you
> could map the xop include hrefs to the appropriate DataHandler in the Map.
> Again this is by FAR the most efficient way to do this.    It's a bit more
> work for the Provider writer, but it performance is a ton better.
>
> Dan
>
>
> >
> > On Thu, Apr 22, 2010 at 11:45 AM, Daniel Kulp <[email protected]> wrote:
> > > > I had hoped that the Apache runtime would process the attachment and
> > >
> > > inline
> > >
> > > > it into the
> > > > 'DOMSource request' before the 'invoke' method is called, but it
> > > > appears that no mtom
> > > > processing takes place.
> > >
> > > Well, the main reason we don't do this is that in many cases we
> COULDN'T
> > > do it
> > > without a ton of memory available and it also would be extremely
> > > inefficient
> > > for most use cases.   At some point, I do think we COULD wrapper the
> > > XMLStreamReader with one that would do the mtom processing, but that
> > > would half to be made optional somehow.
> > >
> > > For example, lets pretend your attachment is a 500MB file.   With the
> > > current
> > > setup, you would have the WebServiceContext injected where you could
> get
> > > the
> > > Attachment and an input stream to get the raw data.   That input stream
> > > would
> > > be a wrapper to the raw HttpInputStream so the data would be streamed
> in
> > > not
> > > consuming any memory and not involving any processor time to encode and
> > > such.
> > >
> > > If we processed it, we would need to pull the 500MB in, run a base64
> > > encode on
> > > it to create a base64 string (which, since it's unicode, would take
> 1.3GB
> > > of
> > > memory) to add to the DOM.   To use that data, you would NORMALLY then
> > > decode
> > > it back to the byte[] data thus wasting more cpu time.
> > >
> > > Dan
> > >
> > > On Thursday 22 April 2010 11:29:55 am Thomas Koenig wrote:
> > > > Is MTOM attachment handling supported through the Dispatch SPI?
> > > >
> > > > I have modified the jaxws_dispatch_provider CXF sample, to
> accept/send
> > > > payloads that contain Base64Binary data.
> > > >
> > > >
> #######################################################################
> > > > Schema:
> > > > #######
> > > > <complexType name="DocumentDetailType">
> > > >
> > > >   <sequence>
> > > >
> > > >     <element name="identifier" type="xsd:string"/>
> > > >     <element name="content" type="xsd:base64Binary"/>
> > > >
> > > >   </sequence>
> > > >
> > > > </complexType>
> > > >
> > > > <complexType name="DocumentType">
> > > >
> > > >   <sequence>
> > > >
> > > >     <element name="name" type="xsd:string"/>
> > > >     <element name="id" type="xsd:string"/>
> > > >     <element name="detail" type="types:DocumentDetailType"/>
> > > >
> > > >   </sequence>
> > > >
> > > > </complexType>
> > > >
> > > > <element name="testDocumentRequest" type="types:DocumentType" />
> > > > <element name="testDocumentResponse" type="types:DocumentType" />
> > > >
> #######################################################################
> > > >
> > > >
> > > >
> #######################################################################
> > > > Request Message sample:
> > > > #######
> > > > ------=_Part_4_8271067.1271948982000
> > > > Content-Type: application/xop+xml; charset=UTF-8; type="text/xml"
> > > > Content-Transfer-Encoding: 8bit
> > > > Content-ID: <[email protected]>
> > > >
> > > > <soapenv:Envelope xmlns:soapenv="
> > >
> > > http://schemas.xmlsoap.org/soap/envelope/";
> > >
> > > > xmlns:typ="http://cxf.apache.org/mime/types";>
> > > >
> > > >    <soapenv:Header/>
> > > >    <soapenv:Body>
> > > >
> > > >       <typ:testDocument>
> > > >
> > > >          <typ:name>RequestSOAPUI_01</typ:name>
> > > >          <typ:id>RequestSOAPUI_01_id</typ:id>
> > > >          <typ:detail>
> > > >
> > > >
> <typ:identifier>RequestSOAPUI_01_identifier</typ:identifier
> > > >             > <typ:content><inc:Include href="cid:217539756627"
> > > >             xmlns:inc="
> > > >
> > > > http://www.w3.org/2004/08/xop/include"/></typ:content>
> > > >
> > > >          </typ:detail>
> > > >
> > > >       </typ:testDocument>
> > > >
> > > >    </soapenv:Body>
> > > >
> > > > </soapenv:Envelope>
> > > > ------=_Part_4_8271067.1271948982000
> > > > Content-Type: text/xml; charset=us-ascii
> > > > Content-Transfer-Encoding: 7bit
> > > > Content-ID: <217539756627>
> > > >
> > > > PGE+DQogIDxiIG5hbWU9IlRob21hcyIvPg0KPGE+
> > > > ------=_Part_4_8271067.1271948982000--
> > > >
> #######################################################################
> > > >
> > > >
> > > >
> #######################################################################
> > > > Apache CXF dispatch provider:
> > > > #######
> > > > @MTOM(threshold = 0, enabled = true)
> > > > @WebServiceProvider(
> > > >
> > > >   portName = "TestDocumentPort",
> > > >   serviceName = "TestDocumentService",
> > > >   targetNamespace = "http://cxf.apache.org/mime";,
> > > >   wsdlLocation = "wsdl/mtom_xop.wsdl")
> > > >
> > > > @ServiceMode(value = Service.Mode.MESSAGE)
> > > > public class TestDocumentDomSourceMessageProvider implements
> > > > Provider<DOMSource> {
> > > >
> > > >     public TestDocumentDomSourceMessageProvider() {
> > > >     }
> > > >
> > > >     public DOMSource invoke(DOMSource request) {
> > > >
> > > >         DOMSource response = new DOMSource();
> > > >         try {
> > > >
> > > >             MessageFactory factory = MessageFactory.newInstance();
> > > >             SOAPMessage soapReq = factory.createMessage();
> > > >             soapReq.getSOAPPart().setContent(request);
> > > >
> > > >             System.out.println("Incoming Client Request as a
> DOMSource
> > >
> > > data
> > >
> > > > in MESSAGE Mode");
> > > >
> > > >             soapReq.writeTo(System.out);
> > > >             System.out.println("\n");
> > > >
> > > >             InputStream is =
> > > >
> > > > getClass().getResourceAsStream("TestDocumentResponse.xml");
> > > >
> > > >             SOAPMessage testDocumentResponse =
> > >
> > >  factory.createMessage(null,
> > >
> > > > is);
> > > >
> > > >             is.close();
> > > >
> > > >             response.setNode(testDocumentResponse.getSOAPPart());
> > > >
> > > >         } catch (Exception ex) {
> > > >
> > > >             ex.printStackTrace();
> > > >
> > > >         }
> > > >         return response;
> > > >
> > > >     }
> > > >
> > > > }
> > > >
> > > > Object implementor = new TestDocumentDomSourceMessageProvider();
> > > > String address = "http://localhost:9000/document-test";;
> > > > Endpoint ep = Endpoint.publish(address, implementor);
> > > > ((SOAPBinding)ep.getBinding()).setMTOMEnabled(true);
> > >
> > >
> #######################################################################xm
> > > ln
> > >
> > > > s:soapenv=" http://schemas.xmlsoap.org/soap/envelope/"; xmlns:typ="
> > > > http://cxf.apache.org/mime/types";>
> > > >
> > > > I had hoped that the Apache runtime would process the attachment and
> > >
> > > inline
> > >
> > > > it into the
> > > > 'DOMSource request' before the 'invoke' method is called, but it
> > > > appears that no mtom
> > > > processing takes place.
> > >
> > > --
> > > Daniel Kulp
> > > [email protected]
> > > http://dankulp.com/blog
>
> --
> Daniel Kulp
> [email protected]
> http://dankulp.com/blog
>

Reply via email to