You are viewing a plain text version of this content. The canonical link for it is here.
Posted to java-dev@axis.apache.org by sc...@apache.org on 2008/01/04 21:27:19 UTC

svn commit: r608985 [1/2] - in /webservices/axis2/trunk/java/modules/jaxws: src/org/apache/axis2/datasource/jaxb/ src/org/apache/axis2/jaxws/message/databinding/impl/ src/org/apache/axis2/jaxws/message/impl/ test/org/apache/axis2/jaxws/message/

Author: scheu
Date: Fri Jan  4 12:27:18 2008
New Revision: 608985

URL: http://svn.apache.org/viewvc?rev=608985&view=rev
Log:
AXIS2-3417
Contributor:Rich Scheuerle
Added shortcut code to the JAXWS Block implementation to get the business object
from the DataSource.  

For example, if the OMElement has a backing JAXBDataSource, then the JAXBBlock can 
retrieve the JAXB object (and JAXBContext) directly from the data source.

I also added a unit test to BlockTests.java to verify the new code.

Modified:
    webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/datasource/jaxb/JAXBDataSource.java
    webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/message/databinding/impl/JAXBBlockImpl.java
    webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/message/databinding/impl/OMBlockImpl.java
    webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/message/databinding/impl/SourceBlockImpl.java
    webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/message/databinding/impl/XMLStringBlockImpl.java
    webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/message/impl/BlockImpl.java
    webservices/axis2/trunk/java/modules/jaxws/test/org/apache/axis2/jaxws/message/BlockTests.java

Modified: webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/datasource/jaxb/JAXBDataSource.java
URL: http://svn.apache.org/viewvc/webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/datasource/jaxb/JAXBDataSource.java?rev=608985&r1=608984&r2=608985&view=diff
==============================================================================
--- webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/datasource/jaxb/JAXBDataSource.java (original)
+++ webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/datasource/jaxb/JAXBDataSource.java Fri Jan  4 12:27:18 2008
@@ -67,6 +67,10 @@
     public Object getObject() {
         return jaxb;
     }
+    
+    public JAXBDSContext getContext() {
+        return context;
+    }
 
     public XMLStreamReader getReader() throws XMLStreamException {
 

Modified: webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/message/databinding/impl/JAXBBlockImpl.java
URL: http://svn.apache.org/viewvc/webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/message/databinding/impl/JAXBBlockImpl.java?rev=608985&r1=608984&r2=608985&view=diff
==============================================================================
--- webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/message/databinding/impl/JAXBBlockImpl.java (original)
+++ webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/message/databinding/impl/JAXBBlockImpl.java Fri Jan  4 12:27:18 2008
@@ -18,10 +18,13 @@
  */
 package org.apache.axis2.jaxws.message.databinding.impl;
 
+import org.apache.axiom.om.OMDataSource;
 import org.apache.axiom.om.OMDataSourceExt;
 import org.apache.axiom.om.OMElement;
 import org.apache.axiom.om.OMException;
+import org.apache.axiom.om.OMSourcedElement;
 import org.apache.axiom.om.util.StAXUtils;
+import org.apache.axis2.datasource.XMLStringDataSource;
 import org.apache.axis2.datasource.jaxb.JAXBDSContext;
 import org.apache.axis2.datasource.jaxb.JAXBDataSource;
 import org.apache.axis2.jaxws.ExceptionFactory;
@@ -102,6 +105,28 @@
             throw ExceptionFactory.makeWebServiceException(je);
         }
         return busObject;
