Author: veithen
Date: Thu Oct 28 21:22:44 2010
New Revision: 1028486
URL: http://svn.apache.org/viewvc?rev=1028486&view=rev
Log:
Merged the methods of the DataHandlerReaderUtils class into
XMLStreamReaderUtils. This fixes the mistake made in r1026835, which put the
class into the wrong package (the utility methods are related to StAX, not to
JAF). It also solves the issue of the duplicate getDataHandlerReader (which
existed both in DataHandlerReaderUtils and XMLStreamReaderUtils).
Removed:
webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/util/activation/DataHandlerReaderUtils.java
Modified:
webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/om/impl/SwitchingWrapper.java
webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/om/impl/builder/DataHandlerReaderUtils.java
webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/om/impl/builder/StAXBuilder.java
webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/om/impl/serialize/StreamingOMSerializer.java
webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/util/stax/XMLStreamReaderUtils.java
webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/util/stax/xop/XOPUtils.java
Modified:
webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/om/impl/SwitchingWrapper.java
URL:
http://svn.apache.org/viewvc/webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/om/impl/SwitchingWrapper.java?rev=1028486&r1=1028485&r2=1028486&view=diff
==============================================================================
---
webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/om/impl/SwitchingWrapper.java
(original)
+++
webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/om/impl/SwitchingWrapper.java
Thu Oct 28 21:22:44 2010
@@ -54,7 +54,6 @@ import org.apache.axiom.om.OMXMLParserWr
import org.apache.axiom.om.impl.OMNavigator;
import org.apache.axiom.om.impl.builder.StAXBuilder;
import org.apache.axiom.om.impl.exception.OMStreamingException;
-import org.apache.axiom.util.activation.DataHandlerReaderUtils;
import org.apache.axiom.util.namespace.MapBasedNamespaceContext;
import org.apache.axiom.util.stax.AbstractXMLStreamReader;
import org.apache.axiom.util.stax.DummyLocation;
@@ -1035,7 +1034,7 @@ class SwitchingWrapper extends AbstractX
* @throws IllegalArgumentException
*/
public Object getProperty(String s) throws IllegalArgumentException {
- Object value = DataHandlerReaderUtils.processGetProperty(this, s);
+ Object value = XMLStreamReaderUtils.processGetProperty(this, s);
if (value != null) {
return value;
}
@@ -1438,7 +1437,7 @@ class SwitchingWrapper extends AbstractX
public void setParser(XMLStreamReader parser) {
this.parser = parser;
dataHandlerReader =
- parser == null ? null :
DataHandlerReaderUtils.getDataHandlerReader(parser);
+ parser == null ? null :
XMLStreamReaderUtils.getDataHandlerReader(parser);
}
private Map getAllNamespaces(OMNode contextNode) {
Modified:
webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/om/impl/builder/DataHandlerReaderUtils.java
URL:
http://svn.apache.org/viewvc/webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/om/impl/builder/DataHandlerReaderUtils.java?rev=1028486&r1=1028485&r2=1028486&view=diff
==============================================================================
---
webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/om/impl/builder/DataHandlerReaderUtils.java
(original)
+++
webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/om/impl/builder/DataHandlerReaderUtils.java
Thu Oct 28 21:22:44 2010
@@ -22,18 +22,19 @@ package org.apache.axiom.om.impl.builder
import javax.xml.stream.XMLStreamReader;
import org.apache.axiom.ext.stax.datahandler.DataHandlerReader;
+import org.apache.axiom.util.stax.XMLStreamReaderUtils;
/**
- * @deprecated Use {...@link
org.apache.axiom.util.activation.DataHandlerReaderUtils} instead.
+ * @deprecated Use the corresponding methods in {...@link
XMLStreamReaderUtils} instead.
*/
public class DataHandlerReaderUtils {
private DataHandlerReaderUtils() {}
public static DataHandlerReader getDataHandlerReader(final XMLStreamReader
reader) {
- return
org.apache.axiom.util.activation.DataHandlerReaderUtils.getDataHandlerReader(reader);
+ return XMLStreamReaderUtils.getDataHandlerReader(reader);
}
public static Object processGetProperty(DataHandlerReader extension,
String propertyName) {
- return
org.apache.axiom.util.activation.DataHandlerReaderUtils.processGetProperty(extension,
propertyName);
+ return XMLStreamReaderUtils.processGetProperty(extension,
propertyName);
}
}
Modified:
webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/om/impl/builder/StAXBuilder.java
URL:
http://svn.apache.org/viewvc/webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/om/impl/builder/StAXBuilder.java?rev=1028486&r1=1028485&r2=1028486&view=diff
==============================================================================
---
webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/om/impl/builder/StAXBuilder.java
(original)
+++
webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/om/impl/builder/StAXBuilder.java
Thu Oct 28 21:22:44 2010
@@ -36,7 +36,6 @@ import org.apache.axiom.om.impl.OMContai
import org.apache.axiom.om.impl.OMNodeEx;
import org.apache.axiom.om.impl.util.OMSerializerUtil;
import org.apache.axiom.om.util.StAXUtils;
-import org.apache.axiom.util.activation.DataHandlerReaderUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
Modified:
webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/om/impl/serialize/StreamingOMSerializer.java
URL:
http://svn.apache.org/viewvc/webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/om/impl/serialize/StreamingOMSerializer.java?rev=1028486&r1=1028485&r2=1028486&view=diff
==============================================================================
---
webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/om/impl/serialize/StreamingOMSerializer.java
(original)
+++
webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/om/impl/serialize/StreamingOMSerializer.java
Thu Oct 28 21:22:44 2010
@@ -25,7 +25,7 @@ import org.apache.axiom.om.OMDataSource;
import org.apache.axiom.om.OMSerializer;
import org.apache.axiom.om.impl.OMStAXWrapper;
import org.apache.axiom.om.impl.util.OMSerializerUtil;
-import org.apache.axiom.util.activation.DataHandlerReaderUtils;
+import org.apache.axiom.util.stax.XMLStreamReaderUtils;
import org.apache.axiom.util.stax.XMLStreamWriterUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
@@ -84,7 +84,7 @@ public class StreamingOMSerializer imple
public void serialize(XMLStreamReader reader, XMLStreamWriter writer,
boolean startAtNext)
throws XMLStreamException {
- dataHandlerReader =
DataHandlerReaderUtils.getDataHandlerReader(reader);
+ dataHandlerReader = XMLStreamReaderUtils.getDataHandlerReader(reader);
dataHandlerWriter = XMLStreamWriterUtils.getDataHandlerWriter(writer);
if (reader instanceof OMStAXWrapper) {
Modified:
webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/util/stax/XMLStreamReaderUtils.java
URL:
http://svn.apache.org/viewvc/webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/util/stax/XMLStreamReaderUtils.java?rev=1028486&r1=1028485&r2=1028486&view=diff
==============================================================================
---
webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/util/stax/XMLStreamReaderUtils.java
(original)
+++
webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/util/stax/XMLStreamReaderUtils.java
Thu Oct 28 21:22:44 2010
@@ -30,6 +30,7 @@ import javax.xml.stream.XMLStreamReader;
import org.apache.axiom.ext.stax.CharacterDataReader;
import org.apache.axiom.ext.stax.DelegatingXMLStreamReader;
+import org.apache.axiom.ext.stax.datahandler.DataHandlerProvider;
import org.apache.axiom.ext.stax.datahandler.DataHandlerReader;
import org.apache.axiom.util.activation.EmptyDataSource;
import org.apache.axiom.util.base64.Base64DecodingOutputStreamWriter;
@@ -40,27 +41,165 @@ import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
/**
- * Contains utility methods to work with {...@link XMLStreamReader} objects.
+ * Contains utility methods to work with {...@link XMLStreamReader} objects,
including the extension
+ * defined by {...@link DataHandlerReader}. In addition to {...@link
DataHandlerReader} support, this
+ * class also provides support for the legacy extension mechanism described
below.
+ *
+ * <h3>Legacy XMLStreamReader extensions for optimized base64 handling</h3>
+ *
+ * <p>
+ * {...@link XMLStreamReader} instances supporting the legacy extension must
conform to the following
+ * requirements:
+ * </p>
+ * <ol>
+ * <li>{...@link XMLStreamReader#getProperty(String)} must return {...@link
Boolean#TRUE} for the
+ * property identified by {...@link
org.apache.axiom.om.OMConstants#IS_DATA_HANDLERS_AWARE},
+ * regardless of the current event. The property is assumed to be immutable
and its value must not
+ * change during the lifetime of the {...@link XMLStreamReader}
implementation.</li>
+ * <li>
+ * <p>
+ * If the {...@link XMLStreamReader} wishes to expose base64 encoded content
using a
+ * {...@link javax.activation.DataHandler} object, it must do so using a single
+ * {...@link XMLStreamConstants#CHARACTERS} event.
+ * </p>
+ * <p>
+ * To maintain compatibility with consumers that are unaware of the extensions
described here, the
+ * implementation should make sure that {...@link XMLStreamReader#getText()},
+ * {...@link XMLStreamReader#getTextStart()}, {...@link
XMLStreamReader#getTextLength()},
+ * {...@link XMLStreamReader#getTextCharacters()},
+ * {...@link XMLStreamReader#getTextCharacters(int, char[], int, int)} and
+ * {...@link XMLStreamReader#getElementText()} behave as expected for this
type of event, i.e. return
+ * the base64 representation of the binary content.
+ * </p>
+ * </li>
+ * <li>{...@link XMLStreamReader#getProperty(String)} must return {...@link
Boolean#TRUE} for the
+ * property identified by {...@link org.apache.axiom.om.OMConstants#IS_BINARY}
if the current event is
+ * a {...@link XMLStreamConstants#CHARACTERS} event representing base64
encoded binary content and for
+ * which a {...@link javax.activation.DataHandler} is available. For all other
events, the returned
+ * value must be {...@link Boolean#FALSE}.</li>
+ * <li>
+ * <p>
+ * If for a given event, the implementation returned {...@link Boolean#TRUE}
for the
+ * {...@link org.apache.axiom.om.OMConstants#IS_BINARY} property, then a call
to
+ * {...@link XMLStreamReader#getProperty(String)} with argument
+ * {...@link org.apache.axiom.om.OMConstants#DATA_HANDLER} must return the
corresponding
+ * {...@link javax.activation.DataHandler} object.
+ * </p>
+ * <p>
+ * The {...@link org.apache.axiom.om.OMConstants#DATA_HANDLER} property is
undefined for any other type
+ * of event. This implies that the consumer of the {...@link XMLStreamReader}
must check the
+ * {...@link org.apache.axiom.om.OMConstants#IS_BINARY} property before
retrieving the
+ * {...@link org.apache.axiom.om.OMConstants#DATA_HANDLER} property.
+ * </p>
+ * </li>
+ * </ol>
+ * The extension mechanism described here has been deprecated mainly because
it doesn't support
+ * deferred loading of the binary content.
*/
public class XMLStreamReaderUtils {
+ // Legacy property names; should be removed in Axiom 1.3
+ private static final String IS_BINARY = "Axiom.IsBinary";
+ private static final String DATA_HANDLER = "Axiom.DataHandler";
+ private static final String IS_DATA_HANDLERS_AWARE =
"IsDatahandlersAwareParsing";
private static Log log = LogFactory.getLog(XMLStreamReaderUtils.class);
-
+
+ private XMLStreamReaderUtils() {}
+
/**
- * Get the {...@link DataHandlerReader} extension from a given {...@link
XMLStreamReader}.
+ * Get the {...@link DataHandlerReader} extension for a given {...@link
XMLStreamReader}, if
+ * available. If the {...@link XMLStreamReader} only supports the legacy
extension (as described
+ * above), then this method will return a compatibility wrapper. Note that
this wrapper doesn't
+ * support deferred loading of the binary content.
*
* @param reader
- * the stream for which the method should return the {...@link
DataHandlerReader}
- * extension
- * @return the reference to the {...@link DataHandlerReader} extension, or
<code>null</code> if
- * the reader doesn't implement the extension
+ * the stream reader to get the {...@link DataHandlerReader}
extension from
+ * @return the implementation of the extension, or <code>null</code> if the
+ * {...@link XMLStreamReader} doesn't expose base64 encoded binary
content as
+ * {...@link DataHandler} objects.
*/
- public static DataHandlerReader getDataHandlerReader(XMLStreamReader
reader) {
+ public static DataHandlerReader getDataHandlerReader(final XMLStreamReader
reader) {
+ try {
+ DataHandlerReader dhr = (DataHandlerReader)reader.getProperty(
+ DataHandlerReader.PROPERTY);
+ if (dhr != null) {
+ return dhr;
+ }
+ } catch (IllegalArgumentException ex) {
+ // Just continue
+ }
+ Boolean isDataHandlerAware;
try {
- return
(DataHandlerReader)reader.getProperty(DataHandlerReader.PROPERTY);
+ isDataHandlerAware =
(Boolean)reader.getProperty(IS_DATA_HANDLERS_AWARE);
} catch (IllegalArgumentException ex) {
return null;
}
+ if (isDataHandlerAware != null && isDataHandlerAware.booleanValue()) {
+ return new DataHandlerReader() {
+ public boolean isBinary() {
+ return
((Boolean)reader.getProperty(IS_BINARY)).booleanValue();
+ }
+
+ public boolean isOptimized() {
+ // This is compatible with the old StAXBuilder
implementation
+ return true;
+ }
+
+ public boolean isDeferred() {
+ return false;
+ }
+
+ public String getContentID() {
+ return null;
+ }
+
+ public DataHandler getDataHandler() {
+ return (DataHandler)reader.getProperty(DATA_HANDLER);
+ }
+
+ public DataHandlerProvider getDataHandlerProvider() {
+ throw new UnsupportedOperationException();
+ }
+ };
+ } else {
+ return null;
+ }
+ }
+
+ /**
+ * Helper method to implement {...@link
XMLStreamReader#getProperty(String)}. This method
+ * processed the properties defined by {...@link
DataHandlerReader#PROPERTY} and the legacy
+ * extension mechanism (as described above). It can therefore be used to
make a
+ * {...@link XMLStreamReader} implementation compatible with code that
expects it to implement this
+ * legacy extension.
+ *
+ * @param extension
+ * the reference to the {...@link DataHandlerReader} extension
for the
+ * {...@link XMLStreamReader} implementation
+ * @param propertyName
+ * the name of the property, as passed to the
+ * {...@link XMLStreamReader#getProperty(String)} method
+ * @return the property value as specified by the {...@link
DataHandlerReader} or legacy extension;
+ * <code>null</code> if the property is not specified by any of
these two extensions
+ */
+ public static Object processGetProperty(DataHandlerReader extension,
String propertyName) {
+ if (extension == null || propertyName == null) {
+ throw new IllegalArgumentException();
+ } else if (propertyName.equals(DataHandlerReader.PROPERTY)) {
+ return extension;
+ } else if (propertyName.equals(IS_DATA_HANDLERS_AWARE)) {
+ return Boolean.TRUE;
+ } else if (propertyName.equals(IS_BINARY)) {
+ return Boolean.valueOf(extension.isBinary());
+ } else if (propertyName.equals(DATA_HANDLER)) {
+ try {
+ return extension.getDataHandler();
+ } catch (XMLStreamException ex) {
+ throw new RuntimeException(ex);
+ }
+ } else {
+ return null;
+ }
}
/**
Modified:
webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/util/stax/xop/XOPUtils.java
URL:
http://svn.apache.org/viewvc/webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/util/stax/xop/XOPUtils.java?rev=1028486&r1=1028485&r2=1028486&view=diff
==============================================================================
---
webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/util/stax/xop/XOPUtils.java
(original)
+++
webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/util/stax/xop/XOPUtils.java
Thu Oct 28 21:22:44 2010
@@ -26,7 +26,7 @@ import java.net.URLDecoder;
import javax.activation.DataHandler;
import javax.xml.stream.XMLStreamReader;
-import org.apache.axiom.util.activation.DataHandlerReaderUtils;
+import org.apache.axiom.util.stax.XMLStreamReaderUtils;
/**
* Contains utility methods related to XOP.
@@ -126,7 +126,7 @@ public class XOPUtils {
return new XOPEncodedStream(reader, (MimePartProvider)reader);
} else if (reader instanceof XOPDecodingStreamReader) {
return ((XOPDecodingStreamReader)reader).getXOPEncodedStream();
- } else if (DataHandlerReaderUtils.getDataHandlerReader(reader) !=
null) {
+ } else if (XMLStreamReaderUtils.getDataHandlerReader(reader) != null) {
XOPEncodingStreamReader wrapper = new
XOPEncodingStreamReader(reader,
ContentIDGenerator.DEFAULT, OptimizationPolicy.ALL);
return new XOPEncodedStream(wrapper, wrapper);