Author: veithen
Date: Tue Jul 14 21:47:26 2009
New Revision: 794080
URL: http://svn.apache.org/viewvc?rev=794080&view=rev
Log:
Some improvements to the data handler extension API.
Modified:
webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/ext/stax/datahandler/DataHandlerProvider.java
webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/ext/stax/datahandler/DataHandlerReader.java
webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/om/impl/OMStAXWrapper.java
webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/om/impl/SwitchingWrapper.java
webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/om/impl/builder/DataHandlerReaderUtil.java
webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/util/stax/xop/MimePartProvider.java
webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/util/stax/xop/XOPDecodingStreamReader.java
webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/util/stax/xop/XOPEncodingStreamReader.java
webservices/commons/trunk/modules/axiom/modules/axiom-api/src/test/java/org/apache/axiom/om/OMTextTestBase.java
webservices/commons/trunk/modules/axiom/modules/axiom-api/src/test/java/org/apache/axiom/util/stax/xop/OMAttachmentAccessorMimePartProvider.java
webservices/commons/trunk/modules/axiom/modules/axiom-api/src/test/java/org/apache/axiom/util/stax/xop/XOPEncodingStreamReaderTest.java
Modified:
webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/ext/stax/datahandler/DataHandlerProvider.java
URL:
http://svn.apache.org/viewvc/webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/ext/stax/datahandler/DataHandlerProvider.java?rev=794080&r1=794079&r2=794080&view=diff
==============================================================================
---
webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/ext/stax/datahandler/DataHandlerProvider.java
(original)
+++
webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/ext/stax/datahandler/DataHandlerProvider.java
Tue Jul 14 21:47:26 2009
@@ -30,6 +30,20 @@
*/
public interface DataHandlerProvider {
/**
+ * Check whether the {...@link DataHandler} has already been loaded. A
return value of
+ * <code>true</code> means that a call to {...@link #getDataHandler()}
will not block or will
+ * retrieve the {...@link DataHandler} without overhead. Note the return
value of this method for a
+ * given instance of this class may change over time due to events other
than a call to
+ * {...@link #getDataHandler()} on the same instance. E.g. a call to
{...@link #getDataHandler()} on
+ * one instance may change the return value of the method on another
instance (because the
+ * {...@link DataHandler} objects can only be loaded in a certain
sequence).
+ *
+ * @return <code>true</code> if the {...@link DataHandler} has already
been loaded;
+ * <code>false</code> otherwise
+ */
+ boolean isLoaded();
+
+ /**
* Get the {...@link DataHandler} object for the binary content.
*
* @return the binary content
Modified:
webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/ext/stax/datahandler/DataHandlerReader.java
URL:
http://svn.apache.org/viewvc/webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/ext/stax/datahandler/DataHandlerReader.java?rev=794080&r1=794079&r2=794080&view=diff
==============================================================================
---
webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/ext/stax/datahandler/DataHandlerReader.java
(original)
+++
webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/ext/stax/datahandler/DataHandlerReader.java
Tue Jul 14 21:47:26 2009
@@ -77,6 +77,17 @@
* available; <code>false</code> for all other types of events.
*/
boolean isBinary();
+
+ /**
+ * Check if the binary content is eligible for optimization (e.g. using
XOP) or if it should
+ * be serialized as base64.
+ * Calling this method is only meaningful if {...@link #isBinary()}
returns <code>true</code> for
+ * the current event. The behavior of this method is undefined if this is
not the case.
+ *
+ * @return <code>true</code> if the binary content is eligible for
optimization;
+ * <code>false</code> otherwise
+ */
+ boolean isOptimized();
/**
* Check whether the {...@link javax.xml.stream.XMLStreamReader} supports
deferred loading of the
Modified:
webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/om/impl/OMStAXWrapper.java
URL:
http://svn.apache.org/viewvc/webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/om/impl/OMStAXWrapper.java?rev=794080&r1=794079&r2=794080&view=diff
==============================================================================
---
webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/om/impl/OMStAXWrapper.java
(original)
+++
webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/om/impl/OMStAXWrapper.java
Tue Jul 14 21:47:26 2009
@@ -97,7 +97,10 @@
}
} else {
if (xopEncoder == null) {
- xopEncoder = new XOPEncodingStreamReader(switchingWrapper,
contentIDGenerator);
+ // Since the intention is to support an efficient way to pass
binary content to a
+ // consumer that is not aware of our data handler extension
(see WSCOMMONS-344), we
+ // use optimizeAll=true, i.e. we ignore OMText#isOptimized().
+ xopEncoder = new XOPEncodingStreamReader(switchingWrapper,
contentIDGenerator, true);
setParent(xopEncoder);
}
}
Modified:
webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/om/impl/SwitchingWrapper.java
URL:
http://svn.apache.org/viewvc/webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/om/impl/SwitchingWrapper.java?rev=794080&r1=794079&r2=794080&view=diff
==============================================================================
---
webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/om/impl/SwitchingWrapper.java
(original)
+++
webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/om/impl/SwitchingWrapper.java
Tue Jul 14 21:47:26 2009
@@ -1204,6 +1204,22 @@
}
}
+ public boolean isOptimized() {
+ if (parser != null) {
+ if (dataHandlerReader != null) {
+ return dataHandlerReader.isOptimized();
+ } else {
+ throw new IllegalStateException();
+ }
+ } else {
+ if (lastNode instanceof OMText) {
+ return ((OMText)lastNode).isOptimized();
+ } else {
+ throw new IllegalStateException();
+ }
+ }
+ }
+
public boolean isDeferred() {
if (parser != null) {
if (dataHandlerReader != null) {
Modified:
webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/om/impl/builder/DataHandlerReaderUtil.java
URL:
http://svn.apache.org/viewvc/webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/om/impl/builder/DataHandlerReaderUtil.java?rev=794080&r1=794079&r2=794080&view=diff
==============================================================================
---
webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/om/impl/builder/DataHandlerReaderUtil.java
(original)
+++
webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/om/impl/builder/DataHandlerReaderUtil.java
Tue Jul 14 21:47:26 2009
@@ -122,6 +122,11 @@
return
((Boolean)reader.getProperty(OMConstants.IS_BINARY)).booleanValue();
}
+ public boolean isOptimized() {
+ // This is compatible with the old StAXBuilder
implementation
+ return true;
+ }
+
public boolean isDeferred() {
return false;
}
Modified:
webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/util/stax/xop/MimePartProvider.java
URL:
http://svn.apache.org/viewvc/webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/util/stax/xop/MimePartProvider.java?rev=794080&r1=794079&r2=794080&view=diff
==============================================================================
---
webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/util/stax/xop/MimePartProvider.java
(original)
+++
webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/util/stax/xop/MimePartProvider.java
Tue Jul 14 21:47:26 2009
@@ -28,6 +28,17 @@
*/
public interface MimePartProvider {
/**
+ * Check whether the MIME part identified by a given content ID has
already been loaded. A
+ * return value of <code>true</code> means that a call to {...@link
#getMimePart(String)} (for
+ * the same content ID) will not block or will retrieve the {...@link
DataHandler} without
+ * overhead.
+ *
+ * @return <code>true</code> if the MIME part has already been loaded;
<code>false</code>
+ * otherwise
+ */
+ boolean isLoaded(String contentID);
+
+ /**
* Get the {...@link DataHandler} for the MIME part identified by a given
content ID.
*
* @param contentID the content ID
Modified:
webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/util/stax/xop/XOPDecodingStreamReader.java
URL:
http://svn.apache.org/viewvc/webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/util/stax/xop/XOPDecodingStreamReader.java?rev=794080&r1=794079&r2=794080&view=diff
==============================================================================
---
webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/util/stax/xop/XOPDecodingStreamReader.java
(original)
+++
webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/util/stax/xop/XOPDecodingStreamReader.java
Tue Jul 14 21:47:26 2009
@@ -73,6 +73,10 @@
return contentID;
}
+ public boolean isLoaded() {
+ return mimePartProvider.isLoaded(contentID);
+ }
+
public DataHandler getDataHandler() throws XMLStreamException {
return mimePartProvider.getMimePart(contentID);
}
@@ -513,6 +517,11 @@
return dh != null;
}
+ public boolean isOptimized() {
+ // xop:Include implies optimized
+ return true;
+ }
+
public boolean isDeferred() {
return true;
}
Modified:
webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/util/stax/xop/XOPEncodingStreamReader.java
URL:
http://svn.apache.org/viewvc/webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/util/stax/xop/XOPEncodingStreamReader.java?rev=794080&r1=794079&r2=794080&view=diff
==============================================================================
---
webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/util/stax/xop/XOPEncodingStreamReader.java
(original)
+++
webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/util/stax/xop/XOPEncodingStreamReader.java
Tue Jul 14 21:47:26 2009
@@ -109,6 +109,7 @@
private final XMLStreamReader parent;
private final ContentIDGenerator contentIDGenerator;
private final DataHandlerReader dataHandlerReader;
+ private final boolean optimizeAll;
private int state = STATE_PASS_THROUGH;
private String currentContentID;
private Map dataHandlerObjects = new LinkedHashMap();
@@ -122,12 +123,17 @@
* @param contentIDGenerator
* used to generate content IDs for the binary content exposed
as
* <tt>xop:Include</tt> element information items
+ * @param optimizeAll
+ * if set to <code>true</code>, <tt>xop:Include</tt> element
information items
+ * will be generated for all data handlers, regardless of the
return value of
+ * {...@link DataHandlerReader#isOptimized()}
*
* @throws IllegalArgumentException
* if the provided {...@link XMLStreamReader} doesn't
implement the extension defined
* by {...@link DataHandlerReader}
*/
- public XOPEncodingStreamReader(XMLStreamReader parent, ContentIDGenerator
contentIDGenerator) {
+ public XOPEncodingStreamReader(XMLStreamReader parent, ContentIDGenerator
contentIDGenerator,
+ boolean optimizeAll) {
this.parent = parent;
this.contentIDGenerator = contentIDGenerator;
DataHandlerReader dataHandlerReader;
@@ -140,6 +146,7 @@
throw new IllegalArgumentException("The supplied XMLStreamReader
doesn't implement the DataHandlerReader extension");
}
this.dataHandlerReader = dataHandlerReader;
+ this.optimizeAll = optimizeAll;
}
/**
@@ -186,7 +193,8 @@
// Fall through
default:
int event = parent.next();
- if (event == CHARACTERS && dataHandlerReader.isBinary()) {
+ if (event == CHARACTERS && dataHandlerReader.isBinary()
+ && (optimizeAll || dataHandlerReader.isOptimized())) {
String contentID = dataHandlerReader.getContentID();
contentID =
contentIDGenerator.generateContentID(contentID);
Object dataHandlerObject = dataHandlerReader.isDeferred()
Modified:
webservices/commons/trunk/modules/axiom/modules/axiom-api/src/test/java/org/apache/axiom/om/OMTextTestBase.java
URL:
http://svn.apache.org/viewvc/webservices/commons/trunk/modules/axiom/modules/axiom-api/src/test/java/org/apache/axiom/om/OMTextTestBase.java?rev=794080&r1=794079&r2=794080&view=diff
==============================================================================
---
webservices/commons/trunk/modules/axiom/modules/axiom-api/src/test/java/org/apache/axiom/om/OMTextTestBase.java
(original)
+++
webservices/commons/trunk/modules/axiom/modules/axiom-api/src/test/java/org/apache/axiom/om/OMTextTestBase.java
Tue Jul 14 21:47:26 2009
@@ -30,6 +30,10 @@
static class TestDataHandlerProvider implements DataHandlerProvider {
private DataHandler dh;
+ public boolean isLoaded() {
+ return false;
+ }
+
public DataHandler getDataHandler() {
if (dh == null) {
dh = new DataHandler("Data", "text/plain");
Modified:
webservices/commons/trunk/modules/axiom/modules/axiom-api/src/test/java/org/apache/axiom/util/stax/xop/OMAttachmentAccessorMimePartProvider.java
URL:
http://svn.apache.org/viewvc/webservices/commons/trunk/modules/axiom/modules/axiom-api/src/test/java/org/apache/axiom/util/stax/xop/OMAttachmentAccessorMimePartProvider.java?rev=794080&r1=794079&r2=794080&view=diff
==============================================================================
---
webservices/commons/trunk/modules/axiom/modules/axiom-api/src/test/java/org/apache/axiom/util/stax/xop/OMAttachmentAccessorMimePartProvider.java
(original)
+++
webservices/commons/trunk/modules/axiom/modules/axiom-api/src/test/java/org/apache/axiom/util/stax/xop/OMAttachmentAccessorMimePartProvider.java
Tue Jul 14 21:47:26 2009
@@ -34,6 +34,11 @@
this.attachments = attachments;
}
+ public boolean isLoaded(String contentID) {
+ // TODO: probably we can only determine this for an Attachments object
+ return false;
+ }
+
public DataHandler getMimePart(String contentID) throws XMLStreamException
{
DataHandler dh = attachments.getDataHandler(contentID);
if (dh == null) {
Modified:
webservices/commons/trunk/modules/axiom/modules/axiom-api/src/test/java/org/apache/axiom/util/stax/xop/XOPEncodingStreamReaderTest.java
URL:
http://svn.apache.org/viewvc/webservices/commons/trunk/modules/axiom/modules/axiom-api/src/test/java/org/apache/axiom/util/stax/xop/XOPEncodingStreamReaderTest.java?rev=794080&r1=794079&r2=794080&view=diff
==============================================================================
---
webservices/commons/trunk/modules/axiom/modules/axiom-api/src/test/java/org/apache/axiom/util/stax/xop/XOPEncodingStreamReaderTest.java
(original)
+++
webservices/commons/trunk/modules/axiom/modules/axiom-api/src/test/java/org/apache/axiom/util/stax/xop/XOPEncodingStreamReaderTest.java
Tue Jul 14 21:47:26 2009
@@ -48,7 +48,7 @@
TestConstants.MTOM_MESSAGE_CONTENT_TYPE);
soapPartReader[i] =
StAXUtils.createXMLStreamReader(attachments[i].getSOAPPartInputStream());
}
- XMLStreamReader actual = new XOPEncodingStreamReader(new
XOPDecodingStreamReader(soapPartReader[1], new
OMAttachmentAccessorMimePartProvider(attachments[1])), contentIDGenerator);
+ XMLStreamReader actual = new XOPEncodingStreamReader(new
XOPDecodingStreamReader(soapPartReader[1], new
OMAttachmentAccessorMimePartProvider(attachments[1])), contentIDGenerator,
false);
new XMLStreamReaderComparator(soapPartReader[0], actual).compare();
}