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 2018/12/19 00:32:10 UTC
svn commit: r1849254 - in /webservices/axiom/trunk:
aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/mixin/
axiom-api/src/main/java/org/apache/axiom/om/ src/site/markdown/
testing/axiom-testsuite/src/main/java/org/apache/axiom/ts/dimension/ser...
Author: veithen
Date: Wed Dec 19 00:32:10 2018
New Revision: 1849254
URL: http://svn.apache.org/viewvc?rev=1849254&view=rev
Log:
Introduce serialize methods in OMContainer that throw the right exceptions and that make it easier to switch between caching and non caching mode.
Modified:
webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/mixin/AxiomContainerSupport.aj
webservices/axiom/trunk/axiom-api/src/main/java/org/apache/axiom/om/OMContainer.java
webservices/axiom/trunk/src/site/markdown/roadmap.md
webservices/axiom/trunk/testing/axiom-testsuite/src/main/java/org/apache/axiom/ts/dimension/serialization/SerializeToOutputStream.java
webservices/axiom/trunk/testing/axiom-testsuite/src/main/java/org/apache/axiom/ts/dimension/serialization/SerializeToWriter.java
Modified: webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/mixin/AxiomContainerSupport.aj
URL: http://svn.apache.org/viewvc/webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/mixin/AxiomContainerSupport.aj?rev=1849254&r1=1849253&r2=1849254&view=diff
==============================================================================
--- webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/mixin/AxiomContainerSupport.aj (original)
+++ webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/mixin/AxiomContainerSupport.aj Wed Dec 19 00:32:10 2018
@@ -237,7 +237,7 @@ public aspect AxiomContainerSupport {
return result;
}
- private void AxiomContainer.serialize(XmlHandler handler, NamespaceContextProvider namespaceContextProvider, OMOutputFormat format, boolean cache) throws XMLStreamException {
+ private void AxiomContainer.serialize(XmlHandler handler, NamespaceContextProvider namespaceContextProvider, OMOutputFormat format, boolean cache) throws StreamException {
handler = new XmlDeclarationRewriterHandler(handler, format);
CoreElement contextElement = getContextElement();
if (contextElement != null) {
@@ -248,22 +248,41 @@ public aspect AxiomContainerSupport {
internalSerialize(handler, cache);
} catch (CoreModelException ex) {
throw AxiomExceptionTranslator.translate(ex);
+ }
+ }
+
+ private void AxiomContainer.serializeAndSurfaceIOException(XmlHandler handler, NamespaceContextProvider namespaceContextProvider, OMOutputFormat format, boolean cache) throws IOException {
+ try {
+ serialize(handler, namespaceContextProvider, format, cache);
} catch (StreamException ex) {
- throw AxiomExceptionTranslator.toXMLStreamException(ex);
+ Throwable cause = ex.getCause();
+ if (cause instanceof IOException) {
+ throw (IOException)cause;
+ } else {
+ throw new OMException(ex);
+ }
}
}
public abstract CoreElement AxiomContainer.getContextElement();
public final void AxiomContainer.serialize(XMLStreamWriter writer, boolean cache) throws XMLStreamException {
- serialize(new XMLStreamWriterHandler(writer), new XMLStreamWriterNamespaceContextProvider(writer), new OMOutputFormat(), cache);
+ try {
+ serialize(new XMLStreamWriterHandler(writer), new XMLStreamWriterNamespaceContextProvider(writer), new OMOutputFormat(), cache);
+ } catch (StreamException ex) {
+ throw AxiomExceptionTranslator.toXMLStreamException(ex);
+ }
}
- private void AxiomContainer.serialize(Writer writer, boolean cache) throws XMLStreamException {
+ public final void AxiomContainer.serialize(Writer writer, boolean cache) throws IOException {
serialize(writer, new OMOutputFormat(), cache);
}
- private void AxiomContainer.serialize(OutputStream out, final OMOutputFormat format, final boolean cache) throws XMLStreamException {
+ public final void AxiomContainer.serialize(OutputStream out, boolean cache) throws IOException {
+ serialize(out, new OMOutputFormat(), cache);
+ }
+
+ public final void AxiomContainer.serialize(OutputStream out, OMOutputFormat format, boolean cache) throws IOException {
String encoding = format.getCharSetEncoding();
if (encoding == null) { //Default encoding is UTF-8
format.setCharSetEncoding(encoding = OMOutputFormat.DEFAULT_CHAR_SET_ENCODING);
@@ -273,11 +292,7 @@ public aspect AxiomContainerSupport {
OutputStream rootPartOutputStream;
if (format.isOptimized()) {
multipartWriter = new OMMultipartWriter(out, format);
- try {
- rootPartOutputStream = multipartWriter.writeRootPart();
- } catch (IOException ex) {
- throw new XMLStreamException(ex);
- }
+ rootPartOutputStream = multipartWriter.writeRootPart();
} else {
multipartWriter = null;
rootPartOutputStream = out;
@@ -297,30 +312,26 @@ public aspect AxiomContainerSupport {
encoder = null;
}
- serialize(handler, null, format, cache);
+ serializeAndSurfaceIOException(handler, null, format, cache);
if (encoder != null) {
- try {
- rootPartOutputStream.close();
- for (String contentID : encoder.getContentIDs()) {
- DataHandler dataHandler = encoder.getDataHandler(contentID);
- if (cache || !(dataHandler instanceof PartDataHandler)) {
- multipartWriter.writePart(dataHandler, contentID);
- } else {
- OutputStream part = multipartWriter.writePart(dataHandler.getContentType(), contentID);
- IOUtils.copy(((PartDataHandler)dataHandler).getPart().getInputStream(false), part, -1);
- part.close();
- }
+ rootPartOutputStream.close();
+ for (String contentID : encoder.getContentIDs()) {
+ DataHandler dataHandler = encoder.getDataHandler(contentID);
+ if (cache || !(dataHandler instanceof PartDataHandler)) {
+ multipartWriter.writePart(dataHandler, contentID);
+ } else {
+ OutputStream part = multipartWriter.writePart(dataHandler.getContentType(), contentID);
+ IOUtils.copy(((PartDataHandler)dataHandler).getPart().getInputStream(false), part, -1);
+ part.close();
}
- multipartWriter.complete();
- } catch (IOException ex) {
- throw new XMLStreamException(ex);
}
+ multipartWriter.complete();
};
}
- private void AxiomContainer.serialize(Writer writer, OMOutputFormat format, boolean cache) throws XMLStreamException {
- serialize(new Serializer(writer), null, format, cache);
+ public final void AxiomContainer.serialize(Writer writer, OMOutputFormat format, boolean cache) throws IOException {
+ serializeAndSurfaceIOException(new Serializer(writer), null, format, cache);
}
public final void AxiomContainer.serialize(OutputStream output) throws XMLStreamException {
@@ -332,27 +343,51 @@ public aspect AxiomContainerSupport {
}
public final void AxiomContainer.serialize(OutputStream output, OMOutputFormat format) throws XMLStreamException {
- serialize(output, format, true);
+ try {
+ serialize(output, format, true);
+ } catch (IOException ex) {
+ throw new XMLStreamException(ex);
+ }
}
public final void AxiomContainer.serializeAndConsume(OutputStream output, OMOutputFormat format) throws XMLStreamException {
- serialize(output, format, false);
+ try {
+ serialize(output, format, false);
+ } catch (IOException ex) {
+ throw new XMLStreamException(ex);
+ }
}
public final void AxiomContainer.serialize(Writer writer) throws XMLStreamException {
- serialize(writer, true);
+ try {
+ serialize(writer, true);
+ } catch (IOException ex) {
+ throw new XMLStreamException(ex);
+ }
}
public final void AxiomContainer.serializeAndConsume(Writer writer) throws XMLStreamException {
- serialize(writer, false);
+ try {
+ serialize(writer, false);
+ } catch (IOException ex) {
+ throw new XMLStreamException(ex);
+ }
}
public final void AxiomContainer.serialize(Writer writer, OMOutputFormat format) throws XMLStreamException {
- serialize(writer, format, true);
+ try {
+ serialize(writer, format, true);
+ } catch (IOException ex) {
+ throw new XMLStreamException(ex);
+ }
}
public final void AxiomContainer.serializeAndConsume(Writer writer, OMOutputFormat format) throws XMLStreamException {
- serialize(writer, format, false);
+ try {
+ serialize(writer, format, false);
+ } catch (IOException ex) {
+ throw new XMLStreamException(ex);
+ }
}
public final void AxiomContainer.close(boolean build) {
Modified: webservices/axiom/trunk/axiom-api/src/main/java/org/apache/axiom/om/OMContainer.java
URL: http://svn.apache.org/viewvc/webservices/axiom/trunk/axiom-api/src/main/java/org/apache/axiom/om/OMContainer.java?rev=1849254&r1=1849253&r2=1849254&view=diff
==============================================================================
--- webservices/axiom/trunk/axiom-api/src/main/java/org/apache/axiom/om/OMContainer.java (original)
+++ webservices/axiom/trunk/axiom-api/src/main/java/org/apache/axiom/om/OMContainer.java Wed Dec 19 00:32:10 2018
@@ -32,6 +32,7 @@ import org.xml.sax.DTDHandler;
import org.xml.sax.ext.DeclHandler;
import org.xml.sax.ext.LexicalHandler;
+import java.io.IOException;
import java.io.OutputStream;
import java.io.Writer;
import java.util.Iterator;
@@ -146,32 +147,36 @@ public interface OMContainer extends OMS
void removeChildren();
/**
- * Serialize the node with caching enabled.
+ * Serialize the node.
* <p>
* This method will always serialize the infoset as plain XML. In particular, any {@link OMText}
* containing optimized binary will be inlined using base64 encoding.
*
* @param output
* the byte stream to write the serialized infoset to
- * @throws XMLStreamException
+ * @param cache
+ * indicates if caching should be enabled
+ * @throws IOException if the stream throws an {@link IOException}
*/
// TODO: need to specify which charset encoding the method will use, in particular for OMDocument nodes
- void serialize(OutputStream output) throws XMLStreamException;
+ void serialize(OutputStream output, boolean cache) throws IOException;
/**
- * Serialize the node with caching enabled.
+ * Serialize the node.
* <p>
* This method will always serialize the infoset as plain XML. In particular, any {@link OMText}
* containing optimized binary will be inlined using base64 encoding.
*
* @param writer
* the character stream to write the serialized infoset to
- * @throws XMLStreamException
+ * @param cache
+ * indicates if caching should be enabled
+ * @throws IOException if the stream throws an {@link IOException}
*/
- void serialize(Writer writer) throws XMLStreamException;
+ void serialize(Writer writer, boolean cache) throws IOException;
/**
- * Serialize the node with caching enabled.
+ * Serialize the node.
* <p>
* The format of the output is controlled by the provided {@link OMOutputFormat} object. In
* particular, {@link OMOutputFormat#setDoOptimize(boolean)} can be used to instruct this method
@@ -181,75 +186,67 @@ public interface OMContainer extends OMS
* the byte stream to write the serialized infoset to
* @param format
* the output format to use
- * @throws XMLStreamException
+ * @param cache
+ * indicates if caching should be enabled
+ * @throws IOException if the stream throws an {@link IOException}
*/
- void serialize(OutputStream output, OMOutputFormat format)
- throws XMLStreamException;
+ void serialize(OutputStream output, OMOutputFormat format, boolean cache) throws IOException;
/**
- * Serialize the node with caching enabled.
+ * Serialize the node.
*
* @param writer
* the character stream to write the serialized infoset to
* @param format
* the output format to use
- * @throws XMLStreamException
+ * @param cache
+ * indicates if caching should be enabled
+ * @throws IOException if the stream throws an {@link IOException}
*/
- void serialize(Writer writer, OMOutputFormat format)
- throws XMLStreamException;
+ // TODO: need to clarify what OMOutputFormat settings are actually taken into account
+ // (obviously the method can't produce XOP/MTOM and the charset encoding is ignored)
+ void serialize(Writer writer, OMOutputFormat format, boolean cache) throws IOException;
/**
- * Serialize the node without caching.
- * <p>
- * This method will always serialize the infoset as plain XML. In particular, any {@link OMText}
- * containing optimized binary will be inlined using base64 encoding.
- *
- * @param output
- * the byte stream to write the serialized infoset to
- * @throws XMLStreamException
+ * @deprecated Use {@link #serialize(OutputStream, boolean)} instead.
+ */
+ void serialize(OutputStream output) throws XMLStreamException;
+
+ /**
+ * @deprecated Use {@link #serialize(Writer, boolean)} instead.
+ */
+ void serialize(Writer writer) throws XMLStreamException;
+
+ /**
+ * @deprecated Use {@link #serialize(OutputStream, OMOutputFormat, boolean)} instead.
+ */
+ void serialize(OutputStream output, OMOutputFormat format) throws XMLStreamException;
+
+ /**
+ * @deprecated Use {@link #serialize(Writer, OMOutputFormat, boolean)} instead.
+ */
+ void serialize(Writer writer, OMOutputFormat format) throws XMLStreamException;
+
+ /**
+ * @deprecated Use {@link #serialize(OutputStream, boolean)} instead.
*/
void serializeAndConsume(OutputStream output)
throws XMLStreamException;
/**
- * Serialize the node without caching.
- * <p>
- * This method will always serialize the infoset as plain XML. In particular, any {@link OMText}
- * containing optimized binary will be inlined using base64 encoding.
- *
- * @param writer
- * the character stream to write the serialized infoset to
- * @throws XMLStreamException
+ * @deprecated Use {@link #serialize(Writer, boolean)} instead.
*/
void serializeAndConsume(Writer writer) throws XMLStreamException;
/**
- * Serialize the node without caching.
- * <p>
- * The format of the output is controlled by the provided {@link OMOutputFormat} object. In
- * particular, {@link OMOutputFormat#setDoOptimize(boolean)} can be used to instruct this method
- * to produce an XOP/MTOM encoded MIME message.
- *
- * @param output
- * the byte stream to write the serialized infoset to
- * @param format
- * the output format to use
- * @throws XMLStreamException
+ * @deprecated Use {@link #serialize(OutputStream, OMOutputFormat, boolean)} instead.
*/
void serializeAndConsume(OutputStream output, OMOutputFormat format)
throws XMLStreamException;
/**
- * Serialize the node without caching.
- *
- * @param writer
- * the character stream to write the serialized infoset to
- * @param format
- * the output format to use
- * @throws XMLStreamException
+ * @deprecated Use {@link #serialize(Writer, OMOutputFormat, boolean)} instead.
*/
- // TODO: need to clarify what OMOutputFormat settings are actually taken into account
- // (obviously the method can't produce XOP/MTOM and the charset encoding is ignored)
void serializeAndConsume(Writer writer, OMOutputFormat format)
throws XMLStreamException;
Modified: webservices/axiom/trunk/src/site/markdown/roadmap.md
URL: http://svn.apache.org/viewvc/webservices/axiom/trunk/src/site/markdown/roadmap.md?rev=1849254&r1=1849253&r2=1849254&view=diff
==============================================================================
--- webservices/axiom/trunk/src/site/markdown/roadmap.md (original)
+++ webservices/axiom/trunk/src/site/markdown/roadmap.md Wed Dec 19 00:32:10 2018
@@ -63,11 +63,6 @@ Axiom 1.3 to meet the following requirem
Therefore methods defined by the Axiom API should only declare `XMLStreamException` if they interact
directly with a StAX object supplied by application code.
- A good example is the `OMContainer#serialize(OutputStream)` method. In Axiom 1.2.x this method
- is declared to throw `XMLStreamException`. This assumes that the implementation necessarily uses
- StAX as XML serializer. This is a wrong assumption, because the implementation is free to use its
- own serializer. Also note that the method doesn't declare `IOException` which would be much more relevant.
-
* Axiom should have well-defined (and distinct) exceptions for at least the following two error cases:
* An I/O error occurs during a deferred parsing operation. In that case, the unchecked exception should
Modified: webservices/axiom/trunk/testing/axiom-testsuite/src/main/java/org/apache/axiom/ts/dimension/serialization/SerializeToOutputStream.java
URL: http://svn.apache.org/viewvc/webservices/axiom/trunk/testing/axiom-testsuite/src/main/java/org/apache/axiom/ts/dimension/serialization/SerializeToOutputStream.java?rev=1849254&r1=1849253&r2=1849254&view=diff
==============================================================================
--- webservices/axiom/trunk/testing/axiom-testsuite/src/main/java/org/apache/axiom/ts/dimension/serialization/SerializeToOutputStream.java (original)
+++ webservices/axiom/trunk/testing/axiom-testsuite/src/main/java/org/apache/axiom/ts/dimension/serialization/SerializeToOutputStream.java Wed Dec 19 00:32:10 2018
@@ -25,8 +25,7 @@ import org.apache.axiom.om.OMContainer;
import org.apache.axiom.testutils.suite.MatrixTestCase;
/**
- * Serializes an {@link OMContainer} using {@link OMContainer#serialize(OutputStream)} or
- * {@link OMContainer#serializeAndConsume(OutputStream)}.
+ * Serializes an {@link OMContainer} using {@link OMContainer#serialize(OutputStream, boolean)}.
*/
public class SerializeToOutputStream extends SerializationStrategy {
private final boolean cache;
@@ -44,11 +43,7 @@ public class SerializeToOutputStream ext
@Override
public XML serialize(OMContainer container) throws Exception {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
- if (cache) {
- container.serialize(baos);
- } else {
- container.serializeAndConsume(baos);
- }
+ container.serialize(baos, cache);
return new XMLAsByteArray(baos.toByteArray());
}
Modified: webservices/axiom/trunk/testing/axiom-testsuite/src/main/java/org/apache/axiom/ts/dimension/serialization/SerializeToWriter.java
URL: http://svn.apache.org/viewvc/webservices/axiom/trunk/testing/axiom-testsuite/src/main/java/org/apache/axiom/ts/dimension/serialization/SerializeToWriter.java?rev=1849254&r1=1849253&r2=1849254&view=diff
==============================================================================
--- webservices/axiom/trunk/testing/axiom-testsuite/src/main/java/org/apache/axiom/ts/dimension/serialization/SerializeToWriter.java (original)
+++ webservices/axiom/trunk/testing/axiom-testsuite/src/main/java/org/apache/axiom/ts/dimension/serialization/SerializeToWriter.java Wed Dec 19 00:32:10 2018
@@ -25,8 +25,7 @@ import org.apache.axiom.om.OMContainer;
import org.apache.axiom.testutils.suite.MatrixTestCase;
/**
- * Serializes an {@link OMContainer} using {@link OMContainer#serialize(Writer)} or
- * {@link OMContainer#serializeAndConsume(Writer)}.
+ * Serializes an {@link OMContainer} using {@link OMContainer#serialize(Writer, boolean)}.
*/
public class SerializeToWriter extends SerializationStrategy {
private final boolean cache;
@@ -44,11 +43,7 @@ public class SerializeToWriter extends S
@Override
public XML serialize(OMContainer container) throws Exception {
StringWriter sw = new StringWriter();
- if (cache) {
- container.serialize(sw);
- } else {
- container.serializeAndConsume(sw);
- }
+ container.serialize(sw, cache);
return new XMLAsString(sw.toString());
}