This is an automated email from the ASF dual-hosted git repository.

veithen pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/ws-axiom.git


The following commit(s) were added to refs/heads/master by this push:
     new 71e49adac [AXIOM-506] Partially migrate from DataHandler to Blob
71e49adac is described below

commit 71e49adacd5f9a877fb0895934f5b216921c0c31
Author: Andreas Veithen <andreas.veit...@gmail.com>
AuthorDate: Wed Nov 2 23:12:32 2022 +0000

    [AXIOM-506] Partially migrate from DataHandler to Blob
    
    Refactor the DataHandlerProvider, DataHandlerReader and
    DataHandlerWriter APIs to work with Blob objects. Also store binary data
    as Blob objects internally.
---
 .../DataHandlerProvider.java => BlobProvider.java} | 16 ++--
 .../DataHandlerReader.java => BlobReader.java}     | 33 ++++----
 .../DataHandlerWriter.java => BlobWriter.java}     | 29 +++----
 .../apache/axiom/ext/stax/datahandler/package.html | 25 ------
 .../java/org/apache/axiom/ext/stax/package.html    |  2 +-
 .../java/org/apache/axiom/om/OMCloneOptions.java   |  8 +-
 .../main/java/org/apache/axiom/om/OMContainer.java |  4 +-
 .../java/org/apache/axiom/om/OMDataSource.java     | 11 +--
 .../main/java/org/apache/axiom/om/OMFactory.java   |  9 ++-
 .../java/org/apache/axiom/om/OMSerializable.java   |  6 +-
 .../org/apache/axiom/om/OMXMLBuilderFactory.java   |  4 +-
 .../apache/axiom/om/impl/MTOMXMLStreamWriter.java  | 15 ++--
 .../axiom/util/stax/XMLStreamReaderUtils.java      | 48 ++++++------
 .../axiom/util/stax/XMLStreamWriterUtils.java      | 74 +++++++++---------
 .../axiom/util/stax/XMLStreamReaderUtilsTest.java  | 90 +++++++++++-----------
 ...der.java => XMLStreamReaderWithBlobReader.java} | 14 ++--
 .../om/impl/common/factory/OMFactoryImpl.java      | 11 ++-
 .../org/apache/axiom/om/impl/intf/TextContent.java | 55 ++++++-------
 .../apache/axiom/om/impl/mixin/AxiomTextMixin.java |  3 +-
 .../impl/stream/ds/PushOMDataSourceXOPHandler.java |  3 +-
 .../pull/AxiomXMLStreamReaderExtensionFactory.java |  6 +-
 .../stax/pull/AxiomXMLStreamReaderHelper.java      | 26 +++----
 ...aHandlerReaderImpl.java => BlobReaderImpl.java} | 22 +++---
 .../push/AxiomXMLStreamWriterExtensionFactory.java |  6 +-
 ...aHandlerWriterImpl.java => BlobWriterImpl.java} | 19 +++--
 .../stream/stax/push/XMLStreamWriterHandler.java   | 32 ++++----
 .../om/impl/stream/xop/ContentIDGenerator.java     |  2 +-
 .../om/impl/stream/xop/OptimizationPolicy.java     | 27 +++----
 .../om/impl/stream/xop/OptimizationPolicyImpl.java |  7 +-
 .../impl/stream/xop/XOPDecodingFilterHandler.java  | 10 ++-
 .../impl/stream/xop/XOPEncodingFilterHandler.java  | 32 ++++----
 .../java/org/apache/axiom/samples/LogWriter.java   | 14 ++--
 .../org/apache/axiom/ts/om/OMTestSuiteBuilder.java | 12 +--
 ...romElement.java => TestGetBlobFromElement.java} | 12 +--
 ....java => TestCreateOMTextFromBlobProvider.java} | 29 +++----
 .../push/PushOMDataSourceScenario.java             |  4 +-
 ...cenario.java => WriteBlobProviderScenario.java} | 22 +++---
 ...HandlerScenario.java => WriteBlobScenario.java} | 11 +--
 38 files changed, 366 insertions(+), 387 deletions(-)

diff --git 
a/axiom-api/src/main/java/org/apache/axiom/ext/stax/datahandler/DataHandlerProvider.java
 b/axiom-api/src/main/java/org/apache/axiom/ext/stax/BlobProvider.java
similarity index 74%
rename from 
axiom-api/src/main/java/org/apache/axiom/ext/stax/datahandler/DataHandlerProvider.java
rename to axiom-api/src/main/java/org/apache/axiom/ext/stax/BlobProvider.java
index 09726b833..4b08a457d 100644
--- 
a/axiom-api/src/main/java/org/apache/axiom/ext/stax/datahandler/DataHandlerProvider.java
+++ b/axiom-api/src/main/java/org/apache/axiom/ext/stax/BlobProvider.java
@@ -17,25 +17,25 @@
  * under the License.
  */
 
-package org.apache.axiom.ext.stax.datahandler;
+package org.apache.axiom.ext.stax;
 
 import java.io.IOException;
 
-import javax.activation.DataHandler;
+import org.apache.axiom.blob.Blob;
 
 /**
  * Interface used for deferred loading of binary content.
  * 
- * @see DataHandlerReader#isDeferred()
- * @see DataHandlerReader#getDataHandlerProvider()
+ * @see BlobReader#isDeferred()
+ * @see BlobReader#getBlobProvider()
  */