+    }
+    
+    @Override
+    protected Object _getBOFromOM(OMElement omElement, Object busContext)
+        throws XMLStreamException, WebServiceException {
+        
+        // Shortcut to get business object from existing data source
+        if (omElement instanceof OMSourcedElement) {
+            OMDataSource ds = ((OMSourcedElement) omElement).getDataSource();
+            if (ds instanceof JAXBDataSource) {
+                // Update the business context to use the one provided
+                // by the datasource
+                try {
+                    JAXBDSContext dsContext = ((JAXBDataSource) ds).getContext();
+                    busContext = new JAXBBlockContext(dsContext.getJAXBContext());
+                } catch (JAXBException e) {
+                    throw ExceptionFactory.makeWebServiceException(e);
+                }
+                return ((JAXBDataSource) ds).getObject();
+            }
+        }
+        return super._getBOFromOM(omElement, busContext);
     }
 
     /**

Modified: webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/message/databinding/impl/OMBlockImpl.java
URL: http://svn.apache.org/viewvc/webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/message/databinding/impl/OMBlockImpl.java?rev=608985&r1=608984&r2=608985&view=diff
==============================================================================
--- webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/message/databinding/impl/OMBlockImpl.java (original)
+++ webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/message/databinding/impl/OMBlockImpl.java Fri Jan  4 12:27:18 2008
@@ -66,6 +66,18 @@
         OMElement om = (OMElement)busObj;
         return om.getXMLStreamReader();
     }
+    
+    @Override
+    protected Object _getBOFromOM(OMElement om, Object busContext)
+        throws XMLStreamException, WebServiceException {
+        return om;
+    }
+    
+    @Override
+    protected OMElement _getOMFromBO(Object busObject, Object busContext)
+        throws XMLStreamException, WebServiceException {
+        return (OMElement) busObject;
+    }
 
     @Override
     protected void _outputFromBO(Object busObject, Object busContext, XMLStreamWriter writer)

Modified: webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/message/databinding/impl/SourceBlockImpl.java
URL: http://svn.apache.org/viewvc/webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/message/databinding/impl/SourceBlockImpl.java?rev=608985&r1=608984&r2=608985&view=diff
==============================================================================
--- webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/message/databinding/impl/SourceBlockImpl.java (original)
+++ webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/message/databinding/impl/SourceBlockImpl.java Fri Jan  4 12:27:18 2008
@@ -18,9 +18,12 @@
  */
 package org.apache.axis2.jaxws.message.databinding.impl;
 
+import org.apache.axiom.om.OMDataSource;
 import org.apache.axiom.om.OMElement;
+import org.apache.axiom.om.OMSourcedElement;
 import org.apache.axiom.om.util.StAXUtils;
 import org.apache.axiom.soap.SOAP11Constants;
+import org.apache.axis2.datasource.SourceDataSource;
 import org.apache.axis2.java.security.AccessController;
 import org.apache.axis2.jaxws.ExceptionFactory;
 import org.apache.axis2.jaxws.i18n.Messages;
@@ -157,6 +160,41 @@
         return new StreamSource(sr);
 
     }
+    
+    @Override
+    protected Object _getBOFromOM(OMElement omElement, Object busContext)
+        throws XMLStreamException, WebServiceException {
+        Object busObject;
+        
+        // Shortcut to get business object from existing data source
+        if (omElement instanceof OMSourcedElement) {
+            OMDataSource ds = ((OMSourcedElement) omElement).getDataSource();
+            if (ds instanceof SourceDataSource) {
+                return ((SourceDataSource) ds).getObject();
+            }
+        }
+        
+        // If the message is a fault, there are some special gymnastics that we have to do
+        // to get this working for all of the handler scenarios.  
+        boolean hasFault = false;
+        if ((parent != null && parent.isFault()) || 
+            omElement.getQName().getLocalPart().equals(SOAP11Constants.SOAPFAULT_LOCAL_NAME)) {
+            hasFault = true;
+        }
+        
+        // Transform reader into business object
+        if (!hasFault) {
+            busObject = super._getBOFromOM(omElement, busContext);
+        }
+        else {
+            ByteArrayOutputStream baos = new ByteArrayOutputStream();
+            omElement.serialize(baos);
+            
+            ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
+            busObject = new StreamSource(bais);
+        }
+        return busObject;
+    }
 
     @Override
     protected XMLStreamReader _getReaderFromBO(Object busObj, Object busContext)
@@ -286,56 +324,6 @@
         return cl;
     }
     
