You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commons-dev@ws.apache.org by ve...@apache.org on 2009/03/07 17:32:06 UTC

svn commit: r751290 - in /webservices/commons/trunk/modules/transport/modules/base: ./ src/main/java/org/apache/axis2/format/ src/test/java/org/apache/axis2/format/

Author: veithen
Date: Sat Mar  7 16:32:06 2009
New Revision: 751290

URL: http://svn.apache.org/viewvc?rev=751290&view=rev
Log:
Added code to optimize text/plain and binary/octet-stream handling.

Added:
    webservices/commons/trunk/modules/transport/modules/base/src/main/java/org/apache/axis2/format/ManagedDataSource.java   (with props)
    webservices/commons/trunk/modules/transport/modules/base/src/main/java/org/apache/axis2/format/ManagedDataSourceFactory.java   (with props)
    webservices/commons/trunk/modules/transport/modules/base/src/main/java/org/apache/axis2/format/WrappedTextNodeOMDataSource.java   (with props)
    webservices/commons/trunk/modules/transport/modules/base/src/main/java/org/apache/axis2/format/WrappedTextNodeStreamReader.java   (contents, props changed)
      - copied, changed from r750138, synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/util/WrappedTextNodeStreamReader.java
    webservices/commons/trunk/modules/transport/modules/base/src/test/java/org/apache/axis2/format/ManagedDataSourceFactoryTest.java   (with props)
    webservices/commons/trunk/modules/transport/modules/base/src/test/java/org/apache/axis2/format/WrappedTextNodeStreamReaderTest.java   (contents, props changed)
      - copied, changed from r750138, synapse/trunk/java/modules/core/src/test/java/org/apache/synapse/util/WrappedTextNodeStreamReaderTest.java
Modified:
    webservices/commons/trunk/modules/transport/modules/base/pom.xml
    webservices/commons/trunk/modules/transport/modules/base/src/main/java/org/apache/axis2/format/DataSourceMessageBuilder.java
    webservices/commons/trunk/modules/transport/modules/base/src/main/java/org/apache/axis2/format/PlainTextBuilder.java

Modified: webservices/commons/trunk/modules/transport/modules/base/pom.xml
URL: http://svn.apache.org/viewvc/webservices/commons/trunk/modules/transport/modules/base/pom.xml?rev=751290&r1=751289&r2=751290&view=diff
==============================================================================
--- webservices/commons/trunk/modules/transport/modules/base/pom.xml (original)
+++ webservices/commons/trunk/modules/transport/modules/base/pom.xml Sat Mar  7 16:32:06 2009
@@ -138,5 +138,11 @@
             <artifactId>junit</artifactId>
             <scope>test</scope>
         </dependency>
+        <dependency>
+            <groupId>xmlunit</groupId>
+            <artifactId>xmlunit</artifactId>
+            <version>1.2</version>
+            <scope>test</scope>
+        </dependency>
     </dependencies>
 </project>

Modified: webservices/commons/trunk/modules/transport/modules/base/src/main/java/org/apache/axis2/format/DataSourceMessageBuilder.java
URL: http://svn.apache.org/viewvc/webservices/commons/trunk/modules/transport/modules/base/src/main/java/org/apache/axis2/format/DataSourceMessageBuilder.java?rev=751290&r1=751289&r2=751290&view=diff
==============================================================================
--- webservices/commons/trunk/modules/transport/modules/base/src/main/java/org/apache/axis2/format/DataSourceMessageBuilder.java (original)
+++ webservices/commons/trunk/modules/transport/modules/base/src/main/java/org/apache/axis2/format/DataSourceMessageBuilder.java Sat Mar  7 16:32:06 2009
@@ -37,19 +37,39 @@
  * provide the message payload as a data source, then the method defined by this
  * interface should be preferred over the method defined by {@link Builder}.
  * <p>
- * When a message builder is invoked through the basic {@link Builder} interface,
- * it is the responsibility of the transport to close the input stream once the
- * message has been processed, and the builder is not required to consume the input
- * stream immediately. On the other hand, when the builder is invoked through this extension
- * interface, the transport is only responsible for ensuring that the {@link DataSource}
- * remains valid for the whole lifecycle of the message. It is the responsibility of the
- * builder to acquire the input stream and to make sure that it is closed when no longer
- * needed. This important difference is the reason why there is no
- * DataSourceMessageBuilderAdapter class.
- * <p>
  * Implementing this interface helps optimizing message processing with transports
  * that use messaging providers that store messages in memory or on the file system.
  * Examples are JMS and VFS.
