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/07/07 22:25:01 UTC

svn commit: r791968 - in /webservices/commons/trunk/modules/axiom/modules: axiom-api/src/main/java/org/apache/axiom/om/ axiom-api/src/main/java/org/apache/axiom/om/impl/ axiom-api/src/main/java/org/apache/axiom/om/impl/builder/ axiom-api/src/main/java/...

Author: veithen
Date: Tue Jul  7 20:25:01 2009
New Revision: 791968

URL: http://svn.apache.org/viewvc?rev=791968&view=rev
Log:
WSCOMMONS-487: Implemented a new extension mechanism to retrieve DataHandler objects from an XMLStreamReader implementation. This supersedes the existing IS_DATA_HANDLERS_AWARE extension, but compatibility is maintained (tested with Axis2).

Added:
    webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/om/impl/builder/DataHandlerReaderUtil.java   (with props)
    webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/stax/ext/
    webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/stax/ext/DataHandlerProvider.java   (with props)
    webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/stax/ext/DataHandlerReader.java   (with props)
Modified:
    webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/om/OMConstants.java
    webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/om/OMFactory.java
    webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/om/impl/OMStAXWrapper.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/builder/StAXOMBuilder.java
    webservices/commons/trunk/modules/axiom/modules/axiom-api/src/test/java/org/apache/axiom/om/OMTextTestBase.java
    webservices/commons/trunk/modules/axiom/modules/axiom-dom/src/main/java/org/apache/axiom/om/impl/dom/TextImpl.java
    webservices/commons/trunk/modules/axiom/modules/axiom-dom/src/main/java/org/apache/axiom/om/impl/dom/TextNodeImpl.java
    webservices/commons/trunk/modules/axiom/modules/axiom-dom/src/main/java/org/apache/axiom/om/impl/dom/factory/OMDOMFactory.java
    webservices/commons/trunk/modules/axiom/modules/axiom-impl/src/main/java/org/apache/axiom/om/impl/llom/OMTextImpl.java
    webservices/commons/trunk/modules/axiom/modules/axiom-impl/src/main/java/org/apache/axiom/om/impl/llom/factory/OMLinkedListImplFactory.java

Modified: webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/om/OMConstants.java
URL: http://svn.apache.org/viewvc/webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/om/OMConstants.java?rev=791968&r1=791967&r2=791968&view=diff
==============================================================================
--- webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/om/OMConstants.java (original)
+++ webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/om/OMConstants.java Tue Jul  7 20:25:01 2009
@@ -59,30 +59,23 @@
             "xml";
     
     /**
-     * {@link javax.xml.stream.XMLStreamReader} property used to check if a given
-     * {@link javax.xml.stream.XMLStreamConstants#CHARACTERS} event represents
-     * base64 encoded binary data exposed as a {@link javax.activation.DataHandler}.
+     * @deprecated
      * 
-     * @see org.apache.axiom.om.impl.builder.StAXOMBuilder
+     * @see org.apache.axiom.om.impl.builder.DataHandlerReaderUtil
      */
     String IS_BINARY = "Axiom.IsBinary";
     
     /**
-     * {@link javax.xml.stream.XMLStreamReader} property used to retrieve the
-     * {@link javax.activation.DataHandler} for a
-     * {@link javax.xml.stream.XMLStreamConstants#CHARACTERS} event representing
-     * base64 encoded binary data.
+     * @deprecated
      * 
-     * @see org.apache.axiom.om.impl.builder.StAXOMBuilder
+     * @see org.apache.axiom.om.impl.builder.DataHandlerReaderUtil
      */
     String DATA_HANDLER = "Axiom.DataHandler";
     
     /**
-     * {@link javax.xml.stream.XMLStreamReader} property indicating that the
-     * reader is capable of exposing base64 encoded binary content as
-     * {@link javax.activation.DataHandler} objects.
+     * @deprecated
      * 
-     * @see org.apache.axiom.om.impl.builder.StAXOMBuilder
+     * @see org.apache.axiom.om.impl.builder.DataHandlerReaderUtil
      */
     String IS_DATA_HANDLERS_AWARE = "IsDatahandlersAwareParsing"; 
 

Modified: webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/om/OMFactory.java
URL: http://svn.apache.org/viewvc/webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/om/OMFactory.java?rev=791968&r1=791967&r2=791968&view=diff
==============================================================================
--- webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/om/OMFactory.java (original)
+++ webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/om/OMFactory.java Tue Jul  7 20:25:01 2009
@@ -21,6 +21,8 @@
 
 import javax.xml.namespace.QName;
 