-    
-    /* (non-Javadoc)
-     * @see org.apache.axis2.jaxws.message.Block#getBusinessObject(boolean)
-     */
-    public Object getBusinessObject(boolean consume) throws XMLStreamException,
-                                                    WebServiceException {
-        if (consumed) {
-            throw ExceptionFactory.makeWebServiceException(Messages.getMessage("BlockImplErr1",
-                                                                               this.getClass()
-                                                                                   .getName()));
-        }
-        
-        if (busObject != null) {
-            busObject = _getBOFromBO(busObject, busContext, consume);
-        } else {
-            // If the message is a fault, there are some special gymnastics that we have to do
-            // to get this working for all of the handler scenarios.  
-            boolean hasFault = false;
-            if ((parent != null && parent.isFault()) || 
-                omElement.getQName().getLocalPart().equals(SOAP11Constants.SOAPFAULT_LOCAL_NAME)) {
-                hasFault = true;
-            }
-            
-            // Transform reader into business object
-            if (!hasFault) {
-                XMLStreamReader reader;
-                if (omElement.getBuilder() != null && !omElement.getBuilder().isCompleted()) {
-                    reader = omElement.getXMLStreamReaderWithoutCaching();
-                } else {
-                    reader = omElement.getXMLStreamReader();
-                }
-                busObject = _getBOFromReader(reader, busContext);    
-            }
-            else {
-                ByteArrayOutputStream baos = new ByteArrayOutputStream();
-                omElement.serialize(baos);
-                
-                ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
-                busObject = new StreamSource(bais);
-            }
-            
-            omElement = null;
-        }
-
-        // Save the businessObject in a local variable
-        // so that we can reset the Block if consume was indicated
-        Object newBusObject = busObject;
-        setConsumed(consume);
-        return newBusObject;
-    }
     
     public void close() {
         return; // Nothing to close

Modified: webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/message/databinding/impl/XMLStringBlockImpl.java
URL: http://svn.apache.org/viewvc/webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/message/databinding/impl/XMLStringBlockImpl.java?rev=608985&r1=608984&r2=608985&view=diff
==============================================================================
--- webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/message/databinding/impl/XMLStringBlockImpl.java (original)
+++ webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/message/databinding/impl/XMLStringBlockImpl.java Fri Jan  4 12:27:18 2008
@@ -18,9 +18,11 @@
  */
 package org.apache.axis2.jaxws.message.databinding.impl;
 
+import org.apache.axiom.om.OMDataSource;
 import org.apache.axiom.om.OMDataSourceExt;
 import org.apache.axiom.om.OMElement;
 import org.apache.axiom.om.OMException;
+import org.apache.axiom.om.OMSourcedElement;
 import org.apache.axiom.om.util.StAXUtils;
 import org.apache.axis2.datasource.XMLStringDataSource;
 import org.apache.axis2.jaxws.ExceptionFactory;
@@ -33,6 +35,7 @@
 import javax.xml.stream.XMLStreamException;
 import javax.xml.stream.XMLStreamReader;
 import javax.xml.stream.XMLStreamWriter;
+import javax.xml.ws.WebServiceException;
 
 import java.io.ByteArrayInputStream;
 import java.io.InputStream;
@@ -74,6 +77,20 @@
         // Create a Reader2Writer converter and get the output as a String
         Reader2Writer r2w = new Reader2Writer(reader);
         return r2w.getAsString();
+    }
+    
+    @Override
+    protected Object _getBOFromOM(OMElement omElement, Object busContext)
+        throws XMLStreamException, WebServiceException {
+        
+        // Shortcut to get business object from existing data source
+        if (omElement instanceof OMSourcedElement) {
+            OMDataSource ds = ((OMSourcedElement) omElement).getDataSource();
+            if (ds instanceof XMLStringDataSource) {
+                return ((XMLStringDataSource) ds).getObject();
+            }
+        }
+        return super._getBOFromOM(omElement, busContext);
     }
 
     protected XMLStreamReader _getReaderFromBO(Object busObj, Object busContext)

Modified: webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/message/impl/BlockImpl.java
URL: http://svn.apache.org/viewvc/webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/message/impl/BlockImpl.java?rev=608985&r1=608984&r2=608985&view=diff
==============================================================================
--- webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/message/impl/BlockImpl.java (original)
+++ webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/message/impl/BlockImpl.java Fri Jan  4 12:27:18 2008
@@ -142,13 +142,7 @@
             busObject = _getBOFromBO(busObject, busContext, consume);
         } else {
             // Transform reader into business object
-            XMLStreamReader reader;
-            if (omElement.getBuilder() != null && !omElement.getBuilder().isCompleted()) {
-                reader = omElement.getXMLStreamReaderWithoutCaching();
-            } else {
-                reader = omElement.getXMLStreamReader();
-            }
-            busObject = _getBOFromReader(reader, busContext);
+            busObject = _getBOFromOM(omElement, busContext);
             omElement = null;
         }
 
@@ -158,6 +152,7 @@
         setConsumed(consume);
         return newBusObject;
     }
