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 =