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();