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


Reply via email to