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: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]