You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ws.apache.org by ve...@apache.org on 2015/10/12 20:59:31 UTC

svn commit: r1708203 - in /webservices/axiom/experimental/axiom-spring-integration/src: main/java/org/apache/axiom/spring/integration/ test/java/org/apache/axiom/spring/integration/ test/resources/org/apache/axiom/spring/integration/

Author: veithen
Date: Mon Oct 12 18:59:31 2015
New Revision: 1708203

URL: http://svn.apache.org/viewvc?rev=1708203&view=rev
Log:
Initial implementation of MTOM attachment streaming.

Added:
    webservices/axiom/experimental/axiom-spring-integration/src/main/java/org/apache/axiom/spring/integration/MimePartProviderAdapter.java   (with props)
Modified:
    webservices/axiom/experimental/axiom-spring-integration/src/main/java/org/apache/axiom/spring/integration/WebServiceOutboundGateway.java
    webservices/axiom/experimental/axiom-spring-integration/src/test/java/org/apache/axiom/spring/integration/WebServiceOutboundGatewayTest.java
    webservices/axiom/experimental/axiom-spring-integration/src/test/resources/org/apache/axiom/spring/integration/mtom-client-context.xml

Added: webservices/axiom/experimental/axiom-spring-integration/src/main/java/org/apache/axiom/spring/integration/MimePartProviderAdapter.java
URL: http://svn.apache.org/viewvc/webservices/axiom/experimental/axiom-spring-integration/src/main/java/org/apache/axiom/spring/integration/MimePartProviderAdapter.java?rev=1708203&view=auto
==============================================================================
--- webservices/axiom/experimental/axiom-spring-integration/src/main/java/org/apache/axiom/spring/integration/MimePartProviderAdapter.java (added)
+++ webservices/axiom/experimental/axiom-spring-integration/src/main/java/org/apache/axiom/spring/integration/MimePartProviderAdapter.java Mon Oct 12 18:59:31 2015
@@ -0,0 +1,62 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.axiom.spring.integration;
+
+import java.io.IOException;
+
+import javax.activation.DataHandler;
+
+import org.apache.axiom.util.stax.xop.MimePartProvider;
+import org.springframework.oxm.UnmarshallingFailureException;
+import org.springframework.oxm.mime.MimeContainer;
+
+final class MimePartProviderAdapter implements MimeContainer {
+    private final MimePartProvider provider;
+
+    MimePartProviderAdapter(MimePartProvider provider) {
+        this.provider = provider;
+    }
+
+    @Override
+    public boolean isXopPackage() {
+        return true;
+    }
+
+    @Override
+    public boolean convertToXopPackage() {
+        throw new UnsupportedOperationException();
+    }
+
+    @Override
+    public void addAttachment(String contentId, DataHandler dataHandler) {
+        throw new UnsupportedOperationException();
+    }
+
+    @Override
+    public DataHandler getAttachment(String contentId) {
+        if (contentId.charAt(0) == '<' && contentId.charAt(contentId.length()-1) == '>') {
+            contentId = contentId.substring(1, contentId.length()-1);
+        }
+        try {
+            return provider.getDataHandler(contentId);
+        } catch (IOException ex) {
+            throw new UnmarshallingFailureException("Failed to retrieve attachment with content ID " + contentId, ex);
+        }
+    }
+}

Propchange: webservices/axiom/experimental/axiom-spring-integration/src/main/java/org/apache/axiom/spring/integration/MimePartProviderAdapter.java
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: webservices/axiom/experimental/axiom-spring-integration/src/main/java/org/apache/axiom/spring/integration/WebServiceOutboundGateway.java
URL: http://svn.apache.org/viewvc/webservices/axiom/experimental/axiom-spring-integration/src/main/java/org/apache/axiom/spring/integration/WebServiceOutboundGateway.java?rev=1708203&r1=1708202&r2=1708203&view=diff
==============================================================================
--- webservices/axiom/experimental/axiom-spring-integration/src/main/java/org/apache/axiom/spring/integration/WebServiceOutboundGateway.java (original)
+++ webservices/axiom/experimental/axiom-spring-integration/src/main/java/org/apache/axiom/spring/integration/WebServiceOutboundGateway.java Mon Oct 12 18:59:31 2015
@@ -25,6 +25,7 @@ import java.net.URL;
 import java.text.ParseException;
 
 import javax.xml.stream.XMLStreamException;
+import javax.xml.stream.XMLStreamReader;
 import javax.xml.transform.stax.StAXSource;
 
 import org.apache.axiom.attachments.Attachments;
@@ -37,11 +38,16 @@ import org.apache.axiom.om.OMXMLBuilderF
 import org.apache.axiom.soap.SOAPFactory;
 import org.apache.axiom.soap.SOAPMessage;
 import org.apache.axiom.soap.SOAPModelBuilder;
+import org.apache.axiom.util.stax.xop.XOPEncodedStream;
+import org.apache.axiom.util.stax.xop.XOPUtils;
 import org.springframework.integration.handler.AbstractReplyProducingMessageHandler;
 import org.springframework.messaging.Message;
 import org.springframework.messaging.MessageDeliveryException;
 import org.springframework.oxm.Marshaller;
 import org.springframework.oxm.Unmarshaller;