+ * <p>
+ * The builder will typically expose the data source directly or indirectly through
+ * the returned {@link OMElement}, e.g. by adding to the tree an {@link org.apache.axiom.om.OMText}
+ * or {@link org.apache.axiom.om.OMDataSource} node referencing the data source.
+ * This means that the builder will not be able to guarantee that all streams requested
+ * from the data source are properly closed. Note that code accessing the returned
+ * {@link OMElement} can't be expected to take care of this since in many cases the fact
+ * that a data source is being used is completely transparent to that code.
+ * It is therefore the responsibility of the transport to make sure that all resources linked to
+ * the data source itself as well as any open stream requested from that data source are properly
+ * released after the message has been processed. Depending on the type of transport, there are
+ * three possible cases:
+ * <ol>
+ *   <li>All resources allocated to the data source or streams requested from it are
+ *       memory based. In that case the garbage collector will take care of freeing
+ *       these resources and the transport should simply pass the data source object
+ *       to the builder.</li>
+ *   <li>There are operation system resources linked to the data source and open
+ *       streams will become invalid when these resources are freed, i.e.
+ *       it is not required that all streams be closed explicitly.
+ *       In this case the transport only needs to take care to properly dispose of
+ *       the data source after the message has been processed by the Axis2 engine.</li>
+ *   <li>Requesting a stream from the data source allocates operation system resources
+ *       (e.g. a network connection) that remain linked to the stream, i.e. all streams requested
+ *       from the data source must be closed properly. In that case the transport should use
+ *       {@link ManagedDataSourceFactory#create(DataSource)} to wrap the original data source
+ *       before passing it to the builder. After the message has been processed it should
+ *       then call {@link ManagedDataSource#destroy()} on the wrapper to close all remaining
+ *       open streams.</li>
+ * </ol>
  */
 public interface DataSourceMessageBuilder extends Builder {
     public OMElement processDocument(DataSource dataSource, String contentType,

Added: webservices/commons/trunk/modules/transport/modules/base/src/main/java/org/apache/axis2/format/ManagedDataSource.java
URL: http://svn.apache.org/viewvc/webservices/commons/trunk/modules/transport/modules/base/src/main/java/org/apache/axis2/format/ManagedDataSource.java?rev=751290&view=auto
==============================================================================
--- webservices/commons/trunk/modules/transport/modules/base/src/main/java/org/apache/axis2/format/ManagedDataSource.java (added)
+++ webservices/commons/trunk/modules/transport/modules/base/src/main/java/org/apache/axis2/format/ManagedDataSource.java Sat Mar  7 16:32:06 2009
@@ -0,0 +1,36 @@
+/*
+ *  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.axis2.format;
+
+import javax.activation.DataSource;
+
+/**
+ * Managed data source.
+ * This type of data source keeps track of the streams that have been
+ * requested using {@link DataSource#getInputStream()} and allows to
+ * forcibly close these streams. Any existing data source can be converted
+ * to a managed data source using {@link ManagedDataSourceFactory#create(DataSource)}. 
+ */
+public interface ManagedDataSource extends DataSource {
+    /**
+     * Close all streams that have been requested from this data source
+     * and that are not yet closed.
+     */
+    void destroy();
+}

Propchange: webservices/commons/trunk/modules/transport/modules/base/src/main/java/org/apache/axis2/format/ManagedDataSource.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: webservices/commons/trunk/modules/transport/modules/base/src/main/java/org/apache/axis2/format/ManagedDataSourceFactory.java
URL: http://svn.apache.org/viewvc/webservices/commons/trunk/modules/transport/modules/base/src/main/java/org/apache/axis2/format/ManagedDataSourceFactory.java?rev=751290&view=auto
==============================================================================
--- webservices/commons/trunk/modules/transport/modules/base/src/main/java/org/apache/axis2/format/ManagedDataSourceFactory.java (added)
+++ webservices/commons/trunk/modules/transport/modules/base/src/main/java/org/apache/axis2/format/ManagedDataSourceFactory.java Sat Mar  7 16:32:06 2009
@@ -0,0 +1,131 @@
+/*
+ *  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.axis2.format;
+
+import java.io.FilterInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.lang.reflect.InvocationHandler;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.lang.reflect.Proxy;
+import java.util.Collections;
+import java.util.LinkedList;
+import java.util.List;
+
+import javax.activation.DataSource;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+/**
+ * Utility class to create {@link ManagedDataSource} objects.
+ */
+public class ManagedDataSourceFactory {
+    private static class ManagedInputStream extends FilterInputStream {
+        private DataSourceManager manager;
+        
+        public ManagedInputStream(DataSourceManager manager, InputStream parent) {
+            super(parent);
+            this.manager = manager;
+        }
+
+        @Override
+        public void close() throws IOException {
+            if (manager != null) {
+                manager.notifyStreamClosed(this);
+                manager = null;
+            }
+            super.close();
+        }
+    }
+    
+    private static class DataSourceManager implements InvocationHandler {
+        private static final Log log = LogFactory.getLog(DataSourceManager.class);
+        
+        private static final Method getInputStreamMethod;
+        private static final Method destroyMethod;
+        
+        static {
+            try {
+                getInputStreamMethod = DataSource.class.getMethod("getInputStream");
+                destroyMethod = ManagedDataSource.class.getMethod("destroy");
+            } catch (NoSuchMethodException ex) {
+                throw new NoSuchMethodError(ex.getMessage());
+            }
+        }
+
+        private final DataSource dataSource;
+        private final List<ManagedInputStream> openStreams = Collections.synchronizedList(
+                new LinkedList<ManagedInputStream>());
+        
+        public DataSourceManager(DataSource dataSource) {
+            this.dataSource = dataSource;
+        }
+        
+        public void notifyStreamClosed(ManagedInputStream managedInputStream) {
+            if (!openStreams.remove(managedInputStream)) {
+                throw new IllegalStateException();
+            }
+        }
+
+        public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
+            try {
+                if (method.equals(getInputStreamMethod)) {
+                    InputStream in = (InputStream)method.invoke(dataSource, args);
+                    ManagedInputStream in2 = new ManagedInputStream(this, in);
+                    openStreams.add(in2);
+                    return in2;
+                } else if (method.equals(destroyMethod)) {
+                    while (!openStreams.isEmpty()) {
+                        try {
+                            openStreams.get(0).close();
+                        } catch (IOException ex) {
+                            log.warn("Exception when closing open stream from managed data source", ex);
+                        }
+                    }
+                    return null;
+                } else {
+                    return method.invoke(dataSource, args);
+                }
+            } catch (InvocationTargetException ex) {
+                throw ex.getCause();
+            }
+        }
+        
+    }
+    
+    /**
+     * Create a {@link ManagedDataSource} proxy for an existing data source.
+     * This will create a dynamic proxy implementing the same interfaces as
+     * the original data source.
+     * 
+     * @param ds the original data source
+     * @return a data source proxy implementing {@link ManagedDataSource}
+     */
+    public static ManagedDataSource create(DataSource ds) {
+        Class<?>[] orgIfaces = ds.getClass().getInterfaces();
+        Class<?>[] ifaces = new Class[orgIfaces.length+1];
+        ifaces[0] = ManagedDataSource.class;
+        System.arraycopy(orgIfaces, 0, ifaces, 1, orgIfaces.length);
+        return (ManagedDataSource)Proxy.newProxyInstance(
+                ManagedDataSourceFactory.class.getClassLoader(), ifaces,
+                new DataSourceManager(ds));
+    }
+}

Propchange: webservices/commons/trunk/modules/transport/modules/base/src/main/java/org/apache/axis2/format/ManagedDataSourceFactory.java
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: webservices/commons/trunk/modules/transport/modules/base/src/main/java/org/apache/axis2/format/PlainTextBuilder.java
URL: http://svn.apache.org/viewvc/webservices/commons/trunk/modules/transport/modules/base/src/main/java/org/apache/axis2/format/PlainTextBuilder.java?rev=751290&r1=751289&r2=751290&view=diff
==============================================================================
--- webservices/commons/trunk/modules/transport/modules/base/src/main/java/org/apache/axis2/format/PlainTextBuilder.java (original)
+++ webservices/commons/trunk/modules/transport/modules/base/src/main/java/org/apache/axis2/format/PlainTextBuilder.java Sat Mar  7 16:32:06 2009
@@ -21,12 +21,15 @@
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.Reader;
+import java.nio.charset.Charset;
 
+import javax.activation.DataSource;
 import javax.xml.namespace.QName;
 
 import org.apache.axiom.om.OMAbstractFactory;
 import org.apache.axiom.om.OMElement;
 import org.apache.axiom.om.OMFactory;
+import org.apache.axiom.om.impl.llom.OMSourcedElementImpl;
 import org.apache.axis2.AxisFault;
 import org.apache.axis2.builder.BuilderUtil;
 import org.apache.axis2.context.MessageContext;
@@ -49,8 +52,8 @@
  * is specified on the content type, the default charset encoding specified by
  * {@link MessageContext#DEFAULT_CHAR_SET_ENCODING} is used.
  */
-public class PlainTextBuilder implements TextMessageBuilder {
-    private OMElement buildMessage(String textPayload, MessageContext msgContext) {
+public class PlainTextBuilder implements TextMessageBuilder, DataSourceMessageBuilder {
+    private static QName getWrapperQName(MessageContext msgContext) {
         QName wrapperQName = BaseConstants.DEFAULT_TEXT_WRAPPER;
         if (msgContext.getAxisService() != null) {
             Parameter wrapperParam
@@ -58,10 +61,13 @@
             if (wrapperParam != null) {
                 wrapperQName = BaseUtils.getQNameFromString(wrapperParam.getValue());
             }
-        }        
-
+        }
+        return wrapperQName;
+    }
+    
+    private OMElement buildMessage(String textPayload, MessageContext msgContext) {
         OMFactory factory = OMAbstractFactory.getOMFactory();
-        OMElement wrapper = factory.createOMElement(wrapperQName, null);
+        OMElement wrapper = factory.createOMElement(getWrapperQName(msgContext), null);
         wrapper.addChild(factory.createOMText(textPayload));
         return wrapper;
     }
@@ -93,4 +99,15 @@
                                      MessageContext msgContext) throws AxisFault {
         return buildMessage(content, msgContext);
     }
+
+    public OMElement processDocument(DataSource dataSource,
+                                     String contentType,
+                                     MessageContext msgContext) throws AxisFault {
+        
+        OMFactory factory = OMAbstractFactory.getOMFactory();
+        Charset cs = Charset.forName(BuilderUtil.getCharSetEncoding(contentType));
+        QName wrapperQName = getWrapperQName(msgContext);
+        return new OMSourcedElementImpl(wrapperQName, factory,
+                new WrappedTextNodeOMDataSource(wrapperQName, dataSource, cs));
+    }
 }

Added: webservices/commons/trunk/modules/transport/modules/base/src/main/java/org/apache/axis2/format/WrappedTextNodeOMDataSource.java
URL: http://svn.apache.org/viewvc/webservices/commons/trunk/modules/transport/modules/base/src/main/java/org/apache/axis2/format/WrappedTextNodeOMDataSource.java?rev=751290&view=auto
==============================================================================
--- webservices/commons/trunk/modules/transport/modules/base/src/main/java/org/apache/axis2/format/WrappedTextNodeOMDataSource.java (added)
+++ webservices/commons/trunk/modules/transport/modules/base/src/main/java/org/apache/axis2/format/WrappedTextNodeOMDataSource.java Sat Mar  7 16:32:06 2009
@@ -0,0 +1,114 @@
+/*
+ *  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.axis2.format;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.OutputStream;
+import java.io.UnsupportedEncodingException;
+import java.io.Writer;
+import java.nio.charset.Charset;
+
+import javax.activation.DataSource;
+import javax.xml.namespace.QName;
+import javax.xml.stream.XMLStreamException;
+import javax.xml.stream.XMLStreamReader;
+import javax.xml.stream.XMLStreamWriter;
+
+import org.apache.axiom.om.OMDataSourceExt;
+import org.apache.axiom.om.OMOutputFormat;
+import org.apache.axiom.om.ds.OMDataSourceExtBase;
+import org.apache.axiom.om.impl.MTOMXMLStreamWriter;
+import org.apache.axiom.om.impl.serialize.StreamingOMSerializer;
+import org.apache.axiom.om.util.StAXUtils;
+
+/**
+ * {@link org.apache.axiom.om.OMDataSource} implementation that represents a text node wrapped
+ * inside an element. The text data is provided by a {@link DataSource} object.
+ */
+public class WrappedTextNodeOMDataSource extends OMDataSourceExtBase {
+    private final QName wrapperElementName;
+    private final DataSource binaryData;
+    private final Charset charset;
+
+    public WrappedTextNodeOMDataSource(QName wrapperElementName, DataSource binaryData,
+            Charset charset) {
+        this.wrapperElementName = wrapperElementName;
+        this.binaryData = binaryData;
+        this.charset = charset;
+    }
+    
+    @Override
+    public void serialize(OutputStream out, OMOutputFormat format) throws XMLStreamException {
+        XMLStreamWriter writer = new MTOMXMLStreamWriter(out, format);
+        serialize(writer);
+        writer.flush();
+    }
+
+    @Override
+    public void serialize(Writer writer, OMOutputFormat format) throws XMLStreamException {
+        MTOMXMLStreamWriter xmlWriter =
+            new MTOMXMLStreamWriter(StAXUtils.createXMLStreamWriter(writer));
+        xmlWriter.setOutputFormat(format);
+        serialize(xmlWriter);
+        xmlWriter.flush();
+    }
+
+    @Override
+    public void serialize(XMLStreamWriter xmlWriter) throws XMLStreamException {
+        StreamingOMSerializer serializer = new StreamingOMSerializer();
+        serializer.serialize(getReader(), xmlWriter);
+    }
+
+    public XMLStreamReader getReader() throws XMLStreamException {
+        InputStream is;
+        try {
+            is = binaryData.getInputStream();
+        }
+        catch (IOException ex) {
+            throw new XMLStreamException(ex);
+        }
+        return new WrappedTextNodeStreamReader(wrapperElementName, new InputStreamReader(is, charset));
+    }
+
+    public Object getObject() {
+        return binaryData;
+    }
+
+    public boolean isDestructiveRead() {
+        return false;
+    }
+
+    public boolean isDestructiveWrite() {
+        return false;
+    }
+    
+    public byte[] getXMLBytes(String encoding) throws UnsupportedEncodingException {
+        throw new UnsupportedOperationException();
+    }
+
+    public void close() {
+    }
+
+    public OMDataSourceExt copy() {
+        return new WrappedTextNodeOMDataSource(wrapperElementName, binaryData, charset);
+    }
+}

Propchange: webservices/commons/trunk/modules/transport/modules/base/src/main/java/org/apache/axis2/format/WrappedTextNodeOMDataSource.java
------------------------------------------------------------------------------
    svn:eol-style = native

Copied: webservices/commons/trunk/modules/transport/modules/base/src/main/java/org/apache/axis2/format/WrappedTextNodeStreamReader.java (from r750138, synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/util/WrappedTextNodeStreamReader.java)
URL: http://svn.apache.org/viewvc/webservices/commons/trunk/modules/transport/modules/base/src/main/java/org/apache/axis2/format/WrappedTextNodeStreamReader.java?p2=webservices/commons/trunk/modules/transport/modules/base/src/main/java/org/apache/axis2/format/WrappedTextNodeStreamReader.java&p1=synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/util/WrappedTextNodeStreamReader.java&r1=750138&r2=751290&rev=751290&view=diff
==============================================================================
--- synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/util/WrappedTextNodeStreamReader.java (original)
+++ webservices/commons/trunk/modules/transport/modules/base/src/main/java/org/apache/axis2/format/WrappedTextNodeStreamReader.java Sat Mar  7 16:32:06 2009
@@ -17,7 +17,7 @@
  *  under the License.
  */
 
-package org.apache.synapse.util;
+package org.apache.axis2.format;
 
 import java.io.IOException;
 import java.io.Reader;
@@ -35,7 +35,7 @@
 import org.apache.commons.io.IOUtils;
 
 /**
- * {@link javax.xml.stream.XMLStreamException XMLInputStreamReader} implementation that
+ * {@link XMLInputStreamReader} implementation that
  * represents a text node wrapped inside an element. The text data is provided by a
  * {@link java.io.Reader Reader}.
  * <p>
@@ -66,6 +66,8 @@
  * "parser" is not coalescing.
  * 
  */
+// TODO: This class has been copied from Synapse (package org.apache.synapse.util).
+//       Once it has been moved to Axis2 or Axiom, remove the duplicate from Synapse.
 public class WrappedTextNodeStreamReader implements XMLStreamReader {
     /**
      * Location object returned by {@link #getLocation()}.

Propchange: webservices/commons/trunk/modules/transport/modules/base/src/main/java/org/apache/axis2/format/WrappedTextNodeStreamReader.java
------------------------------------------------------------------------------
    svn:mergeinfo = 

Added: webservices/commons/trunk/modules/transport/modules/base/src/test/java/org/apache/axis2/format/ManagedDataSourceFactoryTest.java
URL: http://svn.apache.org/viewvc/webservices/commons/trunk/modules/transport/modules/base/src/test/java/org/apache/axis2/format/ManagedDataSourceFactoryTest.java?rev=751290&view=auto
==============================================================================
--- webservices/commons/trunk/modules/transport/modules/base/src/test/java/org/apache/axis2/format/ManagedDataSourceFactoryTest.java (added)
+++ webservices/commons/trunk/modules/transport/modules/base/src/test/java/org/apache/axis2/format/ManagedDataSourceFactoryTest.java Sat Mar  7 16:32:06 2009
@@ -0,0 +1,59 @@
+/*
+ *  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.axis2.format;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+
+import javax.activation.DataSource;
+
+import junit.framework.TestCase;
+
+public class ManagedDataSourceFactoryTest extends TestCase {
+    /**
+     * Test that exceptions thrown by {@link DataSource#getInputStream()} are
+     * correctly propagated. Since {@link ManagedDataSourceFactory} uses dynamic
+     * proxies this aspect needs particular attention.
+     */
+    public void testExceptionPropagation() {
+        ManagedDataSource ds = ManagedDataSourceFactory.create(new DataSource() {
+            public String getContentType() {
+                return null;
+            }
+
+            public InputStream getInputStream() throws IOException {
+                throw new IOException("TEST");
+            }
+
+            public OutputStream getOutputStream() throws IOException {
+                return null;
+            }
+            
+            public String getName() {
+                return null;
+            }
+        });
+        try {
+            ds.getInputStream();
+        } catch (IOException ex) {
+            assertEquals("TEST", ex.getMessage());
+        }
+    }
+}

Propchange: webservices/commons/trunk/modules/transport/modules/base/src/test/java/org/apache/axis2/format/ManagedDataSourceFactoryTest.java
------------------------------------------------------------------------------
    svn:eol-style = native

Copied: webservices/commons/trunk/modules/transport/modules/base/src/test/java/org/apache/axis2/format/WrappedTextNodeStreamReaderTest.java (from r750138, synapse/trunk/java/modules/core/src/test/java/org/apache/synapse/util/WrappedTextNodeStreamReaderTest.java)
URL: http://svn.apache.org/viewvc/webservices/commons/trunk/modules/transport/modules/base/src/test/java/org/apache/axis2/format/WrappedTextNodeStreamReaderTest.java?p2=webservices/commons/trunk/modules/transport/modules/base/src/test/java/org/apache/axis2/format/WrappedTextNodeStreamReaderTest.java&p1=synapse/trunk/java/modules/core/src/test/java/org/apache/synapse/util/WrappedTextNodeStreamReaderTest.java&r1=750138&r2=751290&rev=751290&view=diff
==============================================================================
--- synapse/trunk/java/modules/core/src/test/java/org/apache/synapse/util/WrappedTextNodeStreamReaderTest.java (original)
+++ webservices/commons/trunk/modules/transport/modules/base/src/test/java/org/apache/axis2/format/WrappedTextNodeStreamReaderTest.java Sat Mar  7 16:32:06 2009
@@ -17,7 +17,7 @@
  *  under the License.
  */
 
-package org.apache.synapse.util;
+package org.apache.axis2.format;
 
 import java.io.StringReader;
 import java.io.StringWriter;
@@ -30,7 +30,6 @@
 import org.apache.axiom.om.OMElement;
 import org.apache.axiom.om.impl.builder.StAXOMBuilder;
 import org.apache.axiom.om.impl.serialize.StreamingOMSerializer;
-import org.apache.synapse.util.WrappedTextNodeStreamReader;
 import org.custommonkey.xmlunit.XMLTestCase;
 
 public class WrappedTextNodeStreamReaderTest extends XMLTestCase {

Propchange: webservices/commons/trunk/modules/transport/modules/base/src/test/java/org/apache/axis2/format/WrappedTextNodeStreamReaderTest.java
------------------------------------------------------------------------------
    svn:mergeinfo =