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/04/13 23:16:57 UTC

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

Author: veithen
Date: Mon Apr 13 21:16:57 2009
New Revision: 764611

URL: http://svn.apache.org/viewvc?rev=764611&view=rev
Log:
PlainTextBuilder: Avoid usage of IOUtils.toString and defer building the text nodes when the message is provided as an InputStream or Reader.

Added:
    webservices/commons/trunk/modules/transport/modules/base/src/main/java/org/apache/axis2/format/WrappedTextNodeOMDataSourceFromDataSource.java   (contents, props changed)
      - copied, changed from r764602, webservices/commons/trunk/modules/transport/modules/base/src/main/java/org/apache/axis2/format/WrappedTextNodeOMDataSource.java
    webservices/commons/trunk/modules/transport/modules/base/src/main/java/org/apache/axis2/format/WrappedTextNodeOMDataSourceFromReader.java   (with props)
Removed:
    webservices/commons/trunk/modules/transport/modules/base/src/main/java/org/apache/axis2/format/WrappedTextNodeOMDataSource.java
Modified:
    webservices/commons/trunk/modules/transport/modules/base/src/main/java/org/apache/axis2/format/PlainTextBuilder.java
    webservices/commons/trunk/modules/transport/modules/base/src/test/java/org/apache/axis2/format/ElementHelperTest.java
    webservices/commons/trunk/modules/transport/modules/testkit/src/main/java/org/apache/axis2/transport/testkit/message/AxisMessage.java

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=764611&r1=764610&r2=764611&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 Mon Apr 13 21:16:57 2009
@@ -18,9 +18,10 @@
  */
 package org.apache.axis2.format;
 
-import java.io.IOException;
 import java.io.InputStream;
+import java.io.InputStreamReader;
 import java.io.Reader;
+import java.io.UnsupportedEncodingException;
 import java.nio.charset.Charset;
 
 import javax.activation.DataSource;
@@ -34,7 +35,6 @@
 import org.apache.axis2.builder.BuilderUtil;
 import org.apache.axis2.context.MessageContext;
 import org.apache.axis2.description.Parameter;
-import org.apache.commons.io.IOUtils;
 import org.apache.axis2.transport.base.BaseConstants;
 import org.apache.axis2.transport.base.BaseUtils;
 
@@ -65,39 +65,40 @@
         return wrapperQName;
     }
     
-    private OMElement buildMessage(String textPayload, MessageContext msgContext) {
-        OMFactory factory = OMAbstractFactory.getOMFactory();
-        OMElement wrapper = factory.createOMElement(getWrapperQName(msgContext), null);
-        wrapper.addChild(factory.createOMText(textPayload));
-        return wrapper;
-    }
-    
     public OMElement processDocument(InputStream inputStream,
                                      String contentType,
                                      MessageContext msgContext) throws AxisFault {
 
+        OMFactory factory = OMAbstractFactory.getOMFactory();
         String charSetEnc = BuilderUtil.getCharSetEncoding(contentType);
+        QName wrapperQName = getWrapperQName(msgContext);
+        Reader reader;
         try {
-            return buildMessage(IOUtils.toString(inputStream, charSetEnc), msgContext);
-        } catch (IOException ex) {
-            throw new AxisFault("Unable to read message payload", ex);
+            reader = new InputStreamReader(inputStream, charSetEnc);
+        } catch (UnsupportedEncodingException ex) {
+            throw new AxisFault("Unsupported encoding: " + charSetEnc, ex);
         }
+        return new OMSourcedElementImpl(wrapperQName, factory,
+                new WrappedTextNodeOMDataSourceFromReader(wrapperQName, reader));
     }
 
     public OMElement processDocument(Reader reader,
                                      String contentType,
                                      MessageContext msgContext) throws AxisFault {
-        try {
-            return buildMessage(IOUtils.toString(reader), msgContext);
-        } catch (IOException ex) {
-            throw new AxisFault("Unable to read message payload", ex);
-        }
+        
+        OMFactory factory = OMAbstractFactory.getOMFactory();
+        QName wrapperQName = getWrapperQName(msgContext);
+        return new OMSourcedElementImpl(wrapperQName, factory,
+                new WrappedTextNodeOMDataSourceFromReader(wrapperQName, reader));
     }
 
     public OMElement processDocument(String content,
                                      String contentType,
                                      MessageContext msgContext) throws AxisFault {
-        return buildMessage(content, msgContext);
+        OMFactory factory = OMAbstractFactory.getOMFactory();
+        OMElement wrapper = factory.createOMElement(getWrapperQName(msgContext), null);
+        factory.createOMText(wrapper, content);
+        return wrapper;
     }
 
     public OMElement processDocument(DataSource dataSource,
@@ -108,6 +109,6 @@
         Charset cs = Charset.forName(BuilderUtil.getCharSetEncoding(contentType));
         QName wrapperQName = getWrapperQName(msgContext);
         return new OMSourcedElementImpl(wrapperQName, factory,
-                new WrappedTextNodeOMDataSource(wrapperQName, dataSource, cs));
+                new WrappedTextNodeOMDataSourceFromDataSource(wrapperQName, dataSource, cs));
     }
 }