-public interface DataHandlerProvider {
+public interface BlobProvider {
     /**
-     * Get the {@link DataHandler} object for the binary content.
+     * Get the {@link Blob} object for the binary content.
      * 
      * @return the binary content
      * 
-     * @throws IOException if an error occurs while loading the {@link 
DataHandler}
+     * @throws IOException if an error occurs while loading the {@link Blob}
      */
-    DataHandler getDataHandler() throws IOException;
+    Blob getBlob() throws IOException;
 }
diff --git 
a/axiom-api/src/main/java/org/apache/axiom/ext/stax/datahandler/DataHandlerReader.java
 b/axiom-api/src/main/java/org/apache/axiom/ext/stax/BlobReader.java
similarity index 85%
rename from 
axiom-api/src/main/java/org/apache/axiom/ext/stax/datahandler/DataHandlerReader.java
rename to axiom-api/src/main/java/org/apache/axiom/ext/stax/BlobReader.java
index 038e5a7ee..d05685560 100644
--- 
a/axiom-api/src/main/java/org/apache/axiom/ext/stax/datahandler/DataHandlerReader.java
+++ b/axiom-api/src/main/java/org/apache/axiom/ext/stax/BlobReader.java
@@ -17,14 +17,15 @@
  * under the License.
  */
 
-package org.apache.axiom.ext.stax.datahandler;
+package org.apache.axiom.ext.stax;
 
-import javax.activation.DataHandler;
 import javax.xml.stream.XMLStreamException;
 
+import org.apache.axiom.blob.Blob;
+
 /**
  * Extension interface for {@link javax.xml.stream.XMLStreamReader} 
implementations that expose
- * base64 encoded binary content as {@link DataHandler} objects.
+ * base64 encoded binary content as {@link Blob} objects.
  * <p>
  * All the requirements specified in {@link org.apache.axiom.ext.stax} apply to
  * this extension interface. In particular,
@@ -47,21 +48,21 @@ import javax.xml.stream.XMLStreamException;
  * 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 {
+public interface BlobReader {
     /**
      * 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();
+    String PROPERTY = BlobReader.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.
+     * {@link Blob} 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
+     *         encoded binary content and for which a {@link Blob} is
      *         available; <code>false</code> for all other types of events.
      */
     boolean isBinary();
@@ -80,8 +81,8 @@ public interface DataHandlerReader {
     /**
      * 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()}.
+     * consumer MAY call {@link #getBlobProvider()} and retrieve the
+     * {@link Blob} later using {@link BlobProvider#getBlob()}.
      * 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.
      * 
@@ -118,29 +119,29 @@ public interface DataHandlerReader {
     String getContentID();
     
     /**
-     * Get the {@link DataHandler} with the binary content for the current 
event. The behavior of
+     * Get the {@link Blob} 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 Blob}, 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
      * 
-     * @throws XMLStreamException if an error occurs while loading the {@link 
DataHandler}
+     * @throws XMLStreamException if an error occurs while loading the {@link 
Blob}
      */
-    DataHandler getDataHandler() throws XMLStreamException;
+    Blob getBlob() throws XMLStreamException;
     
     /**
-     * Get a {@link DataHandlerProvider} instance for deferred loading of the 
binary content for the
+     * Get a {@link BlobProvider} 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
+     * @return the {@link BlobProvider} instance the consumer can use to load 
the binary
      *         content at a later time
      */
-    DataHandlerProvider getDataHandlerProvider();
+    BlobProvider getBlobProvider();
 }
diff --git 
a/axiom-api/src/main/java/org/apache/axiom/ext/stax/datahandler/DataHandlerWriter.java
 b/axiom-api/src/main/java/org/apache/axiom/ext/stax/BlobWriter.java
similarity index 83%
rename from 
axiom-api/src/main/java/org/apache/axiom/ext/stax/datahandler/DataHandlerWriter.java
rename to axiom-api/src/main/java/org/apache/axiom/ext/stax/BlobWriter.java
index 63be94ec8..b60f29aad 100644
--- 
a/axiom-api/src/main/java/org/apache/axiom/ext/stax/datahandler/DataHandlerWriter.java
+++ b/axiom-api/src/main/java/org/apache/axiom/ext/stax/BlobWriter.java
@@ -17,16 +17,17 @@
  * under the License.
  */
 
-package org.apache.axiom.ext.stax.datahandler;
+package org.apache.axiom.ext.stax;
 
 import java.io.IOException;
 
-import javax.activation.DataHandler;
 import javax.xml.stream.XMLStreamException;
 
+import org.apache.axiom.blob.Blob;
+
 /**
  * Extension interface for {@link javax.xml.stream.XMLStreamWriter} 
implementations that can
- * receive base64 encoded binary content as {@link DataHandler} objects. A 
stream writer
+ * receive base64 encoded binary content as {@link Blob} objects. A stream 
writer
  * implementing this extension may write the binary data as base64 encoded 
character data
  * or using some optimization such as XOP/MTOM.
  * <p>
@@ -35,8 +36,8 @@ import javax.xml.stream.XMLStreamException;
  * a consumer MUST use {@link 
javax.xml.stream.XMLStreamWriter#getProperty(String)} with the property
  * name defined by {@link #PROPERTY} to get a reference to this extension 
interface.
  * <p>
- * The interface defines two methods to write binary content, one that takes a 
{@link DataHandler}
- * argument and one with a {@link DataHandlerProvider} argument. The first 
should be used when
+ * The interface defines two methods to write binary content, one that takes a 
{@link Blob}
+ * argument and one with a {@link BlobProvider} argument. The first should be 
used when
  * the content is immediately available, while the second supports deferred 
loading of the data
  * handler. The meaning of the <code>contentID</code> and 
<code>optimize</code> arguments is
  * the same for both methods:
@@ -45,7 +46,7 @@ import javax.xml.stream.XMLStreamException;
  *   <dd>
  *     A content ID of the binary content, if available. The semantics of this 
argument are
  *     similar to those defined for the return value of the
- *     {@link DataHandlerReader#getContentID()} method:
+ *     {@link BlobReader#getContentID()} method:
  *     <ul>
  *       <li>This argument should only be set if a content ID has been used
  *           previously in an interaction with another component or system.
@@ -62,23 +63,23 @@ import javax.xml.stream.XMLStreamException;
  *     to override this value or ignore it entirely.
  * </dl>
  * Instead of interacting directly with this extension interface, the consumer 
may use the
- * {@link 
org.apache.axiom.util.stax.XMLStreamWriterUtils#writeDataHandler(javax.xml.stream.XMLStreamWriter,
 DataHandler, String, boolean)} or
- * {@link 
org.apache.axiom.util.stax.XMLStreamWriterUtils#writeDataHandler(javax.xml.stream.XMLStreamWriter,
 DataHandlerProvider, String, boolean)}
+ * {@link 
org.apache.axiom.util.stax.XMLStreamWriterUtils#writeBlob(javax.xml.stream.XMLStreamWriter,
 Blob, String, boolean)} or
+ * {@link 
org.apache.axiom.util.stax.XMLStreamWriterUtils#writeBlob(javax.xml.stream.XMLStreamWriter,
 BlobProvider, String, boolean)}
  * utility methods. These methods make the processing of binary data entirely 
transparent for
  * the caller.
  */
-public interface DataHandlerWriter {
+public interface BlobWriter {
     /**
      * The name of the property used to look up this extension interface from a
      * {@link javax.xml.stream.XMLStreamWriter} implementation.
      */
-    String PROPERTY = DataHandlerWriter.class.getName();
+    String PROPERTY = BlobWriter.class.getName();
 
     /**
      * Write binary content to the stream. The implementation may choose to 
write the data as base64
      * encoded character data or using an optimization protocol such as 
XOP/MTOM.
      * 
-     * @param dataHandler
+     * @param blob
      *            the binary content to write
      * @param contentID
      *            an existing content ID for the binary data (see above)
@@ -89,7 +90,7 @@ public interface DataHandlerWriter {
      * @throws XMLStreamException
      *             if an error occurs while writing to the underlying stream
      */
-    void writeDataHandler(DataHandler dataHandler, String contentID, boolean 
optimize)
+    void writeBlob(Blob blob, String contentID, boolean optimize)
             throws IOException, XMLStreamException;
 
     /**
@@ -99,7 +100,7 @@ public interface DataHandlerWriter {
      * after the XML infoset is complete. If the caller uses this method, the 
implementation can
      * defer the actual loading of the binary content.
      * 
-     * @param dataHandlerProvider
+     * @param blobProvider
      *            the binary content to write
      * @param contentID
      *            an existing content ID for the binary data (see above)
@@ -113,6 +114,6 @@ public interface DataHandlerWriter {
      * @throws XMLStreamException
      *             if an error occurs while writing to the underlying stream
      */
-    void writeDataHandler(DataHandlerProvider dataHandlerProvider, String 
contentID,
+    void writeBlob(BlobProvider blobProvider, String contentID,
             boolean optimize) throws IOException, XMLStreamException;
 }
diff --git 
a/axiom-api/src/main/java/org/apache/axiom/ext/stax/datahandler/package.html 
b/axiom-api/src/main/java/org/apache/axiom/ext/stax/datahandler/package.html
deleted file mode 100644
index a9ccaa432..000000000
--- a/axiom-api/src/main/java/org/apache/axiom/ext/stax/datahandler/package.html
+++ /dev/null
@@ -1,25 +0,0 @@
-<!--
-  ~ 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.
-  -->
-<html>
-<body>
-Defines an Axiom specific extension to the StAX API to work with DataHandler 
objects.
-
-@see org.apache.axiom.ext.stax
-</body>
-</html>
\ No newline at end of file
diff --git a/axiom-api/src/main/java/org/apache/axiom/ext/stax/package.html 
b/axiom-api/src/main/java/org/apache/axiom/ext/stax/package.html
index 6698fba2d..9724f8318 100644
--- a/axiom-api/src/main/java/org/apache/axiom/ext/stax/package.html
+++ b/axiom-api/src/main/java/org/apache/axiom/ext/stax/package.html
@@ -20,7 +20,7 @@
 <body>
 Defines Axiom specific extensions to the StAX API.
 <p>
-This package and its subpackages defines several extensions to the StAX API, 
more precisely for the
+This package defines several extensions to the StAX API, more precisely for the
 {@link javax.xml.stream.XMLStreamReader} and {@link 
javax.xml.stream.XMLStreamWriter} classes.
 The reader or writer wishing to support the
 extension MAY implement the corresponding interface directly, but a consumer 
MUST use
diff --git a/axiom-api/src/main/java/org/apache/axiom/om/OMCloneOptions.java 
b/axiom-api/src/main/java/org/apache/axiom/om/OMCloneOptions.java
index 7c2361e68..7241624c4 100644
--- a/axiom-api/src/main/java/org/apache/axiom/om/OMCloneOptions.java
+++ b/axiom-api/src/main/java/org/apache/axiom/om/OMCloneOptions.java
@@ -20,7 +20,7 @@ package org.apache.axiom.om;
 
 import javax.activation.DataHandler;
 
-import org.apache.axiom.ext.stax.datahandler.DataHandlerProvider;
+import org.apache.axiom.ext.stax.BlobProvider;
 
 public class OMCloneOptions {
     private boolean fetchDataHandlers;
@@ -40,11 +40,11 @@ public class OMCloneOptions {
     /**
      * Specify whether {@link DataHandler} objects should be fetched when 
cloning {@link OMText}
      * nodes. If this option is set to <code>false</code> (default) then an 
{@link OMText} node
-     * backed by a {@link DataHandlerProvider} will be cloned by copying the 
reference to that
-     * {@link DataHandlerProvider} to the cloned {@link OMText} node. This 
implies that if the
+     * backed by a {@link BlobProvider} will be cloned by copying the 
reference to that
+     * {@link BlobProvider} to the cloned {@link OMText} node. This implies 
that if the
      * original tree was constructed from an XOP encoded stream, then the 
clone may become unusable
      * if that stream is closed. If this option is set to <code>true</code>, 
then
-     * {@link DataHandlerProvider} references will be replaced by {@link 
DataHandler} references. In
+     * {@link BlobProvider} references will be replaced by {@link DataHandler} 
references. In
      * addition, the necessary actions are taken to ensure that the content of 
these
      * {@link DataHandler} instances is fetched into memory or temporary 
storage, so that the clones
      * remain usable even after the underlying stream is closed.
diff --git a/axiom-api/src/main/java/org/apache/axiom/om/OMContainer.java 
b/axiom-api/src/main/java/org/apache/axiom/om/OMContainer.java
index d8c59683e..812ea178b 100644
--- a/axiom-api/src/main/java/org/apache/axiom/om/OMContainer.java
+++ b/axiom-api/src/main/java/org/apache/axiom/om/OMContainer.java
@@ -26,7 +26,7 @@ import javax.xml.transform.Transformer;
 import javax.xml.transform.sax.SAXResult;
 import javax.xml.transform.sax.SAXSource;
 
-import org.apache.axiom.ext.stax.datahandler.DataHandlerReader;
+import org.apache.axiom.ext.stax.BlobReader;
 import org.xml.sax.ContentHandler;
 import org.xml.sax.DTDHandler;
 import org.xml.sax.ext.DeclHandler;
@@ -315,7 +315,7 @@ public interface OMContainer extends OMSerializable {
      * {@link XMLStreamReader#close()} method.
      * <p>
      * The returned reader MAY implement the extension defined by
-     * {@link DataHandlerReader} and any binary content will
+     * {@link BlobReader} and any binary content will
      * be reported using this extension. More precisely, if the object model 
contains an
      * {@link OMText} instance with {@link OMText#isBinary()} returning 
<code>true</code> (or
      * would contain such an instance after it has been fully built), then its 
data will always be
diff --git a/axiom-api/src/main/java/org/apache/axiom/om/OMDataSource.java 
b/axiom-api/src/main/java/org/apache/axiom/om/OMDataSource.java
index 7d6db4bac..50e353262 100644
--- a/axiom-api/src/main/java/org/apache/axiom/om/OMDataSource.java
+++ b/axiom-api/src/main/java/org/apache/axiom/om/OMDataSource.java
@@ -27,8 +27,9 @@ import javax.xml.stream.XMLStreamException;
 import javax.xml.stream.XMLStreamReader;
 import javax.xml.stream.XMLStreamWriter;
 
-import org.apache.axiom.ext.stax.datahandler.DataHandlerProvider;
-import org.apache.axiom.ext.stax.datahandler.DataHandlerWriter;
+import org.apache.axiom.blob.Blob;
+import org.apache.axiom.ext.stax.BlobProvider;
+import org.apache.axiom.ext.stax.BlobWriter;
 import org.apache.axiom.om.ds.AbstractOMDataSource;
 import org.apache.axiom.om.ds.AbstractPullOMDataSource;
 import org.apache.axiom.om.ds.AbstractPushOMDataSource;
@@ -122,10 +123,10 @@ public interface OMDataSource {
      * <li>To produce base64 binary data (that could be optimized using 
XOP/MTOM), the
      * implementation MUST use one of the following approaches:
      * <ul>
-     * <li>Use the {@link DataHandlerWriter} extension (or alternatively the
-     * {@link XMLStreamWriterUtils#writeDataHandler(XMLStreamWriter, 
DataHandler, String, boolean)}
+     * <li>Use the {@link BlobWriter} extension (or alternatively the
+     * {@link XMLStreamWriterUtils#writeBlob(XMLStreamWriter, Blob, String, 
boolean)}
      * or
-     * {@link XMLStreamWriterUtils#writeDataHandler(XMLStreamWriter, 
DataHandlerProvider, String, boolean)}
+     * {@link XMLStreamWriterUtils#writeBlob(XMLStreamWriter, BlobProvider, 
String, boolean)}
      * utility methods) to write the data to the stream. This is the preferred 
approach, unless the
      * content is produced by a third party library that is not aware of these 
APIs.
      * <li>Cast the {@link XMLStreamWriter} to an {@link MTOMXMLStreamWriter}, 
use
diff --git a/axiom-api/src/main/java/org/apache/axiom/om/OMFactory.java 
b/axiom-api/src/main/java/org/apache/axiom/om/OMFactory.java
index 34e4bc232..e6541afe4 100644
--- a/axiom-api/src/main/java/org/apache/axiom/om/OMFactory.java
+++ b/axiom-api/src/main/java/org/apache/axiom/om/OMFactory.java
@@ -22,7 +22,8 @@ package org.apache.axiom.om;
 import javax.activation.DataHandler;
 import javax.xml.namespace.QName;
 
-import org.apache.axiom.ext.stax.datahandler.DataHandlerProvider;
+import org.apache.axiom.blob.Blob;
+import org.apache.axiom.ext.stax.BlobProvider;
 
 /** Class OMFactory */
 public interface OMFactory {
@@ -300,14 +301,14 @@ public interface OMFactory {
      * 
      * @param contentID
      *            the content ID identifying the binary content; may be 
<code>null</code>
-     * @param dataHandlerProvider
-     *            used to load the {@link javax.activation.DataHandler} when 
requested from the returned
+     * @param blobProvider
+     *            used to load the {@link Blob} when requested from the 
returned
      *            {@link OMText} node
      * @param optimize
      *            determines whether the binary content should be optimized
      * @return TODO
      */
-    OMText createOMText(String contentID, DataHandlerProvider 
dataHandlerProvider,
+    OMText createOMText(String contentID, BlobProvider blobProvider,
             boolean optimize);
 
     /**
diff --git a/axiom-api/src/main/java/org/apache/axiom/om/OMSerializable.java 
b/axiom-api/src/main/java/org/apache/axiom/om/OMSerializable.java
index ed4122b7f..73bfc2872 100644
--- a/axiom-api/src/main/java/org/apache/axiom/om/OMSerializable.java
+++ b/axiom-api/src/main/java/org/apache/axiom/om/OMSerializable.java
@@ -22,7 +22,7 @@ package org.apache.axiom.om;
 import javax.xml.stream.XMLStreamException;
 import javax.xml.stream.XMLStreamWriter;
 
-import org.apache.axiom.ext.stax.datahandler.DataHandlerWriter;
+import org.apache.axiom.ext.stax.BlobWriter;
 
 /**
  * Information item that can be serialized (written to an XML stream writer) 
and
@@ -85,11 +85,11 @@ public interface OMSerializable extends OMInformationItem {
      * <p>
      * The implementation of this method must satisfy the following 
requirements:
      * <ul>
-     * <li>If the writer exposes the {@link DataHandlerWriter} extension, then 
base64 binary data
+     * <li>If the writer exposes the {@link BlobWriter} extension, then base64 
binary data
      * MUST be written using one of the methods defined by that extension. 
This will occur if the
      * information item is an {@link OMText} node for which {@link 
OMText#isBinary()} returns
      * <code>true</code> or if it is an {@link OMContainer} that has such an 
{@link OMText} node as
-     * descendant. If the writer doesn't expose the {@link DataHandlerWriter} 
extension, then the
+     * descendant. If the writer doesn't expose the {@link BlobWriter} 
extension, then the
      * implementation MUST use {@link XMLStreamWriter#writeCharacters(String)} 
or
      * {@link XMLStreamWriter#writeCharacters(char[], int, int)} to write the 
base64 encoded data to
      * the stream.
diff --git 
a/axiom-api/src/main/java/org/apache/axiom/om/OMXMLBuilderFactory.java 
b/axiom-api/src/main/java/org/apache/axiom/om/OMXMLBuilderFactory.java
index da4575cce..0d4261d6e 100644
--- a/axiom-api/src/main/java/org/apache/axiom/om/OMXMLBuilderFactory.java
+++ b/axiom-api/src/main/java/org/apache/axiom/om/OMXMLBuilderFactory.java
@@ -29,7 +29,7 @@ import javax.xml.transform.dom.DOMSource;
 import javax.xml.transform.sax.SAXSource;
 
 import org.apache.axiom.attachments.Attachments;
-import org.apache.axiom.ext.stax.datahandler.DataHandlerReader;
+import org.apache.axiom.ext.stax.BlobReader;
 import org.apache.axiom.mime.ContentType;
 import org.apache.axiom.mime.MediaType;
 import org.apache.axiom.mime.MultipartBody;
@@ -68,7 +68,7 @@ public class OMXMLBuilderFactory {
      * of the document represented by the stream reader.
      * <p>
      * The builder supports the {@link XMLStreamReader} extension defined by
-     * {@link DataHandlerReader} as well as the legacy extension mechanism 
defined in the
+     * {@link BlobReader} as well as the legacy extension mechanism defined in 
the
      * documentation of {@link XMLStreamReaderUtils}.
      * <p>
      * The returned builder also performs namespace repairing, i.e. it adds 
appropriate namespace
diff --git 
a/axiom-api/src/main/java/org/apache/axiom/om/impl/MTOMXMLStreamWriter.java 
b/axiom-api/src/main/java/org/apache/axiom/om/impl/MTOMXMLStreamWriter.java
index b7b49b0bf..a7bd1cf27 100644
--- a/axiom-api/src/main/java/org/apache/axiom/om/impl/MTOMXMLStreamWriter.java
+++ b/axiom-api/src/main/java/org/apache/axiom/om/impl/MTOMXMLStreamWriter.java
@@ -25,8 +25,9 @@ import javax.activation.DataHandler;
 import javax.xml.stream.XMLStreamException;
 import javax.xml.stream.XMLStreamWriter;
 
-import org.apache.axiom.ext.stax.datahandler.DataHandlerProvider;
-import org.apache.axiom.ext.stax.datahandler.DataHandlerWriter;
+import org.apache.axiom.blob.Blob;
+import org.apache.axiom.ext.stax.BlobProvider;
+import org.apache.axiom.ext.stax.BlobWriter;
 import org.apache.axiom.om.OMOutputFormat;
 import org.apache.axiom.util.stax.XMLStreamWriterUtils;
 
@@ -42,9 +43,9 @@ public abstract class MTOMXMLStreamWriter implements 
XMLStreamWriter {
      * Check if MTOM is enabled.
      * <p>
      * Note that serialization code should use
-     * {@link XMLStreamWriterUtils#writeDataHandler(XMLStreamWriter, 
DataHandler, String, boolean)}
+     * {@link XMLStreamWriterUtils#writeBlob(XMLStreamWriter, Blob, String, 
boolean)}
      * or
-     * {@link XMLStreamWriterUtils#writeDataHandler(XMLStreamWriter, 
DataHandlerProvider, String, boolean)}
+     * {@link XMLStreamWriterUtils#writeBlob(XMLStreamWriter, BlobProvider, 
String, boolean)}
      * to submit any binary content and let this writer decide whether the 
content should be written
      * as base64 encoded character data or using {@code xop:Include}. This 
makes optimization
      * entirely transparent for the caller and there should be no need to 
check if the writer is
@@ -59,7 +60,7 @@ public abstract class MTOMXMLStreamWriter implements 
XMLStreamWriter {
     public abstract boolean isOptimized();
 
     /**
-     * Prepare a {@link DataHandler} for serialization without using the 
{@link DataHandlerWriter}
+     * Prepare a {@link DataHandler} for serialization without using the 
{@link BlobWriter}
      * API. The method first determines whether the binary data represented by 
the
      * {@link DataHandler} should be optimized or inlined. If the data should 
not be optimized, then
      * the method returns <code>null</code> and the caller is expected to use
@@ -70,9 +71,9 @@ public abstract class MTOMXMLStreamWriter implements 
XMLStreamWriter {
      * <p>
      * This method should only be used to integrate Axiom with third party 
libraries that support
      * XOP. In all other cases,
-     * {@link XMLStreamWriterUtils#writeDataHandler(XMLStreamWriter, 
DataHandler, String, boolean)}
+     * {@link XMLStreamWriterUtils#writeBlob(XMLStreamWriter, Blob, String, 
boolean)}
      * or
-     * {@link XMLStreamWriterUtils#writeDataHandler(XMLStreamWriter, 
DataHandlerProvider, String, boolean)}
+     * {@link XMLStreamWriterUtils#writeBlob(XMLStreamWriter, BlobProvider, 
String, boolean)}
      * should be used to write base64Binary values and the application code 
should never generate
      * {@code xop:Include} elements itself.
      * 
diff --git 
a/axiom-api/src/main/java/org/apache/axiom/util/stax/XMLStreamReaderUtils.java 
b/axiom-api/src/main/java/org/apache/axiom/util/stax/XMLStreamReaderUtils.java
index 966d20246..b0f867695 100644
--- 
a/axiom-api/src/main/java/org/apache/axiom/util/stax/XMLStreamReaderUtils.java
+++ 
b/axiom-api/src/main/java/org/apache/axiom/util/stax/XMLStreamReaderUtils.java
@@ -23,25 +23,23 @@ import java.io.IOException;
 import java.io.Reader;
 import java.io.Writer;
 
-import javax.activation.DataHandler;
 import javax.xml.stream.XMLStreamConstants;
 import javax.xml.stream.XMLStreamException;
 import javax.xml.stream.XMLStreamReader;
 
+import org.apache.axiom.blob.Blob;
 import org.apache.axiom.blob.Blobs;
 import org.apache.axiom.blob.MemoryBlob;
+import org.apache.axiom.ext.stax.BlobReader;
 import org.apache.axiom.ext.stax.CharacterDataReader;
 import org.apache.axiom.ext.stax.DelegatingXMLStreamReader;
-import org.apache.axiom.ext.stax.datahandler.DataHandlerReader;
-import org.apache.axiom.util.activation.BlobDataSource;
-import org.apache.axiom.util.activation.EmptyDataSource;
 import org.apache.axiom.util.base64.Base64DecodingOutputStreamWriter;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 
 /**
  * Contains utility methods to work with {@link XMLStreamReader} objects, 
including the extension
- * defined by {@link DataHandlerReader}.
+ * defined by {@link BlobReader}.
  */
 public class XMLStreamReaderUtils {
     private static final Log log = 
LogFactory.getLog(XMLStreamReaderUtils.class);
@@ -49,18 +47,18 @@ public class XMLStreamReaderUtils {
     private XMLStreamReaderUtils() {}
     
     /**
-     * Get the {@link DataHandlerReader} extension for a given {@link 
XMLStreamReader}, if
+     * Get the {@link BlobReader} extension for a given {@link 
XMLStreamReader}, if
      * available.
      * 
      * @param reader
-     *            the stream reader to get the {@link DataHandlerReader} 
extension from
+     *            the stream reader to get the {@link BlobReader} 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.
+     *         {@link Blob} objects.
      */
-    public static DataHandlerReader getDataHandlerReader(final XMLStreamReader 
reader) {
+    public static BlobReader getBlobReader(final XMLStreamReader reader) {
         try {
-            return 
(DataHandlerReader)reader.getProperty(DataHandlerReader.PROPERTY);
+            return (BlobReader)reader.getProperty(BlobReader.PROPERTY);
         } catch (IllegalArgumentException ex) {
             return null;
         }
@@ -68,21 +66,21 @@ public class XMLStreamReaderUtils {
     
     /**
      * Helper method to implement {@link XMLStreamReader#getProperty(String)}. 
This method
-     * processes the property defined by {@link DataHandlerReader#PROPERTY}.
+     * processes the property defined by {@link BlobReader#PROPERTY}.
      * 
      * @param extension
-     *            the reference to the {@link DataHandlerReader} extension for 
the
+     *            the reference to the {@link BlobReader} 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} extension;
+     * @return the property value as specified by the {@link BlobReader} 
extension;
      *         <code>null</code> if the property doesn't match
      */
-    public static Object processGetProperty(DataHandlerReader extension, 
String propertyName) {
+    public static Object processGetProperty(BlobReader extension, String 
propertyName) {
         if (extension == null || propertyName == null) {
             throw new IllegalArgumentException();
-        } else if (propertyName.equals(DataHandlerReader.PROPERTY)) {
+        } else if (propertyName.equals(BlobReader.PROPERTY)) {
             return extension;
         } else {
             return null;
@@ -90,9 +88,9 @@ public class XMLStreamReaderUtils {
     }
     
     /**
-     * Get a {@link DataHandler} for the binary data encoded in an element. 
The method supports
+     * Get a {@link Blob} for the binary data encoded in an element. The 
method supports
      * base64 encoded character data as well as optimized binary data through 
the
-     * {@link DataHandlerReader} extension.
+     * {@link BlobReader} extension.
      * <p>
      * <em>Precondition</em>: the reader is on a {@link 
XMLStreamConstants#START_ELEMENT}
      * <p>
@@ -102,21 +100,21 @@ public class XMLStreamReaderUtils {
      * @param reader the stream to read the data from
      * @return the binary data from the element
      */
-    public static DataHandler getDataHandlerFromElement(XMLStreamReader reader)
+    public static Blob getBlobFromElement(XMLStreamReader reader)
             throws XMLStreamException {
         
         int event = reader.next();
         if (event == XMLStreamConstants.END_ELEMENT) {
-            // This means that the element is actually empty -> return empty 
DataHandler
-            return new DataHandler(new 
EmptyDataSource("application/octet-stream"));
+            // This means that the element is actually empty -> return empty 
blob
+            return Blobs.createBlob(new byte[0]);
         } else if (event != XMLStreamConstants.CHARACTERS) {
             throw new XMLStreamException("Expected a CHARACTER event");
         }
-        DataHandlerReader dhr = getDataHandlerReader(reader);
-        if (dhr != null && dhr.isBinary()) {
-            DataHandler dh = dhr.getDataHandler();
+        BlobReader blobReader = getBlobReader(reader);
+        if (blobReader != null && blobReader.isBinary()) {
+            Blob blob = blobReader.getBlob();
             reader.next();
-            return dh;
+            return blob;
         } else {
             MemoryBlob blob = Blobs.createMemoryBlob();
             Writer out = new 
Base64DecodingOutputStreamWriter(blob.getOutputStream());
@@ -139,7 +137,7 @@ public class XMLStreamReaderUtils {
             } catch (IOException ex) {
                 throw new XMLStreamException("Error during base64 decoding", 
ex);
             }
-            return new DataHandler(new BlobDataSource(blob, 
"application/octet-string"));
+            return blob;
         }
     }
     
diff --git 
a/axiom-api/src/main/java/org/apache/axiom/util/stax/XMLStreamWriterUtils.java 
b/axiom-api/src/main/java/org/apache/axiom/util/stax/XMLStreamWriterUtils.java
index 93e9edcf2..1525c1bcb 100644
--- 
a/axiom-api/src/main/java/org/apache/axiom/util/stax/XMLStreamWriterUtils.java
+++ 
b/axiom-api/src/main/java/org/apache/axiom/util/stax/XMLStreamWriterUtils.java
@@ -21,12 +21,12 @@ package org.apache.axiom.util.stax;
 
 import java.io.IOException;
 
-import javax.activation.DataHandler;
 import javax.xml.stream.XMLStreamException;
 import javax.xml.stream.XMLStreamWriter;
 
-import org.apache.axiom.ext.stax.datahandler.DataHandlerProvider;
-import org.apache.axiom.ext.stax.datahandler.DataHandlerWriter;
+import org.apache.axiom.blob.Blob;
+import org.apache.axiom.ext.stax.BlobProvider;
+import org.apache.axiom.ext.stax.BlobWriter;
 import org.apache.axiom.util.base64.Base64EncodingWriterOutputStream;
 
 /**
@@ -43,68 +43,68 @@ public class XMLStreamWriterUtils {
      * <p>
      * Note that this method will always serialize the data as base64 encoded 
character data.
      * Serialization code should prefer using
-     * {@link #writeDataHandler(XMLStreamWriter, DataHandler, String, 
boolean)} or
-     * {@link #writeDataHandler(XMLStreamWriter, DataHandlerProvider, String, 
boolean)} to
+     * {@link #writeBlob(XMLStreamWriter, Blob, String, boolean)} or
+     * {@link #writeBlob(XMLStreamWriter, BlobProvider, String, boolean)} to
      * enable optimization (if supported by the {@link XMLStreamWriter}).
      * 
      * @param writer the stream writer to write the data to
-     * @param dh the data handler containing the data to encode
+     * @param blob the blob containing the data to encode
      * @throws IOException if an error occurs when reading the data from the 
data handler
      * @throws XMLStreamException if an error occurs when writing the base64 
encoded data to
      *         the stream
      */
-    public static void writeBase64(XMLStreamWriter writer, DataHandler dh)
+    public static void writeBase64(XMLStreamWriter writer, Blob blob)
             throws IOException, XMLStreamException {
         
         Base64EncodingWriterOutputStream out = new 
Base64EncodingWriterOutputStream(
                 new XMLStreamWriterWriter(writer), 4096, true);
         try {
-            dh.writeTo(out);
+            blob.writeTo(out);
             out.close();
         } catch (XMLStreamIOException ex) {
             throw ex.getXMLStreamException();
         }
     }
 
-    private static DataHandlerWriter 
internalGetDataHandlerWriter(XMLStreamWriter writer) {
+    private static BlobWriter internalGetBlobWriter(XMLStreamWriter writer) {
         try {
-            return 
(DataHandlerWriter)writer.getProperty(DataHandlerWriter.PROPERTY);
+            return (BlobWriter)writer.getProperty(BlobWriter.PROPERTY);
         } catch (IllegalArgumentException ex) {
             return null;
         }
     }
 
     /**
-     * Get the {@link DataHandlerWriter} extension for a given {@link 
XMLStreamWriter}. If the
+     * Get the {@link BlobWriter} extension for a given {@link 
XMLStreamWriter}. If the
      * writer exposes the extension, a reference to the extension interface 
implementation is
      * returned. If the writer doesn't expose the extension, this method 
returns an instance of the
      * extension interface that emulates the extension (by writing the binary 
data as base64
      * character data to the stream).
      * 
      * @param writer
-     *            the stream for which the method should return the {@link 
DataHandlerWriter}
+     *            the stream for which the method should return the {@link 
BlobWriter}
      *            extension
      * @return a reference to the extension interface exposed by the writer or 
an implementation the
      *         emulates the extension; the return value is never 
<code>null</code>
      */
-    public static DataHandlerWriter getDataHandlerWriter(final XMLStreamWriter 
writer) {
-        DataHandlerWriter dataHandlerWriter = 
internalGetDataHandlerWriter(writer);
-        if (dataHandlerWriter == null) {
-            return new DataHandlerWriter() {
+    public static BlobWriter getBlobWriter(final XMLStreamWriter writer) {
+        BlobWriter blobWriter = internalGetBlobWriter(writer);
+        if (blobWriter == null) {
+            return new BlobWriter() {
                 @Override
-                public void writeDataHandler(DataHandler dataHandler, String 
contentID,
+                public void writeBlob(Blob blob, String contentID,
                         boolean optimize) throws IOException, 
XMLStreamException {
-                    writeBase64(writer, dataHandler);
+                    writeBase64(writer, blob);
                 }
 
                 @Override
-                public void writeDataHandler(DataHandlerProvider 
dataHandlerProvider,
+                public void writeBlob(BlobProvider blobProvider,
                         String contentID, boolean optimize) throws 
IOException, XMLStreamException {
-                    writeBase64(writer, dataHandlerProvider.getDataHandler());
+                    writeBase64(writer, blobProvider.getBlob());
                 }
             };
         } else {
-            return dataHandlerWriter;
+            return blobWriter;
         }
     }
 
@@ -112,15 +112,15 @@ public class XMLStreamWriterUtils {
      * Write binary content to the stream. Depending on the supplied {@link 
XMLStreamWriter},
      * the content will be written as base64 encoded character data or using 
an optimization
      * scheme such as XOP/MTOM. The method attempts to submit the binary 
content using the
-     * {@link DataHandlerWriter} extension. If the writer doesn't expose this 
extension,
-     * the method will fall back to {@link #writeBase64(XMLStreamWriter, 
DataHandler)}.
+     * {@link BlobWriter} extension. If the writer doesn't expose this 
extension,
+     * the method will fall back to {@link #writeBase64(XMLStreamWriter, 
Blob)}.
      * <p>
-     * Please refer to the documentation of {@link DataHandlerWriter} for a 
more
+     * Please refer to the documentation of {@link BlobWriter} for a more
      * detailed description of the semantics of the different arguments.
      * 
      * @param writer
      *            the stream writer to write the data to
-     * @param dataHandler
+     * @param blob
      *            the binary content to write
      * @param contentID
      *            an existing content ID for the binary data
@@ -131,24 +131,24 @@ public class XMLStreamWriterUtils {
      * @throws XMLStreamException
      *             if an error occurs while writing to the underlying stream
      */
-    public static void writeDataHandler(XMLStreamWriter writer, DataHandler 
dataHandler,
+    public static void writeBlob(XMLStreamWriter writer, Blob blob,
             String contentID, boolean optimize) throws IOException, 
XMLStreamException {
-        DataHandlerWriter dataHandlerWriter = 
internalGetDataHandlerWriter(writer);
-        if (dataHandlerWriter != null) {
-            dataHandlerWriter.writeDataHandler(dataHandler, contentID, 
optimize);
+        BlobWriter blobWriter = internalGetBlobWriter(writer);
+        if (blobWriter != null) {
+            blobWriter.writeBlob(blob, contentID, optimize);
         } else {
-            writeBase64(writer, dataHandler);
+            writeBase64(writer, blob);
         }
     }
     
     /**
      * Write binary content to the stream. This method is similar to
-     * {@link #writeDataHandler(XMLStreamWriter, DataHandler, String, 
boolean)},
+     * {@link #writeBlob(XMLStreamWriter, Blob, String, boolean)},
      * but supports deferred loading of the data handler.
      * 
      * @param writer
      *            the stream writer to write the data to
-     * @param dataHandlerProvider
+     * @param blobProvider
      *            the binary content to write
      * @param contentID
      *            an existing content ID for the binary data
@@ -159,13 +159,13 @@ public class XMLStreamWriterUtils {
      * @throws XMLStreamException
      *             if an error occurs while writing to the underlying stream
      */
-    public static void writeDataHandler(XMLStreamWriter writer, 
DataHandlerProvider dataHandlerProvider,
+    public static void writeBlob(XMLStreamWriter writer, BlobProvider 
blobProvider,
             String contentID, boolean optimize) throws IOException, 
XMLStreamException {
-        DataHandlerWriter dataHandlerWriter = 
internalGetDataHandlerWriter(writer);
-        if (dataHandlerWriter != null) {
-            dataHandlerWriter.writeDataHandler(dataHandlerProvider, contentID, 
optimize);
+        BlobWriter blobWriter = internalGetBlobWriter(writer);
+        if (blobWriter != null) {
+            blobWriter.writeBlob(blobProvider, contentID, optimize);
         } else {
-            writeBase64(writer, dataHandlerProvider.getDataHandler());
+            writeBase64(writer, blobProvider.getBlob());
         }
     }
     
diff --git 
a/axiom-api/src/test/java/org/apache/axiom/util/stax/XMLStreamReaderUtilsTest.java
 
b/axiom-api/src/test/java/org/apache/axiom/util/stax/XMLStreamReaderUtilsTest.java
index 4eee156f5..32183945b 100644
--- 
a/axiom-api/src/test/java/org/apache/axiom/util/stax/XMLStreamReaderUtilsTest.java
+++ 
b/axiom-api/src/test/java/org/apache/axiom/util/stax/XMLStreamReaderUtilsTest.java
@@ -24,12 +24,12 @@ import java.io.StringReader;
 import java.util.Arrays;
 import java.util.Random;
 
-import javax.activation.DataHandler;
 import javax.xml.stream.XMLStreamException;
 import javax.xml.stream.XMLStreamReader;
 
 import junit.framework.TestCase;
 
+import org.apache.axiom.blob.Blob;
 import org.apache.axiom.om.util.StAXParserConfiguration;
 import org.apache.axiom.om.util.StAXUtils;
 import org.apache.axiom.util.base64.Base64EncodingStringBufferOutputStream;
@@ -37,33 +37,33 @@ import org.apache.commons.io.IOUtils;
 
 public class XMLStreamReaderUtilsTest extends TestCase {
     /**
-     * Test that {@link 
XMLStreamReaderUtils#getDataHandlerFromElement(XMLStreamReader)}
-     * returns an empty {@link DataHandler} when the element is empty. The 
test uses
+     * Test that {@link 
XMLStreamReaderUtils#getBlobFromElement(XMLStreamReader)}
+     * returns an empty {@link Blob} when the element is empty. The test uses
      * an {@link XMLStreamReader} instance that doesn't implement the
-     * {@link org.apache.axiom.ext.stax.datahandler.DataHandlerReader} 
extension.
+     * {@link org.apache.axiom.ext.stax.BlobReader} extension.
      * 
      * @throws Exception
      */
-    public void testGetDataHandlerFromElementWithZeroLengthNonDHR() throws 
Exception {
-        testGetDataHandlerFromElementWithZeroLength(false);
+    public void testGetBlobFromElementWithZeroLengthNonBlobReader() throws 
Exception {
+        testGetBlobFromElementWithZeroLength(false);
     }
     
     /**
-     * Test that {@link 
XMLStreamReaderUtils#getDataHandlerFromElement(XMLStreamReader)}
-     * returns an empty {@link DataHandler} when the element is empty. The 
test uses
+     * Test that {@link 
XMLStreamReaderUtils#getBlobFromElement(XMLStreamReader)}
+     * returns an empty {@link Blob} when the element is empty. The test uses
      * an {@link XMLStreamReader} instance that implements the
-     * {@link org.apache.axiom.ext.stax.datahandler.DataHandlerReader} 
extension.
+     * {@link org.apache.axiom.ext.stax.BlobReader} extension.
      * 
      * @throws Exception
      */
-    public void testGetDataHandlerFromElementWithZeroLengthDHR() throws 
Exception {
-        testGetDataHandlerFromElementWithZeroLength(true);
+    public void testGetBlobFromElementWithZeroLengthBlobReader() throws 
Exception {
+        testGetBlobFromElementWithZeroLength(true);
     }
     
-    private void testGetDataHandlerFromElementWithZeroLength(boolean useDHR) 
throws Exception {
+    private void testGetBlobFromElementWithZeroLength(boolean useBlobReader) 
throws Exception {
         XMLStreamReader reader = StAXUtils.createXMLStreamReader(new 
StringReader("<test/>"));
-        if (useDHR) {
-            reader = new XMLStreamReaderWithDataHandlerReader(reader);
+        if (useBlobReader) {
+            reader = new XMLStreamReaderWithBlobReader(reader);
         }
         try {
             reader.next();
@@ -71,44 +71,44 @@ public class XMLStreamReaderUtilsTest extends TestCase {
             // Check precondition
             assertTrue(reader.isStartElement());
             
-            DataHandler dh = 
XMLStreamReaderUtils.getDataHandlerFromElement(reader);
+            Blob blob = XMLStreamReaderUtils.getBlobFromElement(reader);
             
             // Check postcondition
             assertTrue(reader.isEndElement());
-            assertEquals(-1, dh.getInputStream().read());
+            assertEquals(-1, blob.getInputStream().read());
         } finally {
             reader.close();
         }
     }
     
     /**
-     * Test that {@link 
XMLStreamReaderUtils#getDataHandlerFromElement(XMLStreamReader)}
+     * Test that {@link 
XMLStreamReaderUtils#getBlobFromElement(XMLStreamReader)}
      * throws an exception if the element has unexpected content. The test uses
      * an {@link XMLStreamReader} instance that doesn't implement the
-     * {@link org.apache.axiom.ext.stax.datahandler.DataHandlerReader} 
extension.
+     * {@link org.apache.axiom.ext.stax.BlobReader} extension.
      * 
      * @throws Exception
      */
-    public void testGetDataHandlerFromElementWithUnexpectedContentNonDHR() 
throws Exception {
-        testGetDataHandlerFromElementWithUnexpectedContent(false);
+    public void testGetBlobFromElementWithUnexpectedContentNonBlobReader() 
throws Exception {
+        testGetBlobFromElementWithUnexpectedContent(false);
     }
     
     /**
-     * Test that {@link 
XMLStreamReaderUtils#getDataHandlerFromElement(XMLStreamReader)}
+     * Test that {@link 
XMLStreamReaderUtils#getBlobFromElement(XMLStreamReader)}
      * throws an exception if the element has unexpected content. The test uses
      * an {@link XMLStreamReader} instance that implements the
-     * {@link org.apache.axiom.ext.stax.datahandler.DataHandlerReader} 
extension.
+     * {@link org.apache.axiom.ext.stax.BlobReader} extension.
      * 
      * @throws Exception
      */
-    public void testGetDataHandlerFromElementWithUnexpectedContentDHR() throws 
Exception {
-        testGetDataHandlerFromElementWithUnexpectedContent(true);
+    public void testGetBlobFromElementWithUnexpectedContentBlobReader() throws 
Exception {
+        testGetBlobFromElementWithUnexpectedContent(true);
     }
     
-    private void testGetDataHandlerFromElementWithUnexpectedContent(boolean 
useDHR) throws Exception {
+    private void testGetBlobFromElementWithUnexpectedContent(boolean 
useBlobReader) throws Exception {
         XMLStreamReader reader = StAXUtils.createXMLStreamReader(new 
StringReader("<test>\n<child/>\n</test>"));
-        if (useDHR) {
-            reader = new XMLStreamReaderWithDataHandlerReader(reader);
+        if (useBlobReader) {
+            reader = new XMLStreamReaderWithBlobReader(reader);
         }
         try {
             reader.next();
@@ -117,7 +117,7 @@ public class XMLStreamReaderUtilsTest extends TestCase {
             assertTrue(reader.isStartElement());
             
             try {
-                XMLStreamReaderUtils.getDataHandlerFromElement(reader);
+                XMLStreamReaderUtils.getBlobFromElement(reader);
                 fail("Expected XMLStreamException");
             } catch (XMLStreamException ex) {
                 // Expected
@@ -128,32 +128,32 @@ public class XMLStreamReaderUtilsTest extends TestCase {
     }
     
     /**
-     * Test that {@link 
XMLStreamReaderUtils#getDataHandlerFromElement(XMLStreamReader)}
+     * Test that {@link 
XMLStreamReaderUtils#getBlobFromElement(XMLStreamReader)}
      * correctly decodes base64 data if the parser is non coalescing and 
produces the data
      * as multiple {@code CHARACTER} events. The test uses an {@link 
XMLStreamReader} instance
-     * that doesn't implement the {@link 
org.apache.axiom.ext.stax.datahandler.DataHandlerReader}
+     * that doesn't implement the {@link org.apache.axiom.ext.stax.BlobReader}
      * extension.
      * 
      * @throws Exception
      */
-    public void testGetDataHandlerFromElementNonCoalescingNonDHR() throws 
Exception {
-        testGetDataHandlerFromElementNonCoalescing(false);
+    public void testgetBlobFromElementNonCoalescingNonBlobReader() throws 
Exception {
+        testgetBlobFromElementNonCoalescing(false);
     }
     
     /**
-     * Test that {@link 
XMLStreamReaderUtils#getDataHandlerFromElement(XMLStreamReader)}
+     * Test that {@link 
XMLStreamReaderUtils#getBlobFromElement(XMLStreamReader)}
      * correctly decodes base64 data if the parser is non coalescing and 
produces the data
      * as multiple {@code CHARACTER} events. The test uses an {@link 
XMLStreamReader} instance
-     * that implements the {@link 
org.apache.axiom.ext.stax.datahandler.DataHandlerReader}
+     * that implements the {@link org.apache.axiom.ext.stax.BlobReader}
      * extension.
      * 
      * @throws Exception
      */
-    public void testGetDataHandlerFromElementNonCoalescingDHR() throws 
Exception {
-        testGetDataHandlerFromElementNonCoalescing(true);
+    public void testgetBlobFromElementNonCoalescingBlobReader() throws 
Exception {
+        testgetBlobFromElementNonCoalescing(true);
     }
     
-    private void testGetDataHandlerFromElementNonCoalescing(boolean useDHR) 
throws Exception {
+    private void testgetBlobFromElementNonCoalescing(boolean useBlobReader) 
throws Exception {
         // We generate base64 that is sufficiently large to force the parser 
to generate
         // multiple CHARACTER events
         StringBuffer buffer = new StringBuffer("<test>");
@@ -165,8 +165,8 @@ public class XMLStreamReaderUtilsTest extends TestCase {
         buffer.append("</test>");
         XMLStreamReader reader = 
StAXUtils.createXMLStreamReader(StAXParserConfiguration.NON_COALESCING,
                 new StringReader(buffer.toString()));
-        if (useDHR) {
-            reader = new XMLStreamReaderWithDataHandlerReader(reader);
+        if (useBlobReader) {
+            reader = new XMLStreamReaderWithBlobReader(reader);
         }
         try {
             reader.next();
@@ -174,33 +174,33 @@ public class XMLStreamReaderUtilsTest extends TestCase {
             // Check precondition
             assertTrue(reader.isStartElement());
             
-            DataHandler dh = 
XMLStreamReaderUtils.getDataHandlerFromElement(reader);
+            Blob blob = XMLStreamReaderUtils.getBlobFromElement(reader);
             
             // Check postcondition
             assertTrue(reader.isEndElement());
-            assertTrue(Arrays.equals(data, 
IOUtils.toByteArray(dh.getInputStream())));
+            assertTrue(Arrays.equals(data, 
IOUtils.toByteArray(blob.getInputStream())));
         } finally {
             reader.close();
         }
     }
     
     /**
-     * Test that {@link 
XMLStreamReaderUtils#getDataHandlerFromElement(XMLStreamReader)} correctly
+     * Test that {@link 
XMLStreamReaderUtils#getBlobFromElement(XMLStreamReader)} correctly
      * decodes base64 encoded content that contains whitespace. This is a 
regression test for <a
      * href="https://issues.apache.org/jira/browse/AXIOM-380";>AXIOM-380</a>.
      * 
      * @throws Exception
      */
-    public void testGetDataHandlerFromElementWithWhitespace() throws Exception 
{
+    public void testgetBlobFromElementWithWhitespace() throws Exception {
         XMLStreamReader reader = StAXUtils.createXMLStreamReader(new 
StringReader(
                 
"<data>MS4wMToxNDIdMS4wMjowMzAwHTEuMDM6MR8wMx4yHzAwHjQfMDEeNB8wMh0xLjA0OlBOUx0xLjA1\r\n"
 + 
                 
"OjIwMTEwODAyHTEuMDY6Mh0xLjA3OkZMRkRMRUNWWh0xLjA4OkZMMDM3ODhXMB0xLjA5OjExMDgw\r\n"
 + 
                 
"MjAwMDcdMS4xMToxOS42OR0xLjEyOjE5LjY5HDIuMDAxOjE4HTIuMDAyOjAwHAAA</data>"));
         try {
             reader.next();
-            DataHandler dh = 
XMLStreamReaderUtils.getDataHandlerFromElement(reader);
+            Blob blob = XMLStreamReaderUtils.getBlobFromElement(reader);
             
assertEquals("1.01:1421.02:03001.03:1032004014021.04:PNS1.05:201108021.06:21.07:FLFDLECVZ1.08:FL03788W01.09:11080200071.11:19.691.12:19.692.001:182.002:00����",
-                    IOUtils.toString(dh.getInputStream(), "ascii"));
+                    IOUtils.toString(blob.getInputStream(), "ascii"));
         } finally {
             reader.close();
         }
diff --git 
a/axiom-api/src/test/java/org/apache/axiom/util/stax/XMLStreamReaderWithDataHandlerReader.java
 
b/axiom-api/src/test/java/org/apache/axiom/util/stax/XMLStreamReaderWithBlobReader.java
similarity index 78%
rename from 
axiom-api/src/test/java/org/apache/axiom/util/stax/XMLStreamReaderWithDataHandlerReader.java
rename to 
axiom-api/src/test/java/org/apache/axiom/util/stax/XMLStreamReaderWithBlobReader.java
index 87dc28929..371795c84 100644
--- 
a/axiom-api/src/test/java/org/apache/axiom/util/stax/XMLStreamReaderWithDataHandlerReader.java
+++ 
b/axiom-api/src/test/java/org/apache/axiom/util/stax/XMLStreamReaderWithBlobReader.java
@@ -18,16 +18,16 @@
  */
 package org.apache.axiom.util.stax;
 
-import javax.activation.DataHandler;
 import javax.xml.stream.XMLStreamException;
 import javax.xml.stream.XMLStreamReader;
 
-import org.apache.axiom.ext.stax.datahandler.DataHandlerProvider;
-import org.apache.axiom.ext.stax.datahandler.DataHandlerReader;
+import org.apache.axiom.blob.Blob;
+import org.apache.axiom.ext.stax.BlobProvider;
+import org.apache.axiom.ext.stax.BlobReader;
 import org.apache.axiom.util.stax.wrapper.XMLStreamReaderWrapper;
 
-public class XMLStreamReaderWithDataHandlerReader extends 
XMLStreamReaderWrapper implements DataHandlerReader {
-    public XMLStreamReaderWithDataHandlerReader(XMLStreamReader parent) {
+public class XMLStreamReaderWithBlobReader extends XMLStreamReaderWrapper 
implements BlobReader {
+    public XMLStreamReaderWithBlobReader(XMLStreamReader parent) {
         super(parent);
     }
 
@@ -58,12 +58,12 @@ public class XMLStreamReaderWithDataHandlerReader extends 
XMLStreamReaderWrapper
     }
 
     @Override
-    public DataHandler getDataHandler() throws XMLStreamException {
+    public Blob getBlob() throws XMLStreamException {
         throw new IllegalStateException();
     }
 
     @Override
-    public DataHandlerProvider getDataHandlerProvider() {
+    public BlobProvider getBlobProvider() {
         throw new IllegalStateException();
     }
 }
diff --git 
a/mixins/om-mixins/src/main/java/org/apache/axiom/om/impl/common/factory/OMFactoryImpl.java
 
b/mixins/om-mixins/src/main/java/org/apache/axiom/om/impl/common/factory/OMFactoryImpl.java
index 6ab4be784..9add26edd 100644
--- 
a/mixins/om-mixins/src/main/java/org/apache/axiom/om/impl/common/factory/OMFactoryImpl.java
+++ 
b/mixins/om-mixins/src/main/java/org/apache/axiom/om/impl/common/factory/OMFactoryImpl.java
@@ -26,7 +26,7 @@ import javax.activation.DataHandler;
 import javax.xml.namespace.QName;
 
 import org.apache.axiom.core.CoreModelException;
-import org.apache.axiom.ext.stax.datahandler.DataHandlerProvider;
+import org.apache.axiom.ext.stax.BlobProvider;
 import org.apache.axiom.om.OMAttribute;
 import org.apache.axiom.om.OMComment;
 import org.apache.axiom.om.OMContainer;
@@ -64,6 +64,7 @@ import org.apache.axiom.om.impl.intf.AxiomText;
 import org.apache.axiom.om.impl.intf.TextContent;
 import org.apache.axiom.om.impl.intf.factory.AxiomElementType;
 import org.apache.axiom.om.impl.intf.factory.AxiomNodeFactory;
+import org.apache.axiom.util.activation.DataHandlerUtils;
 
 public class OMFactoryImpl implements OMFactory {
     protected final AxiomNodeFactory nodeFactory;
@@ -213,14 +214,16 @@ public class OMFactoryImpl implements OMFactory {
     @Override
     public final OMText createOMText(DataHandler dataHandler, boolean 
optimize) {
         return createAxiomText(
-                null, new TextContent(null, dataHandler, optimize), 
OMNode.TEXT_NODE);
+                null,
+                new TextContent(null, DataHandlerUtils.toBlob(dataHandler), 
optimize),
+                OMNode.TEXT_NODE);
     }
 
     @Override
     public final OMText createOMText(
-            String contentID, DataHandlerProvider dataHandlerProvider, boolean 
optimize) {
+            String contentID, BlobProvider blobProvider, boolean optimize) {
         return createAxiomText(
-                null, new TextContent(contentID, dataHandlerProvider, 
optimize), OMNode.TEXT_NODE);
+                null, new TextContent(contentID, blobProvider, optimize), 
OMNode.TEXT_NODE);
     }
 
     @Override
diff --git 
a/mixins/om-mixins/src/main/java/org/apache/axiom/om/impl/intf/TextContent.java 
b/mixins/om-mixins/src/main/java/org/apache/axiom/om/impl/intf/TextContent.java
index 71dad3b94..07c9542e4 100644
--- 
a/mixins/om-mixins/src/main/java/org/apache/axiom/om/impl/intf/TextContent.java
+++ 
b/mixins/om-mixins/src/main/java/org/apache/axiom/om/impl/intf/TextContent.java
@@ -20,18 +20,17 @@ package org.apache.axiom.om.impl.intf;
 
 import java.io.IOException;
 
-import javax.activation.DataHandler;
-
+import org.apache.axiom.blob.Blob;
 import org.apache.axiom.blob.Blobs;
 import org.apache.axiom.core.ClonePolicy;
 import org.apache.axiom.core.CloneableCharacterData;
 import org.apache.axiom.core.stream.CharacterData;
 import org.apache.axiom.core.stream.CharacterDataSink;
-import org.apache.axiom.ext.stax.datahandler.DataHandlerProvider;
+import org.apache.axiom.ext.stax.BlobProvider;
 import org.apache.axiom.om.OMCloneOptions;
 import org.apache.axiom.om.OMException;
 import org.apache.axiom.util.UIDGenerator;
-import org.apache.axiom.util.activation.BlobDataSource;
+import org.apache.axiom.util.activation.DataHandlerUtils;
 import org.apache.axiom.util.base64.AbstractBase64EncodingOutputStream;
 import org.apache.axiom.util.base64.Base64EncodingStringBufferOutputStream;
 import org.apache.axiom.util.base64.Base64Utils;
@@ -45,10 +44,10 @@ public final class TextContent implements 
CloneableCharacterData {
     private String contentID;
 
     /**
-     * Contains a {@link DataHandler} or {@link DataHandlerProvider} object if 
the text node
-     * represents base64 encoded binary data.
+     * Contains a {@link Blob} or {@link BlobProvider} object if the text node 
represents base64
+     * encoded binary data.
      */
-    private Object dataHandlerObject;
+    private Object blobObject;
 
     private boolean optimize;
     private boolean binary;
@@ -65,11 +64,11 @@ public final class TextContent implements 
CloneableCharacterData {
         this.optimize = optimize;
     }
 
-    public TextContent(String contentID, Object dataHandlerObject, boolean 
optimize) {
+    public TextContent(String contentID, Object blobObject, boolean optimize) {
         this.value = null;
         mimeType = null;
         this.contentID = contentID;
-        this.dataHandlerObject = dataHandlerObject;
+        this.blobObject = blobObject;
         binary = true;
         this.optimize = optimize;
     }
@@ -78,7 +77,7 @@ public final class TextContent implements 
CloneableCharacterData {
         this.value = other.value;
         this.mimeType = other.mimeType;
         this.contentID = other.contentID;
-        this.dataHandlerObject = other.dataHandlerObject;
+        this.blobObject = other.blobObject;
         this.optimize = other.optimize;
         this.binary = other.binary;
     }
@@ -113,33 +112,33 @@ public final class TextContent implements 
CloneableCharacterData {
         this.contentID = contentID;
     }
 
-    public Object getDataHandlerObject() {
-        return dataHandlerObject;
+    public Object getBlobObject() {
+        return blobObject;
     }
 
-    public DataHandler getDataHandler() {
-        if (dataHandlerObject != null) {
-            if (dataHandlerObject instanceof DataHandlerProvider) {
+    public Blob getBlob() {
+        if (blobObject != null) {
+            if (blobObject instanceof BlobProvider) {
                 try {
-                    dataHandlerObject = ((DataHandlerProvider) 
dataHandlerObject).getDataHandler();
+                    blobObject = ((BlobProvider) blobObject).getBlob();
                 } catch (IOException ex) {
                     throw new OMException(ex);
                 }
             }
-            return (DataHandler) dataHandlerObject;
+            return (Blob) blobObject;
         } else if (binary) {
-            return new DataHandler(
-                    new 
BlobDataSource(Blobs.createBlob(Base64Utils.decode(value)), mimeType));
+            return Blobs.createBlob(Base64Utils.decode(value));
         } else {
-            throw new OMException("No DataHandler available");
+            throw new OMException("No Blob available");
         }
     }
 
     @Override
     public String toString() {
-        if (dataHandlerObject != null) {
+        if (blobObject != null) {
             try {
-                return Base64Utils.encode(getDataHandler());
+                // TODO(AXIOM-506): avoid conversion here
+                return 
Base64Utils.encode(DataHandlerUtils.toDataHandler(getBlob()));
             } catch (Exception e) {
                 throw new OMException(e);
             }
@@ -149,9 +148,10 @@ public final class TextContent implements 
CloneableCharacterData {
     }
 
     public char[] toCharArray() {
-        if (dataHandlerObject != null) {
+        if (blobObject != null) {
             try {
-                return Base64Utils.encodeToCharArray(getDataHandler());
+                // TODO(AXIOM-506): avoid conversion here
+                return 
Base64Utils.encodeToCharArray(DataHandlerUtils.toDataHandler(getBlob()));
             } catch (IOException ex) {
                 throw new OMException(ex);
             }
@@ -167,7 +167,8 @@ public final class TextContent implements 
CloneableCharacterData {
                 && ((OMCloneOptions) options).isFetchDataHandlers()) {
             // Force loading of the reference to the DataHandler and ensure 
that its content is
             // completely fetched into memory (or temporary storage).
-            getDataHandler().getDataSource();
+            // TODO(AXIOM-506): review this
+            DataHandlerUtils.toDataHandler(getBlob()).getDataSource();
         }
         return new TextContent(this);
     }
@@ -176,7 +177,7 @@ public final class TextContent implements 
CloneableCharacterData {
     public void writeTo(CharacterDataSink sink) throws IOException {
         if (binary) {
             AbstractBase64EncodingOutputStream out = 
sink.getBase64EncodingOutputStream();
-            getDataHandler().writeTo(out);
+            getBlob().writeTo(out);
             out.complete();
         } else {
             // TODO: there must be a better way to just write a String
@@ -190,7 +191,7 @@ public final class TextContent implements 
CloneableCharacterData {
             Base64EncodingStringBufferOutputStream out =
                     new Base64EncodingStringBufferOutputStream(buffer);
             try {
-                getDataHandler().writeTo(out);
+                getBlob().writeTo(out);
                 out.complete();
             } catch (IOException ex) {
                 throw new OMException(ex);
diff --git 
a/mixins/om-mixins/src/main/java/org/apache/axiom/om/impl/mixin/AxiomTextMixin.java
 
b/mixins/om-mixins/src/main/java/org/apache/axiom/om/impl/mixin/AxiomTextMixin.java
index f578b9ec3..e248b1c12 100644
--- 
a/mixins/om-mixins/src/main/java/org/apache/axiom/om/impl/mixin/AxiomTextMixin.java
+++ 
b/mixins/om-mixins/src/main/java/org/apache/axiom/om/impl/mixin/AxiomTextMixin.java
@@ -31,6 +31,7 @@ import org.apache.axiom.om.impl.common.AxiomSemantics;
 import org.apache.axiom.om.impl.common.OMNamespaceImpl;
 import org.apache.axiom.om.impl.intf.AxiomText;
 import org.apache.axiom.om.impl.intf.TextContent;
+import org.apache.axiom.util.activation.DataHandlerUtils;
 import org.apache.axiom.weaver.annotation.Mixin;
 
 @Mixin
@@ -132,7 +133,7 @@ public abstract class AxiomTextMixin implements AxiomText {
         try {
             Object content = coreGetCharacterData();
             if (content instanceof TextContent) {
-                return ((TextContent) content).getDataHandler();
+                return DataHandlerUtils.toDataHandler(((TextContent) 
content).getBlob());
             } else {
                 throw new OMException("No DataHandler available");
             }
diff --git 
a/mixins/om-mixins/src/main/java/org/apache/axiom/om/impl/stream/ds/PushOMDataSourceXOPHandler.java
 
b/mixins/om-mixins/src/main/java/org/apache/axiom/om/impl/stream/ds/PushOMDataSourceXOPHandler.java
index 8793985cf..980d249b8 100644
--- 
a/mixins/om-mixins/src/main/java/org/apache/axiom/om/impl/stream/ds/PushOMDataSourceXOPHandler.java
+++ 
b/mixins/om-mixins/src/main/java/org/apache/axiom/om/impl/stream/ds/PushOMDataSourceXOPHandler.java
@@ -29,6 +29,7 @@ import 
org.apache.axiom.core.stream.xop.AbstractXOPDecodingFilterHandler;
 import org.apache.axiom.om.impl.intf.TextContent;
 import org.apache.axiom.om.impl.stream.xop.XOPHandler;
 import org.apache.axiom.util.UIDGenerator;
+import org.apache.axiom.util.activation.DataHandlerUtils;
 
 final class PushOMDataSourceXOPHandler extends AbstractXOPDecodingFilterHandler
         implements XOPHandler {
@@ -51,6 +52,6 @@ final class PushOMDataSourceXOPHandler extends 
AbstractXOPDecodingFilterHandler
         if (dataHandler == null) {
             throw new StreamException("No DataHandler found for content ID " + 
contentID);
         }
-        return new TextContent(contentID, dataHandler, true);
+        return new TextContent(contentID, 
DataHandlerUtils.toBlob(dataHandler), true);
     }
 }
diff --git 
a/mixins/om-mixins/src/main/java/org/apache/axiom/om/impl/stream/stax/pull/AxiomXMLStreamReaderExtensionFactory.java
 
b/mixins/om-mixins/src/main/java/org/apache/axiom/om/impl/stream/stax/pull/AxiomXMLStreamReaderExtensionFactory.java
index 911a312e4..8c0e46888 100644
--- 
a/mixins/om-mixins/src/main/java/org/apache/axiom/om/impl/stream/stax/pull/AxiomXMLStreamReaderExtensionFactory.java
+++ 
b/mixins/om-mixins/src/main/java/org/apache/axiom/om/impl/stream/stax/pull/AxiomXMLStreamReaderExtensionFactory.java
@@ -20,9 +20,9 @@ package org.apache.axiom.om.impl.stream.stax.pull;
 
 import org.apache.axiom.core.stream.stax.pull.output.InternalXMLStreamReader;
 import 
org.apache.axiom.core.stream.stax.pull.output.XMLStreamReaderExtensionFactory;
+import org.apache.axiom.ext.stax.BlobReader;
 import org.apache.axiom.ext.stax.CharacterDataReader;
 import org.apache.axiom.ext.stax.DTDReader;
-import org.apache.axiom.ext.stax.datahandler.DataHandlerReader;
 
 public final class AxiomXMLStreamReaderExtensionFactory implements 
XMLStreamReaderExtensionFactory {
     public static final AxiomXMLStreamReaderExtensionFactory INSTANCE =
@@ -32,8 +32,8 @@ public final class AxiomXMLStreamReaderExtensionFactory 
implements XMLStreamRead
 
     @Override
     public Object createExtension(String propertyName, InternalXMLStreamReader 
reader) {
-        if (propertyName.equals(DataHandlerReader.PROPERTY)) {
-            return new DataHandlerReaderImpl(reader);
+        if (propertyName.equals(BlobReader.PROPERTY)) {
+            return new BlobReaderImpl(reader);
         } else if (propertyName.equals(DTDReader.PROPERTY)) {
             return new DTDReaderImpl(reader);
         } else if (propertyName.equals(CharacterDataReader.PROPERTY)) {
diff --git 
a/mixins/om-mixins/src/main/java/org/apache/axiom/om/impl/stream/stax/pull/AxiomXMLStreamReaderHelper.java
 
b/mixins/om-mixins/src/main/java/org/apache/axiom/om/impl/stream/stax/pull/AxiomXMLStreamReaderHelper.java
index 8fe733d97..be84bec2e 100644
--- 
a/mixins/om-mixins/src/main/java/org/apache/axiom/om/impl/stream/stax/pull/AxiomXMLStreamReaderHelper.java
+++ 
b/mixins/om-mixins/src/main/java/org/apache/axiom/om/impl/stream/stax/pull/AxiomXMLStreamReaderHelper.java
@@ -25,8 +25,8 @@ import org.apache.axiom.core.stream.CharacterData;
 import org.apache.axiom.core.stream.StreamException;
 import org.apache.axiom.core.stream.stax.pull.input.DTDInfo;
 import org.apache.axiom.core.stream.stax.pull.input.XMLStreamReaderHelper;
+import org.apache.axiom.ext.stax.BlobReader;
 import org.apache.axiom.ext.stax.DTDReader;
-import org.apache.axiom.ext.stax.datahandler.DataHandlerReader;
 import org.apache.axiom.om.impl.intf.TextContent;
 import org.apache.axiom.util.stax.XMLStreamReaderUtils;
 
@@ -34,14 +34,14 @@ final class AxiomXMLStreamReaderHelper extends 
XMLStreamReaderHelper {
     private final XMLStreamReader reader;
 
     /**
-     * Reference to the {@link DataHandlerReader} extension of the reader, or 
<code>null</code> if
-     * the reader doesn't support this extension.
+     * Reference to the {@link BlobReader} extension of the reader, or 
<code>null</code> if the
+     * reader doesn't support this extension.
      */
-    private final DataHandlerReader dataHandlerReader;
+    private final BlobReader blobReader;
 
     AxiomXMLStreamReaderHelper(XMLStreamReader reader) {
         this.reader = reader;
-        dataHandlerReader = XMLStreamReaderUtils.getDataHandlerReader(reader);
+        blobReader = XMLStreamReaderUtils.getBlobReader(reader);
     }
 
     @Override
@@ -62,18 +62,18 @@ final class AxiomXMLStreamReaderHelper extends 
XMLStreamReaderHelper {
 
     @Override
     public CharacterData getCharacterData() throws StreamException {
-        if (dataHandlerReader != null && dataHandlerReader.isBinary()) {
-            if (dataHandlerReader.isDeferred()) {
+        if (blobReader != null && blobReader.isBinary()) {
+            if (blobReader.isDeferred()) {
                 return new TextContent(
-                        dataHandlerReader.getContentID(),
-                        dataHandlerReader.getDataHandlerProvider(),
-                        dataHandlerReader.isOptimized());
+                        blobReader.getContentID(),
+                        blobReader.getBlobProvider(),
+                        blobReader.isOptimized());
             } else {
                 try {
                     return new TextContent(
-                            dataHandlerReader.getContentID(),
-                            dataHandlerReader.getDataHandler(),
-                            dataHandlerReader.isOptimized());
+                            blobReader.getContentID(),
+                            blobReader.getBlob(),
+                            blobReader.isOptimized());
                 } catch (XMLStreamException ex) {
                     throw new StreamException(ex);
                 }
diff --git 
a/mixins/om-mixins/src/main/java/org/apache/axiom/om/impl/stream/stax/pull/DataHandlerReaderImpl.java
 
b/mixins/om-mixins/src/main/java/org/apache/axiom/om/impl/stream/stax/pull/BlobReaderImpl.java
similarity index 71%
rename from 
mixins/om-mixins/src/main/java/org/apache/axiom/om/impl/stream/stax/pull/DataHandlerReaderImpl.java
rename to 
mixins/om-mixins/src/main/java/org/apache/axiom/om/impl/stream/stax/pull/BlobReaderImpl.java
index 8a4a0e2a7..a4c0735b9 100644
--- 
a/mixins/om-mixins/src/main/java/org/apache/axiom/om/impl/stream/stax/pull/DataHandlerReaderImpl.java
+++ 
b/mixins/om-mixins/src/main/java/org/apache/axiom/om/impl/stream/stax/pull/BlobReaderImpl.java
@@ -18,19 +18,19 @@
  */
 package org.apache.axiom.om.impl.stream.stax.pull;
 
-import javax.activation.DataHandler;
 import javax.xml.stream.XMLStreamException;
 import javax.xml.stream.XMLStreamReader;
 
+import org.apache.axiom.blob.Blob;
 import org.apache.axiom.core.stream.stax.pull.output.InternalXMLStreamReader;
-import org.apache.axiom.ext.stax.datahandler.DataHandlerProvider;
-import org.apache.axiom.ext.stax.datahandler.DataHandlerReader;
+import org.apache.axiom.ext.stax.BlobProvider;
+import org.apache.axiom.ext.stax.BlobReader;
 import org.apache.axiom.om.impl.intf.TextContent;
 
-final class DataHandlerReaderImpl implements DataHandlerReader {
+final class BlobReaderImpl implements BlobReader {
     private final InternalXMLStreamReader reader;
 
-    DataHandlerReaderImpl(InternalXMLStreamReader reader) {
+    BlobReaderImpl(InternalXMLStreamReader reader) {
         this.reader = reader;
     }
 
@@ -51,8 +51,7 @@ final class DataHandlerReaderImpl implements 
DataHandlerReader {
 
     @Override
     public boolean isDeferred() {
-        return ((TextContent) reader.getCharacterData()).getDataHandlerObject()
-                instanceof DataHandlerProvider;
+        return ((TextContent) reader.getCharacterData()).getBlobObject() 
instanceof BlobProvider;
     }
 
     @Override
@@ -61,13 +60,12 @@ final class DataHandlerReaderImpl implements 
DataHandlerReader {
     }
 
     @Override
-    public DataHandler getDataHandler() throws XMLStreamException {
-        return ((TextContent) reader.getCharacterData()).getDataHandler();
+    public Blob getBlob() throws XMLStreamException {
+        return ((TextContent) reader.getCharacterData()).getBlob();
     }
 
     @Override
-    public DataHandlerProvider getDataHandlerProvider() {
-        return (DataHandlerProvider)
-                ((TextContent) 
reader.getCharacterData()).getDataHandlerObject();
+    public BlobProvider getBlobProvider() {
+        return (BlobProvider) ((TextContent) 
reader.getCharacterData()).getBlobObject();
     }
 }
diff --git 
a/mixins/om-mixins/src/main/java/org/apache/axiom/om/impl/stream/stax/push/AxiomXMLStreamWriterExtensionFactory.java
 
b/mixins/om-mixins/src/main/java/org/apache/axiom/om/impl/stream/stax/push/AxiomXMLStreamWriterExtensionFactory.java
index 1844504bc..33a14419e 100644
--- 
a/mixins/om-mixins/src/main/java/org/apache/axiom/om/impl/stream/stax/push/AxiomXMLStreamWriterExtensionFactory.java
+++ 
b/mixins/om-mixins/src/main/java/org/apache/axiom/om/impl/stream/stax/push/AxiomXMLStreamWriterExtensionFactory.java
@@ -20,7 +20,7 @@ package org.apache.axiom.om.impl.stream.stax.push;
 
 import org.apache.axiom.core.stream.stax.push.input.InternalXMLStreamWriter;
 import 
org.apache.axiom.core.stream.stax.push.input.XMLStreamWriterExtensionFactory;
-import org.apache.axiom.ext.stax.datahandler.DataHandlerWriter;
+import org.apache.axiom.ext.stax.BlobWriter;
 
 public final class AxiomXMLStreamWriterExtensionFactory implements 
XMLStreamWriterExtensionFactory {
     public static final AxiomXMLStreamWriterExtensionFactory INSTANCE =
@@ -30,8 +30,8 @@ public final class AxiomXMLStreamWriterExtensionFactory 
implements XMLStreamWrit
 
     @Override
     public Object createExtension(String propertyName, InternalXMLStreamWriter 
writer) {
-        if (DataHandlerWriter.PROPERTY.equals(propertyName)) {
-            return new DataHandlerWriterImpl(writer);
+        if (BlobWriter.PROPERTY.equals(propertyName)) {
+            return new BlobWriterImpl(writer);
         } else {
             return null;
         }
diff --git 
a/mixins/om-mixins/src/main/java/org/apache/axiom/om/impl/stream/stax/push/DataHandlerWriterImpl.java
 
b/mixins/om-mixins/src/main/java/org/apache/axiom/om/impl/stream/stax/push/BlobWriterImpl.java
similarity index 66%
rename from 
mixins/om-mixins/src/main/java/org/apache/axiom/om/impl/stream/stax/push/DataHandlerWriterImpl.java
rename to 
mixins/om-mixins/src/main/java/org/apache/axiom/om/impl/stream/stax/push/BlobWriterImpl.java
index de13cf8d8..3bf5c8557 100644
--- 
a/mixins/om-mixins/src/main/java/org/apache/axiom/om/impl/stream/stax/push/DataHandlerWriterImpl.java
+++ 
b/mixins/om-mixins/src/main/java/org/apache/axiom/om/impl/stream/stax/push/BlobWriterImpl.java
@@ -20,31 +20,30 @@ package org.apache.axiom.om.impl.stream.stax.push;
 
 import java.io.IOException;
 
-import javax.activation.DataHandler;
 import javax.xml.stream.XMLStreamException;
 
+import org.apache.axiom.blob.Blob;
 import org.apache.axiom.core.stream.stax.push.input.InternalXMLStreamWriter;
-import org.apache.axiom.ext.stax.datahandler.DataHandlerProvider;
-import org.apache.axiom.ext.stax.datahandler.DataHandlerWriter;
+import org.apache.axiom.ext.stax.BlobProvider;
+import org.apache.axiom.ext.stax.BlobWriter;
 import org.apache.axiom.om.impl.intf.TextContent;
 
-public final class DataHandlerWriterImpl implements DataHandlerWriter {
+public final class BlobWriterImpl implements BlobWriter {
     private final InternalXMLStreamWriter writer;
 
-    public DataHandlerWriterImpl(InternalXMLStreamWriter writer) {
+    public BlobWriterImpl(InternalXMLStreamWriter writer) {
         this.writer = writer;
     }
 
     @Override
-    public void writeDataHandler(DataHandler dataHandler, String contentID, 
boolean optimize)
+    public void writeBlob(Blob blob, String contentID, boolean optimize)
             throws IOException, XMLStreamException {
-        writer.writeCharacterData(new TextContent(contentID, dataHandler, 
optimize));
+        writer.writeCharacterData(new TextContent(contentID, blob, optimize));
     }
 
     @Override
-    public void writeDataHandler(
-            DataHandlerProvider dataHandlerProvider, String contentID, boolean 
optimize)
+    public void writeBlob(BlobProvider blobProvider, String contentID, boolean 
optimize)
             throws IOException, XMLStreamException {
-        writer.writeCharacterData(new TextContent(contentID, 
dataHandlerProvider, optimize));
+        writer.writeCharacterData(new TextContent(contentID, blobProvider, 
optimize));
     }
 }
diff --git 
a/mixins/om-mixins/src/main/java/org/apache/axiom/om/impl/stream/stax/push/XMLStreamWriterHandler.java
 
b/mixins/om-mixins/src/main/java/org/apache/axiom/om/impl/stream/stax/push/XMLStreamWriterHandler.java
index 16a21d625..d0075de67 100644
--- 
a/mixins/om-mixins/src/main/java/org/apache/axiom/om/impl/stream/stax/push/XMLStreamWriterHandler.java
+++ 
b/mixins/om-mixins/src/main/java/org/apache/axiom/om/impl/stream/stax/push/XMLStreamWriterHandler.java
@@ -25,8 +25,8 @@ import org.apache.axiom.core.stream.StreamException;
 import org.apache.axiom.core.stream.XmlHandler;
 import org.apache.axiom.core.stream.serializer.Serializer;
 import org.apache.axiom.core.stream.util.CharacterDataAccumulator;
-import org.apache.axiom.ext.stax.datahandler.DataHandlerProvider;
-import org.apache.axiom.ext.stax.datahandler.DataHandlerWriter;
+import org.apache.axiom.ext.stax.BlobProvider;
+import org.apache.axiom.ext.stax.BlobWriter;
 import org.apache.axiom.om.impl.intf.TextContent;
 import org.apache.axiom.util.stax.XMLStreamWriterUtils;
 
@@ -35,7 +35,7 @@ import javax.xml.stream.XMLStreamWriter;
 
 public class XMLStreamWriterHandler implements XmlHandler {
     private final XMLStreamWriter writer;
-    private DataHandlerWriter dataHandlerWriter;
+    private BlobWriter blobWriter;
     private final CharacterDataAccumulator buffer = new 
CharacterDataAccumulator();
     private boolean buffering;
     private String piTarget;
@@ -163,17 +163,17 @@ public class XMLStreamWriterHandler implements XmlHandler 
{
             if (data instanceof TextContent) {
                 TextContent textContent = (TextContent) data;
                 if (textContent.isBinary()) {
-                    Object dataHandlerObject = 
textContent.getDataHandlerObject();
-                    if (dataHandlerObject instanceof DataHandlerProvider) {
-                        getDataHandlerWriter()
-                                .writeDataHandler(
-                                        (DataHandlerProvider) 
dataHandlerObject,
+                    Object blobObject = textContent.getBlobObject();
+                    if (blobObject instanceof BlobProvider) {
+                        getBlobWriter()
+                                .writeBlob(
+                                        (BlobProvider) blobObject,
                                         textContent.getContentID(),
                                         textContent.isOptimize());
                     } else {
-                        getDataHandlerWriter()
-                                .writeDataHandler(
-                                        textContent.getDataHandler(),
+                        getBlobWriter()
+                                .writeBlob(
+                                        textContent.getBlob(),
                                         textContent.getContentID(),
                                         textContent.isOptimize());
                     }
@@ -241,12 +241,12 @@ public class XMLStreamWriterHandler implements XmlHandler 
{
         }
     }
 
-    private DataHandlerWriter getDataHandlerWriter() {
-        // We only retrieve/create the DataHandlerWriter if necessary
-        if (dataHandlerWriter == null) {
-            dataHandlerWriter = 
XMLStreamWriterUtils.getDataHandlerWriter(writer);
+    private BlobWriter getBlobWriter() {
+        // We only retrieve/create the BlobWriter if necessary
+        if (blobWriter == null) {
+            blobWriter = XMLStreamWriterUtils.getBlobWriter(writer);
         }
-        return dataHandlerWriter;
+        return blobWriter;
     }
 
     @Override
diff --git 
a/mixins/om-mixins/src/main/java/org/apache/axiom/om/impl/stream/xop/ContentIDGenerator.java
 
b/mixins/om-mixins/src/main/java/org/apache/axiom/om/impl/stream/xop/ContentIDGenerator.java
index e97c0ca22..cfc3d440f 100644
--- 
a/mixins/om-mixins/src/main/java/org/apache/axiom/om/impl/stream/xop/ContentIDGenerator.java
+++ 
b/mixins/om-mixins/src/main/java/org/apache/axiom/om/impl/stream/xop/ContentIDGenerator.java
@@ -44,7 +44,7 @@ public interface ContentIDGenerator {
      *
      * @param existingContentID An existing content ID for the {@link 
javax.activation.DataHandler}
      *     being processed, as returned by {@link
-     *     
org.apache.axiom.ext.stax.datahandler.DataHandlerReader#getContentID()}, or 
<code>null
+     *     org.apache.axiom.ext.stax.BlobReader#getContentID()}, or <code>null
      *     </code> if no existing content ID is known. The implementation is 
free to use this
      *     information or not.
      * @return the content ID; may not be <code>null</code>
diff --git 
a/mixins/om-mixins/src/main/java/org/apache/axiom/om/impl/stream/xop/OptimizationPolicy.java
 
b/mixins/om-mixins/src/main/java/org/apache/axiom/om/impl/stream/xop/OptimizationPolicy.java
index 9172c964f..0b6778a8a 100644
--- 
a/mixins/om-mixins/src/main/java/org/apache/axiom/om/impl/stream/xop/OptimizationPolicy.java
+++ 
b/mixins/om-mixins/src/main/java/org/apache/axiom/om/impl/stream/xop/OptimizationPolicy.java
@@ -23,18 +23,16 @@ import java.io.IOException;
 
 import javax.activation.DataHandler;
 
-import org.apache.axiom.ext.stax.datahandler.DataHandlerProvider;
+import org.apache.axiom.ext.stax.BlobProvider;
 
 /**
  * Encapsulates an algorithm that decides whether base64 encoded binary data 
should be optimized
  * using XOP. The implementation takes the decision based on the submitted 
binary content and the
  * "eligible for optimization" flag. Depending on the context of use, this 
flag is provided by the
- * return value of {@link 
org.apache.axiom.ext.stax.datahandler.DataHandlerReader#isOptimized()} or
- * the <code>optimize</code> argument of {@link
- * 
org.apache.axiom.ext.stax.datahandler.DataHandlerWriter#writeDataHandler(DataHandler,
 String,
- * boolean)} or {@link
- * 
org.apache.axiom.ext.stax.datahandler.DataHandlerWriter#writeDataHandler(DataHandlerProvider,
- * String, boolean)}.
+ * return value of {@link org.apache.axiom.ext.stax.BlobReader#isOptimized()} 
or the <code>optimize
+ * </code> argument of {@link 
org.apache.axiom.ext.stax.BlobWriter#writeBlob(DataHandler, String,
+ * boolean)} or {@link 
org.apache.axiom.ext.stax.BlobWriter#writeBlob(BlobProvider, String,
+ * boolean)}.
  */
 public interface OptimizationPolicy {
     /**
@@ -48,8 +46,7 @@ public interface OptimizationPolicy {
                 }
 
                 @Override
-                public boolean isOptimized(
-                        DataHandlerProvider dataHandlerProvider, boolean 
optimize) {
+                public boolean isOptimized(BlobProvider dataHandlerProvider, 
boolean optimize) {
                     return optimize;
                 }
             };
@@ -66,8 +63,7 @@ public interface OptimizationPolicy {
                 }
 
                 @Override
-                public boolean isOptimized(
-                        DataHandlerProvider dataHandlerProvider, boolean 
optimize) {
+                public boolean isOptimized(BlobProvider dataHandlerProvider, 
boolean optimize) {
                     return true;
                 }
             };
@@ -86,16 +82,15 @@ public interface OptimizationPolicy {
     boolean isOptimized(DataHandler dataHandler, boolean optimize) throws 
IOException;
 
     /**
-     * Determine whether the binary content supplied by a given {@link 
DataHandlerProvider} should
-     * be optimized.
+     * Determine whether the binary content supplied by a given {@link 
BlobProvider} should be
+     * optimized.
      *
-     * @param dataHandlerProvider the binary content
+     * @param blobProvider the binary content
      * @param optimize indicates whether the binary content was initially 
marked as eligible for
      *     optimization (see above)
      * @return <code>true</code> if the binary content should be optimized 
using XOP, i.e. encoded
      *     using {@code xop:Include}
      * @throws IOException if an error occurs while reading the data handler
      */
-    boolean isOptimized(DataHandlerProvider dataHandlerProvider, boolean 
optimize)
-            throws IOException;
+    boolean isOptimized(BlobProvider blobProvider, boolean optimize) throws 
IOException;
 }
diff --git 
a/mixins/om-mixins/src/main/java/org/apache/axiom/om/impl/stream/xop/OptimizationPolicyImpl.java
 
b/mixins/om-mixins/src/main/java/org/apache/axiom/om/impl/stream/xop/OptimizationPolicyImpl.java
index d709c7b6c..e2e79f01f 100644
--- 
a/mixins/om-mixins/src/main/java/org/apache/axiom/om/impl/stream/xop/OptimizationPolicyImpl.java
+++ 
b/mixins/om-mixins/src/main/java/org/apache/axiom/om/impl/stream/xop/OptimizationPolicyImpl.java
@@ -23,7 +23,7 @@ import java.io.IOException;
 
 import javax.activation.DataHandler;
 
-import org.apache.axiom.ext.stax.datahandler.DataHandlerProvider;
+import org.apache.axiom.ext.stax.BlobProvider;
 import org.apache.axiom.om.OMOutputFormat;
 import org.apache.axiom.util.activation.DataHandlerUtils;
 import org.apache.commons.logging.Log;
@@ -62,8 +62,7 @@ public final class OptimizationPolicyImpl implements 
OptimizationPolicy {
     }
 
     @Override
-    public boolean isOptimized(DataHandlerProvider dataHandlerProvider, 
boolean optimize)
-            throws IOException {
+    public boolean isOptimized(BlobProvider blobProvider, boolean optimize) 
throws IOException {
 
         if (!optimize) {
             return false;
@@ -72,7 +71,7 @@ public final class OptimizationPolicyImpl implements 
OptimizationPolicy {
             // DataHandlerProvider#getDataHandler(), which would force loading 
the data handler.
             return true;
         } else {
-            return isOptimized(dataHandlerProvider.getDataHandler(), optimize);
+            return 
isOptimized(DataHandlerUtils.toDataHandler(blobProvider.getBlob()), optimize);
         }
     }
 }
diff --git 
a/mixins/om-mixins/src/main/java/org/apache/axiom/om/impl/stream/xop/XOPDecodingFilterHandler.java
 
b/mixins/om-mixins/src/main/java/org/apache/axiom/om/impl/stream/xop/XOPDecodingFilterHandler.java
index 538226007..a9445cf27 100644
--- 
a/mixins/om-mixins/src/main/java/org/apache/axiom/om/impl/stream/xop/XOPDecodingFilterHandler.java
+++ 
b/mixins/om-mixins/src/main/java/org/apache/axiom/om/impl/stream/xop/XOPDecodingFilterHandler.java
@@ -22,15 +22,17 @@ import java.io.IOException;
 
 import javax.activation.DataHandler;
 
+import org.apache.axiom.blob.Blob;
 import org.apache.axiom.core.stream.XmlHandler;
 import org.apache.axiom.core.stream.xop.AbstractXOPDecodingFilterHandler;
-import org.apache.axiom.ext.stax.datahandler.DataHandlerProvider;
+import org.apache.axiom.ext.stax.BlobProvider;
 import org.apache.axiom.om.OMAttachmentAccessor;
 import org.apache.axiom.om.OMException;
 import org.apache.axiom.om.impl.intf.TextContent;
+import org.apache.axiom.util.activation.DataHandlerUtils;
 
 final class XOPDecodingFilterHandler extends AbstractXOPDecodingFilterHandler {
-    private static class DataHandlerProviderImpl implements 
DataHandlerProvider {
+    private static class DataHandlerProviderImpl implements BlobProvider {
         private final OMAttachmentAccessor attachmentAccessor;
         private final String contentID;
 
@@ -40,12 +42,12 @@ final class XOPDecodingFilterHandler extends 
AbstractXOPDecodingFilterHandler {
         }
 
         @Override
-        public DataHandler getDataHandler() throws IOException {
+        public Blob getBlob() throws IOException {
             DataHandler dh = attachmentAccessor.getDataHandler(contentID);
             if (dh == null) {
                 throw new OMException("No MIME part found for content ID '" + 
contentID + "'");
             } else {
-                return dh;
+                return DataHandlerUtils.toBlob(dh);
             }
         }
     }
diff --git 
a/mixins/om-mixins/src/main/java/org/apache/axiom/om/impl/stream/xop/XOPEncodingFilterHandler.java
 
b/mixins/om-mixins/src/main/java/org/apache/axiom/om/impl/stream/xop/XOPEncodingFilterHandler.java
index 742ee4390..3e1f98d86 100644
--- 
a/mixins/om-mixins/src/main/java/org/apache/axiom/om/impl/stream/xop/XOPEncodingFilterHandler.java
+++ 
b/mixins/om-mixins/src/main/java/org/apache/axiom/om/impl/stream/xop/XOPEncodingFilterHandler.java
@@ -26,17 +26,19 @@ import java.util.Set;
 
 import javax.activation.DataHandler;
 
+import org.apache.axiom.blob.Blob;
 import org.apache.axiom.core.stream.StreamException;
 import org.apache.axiom.core.stream.XmlHandler;
 import org.apache.axiom.core.stream.xop.AbstractXOPEncodingFilterHandler;
-import org.apache.axiom.ext.stax.datahandler.DataHandlerProvider;
+import org.apache.axiom.ext.stax.BlobProvider;
 import org.apache.axiom.om.OMAttachmentAccessor;
 import org.apache.axiom.om.OMException;
 import org.apache.axiom.om.impl.intf.TextContent;
+import org.apache.axiom.util.activation.DataHandlerUtils;
 
 public final class XOPEncodingFilterHandler extends 
AbstractXOPEncodingFilterHandler
         implements XOPHandler, OMAttachmentAccessor {
-    private final Map<String, Object> dataHandlerObjects = new 
LinkedHashMap<String, Object>();
+    private final Map<String, Object> blobObjects = new LinkedHashMap<String, 
Object>();
     private final ContentIDGenerator contentIDGenerator;
     private final OptimizationPolicy optimizationPolicy;
 
@@ -59,7 +61,7 @@ public final class XOPEncodingFilterHandler extends 
AbstractXOPEncodingFilterHan
         }
         if (doOptimize) {
             String contentID = contentIDGenerator.generateContentID(null);
-            dataHandlerObjects.put(contentID, dataHandler);
+            blobObjects.put(contentID, DataHandlerUtils.toBlob(dataHandler));
             return contentID;
         } else {
             return null;
@@ -75,19 +77,19 @@ public final class XOPEncodingFilterHandler extends 
AbstractXOPEncodingFilterHan
      *     returned.
      */
     public Set<String> getContentIDs() {
-        return Collections.unmodifiableSet(dataHandlerObjects.keySet());
+        return Collections.unmodifiableSet(blobObjects.keySet());
     }
 
     @Override
     public DataHandler getDataHandler(String contentID) {
-        Object dataHandlerObject = dataHandlerObjects.get(contentID);
-        if (dataHandlerObject == null) {
+        Object blobObject = blobObjects.get(contentID);
+        if (blobObject == null) {
             return null;
-        } else if (dataHandlerObject instanceof DataHandler) {
-            return (DataHandler) dataHandlerObject;
+        } else if (blobObject instanceof Blob) {
+            return DataHandlerUtils.toDataHandler((Blob) blobObject);
         } else {
             try {
-                return ((DataHandlerProvider) 
dataHandlerObject).getDataHandler();
+                return DataHandlerUtils.toDataHandler(((BlobProvider) 
blobObject).getBlob());
             } catch (IOException ex) {
                 throw new OMException(ex);
             }
@@ -99,18 +101,18 @@ public final class XOPEncodingFilterHandler extends 
AbstractXOPEncodingFilterHan
         if (data instanceof TextContent) {
             TextContent textContent = (TextContent) data;
             if (textContent.isBinary()) {
-                Object dataHandlerObject = textContent.getDataHandlerObject();
+                Object blobObject = textContent.getBlobObject();
                 boolean optimize;
                 try {
-                    if (dataHandlerObject instanceof DataHandlerProvider) {
+                    if (blobObject instanceof BlobProvider) {
                         optimize =
                                 optimizationPolicy.isOptimized(
-                                        (DataHandlerProvider) 
dataHandlerObject,
-                                        textContent.isOptimize());
+                                        (BlobProvider) blobObject, 
textContent.isOptimize());
                     } else {
                         optimize =
                                 optimizationPolicy.isOptimized(
-                                        (DataHandler) dataHandlerObject, 
textContent.isOptimize());
+                                        DataHandlerUtils.toDataHandler((Blob) 
blobObject),
+                                        textContent.isOptimize());
                     }
                 } catch (IOException ex) {
                     throw new StreamException(ex);
@@ -118,7 +120,7 @@ public final class XOPEncodingFilterHandler extends 
AbstractXOPEncodingFilterHan
                 if (optimize) {
                     String contentID =
                             
contentIDGenerator.generateContentID(textContent.getContentID());
-                    dataHandlerObjects.put(contentID, dataHandlerObject);
+                    blobObjects.put(contentID, blobObject);
                     return contentID;
                 }
             }
diff --git a/samples/src/test/java/org/apache/axiom/samples/LogWriter.java 
b/samples/src/test/java/org/apache/axiom/samples/LogWriter.java
index 410c36db6..4a17e17c1 100644
--- a/samples/src/test/java/org/apache/axiom/samples/LogWriter.java
+++ b/samples/src/test/java/org/apache/axiom/samples/LogWriter.java
@@ -20,23 +20,23 @@ package org.apache.axiom.samples;
 
 import java.io.IOException;
 
-import javax.activation.DataHandler;
 import javax.xml.stream.XMLStreamException;
 import javax.xml.stream.XMLStreamWriter;
 
-import org.apache.axiom.ext.stax.datahandler.DataHandlerProvider;
-import org.apache.axiom.ext.stax.datahandler.DataHandlerWriter;
+import org.apache.axiom.blob.Blob;
+import org.apache.axiom.ext.stax.BlobProvider;
+import org.apache.axiom.ext.stax.BlobWriter;
 import org.apache.axiom.util.stax.wrapper.XMLStreamWriterWrapper;
 
 // START SNIPPET: main
-public class LogWriter extends XMLStreamWriterWrapper implements 
DataHandlerWriter {
+public class LogWriter extends XMLStreamWriterWrapper implements BlobWriter {
     public LogWriter(XMLStreamWriter parent) {
         super(parent);
     }
 
     @Override
     public Object getProperty(String name) throws IllegalArgumentException {
-        if (name.equals(DataHandlerWriter.PROPERTY)) {
+        if (name.equals(BlobWriter.PROPERTY)) {
             return this;
         } else {
             return super.getProperty(name);
@@ -44,13 +44,13 @@ public class LogWriter extends XMLStreamWriterWrapper 
implements DataHandlerWrit
     }
 
     @Override
-    public void writeDataHandler(DataHandler dataHandler, String contentID, 
boolean optimize)
+    public void writeBlob(Blob blob, String contentID, boolean optimize)
             throws IOException, XMLStreamException {
         super.writeCharacters("[base64 encoded data]");
     }
 
     @Override
-    public void writeDataHandler(DataHandlerProvider dataHandlerProvider, 
String contentID,
+    public void writeBlob(BlobProvider blobProvider, String contentID,
             boolean optimize) throws IOException, XMLStreamException {
         super.writeCharacters("[base64 encoded data]");
     }
diff --git 
a/testing/axiom-testsuite/src/main/java/org/apache/axiom/ts/om/OMTestSuiteBuilder.java
 
b/testing/axiom-testsuite/src/main/java/org/apache/axiom/ts/om/OMTestSuiteBuilder.java
index 8b1b0e61d..147a7af61 100644
--- 
a/testing/axiom-testsuite/src/main/java/org/apache/axiom/ts/om/OMTestSuiteBuilder.java
+++ 
b/testing/axiom-testsuite/src/main/java/org/apache/axiom/ts/om/OMTestSuiteBuilder.java
@@ -876,12 +876,8 @@ public class OMTestSuiteBuilder extends 
MatrixTestSuiteBuilder {
             addTest(new 
org.apache.axiom.ts.om.element.sr.TestCommentEvent(metaFactory, bf, true));
             addTest(new 
org.apache.axiom.ts.om.element.sr.TestCommentEvent(metaFactory, bf, false));
         }
-        addTest(
-                new 
org.apache.axiom.ts.om.element.sr.TestGetDataHandlerFromElement(
-                        metaFactory, true));
-        addTest(
-                new 
org.apache.axiom.ts.om.element.sr.TestGetDataHandlerFromElement(
-                        metaFactory, false));
+        addTest(new 
org.apache.axiom.ts.om.element.sr.TestGetBlobFromElement(metaFactory, true));
+        addTest(new 
org.apache.axiom.ts.om.element.sr.TestGetBlobFromElement(metaFactory, false));
         addTest(new 
org.apache.axiom.ts.om.element.sr.TestGetElementText(metaFactory));
         for (BuilderFactory bf : getInstances(BuilderFactory.class)) {
             addTest(
@@ -989,10 +985,10 @@ public class OMTestSuiteBuilder extends 
MatrixTestSuiteBuilder {
                         metaFactory));
         addTest(new 
org.apache.axiom.ts.om.factory.TestCreateOMText(metaFactory));
         addTest(
-                new 
org.apache.axiom.ts.om.factory.TestCreateOMTextFromDataHandlerProvider(
+                new 
org.apache.axiom.ts.om.factory.TestCreateOMTextFromBlobProvider(
                         metaFactory, false));
         addTest(
-                new 
org.apache.axiom.ts.om.factory.TestCreateOMTextFromDataHandlerProvider(
+                new 
org.apache.axiom.ts.om.factory.TestCreateOMTextFromBlobProvider(
                         metaFactory, true));
         addTest(new 
org.apache.axiom.ts.om.factory.TestCreateOMTextFromOMText(metaFactory));
         addTest(new 
org.apache.axiom.ts.om.factory.TestCreateOMTextWithNullParent(metaFactory));
diff --git 
a/testing/axiom-testsuite/src/main/java/org/apache/axiom/ts/om/element/sr/TestGetDataHandlerFromElement.java
 
b/testing/axiom-testsuite/src/main/java/org/apache/axiom/ts/om/element/sr/TestGetBlobFromElement.java
similarity index 83%
rename from 
testing/axiom-testsuite/src/main/java/org/apache/axiom/ts/om/element/sr/TestGetDataHandlerFromElement.java
rename to 
testing/axiom-testsuite/src/main/java/org/apache/axiom/ts/om/element/sr/TestGetBlobFromElement.java
index 667f32da7..67e9bf048 100644
--- 
a/testing/axiom-testsuite/src/main/java/org/apache/axiom/ts/om/element/sr/TestGetDataHandlerFromElement.java
+++ 
b/testing/axiom-testsuite/src/main/java/org/apache/axiom/ts/om/element/sr/TestGetBlobFromElement.java
@@ -21,10 +21,10 @@ package org.apache.axiom.ts.om.element.sr;
 import java.io.StringReader;
 
 import javax.activation.DataHandler;
-import javax.activation.DataSource;
 import javax.xml.namespace.QName;
 import javax.xml.stream.XMLStreamReader;
 
+import org.apache.axiom.blob.Blob;
 import org.apache.axiom.om.OMElement;
 import org.apache.axiom.om.OMFactory;
 import org.apache.axiom.om.OMMetaFactory;
@@ -35,13 +35,13 @@ import org.apache.axiom.ts.AxiomTestCase;
 import org.apache.axiom.util.stax.XMLStreamReaderUtils;
 
 /**
- * Tests {@link 
XMLStreamReaderUtils#getDataHandlerFromElement(XMLStreamReader)} on an {@link
+ * Tests {@link XMLStreamReaderUtils#getBlobFromElement(XMLStreamReader)} on 
an {@link
  * XMLStreamReader} returned by {@link OMElement#getXMLStreamReader(boolean)}.
  */
-public class TestGetDataHandlerFromElement extends AxiomTestCase {
+public class TestGetBlobFromElement extends AxiomTestCase {
     private final boolean cache;
 
-    public TestGetDataHandlerFromElement(OMMetaFactory metaFactory, boolean 
cache) {
+    public TestGetBlobFromElement(OMMetaFactory metaFactory, boolean cache) {
         super(metaFactory);
         this.cache = cache;
         addTestParameter("cache", cache);
@@ -60,7 +60,7 @@ public class TestGetDataHandlerFromElement extends 
AxiomTestCase {
         XMLStreamReader reader = root.getXMLStreamReader(cache);
         assertEquals(XMLStreamReader.START_ELEMENT, reader.next());
         assertEquals(XMLStreamReader.START_ELEMENT, reader.next());
-        DataSource ds = 
XMLStreamReaderUtils.getDataHandlerFromElement(reader).getDataSource();
-        IOTestUtils.compareStreams(orgDS.getInputStream(), 
ds.getInputStream());
+        Blob blob = XMLStreamReaderUtils.getBlobFromElement(reader);
+        IOTestUtils.compareStreams(orgDS.getInputStream(), 
blob.getInputStream());
     }
 }
diff --git 
a/testing/axiom-testsuite/src/main/java/org/apache/axiom/ts/om/factory/TestCreateOMTextFromDataHandlerProvider.java
 
b/testing/axiom-testsuite/src/main/java/org/apache/axiom/ts/om/factory/TestCreateOMTextFromBlobProvider.java
similarity index 72%
rename from 
testing/axiom-testsuite/src/main/java/org/apache/axiom/ts/om/factory/TestCreateOMTextFromDataHandlerProvider.java
rename to 
testing/axiom-testsuite/src/main/java/org/apache/axiom/ts/om/factory/TestCreateOMTextFromBlobProvider.java
index bf9f23e3a..a38ddbb62 100644
--- 
a/testing/axiom-testsuite/src/main/java/org/apache/axiom/ts/om/factory/TestCreateOMTextFromDataHandlerProvider.java
+++ 
b/testing/axiom-testsuite/src/main/java/org/apache/axiom/ts/om/factory/TestCreateOMTextFromBlobProvider.java
@@ -22,34 +22,35 @@ import static com.google.common.truth.Truth.assertThat;
 
 import javax.activation.DataHandler;
 
-import org.apache.axiom.ext.stax.datahandler.DataHandlerProvider;
+import org.apache.axiom.blob.Blob;
+import org.apache.axiom.ext.stax.BlobProvider;
 import org.apache.axiom.om.OMFactory;
 import org.apache.axiom.om.OMMetaFactory;
 import org.apache.axiom.om.OMText;
 import org.apache.axiom.ts.AxiomTestCase;
 import org.apache.axiom.util.UIDGenerator;
+import org.apache.axiom.util.activation.DataHandlerUtils;
 
-public class TestCreateOMTextFromDataHandlerProvider extends AxiomTestCase {
-    static class TestDataHandlerProvider implements DataHandlerProvider {
-        private DataHandler dh;
+public class TestCreateOMTextFromBlobProvider extends AxiomTestCase {
+    static class TestDataHandlerProvider implements BlobProvider {
+        private Blob blob;
 
         @Override
-        public DataHandler getDataHandler() {
-            if (dh == null) {
-                dh = new DataHandler("Data", "text/plain");
+        public Blob getBlob() {
+            if (blob == null) {
+                blob = DataHandlerUtils.toBlob(new DataHandler("Data", 
"text/plain"));
             }
-            return dh;
+            return blob;
         }
 
-        public boolean isDataHandlerCreated() {
-            return dh != null;
+        public boolean isBlobCreated() {
+            return blob != null;
         }
     }
 
     private final boolean nullContentID;
 
-    public TestCreateOMTextFromDataHandlerProvider(
-            OMMetaFactory metaFactory, boolean nullContentID) {
+    public TestCreateOMTextFromBlobProvider(OMMetaFactory metaFactory, boolean 
nullContentID) {
         super(metaFactory);
         this.nullContentID = nullContentID;
         addTestParameter("nullContentId", nullContentID);
@@ -61,9 +62,9 @@ public class TestCreateOMTextFromDataHandlerProvider extends 
AxiomTestCase {
         OMFactory factory = metaFactory.getOMFactory();
         String contentID = nullContentID ? null : 
UIDGenerator.generateContentId();
         OMText text = factory.createOMText(contentID, prov, true);
-        assertFalse(prov.isDataHandlerCreated());
+        assertFalse(prov.isBlobCreated());
         assertEquals(text.getDataHandler().getContent(), "Data");
-        assertTrue(prov.isDataHandlerCreated());
+        assertTrue(prov.isBlobCreated());
         if (contentID == null) {
             assertThat(text.getContentID()).isNotNull();
         } else {
diff --git 
a/testing/axiom-testsuite/src/main/java/org/apache/axiom/ts/om/sourcedelement/push/PushOMDataSourceScenario.java
 
b/testing/axiom-testsuite/src/main/java/org/apache/axiom/ts/om/sourcedelement/push/PushOMDataSourceScenario.java
index 3082bf035..111ad7470 100644
--- 
a/testing/axiom-testsuite/src/main/java/org/apache/axiom/ts/om/sourcedelement/push/PushOMDataSourceScenario.java
+++ 
b/testing/axiom-testsuite/src/main/java/org/apache/axiom/ts/om/sourcedelement/push/PushOMDataSourceScenario.java
@@ -42,8 +42,8 @@ public interface PushOMDataSourceScenario extends Dimension {
         new WriteCDataScenario(),
         new WriteCharactersCharArrayScenario(),
         new WriteCommentScenario(),
-        new WriteDataHandlerScenario(),
-        new WriteDataHandlerProviderScenario(),
+        new WriteBlobScenario(),
+        new WriteBlobProviderScenario(),
         new WriteEmptyElementScenario(),
         new WriteEmptyElementAutoPrefixScenario(),
         new WriteEmptyElementNamespaceUnawareScenario(),
diff --git 
a/testing/axiom-testsuite/src/main/java/org/apache/axiom/ts/om/sourcedelement/push/WriteDataHandlerProviderScenario.java
 
b/testing/axiom-testsuite/src/main/java/org/apache/axiom/ts/om/sourcedelement/push/WriteBlobProviderScenario.java
similarity index 79%
rename from 
testing/axiom-testsuite/src/main/java/org/apache/axiom/ts/om/sourcedelement/push/WriteDataHandlerProviderScenario.java
rename to 
testing/axiom-testsuite/src/main/java/org/apache/axiom/ts/om/sourcedelement/push/WriteBlobProviderScenario.java
index 579d43406..170adb229 100644
--- 
a/testing/axiom-testsuite/src/main/java/org/apache/axiom/ts/om/sourcedelement/push/WriteDataHandlerProviderScenario.java
+++ 
b/testing/axiom-testsuite/src/main/java/org/apache/axiom/ts/om/sourcedelement/push/WriteBlobProviderScenario.java
@@ -26,27 +26,29 @@ import javax.activation.DataHandler;
 import javax.xml.stream.XMLStreamException;
 import javax.xml.stream.XMLStreamWriter;
 
-import org.apache.axiom.ext.stax.datahandler.DataHandlerProvider;
-import org.apache.axiom.ext.stax.datahandler.DataHandlerWriter;
+import org.apache.axiom.blob.Blob;
+import org.apache.axiom.ext.stax.BlobProvider;
+import org.apache.axiom.ext.stax.BlobWriter;
 import org.apache.axiom.om.OMElement;
 import org.apache.axiom.om.OMText;
 import org.apache.axiom.testutils.activation.RandomDataSource;
 import org.apache.axiom.testutils.io.IOTestUtils;
 import org.apache.axiom.testutils.suite.MatrixTestCase;
+import org.apache.axiom.util.activation.DataHandlerUtils;
 import org.apache.axiom.util.stax.XMLStreamWriterUtils;
 import org.junit.Assert;
 
 /**
- * Tests that {@link DataHandlerWriter#writeDataHandler(DataHandlerProvider, 
String, boolean)}
- * creates an {@link OMText} backed by a {@link DataHandlerProvider}.
+ * Tests that {@link BlobWriter#writeBlob(BlobProvider, String, boolean)} 
creates an {@link OMText}
+ * backed by a {@link BlobProvider}.
  */
-public class WriteDataHandlerProviderScenario implements 
PushOMDataSourceScenario {
+public class WriteBlobProviderScenario implements PushOMDataSourceScenario {
     private final DataHandler dh = new DataHandler(new RandomDataSource(1024));
-    private final DataHandlerProvider dhp =
-            new DataHandlerProvider() {
+    private final BlobProvider blobProvider =
+            new BlobProvider() {
                 @Override
-                public DataHandler getDataHandler() throws IOException {
-                    return dh;
+                public Blob getBlob() throws IOException {
+                    return DataHandlerUtils.toBlob(dh);
                 }
             };
 
@@ -64,7 +66,7 @@ public class WriteDataHandlerProviderScenario implements 
PushOMDataSourceScenari
     public void serialize(XMLStreamWriter writer) throws XMLStreamException {
         writer.writeStartElement(null, "root", null);
         try {
-            XMLStreamWriterUtils.writeDataHandler(writer, dhp, null, true);
+            XMLStreamWriterUtils.writeBlob(writer, blobProvider, null, true);
         } catch (IOException ex) {
             throw new XMLStreamException(ex);
         }
diff --git 
a/testing/axiom-testsuite/src/main/java/org/apache/axiom/ts/om/sourcedelement/push/WriteDataHandlerScenario.java
 
b/testing/axiom-testsuite/src/main/java/org/apache/axiom/ts/om/sourcedelement/push/WriteBlobScenario.java
similarity index 87%
rename from 
testing/axiom-testsuite/src/main/java/org/apache/axiom/ts/om/sourcedelement/push/WriteDataHandlerScenario.java
rename to 
testing/axiom-testsuite/src/main/java/org/apache/axiom/ts/om/sourcedelement/push/WriteBlobScenario.java
index c51167be2..978b3aab2 100644
--- 
a/testing/axiom-testsuite/src/main/java/org/apache/axiom/ts/om/sourcedelement/push/WriteDataHandlerScenario.java
+++ 
b/testing/axiom-testsuite/src/main/java/org/apache/axiom/ts/om/sourcedelement/push/WriteBlobScenario.java
@@ -26,20 +26,21 @@ import javax.activation.DataHandler;
 import javax.xml.stream.XMLStreamException;
 import javax.xml.stream.XMLStreamWriter;
 
-import org.apache.axiom.ext.stax.datahandler.DataHandlerWriter;
+import org.apache.axiom.ext.stax.BlobWriter;
 import org.apache.axiom.om.OMElement;
 import org.apache.axiom.om.OMText;
 import org.apache.axiom.testutils.activation.RandomDataSource;
 import org.apache.axiom.testutils.io.IOTestUtils;
 import org.apache.axiom.testutils.suite.MatrixTestCase;
+import org.apache.axiom.util.activation.DataHandlerUtils;
 import org.apache.axiom.util.stax.XMLStreamWriterUtils;
 import org.junit.Assert;
 
 /**
- * Tests that {@link DataHandlerWriter#writeDataHandler(DataHandler, String, 
boolean)} creates an
- * {@link OMText} backed by a {@link DataHandler}.
+ * Tests that {@link BlobWriter#writeBlob(Blob, String, boolean)} creates an 
{@link OMText} backed
+ * by a {@link Blob}.
  */
-public class WriteDataHandlerScenario implements PushOMDataSourceScenario {
+public class WriteBlobScenario implements PushOMDataSourceScenario {
     private final DataHandler dh = new DataHandler(new RandomDataSource(1024));
 
     @Override
@@ -56,7 +57,7 @@ public class WriteDataHandlerScenario implements 
PushOMDataSourceScenario {
     public void serialize(XMLStreamWriter writer) throws XMLStreamException {
         writer.writeStartElement(null, "root", null);
         try {
-            XMLStreamWriterUtils.writeDataHandler(writer, dh, null, true);
+            XMLStreamWriterUtils.writeBlob(writer, 
DataHandlerUtils.toBlob(dh), null, true);
         } catch (IOException ex) {
             throw new XMLStreamException(ex);
         }

Reply via email to