You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@ws.apache.org by ve...@apache.org on 2010/10/28 23:22:44 UTC

svn commit: r1028486 - in /webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom: om/impl/ om/impl/builder/ om/impl/serialize/ util/activation/ util/stax/ util/stax/xop/

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