+import org.springframework.oxm.mime.MimeContainer;
+import org.springframework.oxm.mime.MimeMarshaller;
+import org.springframework.oxm.mime.MimeUnmarshaller;
 
 public final class WebServiceOutboundGateway extends AbstractReplyProducingMessageHandler {
     private final OMMetaFactory metaFactory = OMAbstractFactory.getMetaFactory();
@@ -83,15 +89,30 @@ public final class WebServiceOutboundGat
             soapMessage.serializeAndConsume(out, format);
             out.close();
             ContentType contentType = new ContentType(connection.getContentType());
+            XMLStreamReader reader;
+            MimeContainer mimeContainer;
             if (contentType.getMediaType().equals(MediaType.MULTIPART_RELATED)) {
                 SOAPModelBuilder builder = OMXMLBuilderFactory.createSOAPModelBuilder(
                         new Attachments(connection.getInputStream(), contentType.toString()));
-                return unmarshaller.unmarshal(new StAXSource(builder.getSOAPEnvelope().getBody().getFirstElement().getXMLStreamReader(false)));
+                reader = builder.getSOAPEnvelope().getBody().getFirstElement().getXMLStreamReader(false);
+                if (marshaller instanceof MimeMarshaller) {
+                    XOPEncodedStream xopEncodedStream = XOPUtils.getXOPEncodedStream(reader);
+                    reader = xopEncodedStream.getReader();
+                    mimeContainer = new MimePartProviderAdapter(xopEncodedStream.getMimePartProvider());
+                } else {
+                    mimeContainer = null;
+                }
+            } else {
+                // TODO
+                return null;
+            }
+            if (mimeContainer != null) {
+                return ((MimeUnmarshaller)unmarshaller).unmarshal(new StAXSource(reader), mimeContainer);
+            } else {
+                return unmarshaller.unmarshal(new StAXSource(reader));
             }
         } catch (IOException | XMLStreamException | ParseException ex) {
             throw new MessageDeliveryException(requestMessage, ex);
         }
-        // TODO
-        return null;
     }
 }

Modified: webservices/axiom/experimental/axiom-spring-integration/src/test/java/org/apache/axiom/spring/integration/WebServiceOutboundGatewayTest.java
URL: http://svn.apache.org/viewvc/webservices/axiom/experimental/axiom-spring-integration/src/test/java/org/apache/axiom/spring/integration/WebServiceOutboundGatewayTest.java?rev=1708203&r1=1708202&r2=1708203&view=diff
==============================================================================
--- webservices/axiom/experimental/axiom-spring-integration/src/test/java/org/apache/axiom/spring/integration/WebServiceOutboundGatewayTest.java (original)
+++ webservices/axiom/experimental/axiom-spring-integration/src/test/java/org/apache/axiom/spring/integration/WebServiceOutboundGatewayTest.java Mon Oct 12 18:59:31 2015
@@ -20,6 +20,7 @@ package org.apache.axiom.spring.integrat
 
 import javax.xml.ws.Endpoint;
 
+import org.apache.axiom.attachments.lifecycle.DataHandlerExt;
 import org.apache.axiom.testutils.PortAllocator;
 import org.apache.axiom.testutils.activation.RandomDataSource;
 import org.apache.axiom.testutils.io.IOTestUtils;
@@ -47,11 +48,11 @@ public class WebServiceOutboundGatewayTe
                 FileService fileService = context.getBean(FileService.class);
                 GetFileRequest request = new GetFileRequest();
                 request.setSeed(12345678);
-                request.setLength(4096);
+                request.setLength(Runtime.getRuntime().maxMemory());
                 GetFileResponse response = fileService.getFile(request);
                 IOTestUtils.compareStreams(
-                        response.getContent().getInputStream(),
-                        new RandomDataSource(request.getSeed(), request.getLength()).getInputStream());
+                        ((DataHandlerExt)response.getContent()).readOnce(), "actual",
+                        new RandomDataSource(request.getSeed(), request.getLength()).getInputStream(), "expected");
             } finally {
                 context.close();
             }

Modified: webservices/axiom/experimental/axiom-spring-integration/src/test/resources/org/apache/axiom/spring/integration/mtom-client-context.xml
URL: http://svn.apache.org/viewvc/webservices/axiom/experimental/axiom-spring-integration/src/test/resources/org/apache/axiom/spring/integration/mtom-client-context.xml?rev=1708203&r1=1708202&r2=1708203&view=diff
==============================================================================
--- webservices/axiom/experimental/axiom-spring-integration/src/test/resources/org/apache/axiom/spring/integration/mtom-client-context.xml (original)
+++ webservices/axiom/experimental/axiom-spring-integration/src/test/resources/org/apache/axiom/spring/integration/mtom-client-context.xml Mon Oct 12 18:59:31 2015
@@ -28,10 +28,16 @@
                            http://ws.apache.org/axiom/spring-integration http://ws.apache.org/axiom/schema/spring-integration.xsd">
     <int:channel id="request"/>
     <int:gateway id="fileService" service-interface="org.apache.axiom.spring.integration.FileService" default-request-channel="request"/>
-    <oxm:jaxb2-marshaller id="marshaller">
-        <oxm:class-to-be-bound name="org.apache.axiom.spring.integration.GetFileRequest"/>
-        <oxm:class-to-be-bound name="org.apache.axiom.spring.integration.GetFileResponse"/>
-    </oxm:jaxb2-marshaller>
+    <!-- TODO: can't use oxm:jaxb2-marshaller here because mtomEnabled is not supported -->
+    <bean id="marshaller" class="org.springframework.oxm.jaxb.Jaxb2Marshaller">
+        <property name="classesToBeBound">
+            <array>
+                <value>org.apache.axiom.spring.integration.GetFileRequest</value>
+                <value>org.apache.axiom.spring.integration.GetFileResponse</value>
+            </array>
+        </property>
+        <property name="mtomEnabled" value="true"/>
+    </bean>
     <axiom:ws-outbound-gateway request-channel="request" url="http://localhost:${port}/mtom"
                                marshaller="marshaller" unmarshaller="marshaller"/>
 </beans>