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 2016/02/08 20:43:34 UTC
svn commit: r1729234 - in
/webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl:
common/builder/ common/serializer/push/ intf/ mixin/ stream/
Author: veithen
Date: Mon Feb 8 19:43:33 2016
New Revision: 1729234
URL: http://svn.apache.org/viewvc?rev=1729234&view=rev
Log:
Rip out the XMLStreamReader to XmlHandler conversion logic from SerializerImpl and reuse the code from StAXOMBuilder instead.
Modified:
webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/common/builder/StAXHelper.java
webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/common/serializer/push/SerializerImpl.java
webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/intf/Serializer.java
webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/mixin/AxiomContainerSupport.aj
webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/stream/StreamException.java
Modified: webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/common/builder/StAXHelper.java
URL: http://svn.apache.org/viewvc/webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/common/builder/StAXHelper.java?rev=1729234&r1=1729233&r2=1729234&view=diff
==============================================================================
--- webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/common/builder/StAXHelper.java (original)
+++ webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/common/builder/StAXHelper.java Mon Feb 8 19:43:33 2016
@@ -107,7 +107,7 @@ public class StAXHelper {
*/
private Exception parserException;
- private int lookAheadToken = XMLStreamReader.START_DOCUMENT;
+ private int lookAheadToken;
public StAXHelper(XMLStreamReader parser, XmlHandler handler, BuilderHandler builderHandler,
Closeable closeable, boolean autoClose, PayloadSelector payloadSelector) {
@@ -118,13 +118,18 @@ public class StAXHelper {
this.autoClose = autoClose;
this.payloadSelector = payloadSelector;
dataHandlerReader = XMLStreamReaderUtils.getDataHandlerReader(parser);
+ lookAheadToken = parser.getEventType();
+ }
+
+ public StAXHelper(XMLStreamReader parser, XmlHandler handler) {
+ this(parser, handler, null, null, false, PayloadSelector.DEFAULT);
}
private static String normalize(String s) {
return s == null ? "" : s;
}
- private void createOMText(int textType) throws StreamException {
+ private void processText(int textType) throws StreamException {
if (textType == XMLStreamConstants.CHARACTERS && dataHandlerReader != null && dataHandlerReader.isBinary()) {
TextContent data;
if (dataHandlerReader.isDeferred()) {
@@ -232,11 +237,13 @@ public class StAXHelper {
* @throws OMException
*/
public int next() throws OMException {
- if (!builderHandler.cache) {
- throw new IllegalStateException("Can't process next node because caching is disabled");
- }
- if (builderHandler.done) {
- throw new OMException();
+ if (builderHandler != null) {
+ if (!builderHandler.cache) {
+ throw new IllegalStateException("Can't process next node because caching is disabled");
+ }
+ if (builderHandler.done) {
+ throw new OMException();
+ }
}
int token = parserNext();
@@ -248,13 +255,13 @@ public class StAXHelper {
handler.startDocument(parser.getEncoding(), parser.getVersion(), parser.getCharacterEncodingScheme(), parser.isStandalone());
break;
case XMLStreamConstants.START_ELEMENT: {
- createNextOMElement();
+ processElement();
break;
}
case XMLStreamConstants.CHARACTERS:
case XMLStreamConstants.CDATA:
case XMLStreamConstants.SPACE:
- createOMText(token);
+ processText(token);
break;
case XMLStreamConstants.END_ELEMENT:
handler.endElement();
@@ -266,7 +273,7 @@ public class StAXHelper {
handler.processComment(parser.getText());
break;
case XMLStreamConstants.DTD:
- createDTD();
+ processDTD();
break;
case XMLStreamConstants.PROCESSING_INSTRUCTION:
handler.processProcessingInstruction(parser.getPITarget(), parser.getPIData());
@@ -275,14 +282,14 @@ public class StAXHelper {
handler.processEntityReference(parser.getLocalName(), parser.getText());
break;
default :
- throw new OMException();
+ throw new IllegalStateException();
}
} catch (StreamException ex) {
throw new OMException(ex);
}
// TODO: this will fail if there is whitespace before the document element
- if (token != XMLStreamConstants.START_DOCUMENT && builderHandler.target == null && !builderHandler.done) {
+ if (builderHandler != null && token != XMLStreamConstants.START_DOCUMENT && builderHandler.target == null && !builderHandler.done) {
// We get here if the document has been discarded (by getDocumentElement(true)
// or because the builder is linked to an OMSourcedElement) and
// we just processed the END_ELEMENT event for the root element. In this case, we consume
@@ -304,24 +311,21 @@ public class StAXHelper {
return token;
}
- /**
- * Creates a new OMElement using either a CustomBuilder or
- * the default Builder mechanism.
- * @throws StreamException
- */
- private void createNextOMElement() throws StreamException {
+ private void processElement() throws StreamException {
String namespaceURI = normalize(parser.getNamespaceURI());
String localName = parser.getLocalName();
String prefix = normalize(parser.getPrefix());
- if (customBuilderForPayload != null && payloadSelector.isPayload(builderHandler.elementLevel+1, builderHandler.target)
- && createWithCustomBuilder(customBuilderForPayload)) {
- return;
- }
- if (customBuilders != null && builderHandler.elementLevel < this.maxDepthForCustomBuilders) {
- CustomBuilder customBuilder = customBuilders.get(namespaceURI, localName);
- if (customBuilder != null && createWithCustomBuilder(customBuilder)) {
+ if (builderHandler != null) {
+ if (customBuilderForPayload != null && payloadSelector.isPayload(builderHandler.elementLevel+1, builderHandler.target)
+ && processWithCustomBuilder(customBuilderForPayload)) {
return;
}
+ if (customBuilders != null && builderHandler.elementLevel < this.maxDepthForCustomBuilders) {
+ CustomBuilder customBuilder = customBuilders.get(namespaceURI, localName);
+ if (customBuilder != null && processWithCustomBuilder(customBuilder)) {
+ return;
+ }
+ }
}
handler.startElement(namespaceURI, localName, prefix);
for (int i = 0, count = parser.getNamespaceCount(); i < count; i++) {
@@ -341,7 +345,7 @@ public class StAXHelper {
handler.attributesCompleted();
}
- private boolean createWithCustomBuilder(CustomBuilder customBuilder) throws StreamException {
+ private boolean processWithCustomBuilder(CustomBuilder customBuilder) throws StreamException {
String namespace = parser.getNamespaceURI();
if (namespace == null) {
@@ -372,7 +376,7 @@ public class StAXHelper {
}
}
- private void createDTD() throws StreamException {
+ private void processDTD() throws StreamException {
DTDReader dtdReader;
try {
dtdReader = (DTDReader)parser.getProperty(DTDReader.PROPERTY);
@@ -380,7 +384,7 @@ public class StAXHelper {
dtdReader = null;
}
if (dtdReader == null) {
- throw new OMException("Cannot create OMDocType because the XMLStreamReader doesn't support the DTDReader extension");
+ throw new StreamException("Cannot process DTD events because the XMLStreamReader doesn't support the DTDReader extension");
}
String internalSubset = getDTDText();
// Woodstox returns an empty string if there is no internal subset
@@ -455,7 +459,7 @@ public class StAXHelper {
parserException = ex;
throw ex;
}
- if (event == XMLStreamConstants.END_DOCUMENT) {
+ if (builderHandler != null && event == XMLStreamConstants.END_DOCUMENT) {
if (builderHandler.cache && builderHandler.elementLevel != 0) {
throw new OMException("Unexpected END_DOCUMENT event");
}
Modified: webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/common/serializer/push/SerializerImpl.java
URL: http://svn.apache.org/viewvc/webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/common/serializer/push/SerializerImpl.java?rev=1729234&r1=1729233&r2=1729234&view=diff
==============================================================================
--- webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/common/serializer/push/SerializerImpl.java (original)
+++ webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/common/serializer/push/SerializerImpl.java Mon Feb 8 19:43:33 2016
@@ -28,9 +28,7 @@ import javax.xml.stream.XMLStreamReader;
import javax.xml.stream.XMLStreamWriter;
import org.apache.axiom.core.CoreAttribute;
-import org.apache.axiom.ext.stax.DTDReader;
import org.apache.axiom.ext.stax.datahandler.DataHandlerProvider;
-import org.apache.axiom.ext.stax.datahandler.DataHandlerReader;
import org.apache.axiom.om.DeferredParsingException;
import org.apache.axiom.om.OMAttribute;
import org.apache.axiom.om.OMContainer;
@@ -39,12 +37,12 @@ import org.apache.axiom.om.OMElement;
import org.apache.axiom.om.OMNamespace;
import org.apache.axiom.om.OMNode;
import org.apache.axiom.om.OMSerializable;
+import org.apache.axiom.om.impl.common.builder.StAXHelper;
import org.apache.axiom.om.impl.common.util.OMDataSourceUtil;
import org.apache.axiom.om.impl.intf.Serializer;
import org.apache.axiom.om.impl.intf.TextContent;
import org.apache.axiom.om.impl.stream.StreamException;
import org.apache.axiom.om.impl.stream.XmlHandler;
-import org.apache.axiom.util.stax.XMLStreamReaderUtils;
public abstract class SerializerImpl implements Serializer {
private final OMSerializable root;
@@ -125,78 +123,6 @@ public abstract class SerializerImpl imp
attributesCompleted();
}
- public final void copyEvent(XMLStreamReader reader, DataHandlerReader dataHandlerReader) throws StreamException {
- try {
- int eventType = reader.getEventType();
- switch (eventType) {
- case XMLStreamReader.DTD:
- DTDReader dtdReader;
- try {
- dtdReader = (DTDReader)reader.getProperty(DTDReader.PROPERTY);
- } catch (IllegalArgumentException ex) {
- dtdReader = null;
- }
- if (dtdReader == null) {
- throw new XMLStreamException("Cannot serialize the DTD because the XMLStreamReader doesn't support the DTDReader extension");
- }
- processDocumentTypeDeclaration(dtdReader.getRootName(), dtdReader.getPublicId(), dtdReader.getSystemId(), reader.getText());
- break;
- case XMLStreamReader.START_ELEMENT:
- handler.startElement(normalize(reader.getNamespaceURI()), reader.getLocalName(), normalize(reader.getPrefix()));
- for (int i=0, count=reader.getNamespaceCount(); i<count; i++) {
- handler.processNamespaceDeclaration(normalize(reader.getNamespacePrefix(i)), normalize(reader.getNamespaceURI(i)));
- }
- for (int i=0, count=reader.getAttributeCount(); i<count; i++) {
- handler.processAttribute(
- normalize(reader.getAttributeNamespace(i)),
- reader.getAttributeLocalName(i),
- normalize(reader.getAttributePrefix(i)),
- reader.getAttributeValue(i),
- reader.getAttributeType(i),
- reader.isAttributeSpecified(i));
- }
- attributesCompleted();
- break;
- case XMLStreamReader.END_ELEMENT:
- endElement();
- break;
- case XMLStreamReader.CHARACTERS:
- if (dataHandlerReader != null && dataHandlerReader.isBinary()) {
- if (dataHandlerReader.isDeferred()) {
- writeDataHandler(dataHandlerReader.getDataHandlerProvider(),
- dataHandlerReader.getContentID(), dataHandlerReader.isOptimized());
- } else {
- writeDataHandler(dataHandlerReader.getDataHandler(),
- dataHandlerReader.getContentID(), dataHandlerReader.isOptimized());
- }
- break;
- }
- // Fall through
- case XMLStreamReader.SPACE:
- case XMLStreamReader.CDATA:
- writeText(eventType, reader.getText());
- break;
- case XMLStreamReader.PROCESSING_INSTRUCTION:
- processProcessingInstruction(reader.getPITarget(), reader.getPIData());
- break;
- case XMLStreamReader.COMMENT:
- processComment(reader.getText());
- break;
- case XMLStreamReader.ENTITY_REFERENCE:
- processEntityReference(reader.getLocalName(), reader.getText());
- break;
- default:
- throw new IllegalStateException();
- }
- } catch (XMLStreamException ex) {
- throw new DeferredParsingException(ex);
- }
- }
-
- private static String normalize(String s) {
- return s == null ? "" : s;
- }
-
/**
* Serialize the given data source.
*
@@ -213,21 +139,17 @@ public abstract class SerializerImpl imp
if (OMDataSourceUtil.isPullDataSource(dataSource)) {
try {
XMLStreamReader reader = dataSource.getReader();
- DataHandlerReader dataHandlerReader = XMLStreamReaderUtils.getDataHandlerReader(reader);
+ StAXHelper helper = new StAXHelper(reader, this);
+ while (helper.lookahead() != XMLStreamReader.START_ELEMENT) {
+ helper.parserNext();
+ }
int depth = 0;
- int eventType;
- // Note: the loop is constructed in such a way that we skip both START_DOCUMENT and END_DOCUMENT
- while ((eventType = reader.next()) != XMLStreamReader.END_DOCUMENT) {
- if (eventType == XMLStreamReader.START_ELEMENT) {
- depth++;
- }
- if (depth > 0) {
- copyEvent(reader, dataHandlerReader);
+ do {
+ switch (helper.next()) {
+ case XMLStreamReader.START_ELEMENT: depth++; break;
+ case XMLStreamReader.END_ELEMENT: depth--; break;
}
- if (eventType == XMLStreamReader.END_ELEMENT) {
- depth--;
- }
- }
+ } while (depth > 0);
reader.close();
} catch (XMLStreamException ex) {
// XMLStreamExceptions occurring while _writing_ are wrapped in an OutputException.
Modified: webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/intf/Serializer.java
URL: http://svn.apache.org/viewvc/webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/intf/Serializer.java?rev=1729234&r1=1729233&r2=1729234&view=diff
==============================================================================
--- webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/intf/Serializer.java (original)
+++ webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/intf/Serializer.java Mon Feb 8 19:43:33 2016
@@ -18,14 +18,10 @@
*/
package org.apache.axiom.om.impl.intf;
-import javax.xml.stream.XMLStreamReader;
-
-import org.apache.axiom.ext.stax.datahandler.DataHandlerReader;
import org.apache.axiom.om.OMElement;
import org.apache.axiom.om.impl.stream.StreamException;
import org.apache.axiom.om.impl.stream.XmlHandler;
public interface Serializer extends XmlHandler {
void serializeStartpart(OMElement element) throws StreamException;
- void copyEvent(XMLStreamReader reader, DataHandlerReader dataHandlerReader) throws StreamException;
}
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=1729234&r1=1729233&r2=1729234&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 Mon Feb 8 19:43:33 2016
@@ -34,8 +34,6 @@ import org.apache.axiom.core.CoreNSAware
import org.apache.axiom.core.CoreNode;
import org.apache.axiom.core.ElementMatcher;
import org.apache.axiom.core.Mapper;
-import org.apache.axiom.ext.stax.datahandler.DataHandlerReader;
-import org.apache.axiom.om.DeferredParsingException;
import org.apache.axiom.om.NodeUnavailableException;
import org.apache.axiom.om.OMElement;
import org.apache.axiom.om.OMException;
@@ -54,6 +52,7 @@ import org.apache.axiom.om.impl.common.N
import org.apache.axiom.om.impl.common.OMChildrenQNameIterator;
import org.apache.axiom.om.impl.common.OMContentHandler;
import org.apache.axiom.om.impl.common.SAXResultContentHandler;
+import org.apache.axiom.om.impl.common.builder.StAXHelper;
import org.apache.axiom.om.impl.common.serializer.pull.OMXMLStreamReaderExAdapter;
import org.apache.axiom.om.impl.common.serializer.pull.PullSerializer;
import org.apache.axiom.om.impl.common.serializer.push.sax.XMLReaderImpl;
@@ -65,7 +64,6 @@ import org.apache.axiom.om.impl.intf.Ser
import org.apache.axiom.om.impl.stream.StreamException;
import org.apache.axiom.om.util.OMXMLStreamReaderValidator;
import org.apache.axiom.om.util.StAXUtils;
-import org.apache.axiom.util.stax.XMLStreamReaderUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.xml.sax.InputSource;
@@ -377,23 +375,10 @@ public aspect AxiomContainerSupport {
// events from the underlying XMLStreamReader.
if (!isComplete() && getBuilder() != null) {
Builder builder = (Builder)getBuilder();
- XMLStreamReader reader = builder.disableCaching();
- DataHandlerReader dataHandlerReader = XMLStreamReaderUtils.getDataHandlerReader(reader);
- boolean first = true;
+ StAXHelper helper = new StAXHelper(builder.disableCaching(), serializer);
int depth = 0;
loop: while (true) {
- int event;
- if (first) {
- event = reader.getEventType();
- first = false;
- } else {
- try {
- event = reader.next();
- } catch (XMLStreamException ex) {
- throw new DeferredParsingException(ex);
- }
- }
- switch (event) {
+ switch (helper.lookahead()) {
case XMLStreamReader.START_ELEMENT:
depth++;
break;
@@ -414,7 +399,7 @@ public aspect AxiomContainerSupport {
}
// Note that we don't copy the final END_ELEMENT/END_DOCUMENT event for
// the container. This is the responsibility of the caller.
- serializer.copyEvent(reader, dataHandlerReader);
+ helper.next();
}
builder.reenableCaching(this);
}
Modified: webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/stream/StreamException.java
URL: http://svn.apache.org/viewvc/webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/stream/StreamException.java?rev=1729234&r1=1729233&r2=1729234&view=diff
==============================================================================
--- webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/stream/StreamException.java (original)
+++ webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/stream/StreamException.java Mon Feb 8 19:43:33 2016
@@ -18,12 +18,17 @@
*/
package org.apache.axiom.om.impl.stream;
+// TODO: update Javadoc
/**
* Wraps an exception thrown by the underlying API (StAX, SAX, etc.) while writing data.
*/
public class StreamException extends Exception {
private static final long serialVersionUID = 7173617216602466028L;
+ public StreamException(String message) {
+ super(message);
+ }
+
public StreamException(String message, Throwable cause) {
super(message, cause);
}