You are viewing a plain text version of this content. The canonical link for it is here.
Posted to axis-cvs@ws.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