+    
 
     /* (non-Javadoc)
       * @see org.apache.axis2.jaxws.message.Block#getQName()
@@ -282,13 +277,12 @@
         } else if (busObject != null) {
             // Getting the reader does not destroy the BusinessObject
             busObject = _getBOFromBO(busObject, busContext, consume);
-            XMLStreamReader newReader = _getReaderFromBO(busObject, busContext);
-            StAXOMBuilder builder = new StAXOMBuilder(newReader);
-            newOMElement = builder.getDocumentElement();
+            newOMElement = _getOMFromBO(busObject, busContext);
         }
         setConsumed(consume);
         return newOMElement;
     }
+    
 
     /* (non-Javadoc)
       * @see org.apache.axis2.jaxws.message.Block#isConsumed()
@@ -338,17 +332,7 @@
                     Messages.getMessage("BlockImplErr1", this.getClass().getName()));
         }
         if (omElement != null) {
-            if (consume) {
-                if (log.isDebugEnabled()) {
-                    log.debug("Write using OMElement.serializeAndConsume");
-                }
-                omElement.serializeAndConsume(writer);
-            } else {
-                if (log.isDebugEnabled()) {
-                    log.debug("Write Using OMElement.serialize");
-                }
-                omElement.serialize(writer);
-            }
+            _outputFromOM(omElement, writer, consume);
         } else if (busObject != null) {
             if (log.isDebugEnabled()) {
                 log.debug("Write business object");
@@ -444,6 +428,24 @@
     protected abstract Object _getBOFromReader(XMLStreamReader reader, Object busContext)
             throws XMLStreamException, WebServiceException;
 
+    
+    /**
+     * Default method for getting business object from OM.
+     * Derived classes may override this method to get the business object from a
+     * data source.
+     * 
+     * @param om
+     * @param busContext
+     * @return Business Object
+     * @throws XMLStreamException
+     * @throws WebServiceException
+     */
+    protected Object _getBOFromOM(OMElement omElement, Object busContext)
+        throws XMLStreamException, WebServiceException {
+        XMLStreamReader reader = _getReaderFromOM(omElement);
+        return _getBOFromReader(reader, busContext);
+    }
+    
     /**
      * Get an XMLStreamReader for the BusinessObject The derived Block must implement this method
      *
@@ -453,6 +455,35 @@
      */
     protected abstract XMLStreamReader _getReaderFromBO(Object busObj, Object busContext)
             throws XMLStreamException, WebServiceException;
+    
+    /**
+     * @param omElement
+     * @return XMLStreamReader
+     */
+    protected XMLStreamReader _getReaderFromOM(OMElement omElement) {
+        XMLStreamReader reader;
+        if (omElement.getBuilder() != null && !omElement.getBuilder().isCompleted()) {
+            reader = omElement.getXMLStreamReaderWithoutCaching();
+        } else {
+            reader = omElement.getXMLStreamReader();
+        }
+        return reader;
+    }
+    
+    /**
+     * @param busObject
+     * @param busContext
+     * @return OMElement
+     * @throws XMLStreamException
+     * @throws WebServiceException
+     */
+    protected OMElement _getOMFromBO(Object busObject, Object busContext)
+        throws XMLStreamException, WebServiceException {
+        // Getting the reader does not destroy the BusinessObject
+        XMLStreamReader newReader = _getReaderFromBO(busObject, busContext);
+        StAXOMBuilder builder = new StAXOMBuilder(newReader);
+        return builder.getDocumentElement();
+    }
 
     /**
      * Output Reader contents to a Writer. The default implementation is probably sufficient for most
@@ -466,6 +497,29 @@
             throws XMLStreamException {
         Reader2Writer r2w = new Reader2Writer(reader);
         r2w.outputTo(writer);
+    }
+    
+    /**
+     * Output OMElement contents to a Writer. The default implementation is probably sufficient for most
+     * derived classes.
+     *
+     * @param om
+     * @param writer
+     * @throws XMLStreamException
+     */
+    protected void _outputFromOM(OMElement omElement, XMLStreamWriter writer, boolean consume)
+            throws XMLStreamException {
+        if (consume) {
+            if (log.isDebugEnabled()) {
+                log.debug("Write using OMElement.serializeAndConsume");
+            }
+            omElement.serializeAndConsume(writer);
+        } else {
+            if (log.isDebugEnabled()) {
+                log.debug("Write Using OMElement.serialize");
+            }
+            omElement.serialize(writer);
+        }
     }
     
     /* (non-Javadoc)



---------------------------------------------------------------------
To unsubscribe, e-mail: axis-cvs-unsubscribe@ws.apache.org
For additional commands, e-mail: axis-cvs-help@ws.apache.org