+import org.apache.axiom.stax.ext.DataHandlerProvider;
+
 /** Class OMFactory */
 public interface OMFactory {
 
@@ -177,6 +179,21 @@
     OMText createOMText(OMContainer parent, String s, String mimeType,
                                boolean optimize);
 
+    /**
+     * Create a binary {@link OMText} node supporting deferred loading of the content.
+     * 
+     * @param contentID
+     *            the content ID identifying the binary content; may be <code>null</code>
+     * @param dataHandlerProvider
+     *            used to load the {@link DataHandler} when requested from the returned
+     *            {@link OMText} node
+     * @param optimize
+     *            determines whether the binary content should be optimized
+     * @return
+     */
+    OMText createOMText(String contentID, DataHandlerProvider dataHandlerProvider,
+            boolean optimize);
+
     OMText createOMText(String contentID, OMContainer parent,
                                OMXMLParserWrapper builder);
 

Modified: webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/om/impl/OMStAXWrapper.java
URL: http://svn.apache.org/viewvc/webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/om/impl/OMStAXWrapper.java?rev=791968&r1=791967&r2=791968&view=diff
==============================================================================
--- webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/om/impl/OMStAXWrapper.java (original)
+++ webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/om/impl/OMStAXWrapper.java Tue Jul  7 20:25:01 2009
@@ -37,7 +37,6 @@
 import org.apache.axiom.om.OMAttachmentAccessor;
 import org.apache.axiom.om.OMAttribute;
 import org.apache.axiom.om.OMComment;
-import org.apache.axiom.om.OMConstants;
 import org.apache.axiom.om.OMContainer;
 import org.apache.axiom.om.OMDocument;
 import org.apache.axiom.om.OMElement;
@@ -50,10 +49,13 @@
 import org.apache.axiom.om.OMXMLStreamReader;
 import org.apache.axiom.om.impl.EmptyOMLocation;
 import org.apache.axiom.om.impl.OMNavigator;
+import org.apache.axiom.om.impl.builder.DataHandlerReaderUtil;
 import org.apache.axiom.om.impl.builder.StAXBuilder;
 import org.apache.axiom.om.impl.exception.OMStreamingException;
 import org.apache.axiom.om.impl.util.NamespaceContextImpl;
 import org.apache.axiom.stax.AbstractXMLStreamReader;
+import org.apache.axiom.stax.ext.DataHandlerProvider;
+import org.apache.axiom.stax.ext.DataHandlerReader;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 
@@ -62,7 +64,7 @@
  * constants.
  */
 public class OMStAXWrapper extends AbstractXMLStreamReader
-    implements OMXMLStreamReader, XMLStreamConstants {
+    implements OMXMLStreamReader, DataHandlerReader, XMLStreamConstants {
     
     private static final Log log = LogFactory.getLog(OMStAXWrapper.class);
     private static boolean DEBUG_ENABLED = log.isDebugEnabled();
@@ -75,6 +77,13 @@
 
     /** Field parser */
     private XMLStreamReader parser;
+    
+    /**
+     * The {@link DataHandlerReader} extension of the underlying parser, or <code>null</code>
+     * if the parser doesn't support this extension.
+     */
+    private DataHandlerReader dataHandlerReader;
+    
     private boolean _isClosed = false;              // Indicate if parser is closed
     private boolean _releaseParserOnClose = false;  // Defaults to legacy behavior, which is keep the reference
 
@@ -851,7 +860,7 @@
         if (builder != null && builder instanceof StAXBuilder) {
             StAXBuilder staxBuilder = (StAXBuilder) builder;
             staxBuilder.close();
-            parser = null;
+            setParser(null);
         } else {
             if (parser != null) {
                 try {
@@ -862,7 +871,7 @@
                     _isClosed = true;
                     // Release the parser so that it can be GC'd or reused.
                     if (_releaseParserOnClose) {
-                        parser = null;
+                        setParser(null);
                     }
                 }
             }
@@ -950,7 +959,7 @@
 
                 // load the parser
                 try {
-                    parser = (XMLStreamReader) builder.getParser();
+                    setParser((XMLStreamReader) builder.getParser());
                 } catch (Exception e) {
                     throw new XMLStreamException("problem accessing the parser. " + e.getMessage(),
                                                  e);
@@ -990,25 +999,9 @@
      * @throws IllegalArgumentException
      */
     public Object getProperty(String s) throws IllegalArgumentException {
-        if (OMConstants.IS_DATA_HANDLERS_AWARE.equals(s)) {
-            return Boolean.TRUE;
-        }
-        if (OMConstants.IS_BINARY.equals(s)) {
-            if (getNode() instanceof OMText) {
-                OMText text = (OMText) getNode();
-                return new Boolean(text.isBinary());
-            }
-            return Boolean.FALSE;
-        } else if (OMConstants.DATA_HANDLER.equals(s)) {
-            if (getNode() instanceof OMText) {
-                OMText text = (OMText) getNode();    
-                if (text.isBinary())
-                    return text.getDataHandler();
-            }
-        }
-        // Per spec, throw IllegalArgumentException
-        if (s == null) {
-            throw new IllegalArgumentException();
+        Object value = DataHandlerReaderUtil.processGetProperty(this, s);
+        if (value != null) {
+            return value;
         }
         if (parser != null) {
             return parser.getProperty(s);
@@ -1236,6 +1229,94 @@
     /*
      *
      * ################################################################
+     * DataHandlerReader extension methods
+     * ################################################################
+     *
+     */
+
+    public boolean isBinary() {
+        if (parser != null) {
+            if (dataHandlerReader != null) {
+                return dataHandlerReader.isBinary();
+            } else {
+                return false;
+            }
+        } else {
+            OMNode node = getNode();
+            if (node instanceof OMText) {
+                return ((OMText)node).isBinary();
+            } else {
+                return false;
+            }
+        }
+    }
+
+    public boolean isDeferred() {
+        if (parser != null) {
+            if (dataHandlerReader != null) {
+                return dataHandlerReader.isDeferred();
+            } else {
+                throw new IllegalStateException();
+            }
+        } else {
+            if (getNode() instanceof OMText) {
+                // TODO: we should support deferred building of the DataHandler
+                return false;
+            } else {
+                throw new IllegalStateException();
+            }
+        }
+    }
+
+    public String getContentID() {
+        if (parser != null) {
+            if (dataHandlerReader != null) {
+                return dataHandlerReader.getContentID();
+            } else {
+                throw new IllegalStateException();
+            }
+        } else {
+            OMNode node = getNode();
+            if (node instanceof OMText) {
+                return ((OMText)node).getContentID();
+            } else {
+                throw new IllegalStateException();
+            }
+        }
+    }
+
+    public DataHandler getDataHandler() {
+        if (parser != null) {
+            if (dataHandlerReader != null) {
+                return dataHandlerReader.getDataHandler();
+            } else {
+                throw new IllegalStateException();
+            }
+        } else {
+            OMNode node = getNode();
+            if (node instanceof OMText) {
+                return (DataHandler)((OMText)node).getDataHandler();
+            } else {
+                throw new IllegalStateException();
+            }
+        }
+    }
+
+    public DataHandlerProvider getDataHandlerProvider() {
+        if (parser != null) {
+            if (dataHandlerReader != null) {
+                return dataHandlerReader.getDataHandlerProvider();
+            } else {
+                throw new IllegalStateException();
+            }
+        } else {
+            throw new IllegalStateException();
+        }
+    }
+
+    /*
+     *
+     * ################################################################
      * Generator methods for the OMNodes returned by the navigator
      * ################################################################
      *
@@ -1459,6 +1540,8 @@
 
     public void setParser(XMLStreamReader parser) {
         this.parser = parser;
+        dataHandlerReader =
+                parser == null ? null : DataHandlerReaderUtil.getDataHandlerReader(parser);
     }
 
     private Map getAllNamespaces(OMNode contextNode) {
@@ -1523,13 +1606,13 @@
         if (builder != null && builder instanceof StAXBuilder) {
             ((StAXBuilder) builder).releaseParserOnClose(value);
             if (isClosed() && value) {
-                parser = null;
+                setParser(null);
             }
             return;
         } else {
             // Release parser if already closed
             if (isClosed() && value) {
-                parser = null;
+                setParser(null);
             }
             _releaseParserOnClose = value;
         }

Added: webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/om/impl/builder/DataHandlerReaderUtil.java
URL: http://svn.apache.org/viewvc/webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/om/impl/builder/DataHandlerReaderUtil.java?rev=791968&view=auto
==============================================================================
--- webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/om/impl/builder/DataHandlerReaderUtil.java (added)
+++ webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/om/impl/builder/DataHandlerReaderUtil.java Tue Jul  7 20:25:01 2009
@@ -0,0 +1,175 @@
+/*
+ * 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.axiom.om.impl.builder;
+
+import javax.activation.DataHandler;
+import javax.xml.stream.XMLStreamConstants;
+import javax.xml.stream.XMLStreamReader;
+
+import org.apache.axiom.om.OMConstants;
+import org.apache.axiom.stax.ext.DataHandlerProvider;
+import org.apache.axiom.stax.ext.DataHandlerReader;
+
+/**
+ * Utility class to work with the {@link XMLStreamReader} 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 DataHandlerReaderUtil {
+    private DataHandlerReaderUtil() {}
+    
+    /**
+     * 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 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(final XMLStreamReader reader) {
+        try {
+            DataHandlerReader dhr = (DataHandlerReader)reader.getProperty(
+                    DataHandlerReader.PROPERTY);
+            if (dhr != null) {
+                return dhr;
+            }
+        } catch (IllegalArgumentException ex) {
+            // Just continue
+        }
+        Boolean isDataHandlerAware;
+        try {
+            isDataHandlerAware = (Boolean)reader.getProperty(OMConstants.IS_DATA_HANDLERS_AWARE);
+        } catch (IllegalArgumentException ex) {
+            return null;
+        }
+        if (isDataHandlerAware != null && isDataHandlerAware.booleanValue()) {
+            return new DataHandlerReader() {
+                public boolean isBinary() {
+                    return ((Boolean)reader.getProperty(OMConstants.IS_BINARY)).booleanValue();
+                }
+
+                public boolean isDeferred() {
+                    return false;
+                }
+
+                public String getContentID() {
+                    return null;
+                }
+
+                public DataHandler getDataHandler() {
+                    return (DataHandler)reader.getProperty(OMConstants.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(OMConstants.IS_DATA_HANDLERS_AWARE)) {
+            return Boolean.TRUE;
+        } else if (propertyName.equals(OMConstants.IS_BINARY)) {
+            return Boolean.valueOf(extension.isBinary());
+        } else if (propertyName.equals(OMConstants.DATA_HANDLER)) {
+            return extension.getDataHandler();
+        } else {
+            return null;
+        }
+    }
+}

Propchange: webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/om/impl/builder/DataHandlerReaderUtil.java
------------------------------------------------------------------------------
    svn:eol-style = native

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=791968&r1=791967&r2=791968&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 Tue Jul  7 20:25:01 2009
@@ -35,6 +35,7 @@
 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.stax.ext.DataHandlerReader;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 
@@ -93,14 +94,10 @@
     protected int maxDepthForCustomBuilders = -1;
     
     /**
-     * Field showing whether the parser is datahandler-aware or not. Client should not directly access this field. 
-     * Instead, they should use {@link #setIsDataHandlerAware(Boolean)} and {@link #isDataHandlerAware()}.
-     * 
-     * @deprecated
-     * @see #isDataHandlerAware()
-     * @see #setIsDataHandlerAware(Boolean)
+     * Reference to the {@link DataHandlerReader} extension of the parser, or <code>null</code> if
+     * the parser doesn't support this extension.
      */
-    protected Boolean isDataHandlerAware = null; // property of parser, https://issues.apache.org/jira/browse/WSCOMMONS-300
+    protected DataHandlerReader dataHandlerReader;
     
     /**
      * Element level is the depth of the element. 
@@ -148,6 +145,7 @@
         if (parser instanceof BuilderAwareReader) {
             ((BuilderAwareReader) parser).setBuilder(this);
         }
+        dataHandlerReader = DataHandlerReaderUtil.getDataHandlerReader(parser);
         this.parser = new SafeXMLStreamReader(parser);
     }
 
@@ -259,21 +257,17 @@
      * @return omNode
      */
     private OMNode createOMText(OMContainer omContainer, int textType) {
-        try {
-            if (isDataHandlerAware() &&
-                    Boolean.TRUE.equals(parser.getProperty(OMConstants.IS_BINARY))) {
-                Object dataHandler = parser.getProperty(OMConstants.DATA_HANDLER);
-                OMText text = omfactory.createOMText(dataHandler, true);
-                text.setBinary(true);
-                omContainer.addChild(text);
-                return text;
-            } 
-        } catch (IllegalArgumentException e) { 
-        	//parser.getProperty may throw illegalArgument exception, ignore
-        } catch (IllegalStateException e) {	
-        	//parser.getProperty may throw illegalState exceptions, ignore
+        if (dataHandlerReader != null && dataHandlerReader.isBinary()) {
+            Object dataHandlerObject =
+                dataHandlerReader.isDeferred() ? (Object)dataHandlerReader.getDataHandlerProvider()
+                                               : (Object)dataHandlerReader.getDataHandler();
+            OMText text = omfactory.createOMText(dataHandlerObject, true);
+            text.setBinary(true);
+            omContainer.addChild(text);
+            return text;
+        } else {
+            return omfactory.createOMText(omContainer, parser.getText(), textType);
         }
-        return omfactory.createOMText(omContainer, parser.getText(), textType);
     }
 
     /**
@@ -667,49 +661,6 @@
     }
 
     /**
-     * Check if the underlying parse is aware of data handlers. (example ADB generated code)
-     *
-     * @return true if the parser is aware of data handlers, otherwise false
-     */
-    protected boolean isDataHandlerAware() {
-        
-        // Is datahandler is immutable for a parser's lifetime.  Thus it should
-        // only be checked one time.
-        if (isDataHandlerAware == null) {
-            // check whether data handlers are treated seperately
-            try {
-                if (parser != null &&
-                        (Boolean.TRUE == parser.getProperty(OMConstants.IS_DATA_HANDLERS_AWARE))) {
-                    isDataHandlerAware = Boolean.TRUE;
-                } else {
-                    isDataHandlerAware = Boolean.FALSE;
-                }
-            } catch (IllegalArgumentException e) {
-                // according to the parser api, get property will return IllegalArgumentException, when that
-                // property is not found.
-                isDataHandlerAware = Boolean.FALSE;
-            } catch (IllegalStateException e) {
-                // it will also throw illegalStateExceptions if in wrong state, ignore
-            }
-        }
-
-        if (Boolean.TRUE.equals(isDataHandlerAware)) {
-            return true;
-        }
-
-        return false;
-    }
-
-    /**
-     * Sets the isDataHandlerAware state of this {@link StAXBuilder}.
-     * 
-     * @param value a boolean value - may be null
-     */
-    protected void setIsDataHandlerAware(Boolean value) {
-        this.isDataHandlerAware = value;
-    }
-    
-    /**
      * Returns the encoding style of the XML data
      * @return the character encoding, defaults to "UTF-8"
      */

Modified: webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/om/impl/builder/StAXOMBuilder.java
URL: http://svn.apache.org/viewvc/webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/om/impl/builder/StAXOMBuilder.java?rev=791968&r1=791967&r2=791968&view=diff
==============================================================================
--- webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/om/impl/builder/StAXOMBuilder.java (original)
+++ webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/om/impl/builder/StAXOMBuilder.java Tue Jul  7 20:25:01 2009
@@ -47,55 +47,10 @@
 
 /**
  * StAX based builder that produces a pure XML infoset compliant object model.
- * 
- * <h3>XMLStreamReader extensions for optimized base64 handling</h3>
- * 
- * <p>This class supports {@link XMLStreamReader} instances that expose base64 encoded binary
- * content as {@link javax.activation.DataHandler} objects. For this to work, the
- * {@link XMLStreamReader} 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>
- * <p>The extension described will typically be implemented by {@link XMLStreamReader} instances
- * provided by databinding frameworks or {@link XMLStreamReader} proxies that enrich a stream of
- * StAX events with binary data existing outside of the XML document. Another example is
- * {@link org.apache.axiom.om.impl.OMStAXWrapper}.</p>
- * <p>One may ask why this extension is defined using {@link XMLStreamReader} properties and not
- * simply as an extension interface that the reader may implement. The reason is that the property
- * based approach continues to work if the {@link XMLStreamReader} implementing the extension
- * is accessed through a proxy implementing the {@link XMLStreamReader} interface but unaware
- * of the extension, at least if the proxy correctly delegates calls to the
- * {@link XMLStreamReader#getProperty(String)} method.</p>
+ * <p>
+ * This class supports the {@link XMLStreamReader} extension defined by
+ * {@link org.apache.axiom.stax.ext.DataHandlerReader} as well as the legacy extension mechanism
+ * defined in the documentation of {@link DataHandlerReaderUtil}.
  */
 public class StAXOMBuilder extends StAXBuilder {
     /** Field document */

Added: webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/stax/ext/DataHandlerProvider.java
URL: http://svn.apache.org/viewvc/webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/stax/ext/DataHandlerProvider.java?rev=791968&view=auto
==============================================================================
--- webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/stax/ext/DataHandlerProvider.java (added)
+++ webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/stax/ext/DataHandlerProvider.java Tue Jul  7 20:25:01 2009
@@ -0,0 +1,37 @@
+/*
+ * 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.axiom.stax.ext;
+
+import javax.activation.DataHandler;
+
+/**
+ * Interface used for deferred loading of binary content.
+ * 
+ * @see DataHandlerReader#isDeferred()
+ * @see DataHandlerReader#getDataHandlerProvider()
+ */
+public interface DataHandlerProvider {
+    /**
+     * Get the {@link DataHandler} object for the binary content.
+     * 
+     * @return the binary content
+     */
+    DataHandler getDataHandler();
+}

Propchange: webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/stax/ext/DataHandlerProvider.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/stax/ext/DataHandlerReader.java
URL: http://svn.apache.org/viewvc/webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/stax/ext/DataHandlerReader.java?rev=791968&view=auto
==============================================================================
--- webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/stax/ext/DataHandlerReader.java (added)
+++ webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/stax/ext/DataHandlerReader.java Tue Jul  7 20:25:01 2009
@@ -0,0 +1,144 @@
+/*
+ * 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.axiom.stax.ext;
+
+import javax.activation.DataHandler;
+
+/**
+ * Extension interface for {@link javax.xml.stream.XMLStreamReader} implementations that expose
+ * base64 encoded binary content as {@link DataHandler} objects.
+ * <p>
+ * The {@link javax.xml.stream.XMLStreamReader} MAY implement this interface directly, but a
+ * consumer MUST use {@link javax.xml.stream.XMLStreamReader#getProperty(String)} with the property
+ * name defined by {@link #PROPERTY} to get a reference to this extension interface. The rationale
+ * for this requirement is that a property based approach continues to work even if the
+ * {@link javax.xml.stream.XMLStreamReader} implementing the extension is accessed indirectly
+ * through a proxy implementing the {@link javax.xml.stream.XMLStreamReader} interface but unaware
+ * of the extension. Note that this assumes that the proxy correctly delegates calls to the
+ * {@link javax.xml.stream.XMLStreamReader#getProperty(String)} method.
+ * <p>
+ * The property defined by {@link #PROPERTY} MUST be available regardless of the current state of
+ * the {@link javax.xml.stream.XMLStreamReader}. In addition it is assumed to be immutable, i.e.
+ * its value MUST NOT not change during the lifetime of the {@link javax.xml.stream.XMLStreamReader}
+ * implementation. For a consumer it is therefore sufficient to look up the extension once and to
+ * continue using the reference returned by
+ * {@link javax.xml.stream.XMLStreamReader#getProperty(String)} during the entire lifetime of the
+ * {@link javax.xml.stream.XMLStreamReader}.
+ * <p>
+ * If the {@link javax.xml.stream.XMLStreamReader} wishes to expose base64 encoded content using
+ * this extension interface, it MUST do so using a single
+ * {@link javax.xml.stream.XMLStreamConstants#CHARACTERS} event. To maintain compatibility with
+ * consumers that are unaware of the extension, the implementation SHOULD make sure that
+ * {@link javax.xml.stream.XMLStreamReader#getText()},
+ * {@link javax.xml.stream.XMLStreamReader#getTextStart()},
+ * {@link javax.xml.stream.XMLStreamReader#getTextLength()},
+ * {@link javax.xml.stream.XMLStreamReader#getTextCharacters()},
+ * {@link javax.xml.stream.XMLStreamReader#getTextCharacters(int, char[], int, int)} and
+ * {@link javax.xml.stream.XMLStreamReader#getElementText()} behave as expected for this type of
+ * event, i.e. return the base64 representation of the binary content.
+ * <p>
+ * The extension described by this interface will typically be implemented by XMLStreamReader
+ * instances provided by databinding frameworks or XMLStreamReader proxies that enrich a stream of
+ * StAX events with binary data existing outside of the XML document (e.g. an XOP/MTOM decoder).
+ */
+public interface DataHandlerReader {
+    /**
+     * The name of the property used to look up this extension interface from a
+     * {@link javax.xml.stream.XMLStreamReader} implementation.
+     */
+    String PROPERTY = DataHandlerReader.class.getName();
+    
+    /**
+     * Check whether the current event is a {@link javax.xml.stream.XMLStreamConstants#CHARACTERS}
+     * event representing base64 encoded binary content and for which a
+     * {@link javax.activation.DataHandler} is available.
+     * 
+     * @return <code>true</code> if the current event is a
+     *         {@link javax.xml.stream.XMLStreamConstants#CHARACTERS} event representing base64
+     *         encoded binary content and for which a {@link javax.activation.DataHandler} is
+     *         available; <code>false</code> for all other types of events.
+     */
+    boolean isBinary();
+    
+    /**
+     * Check whether the {@link javax.xml.stream.XMLStreamReader} supports deferred loading of the
+     * binary content for the current event. If this method returns <code>true</code> then a
+     * consumer MAY call {@link #getDataHandlerProvider()} and retrieve the
+     * {@link javax.activation.DataHandler} later using {@link DataHandlerProvider#getDataHandler()}.
+     * Calling this method is only meaningful if {@link #isBinary()} returns <code>true</code> for
+     * the current event. The behavior of this method is undefined if this is not the case.
+     * 
+     * @return <code>true</code> if deferred loading is supported; <code>false</code> otherwise
+     */
+    boolean isDeferred();
+    
+    /**
+     * Get the content ID of the binary content for the current event, if available. The result of
+     * this method is defined if and only if {@link #isBinary()} returns <code>true</code> for the
+     * current event.
+     * <p>
+     * The implementation SHOULD only return a non null value if the content ID has been used
+     * previously in an interaction with another component or system. The implementation SHOULD NOT
+     * generate a new content ID solely for the purpose of this method.
+     * <p>
+     * If available, the returned value MUST be a raw content ID. In particular:
+     * <ul>
+     * <li>If the content ID has been extracted from an <tt>href</tt> attribute, it MUST NOT
+     * contain the <tt>cid:</tt> prefix.</li>
+     * <li>If it has been extracted from a <tt>Content-ID</tt> MIME header, it MUST NOT be
+     * enclosed in angles (<tt>&lt;></tt>).</li>
+     * </ul>
+     * <p>
+     * A consumer MAY use the return value of this method in contexts where it is desirable to
+     * preserve the original content ID used by another system or component to identify the binary
+     * content. However, the consumer MUST NOT make any assumption about the uniqueness or validity
+     * of the content ID (with respect to relevant standards such as RFC822) and SHOULD make
+     * provision to sanitize the value if necessary.
+     * 
+     * @return any content ID used previously to identify the binary content, or <code>null</code>
+     *         if no content ID is known
+     */
+    String getContentID();
+    
+    /**
+     * Get the {@link DataHandler} with the binary content for the current event. The behavior of
+     * this method is only defined for events for which {@link #isBinary()} returns
+     * <code>true</code>. For events of this type the method MUST return a valid
+     * {@link DataHandler}, regardless of the return value of {@link #isDeferred()}. If
+     * {@link #isDeferred()} returns <code>true</code>, then the consumer may use this method to
+     * force the implementation to load the binary content immediately.
+     * 
+     * @return the binary content for the current event
+     */
+    DataHandler getDataHandler();
+    
+    /**
+     * Get a {@link DataHandlerProvider} instance for deferred loading of the binary content for the
+     * current event. The behavior of this method is defined if and only if {@link #isDeferred()}
+     * returns <code>true</code> for the current event. The returned reference MUST remain valid
+     * after the current event has been consumed. It is up to the implementation to specify the
+     * exact lifecycle of the returned instance, in particular until when the binary content can be
+     * retrieved.
+     * 
+     * @return the {@link DataHandlerProvider} instance the consumer can use to load the binary
+     *         content at a later time
+     */
+    DataHandlerProvider getDataHandlerProvider();
+}

Propchange: webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/stax/ext/DataHandlerReader.java
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: webservices/commons/trunk/modules/axiom/modules/axiom-api/src/test/java/org/apache/axiom/om/OMTextTestBase.java
URL: http://svn.apache.org/viewvc/webservices/commons/trunk/modules/axiom/modules/axiom-api/src/test/java/org/apache/axiom/om/OMTextTestBase.java?rev=791968&r1=791967&r2=791968&view=diff
==============================================================================
--- webservices/commons/trunk/modules/axiom/modules/axiom-api/src/test/java/org/apache/axiom/om/OMTextTestBase.java (original)
+++ webservices/commons/trunk/modules/axiom/modules/axiom-api/src/test/java/org/apache/axiom/om/OMTextTestBase.java Tue Jul  7 20:25:01 2009
@@ -19,7 +19,26 @@
 
 package org.apache.axiom.om;
 
+import javax.activation.DataHandler;
+
+import org.apache.axiom.stax.ext.DataHandlerProvider;
+
 public class OMTextTestBase extends AbstractTestCase {
+    static class TestDataHandlerProvider implements DataHandlerProvider {
+        private DataHandler dh;
+        
+        public DataHandler getDataHandler() {
+            if (dh == null) {
+                dh = new DataHandler("Data", "text/plain");
+            }
+            return dh;
+        }
+        
+        public boolean isDataHandlerCreated() {
+            return dh != null;
+        }
+    }
+    
     protected final OMMetaFactory omMetaFactory;
 
     public OMTextTestBase(OMMetaFactory omMetaFactory) {
@@ -41,6 +60,15 @@
                 text.equals(omText.getText()));
 
     }
+    
+    public void testCreateFromDataHandlerProvider() throws Exception {
+        TestDataHandlerProvider prov = new TestDataHandlerProvider();
+        OMFactory factory = omMetaFactory.getOMFactory();
+        OMText text = factory.createOMText(null, prov, true);
+        assertFalse(prov.isDataHandlerCreated());
+        assertEquals(((DataHandler)text.getDataHandler()).getContent(), "Data");
+        assertTrue(prov.isDataHandlerCreated());
+    }
 
     public void testSetText() {
         OMFactory factory = omMetaFactory.getOMFactory();

Modified: webservices/commons/trunk/modules/axiom/modules/axiom-dom/src/main/java/org/apache/axiom/om/impl/dom/TextImpl.java
URL: http://svn.apache.org/viewvc/webservices/commons/trunk/modules/axiom/modules/axiom-dom/src/main/java/org/apache/axiom/om/impl/dom/TextImpl.java?rev=791968&r1=791967&r2=791968&view=diff
==============================================================================
--- webservices/commons/trunk/modules/axiom/modules/axiom-dom/src/main/java/org/apache/axiom/om/impl/dom/TextImpl.java (original)
+++ webservices/commons/trunk/modules/axiom/modules/axiom-dom/src/main/java/org/apache/axiom/om/impl/dom/TextImpl.java Tue Jul  7 20:25:01 2009
@@ -26,6 +26,7 @@
 import org.apache.axiom.om.OMFactory;
 import org.apache.axiom.om.OMNode;
 import org.apache.axiom.om.OMXMLParserWrapper;
+import org.apache.axiom.stax.ext.DataHandlerProvider;
 import org.w3c.dom.Node;
 
 public class TextImpl extends TextNodeImpl {
@@ -39,6 +40,11 @@
         super(ownerNode, dataHandler, optimize, factory);
     }
 
+    public TextImpl(DocumentImpl ownerNode, String contentID,
+            DataHandlerProvider dataHandlerProvider, boolean optimize, OMFactory factory) {
+        super(ownerNode, contentID, dataHandlerProvider, optimize, factory);
+    }
+
     public TextImpl(DocumentImpl ownerNode, OMFactory factory) {
         super(ownerNode, factory);
     }

Modified: webservices/commons/trunk/modules/axiom/modules/axiom-dom/src/main/java/org/apache/axiom/om/impl/dom/TextNodeImpl.java
URL: http://svn.apache.org/viewvc/webservices/commons/trunk/modules/axiom/modules/axiom-dom/src/main/java/org/apache/axiom/om/impl/dom/TextNodeImpl.java?rev=791968&r1=791967&r2=791968&view=diff
==============================================================================
--- webservices/commons/trunk/modules/axiom/modules/axiom-dom/src/main/java/org/apache/axiom/om/impl/dom/TextNodeImpl.java (original)
+++ webservices/commons/trunk/modules/axiom/modules/axiom-dom/src/main/java/org/apache/axiom/om/impl/dom/TextNodeImpl.java Tue Jul  7 20:25:01 2009
@@ -33,6 +33,7 @@
 import org.apache.axiom.om.impl.builder.XOPBuilder;
 import org.apache.axiom.om.util.TextHelper;
 import org.apache.axiom.om.util.UUIDGenerator;
+import org.apache.axiom.stax.ext.DataHandlerProvider;
 import org.w3c.dom.DOMException;
 import org.w3c.dom.Node;
 import org.w3c.dom.Text;
@@ -185,6 +186,24 @@
         this.ns = XOP_NS;
     }
 
+    /**
+     * Constructor.
+     * 
+     * @param contentID
+     * @param dataHandlerProvider
+     * @param optimize
+     * @param factory
+     */
+    public TextNodeImpl(DocumentImpl ownerNode, String contentID, DataHandlerProvider
+            dataHandlerProvider, boolean optimize, OMFactory factory) {
+        super(ownerNode, factory);
+        this.contentID = contentID;
+        dataHandlerObject = dataHandlerProvider;
+        isBinary = true;
+        this.optimize = optimize;
+        done = true;
+    }
+
     /** @param ownerNode  */
     public TextNodeImpl(DocumentImpl ownerNode, OMFactory factory) {
         super(ownerNode, factory);
@@ -427,6 +446,8 @@
                 }
                 dataHandlerObject = ((XOPBuilder) builder)
                         .getDataHandler(contentID);
+            } else if (dataHandlerObject instanceof DataHandlerProvider) {
+                dataHandlerObject = ((DataHandlerProvider)dataHandlerObject).getDataHandler();
             }
             return dataHandlerObject;
         }

Modified: webservices/commons/trunk/modules/axiom/modules/axiom-dom/src/main/java/org/apache/axiom/om/impl/dom/factory/OMDOMFactory.java
URL: http://svn.apache.org/viewvc/webservices/commons/trunk/modules/axiom/modules/axiom-dom/src/main/java/org/apache/axiom/om/impl/dom/factory/OMDOMFactory.java?rev=791968&r1=791967&r2=791968&view=diff
==============================================================================
--- webservices/commons/trunk/modules/axiom/modules/axiom-dom/src/main/java/org/apache/axiom/om/impl/dom/factory/OMDOMFactory.java (original)
+++ webservices/commons/trunk/modules/axiom/modules/axiom-dom/src/main/java/org/apache/axiom/om/impl/dom/factory/OMDOMFactory.java Tue Jul  7 20:25:01 2009
@@ -49,6 +49,7 @@
 import org.apache.axiom.om.impl.dom.ProcessingInstructionImpl;
 import org.apache.axiom.om.impl.dom.TextImpl;
 import org.apache.axiom.om.impl.dom.TextNodeImpl;
+import org.apache.axiom.stax.ext.DataHandlerProvider;
 import org.w3c.dom.Node;
 
 import javax.xml.namespace.QName;
@@ -339,6 +340,11 @@
         return new TextImpl(this.document, dataHandler, optimize, this);
     }
 
+    public OMText createOMText(String contentID, DataHandlerProvider dataHandlerProvider,
+            boolean optimize) {
+        return new TextImpl(this.document, contentID, dataHandlerProvider, optimize, this);
+    }
+
     /**
      * Creates an OMDOM Text node, adds it to the give parent element and returns it.
      *

Modified: webservices/commons/trunk/modules/axiom/modules/axiom-impl/src/main/java/org/apache/axiom/om/impl/llom/OMTextImpl.java
URL: http://svn.apache.org/viewvc/webservices/commons/trunk/modules/axiom/modules/axiom-impl/src/main/java/org/apache/axiom/om/impl/llom/OMTextImpl.java?rev=791968&r1=791967&r2=791968&view=diff
==============================================================================
--- webservices/commons/trunk/modules/axiom/modules/axiom-impl/src/main/java/org/apache/axiom/om/impl/llom/OMTextImpl.java (original)
+++ webservices/commons/trunk/modules/axiom/modules/axiom-impl/src/main/java/org/apache/axiom/om/impl/llom/OMTextImpl.java Tue Jul  7 20:25:01 2009
@@ -35,6 +35,7 @@
 import org.apache.axiom.om.impl.util.OMSerializerUtil;
 import org.apache.axiom.om.util.TextHelper;
 import org.apache.axiom.om.util.UUIDGenerator;
+import org.apache.axiom.stax.ext.DataHandlerProvider;
 
 import javax.xml.namespace.QName;
 import javax.xml.stream.XMLStreamException;
@@ -217,6 +218,24 @@
     }
 
     /**
+     * Constructor.
+     * 
+     * @param dataHandlerProvider
+     * @param optimize
+     * @param factory
+     */
+    public OMTextImpl(String contentID, DataHandlerProvider dataHandlerProvider, boolean optimize,
+            OMFactory factory) {
+        super(factory);
+        this.contentID = contentID;
+        dataHandlerObject = dataHandlerProvider;
+        isBinary = true;
+        this.optimize = optimize;
+        done = true;
+        nodeType = TEXT_NODE;
+    }
+
+    /**
      * @param contentID
      * @param parent
      * @param builder   Used when the builder is encountered with a XOP:Include tag Stores a
@@ -364,6 +383,8 @@
                 }
                 dataHandlerObject = ((XOPBuilder) builder)
                         .getDataHandler(contentID);
+            } else if (dataHandlerObject instanceof DataHandlerProvider) {
+                dataHandlerObject = ((DataHandlerProvider)dataHandlerObject).getDataHandler();
             }
             return dataHandlerObject;
         }

Modified: webservices/commons/trunk/modules/axiom/modules/axiom-impl/src/main/java/org/apache/axiom/om/impl/llom/factory/OMLinkedListImplFactory.java
URL: http://svn.apache.org/viewvc/webservices/commons/trunk/modules/axiom/modules/axiom-impl/src/main/java/org/apache/axiom/om/impl/llom/factory/OMLinkedListImplFactory.java?rev=791968&r1=791967&r2=791968&view=diff
==============================================================================
--- webservices/commons/trunk/modules/axiom/modules/axiom-impl/src/main/java/org/apache/axiom/om/impl/llom/factory/OMLinkedListImplFactory.java (original)
+++ webservices/commons/trunk/modules/axiom/modules/axiom-impl/src/main/java/org/apache/axiom/om/impl/llom/factory/OMLinkedListImplFactory.java Tue Jul  7 20:25:01 2009
@@ -42,6 +42,7 @@
 import org.apache.axiom.om.impl.llom.OMProcessingInstructionImpl;
 import org.apache.axiom.om.impl.llom.OMSourcedElementImpl;
 import org.apache.axiom.om.impl.llom.OMTextImpl;
+import org.apache.axiom.stax.ext.DataHandlerProvider;
 
 import javax.xml.namespace.QName;
 import java.util.Hashtable;
@@ -258,6 +259,11 @@
         return new OMTextImpl(dataHandler, optimize, this);
     }
 
+    public OMText createOMText(String contentID, DataHandlerProvider dataHandlerProvider,
+            boolean optimize) {
+        return new OMTextImpl(contentID, dataHandlerProvider, optimize, this);
+    }
+
     public OMText createOMText(String contentID, OMContainer parent,
                                OMXMLParserWrapper builder) {
         return new OMTextImpl(contentID, parent, builder, this);