Copied: webservices/commons/trunk/modules/transport/modules/base/src/main/java/org/apache/axis2/format/WrappedTextNodeOMDataSourceFromDataSource.java (from r764602, 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/WrappedTextNodeOMDataSourceFromDataSource.java?p2=webservices/commons/trunk/modules/transport/modules/base/src/main/java/org/apache/axis2/format/WrappedTextNodeOMDataSourceFromDataSource.java&p1=webservices/commons/trunk/modules/transport/modules/base/src/main/java/org/apache/axis2/format/WrappedTextNodeOMDataSource.java&r1=764602&r2=764611&rev=764611&view=diff
==============================================================================
--- webservices/commons/trunk/modules/transport/modules/base/src/main/java/org/apache/axis2/format/WrappedTextNodeOMDataSource.java (original)
+++ webservices/commons/trunk/modules/transport/modules/base/src/main/java/org/apache/axis2/format/WrappedTextNodeOMDataSourceFromDataSource.java Mon Apr 13 21:16:57 2009
@@ -44,12 +44,12 @@
  * {@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 {
+public class WrappedTextNodeOMDataSourceFromDataSource extends OMDataSourceExtBase {
     private final QName wrapperElementName;
     private final DataSource binaryData;
     private final Charset charset;
 
-    public WrappedTextNodeOMDataSource(QName wrapperElementName, DataSource binaryData,
+    public WrappedTextNodeOMDataSourceFromDataSource(QName wrapperElementName, DataSource binaryData,
             Charset charset) {
         this.wrapperElementName = wrapperElementName;
         this.binaryData = binaryData;
@@ -109,6 +109,6 @@
     }
 
     public OMDataSourceExt copy() {
-        return new WrappedTextNodeOMDataSource(wrapperElementName, binaryData, charset);
+        return new WrappedTextNodeOMDataSourceFromDataSource(wrapperElementName, binaryData, charset);
     }
 }

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

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

Added: webservices/commons/trunk/modules/transport/modules/base/src/main/java/org/apache/axis2/format/WrappedTextNodeOMDataSourceFromReader.java
URL: http://svn.apache.org/viewvc/webservices/commons/trunk/modules/transport/modules/base/src/main/java/org/apache/axis2/format/WrappedTextNodeOMDataSourceFromReader.java?rev=764611&view=auto
==============================================================================
--- webservices/commons/trunk/modules/transport/modules/base/src/main/java/org/apache/axis2/format/WrappedTextNodeOMDataSourceFromReader.java (added)
+++ webservices/commons/trunk/modules/transport/modules/base/src/main/java/org/apache/axis2/format/WrappedTextNodeOMDataSourceFromReader.java Mon Apr 13 21:16:57 2009
@@ -0,0 +1,99 @@
+/*
+ *  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.Reader;
+import java.io.UnsupportedEncodingException;
+import java.io.Writer;
+
+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 Reader} object. Since the stream
+ * can only be read once, this data source is destructive.
+ */
+public class WrappedTextNodeOMDataSourceFromReader extends OMDataSourceExtBase {
+    private final QName wrapperElementName;
+    private final Reader reader;
+    
+    public WrappedTextNodeOMDataSourceFromReader(QName wrapperElementName, Reader reader) {
+        this.wrapperElementName = wrapperElementName;
+        this.reader = reader;
+    }
+
+    @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 {
+        return new WrappedTextNodeStreamReader(wrapperElementName, reader);
+    }
+
+    public Object getObject() {
+        return null;
+    }
+
+    public boolean isDestructiveRead() {
+        return true;
+    }
+
+    public boolean isDestructiveWrite() {
+        return true;
+    }
+    
+    public byte[] getXMLBytes(String encoding) throws UnsupportedEncodingException {
+        throw new UnsupportedOperationException();
+    }
+
+    public void close() {
+        try {
+            reader.close();
+        } catch (IOException ex) {
+            // Ignore
+        }
+    }
+
+    public OMDataSourceExt copy() {
+        throw new UnsupportedOperationException();
+    }
+}

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

Modified: webservices/commons/trunk/modules/transport/modules/base/src/test/java/org/apache/axis2/format/ElementHelperTest.java
URL: http://svn.apache.org/viewvc/webservices/commons/trunk/modules/transport/modules/base/src/test/java/org/apache/axis2/format/ElementHelperTest.java?rev=764611&r1=764610&r2=764611&view=diff
==============================================================================
--- webservices/commons/trunk/modules/transport/modules/base/src/test/java/org/apache/axis2/format/ElementHelperTest.java (original)
+++ webservices/commons/trunk/modules/transport/modules/base/src/test/java/org/apache/axis2/format/ElementHelperTest.java Mon Apr 13 21:16:57 2009
@@ -75,7 +75,7 @@
         QName qname = new QName("a");
         Charset cs = Charset.forName("ascii");
         OMSourcedElement element = new OMSourcedElementImpl(qname, factory,
-                new WrappedTextNodeOMDataSource(qname, ds, cs));
+                new WrappedTextNodeOMDataSourceFromDataSource(qname, ds, cs));
         Reader in = ElementHelper.getTextAsStream(element, true);
         assertFalse(in instanceof StringReader);
         compareStreams(new InputStreamReader(ds.getInputStream(), cs), in);
@@ -117,7 +117,7 @@
         DataSource ds = new RandomDataSource(665544, 32, 128, 20000000);
         QName qname = new QName("a");
         OMSourcedElement element = new OMSourcedElementImpl(qname, factory,
-                new WrappedTextNodeOMDataSource(qname, ds, Charset.forName("ascii")));
+                new WrappedTextNodeOMDataSourceFromDataSource(qname, ds, Charset.forName("ascii")));
         Reader in = new InputStreamReader(ds.getInputStream(), "ascii");
         Writer out = new CharacterStreamComparator(in);
         ElementHelper.writeTextTo(element, out, true); // cache doesn't matter here

Modified: webservices/commons/trunk/modules/transport/modules/testkit/src/main/java/org/apache/axis2/transport/testkit/message/AxisMessage.java
URL: http://svn.apache.org/viewvc/webservices/commons/trunk/modules/transport/modules/testkit/src/main/java/org/apache/axis2/transport/testkit/message/AxisMessage.java?rev=764611&r1=764610&r2=764611&view=diff
==============================================================================
--- webservices/commons/trunk/modules/transport/modules/testkit/src/main/java/org/apache/axis2/transport/testkit/message/AxisMessage.java (original)
+++ webservices/commons/trunk/modules/transport/modules/testkit/src/main/java/org/apache/axis2/transport/testkit/message/AxisMessage.java Mon Apr 13 21:16:57 2009
@@ -20,6 +20,8 @@
 package org.apache.axis2.transport.testkit.message;
 
 import org.apache.axiom.attachments.Attachments;
+import org.apache.axiom.om.OMElement;
+import org.apache.axiom.om.OMSourcedElement;
 import org.apache.axiom.soap.SOAPEnvelope;
 import org.apache.axis2.Constants;
 import org.apache.axis2.context.MessageContext;
@@ -40,6 +42,14 @@
     public AxisMessage(MessageContext msgContext) throws Exception {
         envelope = msgContext.getEnvelope();
         envelope.build();
+        
+        // TODO: quick & dirty hack to force expansion of OMSourceElement payloads
+        OMElement content = envelope.getBody().getFirstElement();
+        if (content instanceof OMSourcedElement) {
+            ((OMSourcedElement)content).getFirstOMChild();
+            ((OMSourcedElement)content).build();
+        }
+        
         if (msgContext.isDoingSwA()) {
             // Make sure that all attachments are read
             attachments = msgContext.getAttachmentMap();