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 pr...@apache.org on 2008/01/15 17:22:27 UTC
svn commit: r612147 [8/17] - in /webservices/axis2/branches/java/jaxws21: ./
modules/adb-codegen/ modules/adb-codegen/src/org/apache/axis2/schema/
modules/adb-codegen/src/org/apache/axis2/schema/template/
modules/adb-codegen/src/org/apache/axis2/schema...
Modified: webservices/axis2/branches/java/jaxws21/modules/jaxws/src/org/apache/axis2/jaxws/message/databinding/impl/JAXBBlockImpl.java
URL: http://svn.apache.org/viewvc/webservices/axis2/branches/java/jaxws21/modules/jaxws/src/org/apache/axis2/jaxws/message/databinding/impl/JAXBBlockImpl.java?rev=612147&r1=612146&r2=612147&view=diff
==============================================================================
--- webservices/axis2/branches/java/jaxws21/modules/jaxws/src/org/apache/axis2/jaxws/message/databinding/impl/JAXBBlockImpl.java (original)
+++ webservices/axis2/branches/java/jaxws21/modules/jaxws/src/org/apache/axis2/jaxws/message/databinding/impl/JAXBBlockImpl.java Tue Jan 15 08:21:22 2008
@@ -18,33 +18,26 @@
*/
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.impl.MTOMXMLStreamWriter;
+import org.apache.axiom.om.OMException;
+import org.apache.axiom.om.OMSourcedElement;
import org.apache.axiom.om.util.StAXUtils;
-import org.apache.axis2.java.security.AccessController;
+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;
-import org.apache.axis2.jaxws.core.MessageContext;
import org.apache.axis2.jaxws.message.Message;
-import org.apache.axis2.jaxws.message.attachments.JAXBAttachmentMarshaller;
-import org.apache.axis2.jaxws.message.attachments.JAXBAttachmentUnmarshaller;
import org.apache.axis2.jaxws.message.databinding.JAXBBlock;
import org.apache.axis2.jaxws.message.databinding.JAXBBlockContext;
-import org.apache.axis2.jaxws.message.databinding.JAXBUtils;
-import org.apache.axis2.jaxws.message.databinding.XSDListUtils;
import org.apache.axis2.jaxws.message.factory.BlockFactory;
import org.apache.axis2.jaxws.message.impl.BlockImpl;
import org.apache.axis2.jaxws.message.util.XMLStreamWriterWithOS;
-import org.apache.axis2.jaxws.spi.Constants;
-import org.apache.axis2.jaxws.utility.XMLRootElementUtil;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
-import javax.xml.bind.JAXBElement;
import javax.xml.bind.JAXBException;
-import javax.xml.bind.JAXBIntrospector;
-import javax.xml.bind.Marshaller;
-import javax.xml.bind.Unmarshaller;
-import javax.xml.datatype.DatatypeConfigurationException;
import javax.xml.namespace.QName;
import javax.xml.stream.XMLStreamException;
import javax.xml.stream.XMLStreamReader;
@@ -54,12 +47,7 @@
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.InputStream;
-import java.io.OutputStream;
import java.io.UnsupportedEncodingException;
-import java.lang.reflect.InvocationTargetException;
-import java.lang.reflect.Method;
-import java.security.PrivilegedAction;
-import java.text.ParseException;
/**
* JAXBBlockImpl <p/> A Block containing a JAXB business object (either a JAXBElement or an object
@@ -99,63 +87,46 @@
super(omElement, busContext, qName, factory);
}
- @Override
protected Object _getBOFromReader(XMLStreamReader reader, Object busContext)
throws XMLStreamException, WebServiceException {
// Get the JAXBBlockContext. All of the necessry information is recorded on it
JAXBBlockContext ctx = (JAXBBlockContext) busContext;
- // retrieve the stored classloader if it is present
- MessageContext msgContext = getParent() != null ? getParent().getMessageContext() : null;
- ClassLoader cl = null;
- if(msgContext != null) {
- cl = (ClassLoader) msgContext.getProperty(Constants.CACHE_CLASSLOADER);
- }
try {
- // TODO Re-evaluate Unmarshall construction w/ MTOM
-
- Unmarshaller u = JAXBUtils.getJAXBUnmarshaller(ctx.getJAXBContext(cl));
-
- if (DEBUG_ENABLED) {
- log.debug("Adding JAXBAttachmentUnmarshaller to Unmarshaller");
- }
-
- Message msg = getParent();
-
- JAXBAttachmentUnmarshaller aum = new JAXBAttachmentUnmarshaller(msg);
- u.setAttachmentUnmarshaller(aum);
-
- Object jaxb = null;
-
- // Unmarshal into the business object.
- if (ctx.getProcessType() == null) {
- jaxb = unmarshalByElement(u, reader); // preferred and always used for
- // style=document
- } else {
- jaxb =
- unmarshalByType(u,
- reader,
- ctx.getProcessType(),
- ctx.isxmlList(),
- ctx.getConstructionType());
- }
-
- // Successfully unmarshalled the object
- JAXBUtils.releaseJAXBUnmarshaller(ctx.getJAXBContext(cl), u);
-
- // Don't close the reader. The reader is owned by the caller, and it
- // may contain other xml instance data (other than this JAXB object)
- // reader.close();
- return jaxb;
+ busObject = ctx.unmarshal(reader);
} catch (JAXBException je) {
if (DEBUG_ENABLED) {
try {
- log.debug("JAXBContext for unmarshal failure:" + ctx.getJAXBContext(cl));
+ log.debug("JAXBContext for unmarshal failure:" +
+ ctx.getJAXBContext(ctx.getClassLoader()));
} catch (Exception e) {
}
}
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);
}
/**
@@ -194,47 +165,13 @@
throws XMLStreamException, WebServiceException {
JAXBBlockContext ctx = (JAXBBlockContext) busContext;
- // retrieve the stored classloader if it is present
- MessageContext msgContext = getParent() != null ? getParent().getMessageContext() : null;
- ClassLoader cl = null;
- if(msgContext != null) {
- cl = (ClassLoader) msgContext.getProperty(Constants.CACHE_CLASSLOADER);
- }
try {
- // Very easy, use the Context to get the Marshaller.
- // Use the marshaller to write the object.
- Marshaller m = JAXBUtils.getJAXBMarshaller(ctx.getJAXBContext(cl));
-
-
- if (DEBUG_ENABLED) {
- log.debug("Adding JAXBAttachmentMarshaller to Marshaller");
- }
-
- Message msg = getParent();
-
- // Pool
- JAXBAttachmentMarshaller am = new JAXBAttachmentMarshaller(msg, writer);
- m.setAttachmentMarshaller(am);
-
-
- // Marshal the object
- if (ctx.getProcessType() == null) {
- marshalByElement(busObject, m, writer, !am.isXOPPackage());
- } else {
- marshalByType(busObject,
- m,
- writer,
- ctx.getProcessType(),
- ctx.isxmlList(),
- ctx.getConstructionType());
- }
-
- // Successfully marshalled the data
- JAXBUtils.releaseJAXBMarshaller(ctx.getJAXBContext(cl), m);
+ ctx.marshal(busObject, writer);
} catch (JAXBException je) {
if (DEBUG_ENABLED) {
try {
- log.debug("JAXBContext for marshal failure:" + ctx.getJAXBContext(cl));
+ log.debug("JAXBContext for marshal failure:" +
+ ctx.getJAXBContext(ctx.getClassLoader()));
} catch (Exception e) {
}
}
@@ -242,354 +179,6 @@
}
}
- /**
- * Get the QName from the jaxb object
- *
- * @param jaxb
- * @param jbc
- * @throws WebServiceException
- */
- private static QName getQName(Object jaxb, JAXBBlockContext ctx, Message msg) throws JAXBException {
-
- // retrieve the stored classloader if it is present
- MessageContext msgContext = msg != null ? msg.getMessageContext() : null;
- ClassLoader cl = null;
- if(msgContext != null) {
- cl = (ClassLoader) msgContext.getProperty(Constants.CACHE_CLASSLOADER);
- }
-
- JAXBIntrospector jbi = JAXBUtils.getJAXBIntrospector(ctx.getJAXBContext(cl));
- QName qName = jbi.getElementName(jaxb);
- JAXBUtils.releaseJAXBIntrospector(ctx.getJAXBContext(cl), jbi);
- return qName;
- }
-
- /**
- * Preferred way to marshal objects.
- *
- * @param b Object that can be rendered as an element and the element name is known by the
- * Marshaller
- * @param m Marshaller
- * @param writer XMLStreamWriter
- */
- private static void marshalByElement(final Object b, final Marshaller m,
- final XMLStreamWriter writer,
- final boolean optimize) throws WebServiceException {
- AccessController.doPrivileged(new PrivilegedAction() {
- public Object run() {
- // Marshalling directly to the output stream is faster than marshalling through the
- // XMLStreamWriter.
- // Take advantage of this optimization if there is an output stream.
- try {
- OutputStream os = (optimize) ? getOutputStream(writer) : null;
- if (os != null) {
- if (DEBUG_ENABLED) {
- log.debug("Invoking marshalByElement. " +
- "Marshaling to an OutputStream. " +
- "Object is "
- + getDebugName(b));
- }
- writer.flush();
- m.marshal(b, os);
- } else {
- if (DEBUG_ENABLED) {
- log.debug("Invoking marshalByElement. " +
- "Marshaling to an XMLStreamWriter. " +
- "Object is "
- + getDebugName(b));
- }
- m.marshal(b, writer);
- }
- } catch (Exception e) {
- throw ExceptionFactory.makeWebServiceException(e);
- }
- return null;
- }});
- }
-
- /**
- * Preferred way to unmarshal objects
- *
- * @param u Unmarshaller
- * @param reader XMLStreamReader
- * @return Object that represents an element
- * @throws WebServiceException
- */
- private static Object unmarshalByElement(final Unmarshaller u, final XMLStreamReader reader)
- throws WebServiceException {
- try {
- if (DEBUG_ENABLED) {
- log.debug("Invoking unMarshalByElement");
- }
- return AccessController.doPrivileged(new PrivilegedAction() {
- public Object run() {
- try {
- return u.unmarshal(reader);
- } catch (Exception e) {
- throw ExceptionFactory.makeWebServiceException(e);
- }
- }
- });
-
- } catch (Exception e) {
- throw ExceptionFactory.makeWebServiceException(e);
- }
- }
-
- /**
- * Marshal objects by type
- *
- * @param b Object that can be rendered as an element, but the element name is not known to the
- * schema (i.e. rpc)
- * @param m Marshaller
- * @param writer XMLStreamWriter
- * @param type
- */
- private static void marshalByType(final Object b, final Marshaller m,
- final XMLStreamWriter writer, final Class type,
- final boolean isList, final JAXBUtils.CONSTRUCTION_TYPE ctype)
- throws WebServiceException {
- AccessController.doPrivileged(new PrivilegedAction() {
- public Object run() {
- try {
-
- // NOTE
- // Example:
- // <xsd:simpleType name="LongList">
- // <xsd:list>
- // <xsd:simpleType>
- // <xsd:restriction base="xsd:unsignedInt"/>
- // </xsd:simpleType>
- // </xsd:list>
- // </xsd:simpleType>
- // <element name="myLong" nillable="true" type="impl:LongList"/>
- //
- // LongList will be represented as an int[]
- // On the wire myLong will be represented as a list of integers
- // with intervening whitespace
- // <myLong>1 2 3</myLong>
- //
- // Unfortunately, we are trying to marshal by type. Therefore
- // we want to marshal an element (foo) that is unknown to schema.
- // If we use the normal marshal code, the wire will look like
- // this (which is incorrect):
- // <foo><item>1</item><item>2</item><item>3</item></foo>
- //
- // The solution is to detect this situation and marshal the
- // String instead. Then we get the correct wire format:
- // <foo>1 2 3</foo>
- Object jbo = b;
-
- if (isList || (type != null && type.isArray())) {
- if (DEBUG_ENABLED) {
- log.debug("marshalling type which is a List or Array");
- }
- // We conver to xsdListString only if the type is not known
- // to the context. In case a jaxbcontext is created from package
- // the array types or list are not know to the context.
- if (ctype == JAXBUtils.CONSTRUCTION_TYPE.BY_CONTEXT_PATH) {
- QName qName = XMLRootElementUtil.getXmlRootElementQNameFromObject(b);
- String text = XSDListUtils.toXSDListString(getTypeEnabledObject(b));
- jbo = new JAXBElement(qName, String.class, text);
- } else if (ctype == JAXBUtils.CONSTRUCTION_TYPE.BY_CLASS_ARRAY) {
- // do nothing common array types should be know to the jaxbcontext.
- // so do not use xsdListString conversion.
- }
- }
-
- // When JAXBContext is created using a context path, it will not include Enum
- // classes.
- // These classes have @XmlEnum annotation but not @XmlType/@XmlElement, so the
- // user will see MarshallingEx, class not known to ctxt.
- //
- // This is a jax-b defect, for now this fix is in place to pass CTS. This only
- // fixes the
- // situation where the enum is the top-level object (e.g., message-part in
- // rpc-lit scenario)
- //
- // Sample of what enum looks like:
- // @XmlEnum public enum EnumString {
- // @XmlEnumValue("String1") STRING_1("String1"),
- // @XmlEnumValue("String2") STRING_2("String2");
- // ... }
- if (type.isEnum()) {
- if (b != null) {
- if (DEBUG_ENABLED) {
- log.debug("marshalByType. Marshaling " + type.getName()
- + " as Enum");
- }
- JAXBElement jbe = (JAXBElement) b;
- String value = XMLRootElementUtil.getEnumValue((Enum) jbe.getValue());
-
- jbo = new JAXBElement(jbe.getName(), String.class, value);
- }
- }
-
- if (DEBUG_ENABLED) {
- log.debug("Invoking marshalByType. " +
- "Marshaling to an XMLStreamWriter. Object is "
- + getDebugName(b));
- }
- m.marshal(jbo, writer);
-
- } catch (Exception e) {
- throw ExceptionFactory.makeWebServiceException(e);
- }
- return null;
- }
- });
- }
-
- /**
- * The root element being read is defined by schema/JAXB; however its contents are known by
- * schema/JAXB. Therefore we use unmarshal by the declared type (This method is used to
- * unmarshal rpc elements)
- *
- * @param u Unmarshaller
- * @param reader XMLStreamReader
- * @param type Class
- * @return Object
- * @throws WebServiceException
- */
- private static Object unmarshalByType(final Unmarshaller u, final XMLStreamReader reader,
- final Class type, final boolean isList,
- final JAXBUtils.CONSTRUCTION_TYPE ctype)
- throws WebServiceException {
-
- if (DEBUG_ENABLED) {
- log.debug("Invoking unmarshalByType.");
- }
-
- return AccessController.doPrivileged(new PrivilegedAction() {
- public Object run() {
- try {
- // Unfortunately RPC is type based. Thus a
- // declared type must be used to unmarshal the xml.
- Object jaxb;
-
- if (!isList) {
- // case: We are not unmarshalling an xsd:list but an Array.
-
- if (type.isArray()) {
- // If the context is created using package
- // we will not have common arrays or type array in the context
- // so let use a differet way to unmarshal this type
- if (ctype == JAXBUtils.CONSTRUCTION_TYPE.BY_CONTEXT_PATH) {
- jaxb = unmarshalAsListOrArray(reader, u, type);
- }
- // list on client array on server, Can happen only in start from java
- // case.
- else if ((ctype == JAXBUtils.CONSTRUCTION_TYPE.BY_CLASS_ARRAY)) {
- // The type could be any Object or primitive
- // I will first unmarshall the xmldata to a String[]
- // Then use the unmarshalled jaxbElement to create
- // proper type Object Array.
- jaxb = u.unmarshal(reader, String[].class);
- Object typeObj = getTypeEnabledObject(jaxb);
- // Now convert String Array in to the required Type Array.
- if (getTypeEnabledObject(typeObj) instanceof String[]) {
- String[] strArray = (String[]) typeObj;
- String strTokens = new String();
- for (String str : strArray) {
- strTokens = strTokens + " " + str;
- }
- QName qName =
- XMLRootElementUtil.
- getXmlRootElementQNameFromObject(jaxb);
- Object obj = XSDListUtils.fromXSDListString(strTokens, type);
- jaxb = new JAXBElement(qName, type, obj);
- }
- } else {
- jaxb = u.unmarshal(reader, type);
- }
-
- } else if (type.isEnum()) {
- // When JAXBContext is created using a context path, it will not
- // include Enum classes.
- // These classes have @XmlEnum annotation but not @XmlType/@XmlElement,
- // so the user will see MarshallingEx, class not known to ctxt.
- //
- // This is a jax-b defect, for now this fix is in place to pass CTS.
- // This only fixes the
- // situation where the enum is the top-level object (e.g., message-part
- // in rpc-lit scenario)
- //
- // Sample of what enum looks like:
- // @XmlEnum public enum EnumString {
- // @XmlEnumValue("String1") STRING_1("String1"),
- // @XmlEnumValue("String2") STRING_2("String2");
- //
- // public static getValue(String){} <-- resolves a "value" to an emum
- // object
- // ... }
- if (DEBUG_ENABLED) {
- log.debug("unmarshalByType. Unmarshalling " + type.getName()
- + " as Enum");
- }
-
- JAXBElement<String> enumValue = u.unmarshal(reader, String.class);
-
- if (enumValue != null) {
- Method m =
- type.getMethod("fromValue", new Class[] { String.class });
- jaxb = m.invoke(null, new Object[] { enumValue.getValue() });
- } else {
- jaxb = null;
- }
- }
- //Normal case: We are not unmarshalling a xsd:list or Array
- else {
- jaxb = u.unmarshal(reader, type);
- }
-
- } else {
- // If this is an xsd:list, we need to return the appropriate
- // list or array (see NOTE above)
- // First unmarshal as a String
- //Second convert the String into a list or array
- jaxb = unmarshalAsListOrArray(reader, u, type);
- }
- return jaxb;
- } catch (Exception e) {
- throw ExceptionFactory.makeWebServiceException(e);
- }
- }
- });
- }
-
- /**
- * convert the String into a list or array
- * @param <T>
- * @param jaxb
- * @param type
- * @return
- * @throws IllegalAccessException
- * @throws ParseException
- * @throws NoSuchMethodException
- * @throws InstantiationException
- * @throws DatatypeConfigurationException
- * @throws InvocationTargetException
- */
- private static Object unmarshalAsListOrArray(XMLStreamReader reader, Unmarshaller u,
- Class type)
- throws IllegalAccessException, ParseException,NoSuchMethodException,InstantiationException,
- DatatypeConfigurationException,InvocationTargetException,JAXBException {
- //If this is an xsd:list, we need to return the appropriate
- // list or array (see NOTE above)
- // First unmarshal as a String
- Object jaxb = u.unmarshal(reader, String.class);
- //Second convert the String into a list or array
- if (getTypeEnabledObject(jaxb) instanceof String) {
- QName qName = XMLRootElementUtil.getXmlRootElementQNameFromObject(jaxb);
- Object obj = XSDListUtils.fromXSDListString((String) getTypeEnabledObject(jaxb), type);
- return new JAXBElement(qName, type, obj);
- } else {
- return jaxb;
- }
-
- }
-
-
public boolean isElementData() {
return true;
}
@@ -625,6 +214,15 @@
public boolean isDestructiveWrite() {
return false;
}
+
+ public OMDataSourceExt copy() throws OMException {
+
+ if (DEBUG_ENABLED) {
+ log.debug("Making a copy of the JAXB object");
+ }
+ return new JAXBDataSource(this.getObject(),
+ (JAXBDSContext) this.getBusinessContext());
+ }
public byte[] getXMLBytes(String encoding) throws UnsupportedEncodingException {
try {
@@ -636,38 +234,13 @@
}
}
- /**
- * Return type enabled object
- *
- * @param obj type or element enabled object
- * @return type enabled object
- */
- static Object getTypeEnabledObject(Object obj) {
- if (obj == null) {
- return null;
- }
- if (obj instanceof JAXBElement) {
- return ((JAXBElement) obj).getValue();
+ public void setParent(Message message) {
+ if (busContext != null) {
+ ((JAXBBlockContext) busContext).setMessage(message);
}
- return obj;
+ super.setParent(message);
}
- private static String getDebugName(Object o) {
- return (o == null) ? "null" : o.getClass().getCanonicalName();
- }
+
- /**
- * If the writer is backed by an OutputStream, then return the OutputStream
- * @param writer
- * @return OutputStream or null
- */
- private static OutputStream getOutputStream(XMLStreamWriter writer) throws XMLStreamException {
- if (writer.getClass() == MTOMXMLStreamWriter.class) {
- return ((MTOMXMLStreamWriter) writer).getOutputStream();
- }
- if (writer.getClass() == XMLStreamWriterWithOS.class) {
- return ((XMLStreamWriterWithOS) writer).getOutputStream();
- }
- return null;
- }
}
Modified: webservices/axis2/branches/java/jaxws21/modules/jaxws/src/org/apache/axis2/jaxws/message/databinding/impl/OMBlockImpl.java
URL: http://svn.apache.org/viewvc/webservices/axis2/branches/java/jaxws21/modules/jaxws/src/org/apache/axis2/jaxws/message/databinding/impl/OMBlockImpl.java?rev=612147&r1=612146&r2=612147&view=diff
==============================================================================
--- webservices/axis2/branches/java/jaxws21/modules/jaxws/src/org/apache/axis2/jaxws/message/databinding/impl/OMBlockImpl.java (original)
+++ webservices/axis2/branches/java/jaxws21/modules/jaxws/src/org/apache/axis2/jaxws/message/databinding/impl/OMBlockImpl.java Tue Jan 15 08:21:22 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/branches/java/jaxws21/modules/jaxws/src/org/apache/axis2/jaxws/message/databinding/impl/SourceBlockImpl.java
URL: http://svn.apache.org/viewvc/webservices/axis2/branches/java/jaxws21/modules/jaxws/src/org/apache/axis2/jaxws/message/databinding/impl/SourceBlockImpl.java?rev=612147&r1=612146&r2=612147&view=diff
==============================================================================
--- webservices/axis2/branches/java/jaxws21/modules/jaxws/src/org/apache/axis2/jaxws/message/databinding/impl/SourceBlockImpl.java (original)
+++ webservices/axis2/branches/java/jaxws21/modules/jaxws/src/org/apache/axis2/jaxws/message/databinding/impl/SourceBlockImpl.java Tue Jan 15 08:21:22 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/branches/java/jaxws21/modules/jaxws/src/org/apache/axis2/jaxws/message/databinding/impl/XMLStringBlockImpl.java
URL: http://svn.apache.org/viewvc/webservices/axis2/branches/java/jaxws21/modules/jaxws/src/org/apache/axis2/jaxws/message/databinding/impl/XMLStringBlockImpl.java?rev=612147&r1=612146&r2=612147&view=diff
==============================================================================
--- webservices/axis2/branches/java/jaxws21/modules/jaxws/src/org/apache/axis2/jaxws/message/databinding/impl/XMLStringBlockImpl.java (original)
+++ webservices/axis2/branches/java/jaxws21/modules/jaxws/src/org/apache/axis2/jaxws/message/databinding/impl/XMLStringBlockImpl.java Tue Jan 15 08:21:22 2008
@@ -18,8 +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.jaxws.ExceptionFactory;
import org.apache.axis2.jaxws.message.databinding.XMLStringBlock;
import org.apache.axis2.jaxws.message.factory.BlockFactory;
@@ -30,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;
@@ -66,15 +72,27 @@
super(omElement, null, qName, factory);
}
- @Override
protected Object _getBOFromReader(XMLStreamReader reader, Object busContext)
throws XMLStreamException {
// 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)
throws XMLStreamException {
// Create an XMLStreamReader from the inputFactory using the String as the sources
@@ -83,7 +101,6 @@
return StAXUtils.createXMLStreamReader(sr);
}
- @Override
protected void _outputFromBO(Object busObject, Object busContext, XMLStreamWriter writer)
throws XMLStreamException {
// There is no fast way to output the String to a writer, so get the reader
@@ -124,6 +141,10 @@
public boolean isDestructiveWrite() {
return false;
+ }
+
+ public OMDataSourceExt copy() throws OMException {
+ return new XMLStringDataSource((String) getObject());
}
Modified: webservices/axis2/branches/java/jaxws21/modules/jaxws/src/org/apache/axis2/jaxws/message/impl/BlockImpl.java
URL: http://svn.apache.org/viewvc/webservices/axis2/branches/java/jaxws21/modules/jaxws/src/org/apache/axis2/jaxws/message/impl/BlockImpl.java?rev=612147&r1=612146&r2=612147&view=diff
==============================================================================
--- webservices/axis2/branches/java/jaxws21/modules/jaxws/src/org/apache/axis2/jaxws/message/impl/BlockImpl.java (original)
+++ webservices/axis2/branches/java/jaxws21/modules/jaxws/src/org/apache/axis2/jaxws/message/impl/BlockImpl.java Tue Jan 15 08:21:22 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)
Modified: webservices/axis2/branches/java/jaxws21/modules/jaxws/src/org/apache/axis2/jaxws/message/impl/XMLPartBase.java
URL: http://svn.apache.org/viewvc/webservices/axis2/branches/java/jaxws21/modules/jaxws/src/org/apache/axis2/jaxws/message/impl/XMLPartBase.java?rev=612147&r1=612146&r2=612147&view=diff
==============================================================================
--- webservices/axis2/branches/java/jaxws21/modules/jaxws/src/org/apache/axis2/jaxws/message/impl/XMLPartBase.java (original)
+++ webservices/axis2/branches/java/jaxws21/modules/jaxws/src/org/apache/axis2/jaxws/message/impl/XMLPartBase.java Tue Jan 15 08:21:22 2008
@@ -152,8 +152,9 @@
// Okay
} else
if (qName.getNamespaceURI().equals(SOAP12Constants.SOAP_ENVELOPE_NAMESPACE_URI)) {
- throw ExceptionFactory.
- makeWebServiceException(Messages.getMessage("restWithSOAPErr"));
+ // throw ExceptionFactory.
+ // makeWebServiceException(Messages.getMessage("restWithSOAPErr"));
+ // Okey
} else {
content = _createSpine(Protocol.rest, Style.DOCUMENT, 0, root);
contentType = SPINE;
Modified: webservices/axis2/branches/java/jaxws21/modules/jaxws/src/org/apache/axis2/jaxws/registry/FactoryRegistry.java
URL: http://svn.apache.org/viewvc/webservices/axis2/branches/java/jaxws21/modules/jaxws/src/org/apache/axis2/jaxws/registry/FactoryRegistry.java?rev=612147&r1=612146&r2=612147&view=diff
==============================================================================
--- webservices/axis2/branches/java/jaxws21/modules/jaxws/src/org/apache/axis2/jaxws/registry/FactoryRegistry.java (original)
+++ webservices/axis2/branches/java/jaxws21/modules/jaxws/src/org/apache/axis2/jaxws/registry/FactoryRegistry.java Tue Jan 15 08:21:22 2008
@@ -45,20 +45,45 @@
import org.apache.axis2.jaxws.server.ServiceInstanceFactoryImpl;
import org.apache.axis2.jaxws.server.dispatcher.factory.EndpointDispatcherFactory;
import org.apache.axis2.jaxws.server.dispatcher.factory.EndpointDispatcherFactoryImpl;
+import org.apache.axis2.jaxws.server.endpoint.injection.WebServiceContextInjector;
+import org.apache.axis2.jaxws.server.endpoint.injection.impl.WebServiceContextInjectorImpl;
import org.apache.axis2.jaxws.server.endpoint.lifecycle.factory.EndpointLifecycleManagerFactory;
+import org.apache.axis2.jaxws.server.endpoint.lifecycle.factory.impl.EndpointLifecycleManagerFactoryImpl;
import org.apache.axis2.jaxws.utility.ExecutorFactory;
import org.apache.axis2.jaxws.utility.JAXWSExecutorFactory;
-import java.util.Hashtable;
+import java.util.HashMap;
import java.util.Map;
-/** FactoryRegistry Registry containing Factories related to the JAX-WS Implementation */
-public class FactoryRegistry {
+import javax.xml.ws.WebServiceContext;
- private final static Map<Class, Object> table;
+/**
+ * FactoryRegistry Registry containing Factories related to the JAX-WS Implementation.
+ * The expected scenario is:
+ * 1) Most or all of the factories are registered during startup.
+ * 2) There are a large number of getFactory calls
+ * 3) There may be an infrequent call to setFactory.
+ *
+ * Thus a "copy on put" approach is used. This ensures that the "gets" are
+ * fast (because they are unsynchronized). The "puts" are slower because they
+ * create a new copy of the HashMap.
+ * See http://www.ibm.com/developerworks/java/library/j-hashmap.html
+ **/
+public class FactoryRegistry {
+ private static volatile Map<Class, Object> table;
+ private static Object lockbox = new Object();
+
static {
- table = new Hashtable<Class, Object>();
+ init();
+ }
+
+ private static final void init() {
+
+ // An unsynchronized Map is used to ensure that gets are fast.
+ table = new HashMap<Class, Object>();
+
+ // Load Factories
table.put(XMLStringBlockFactory.class, new XMLStringBlockFactoryImpl());
table.put(EndpointDispatcherFactory.class, new EndpointDispatcherFactoryImpl());
table.put(JAXBBlockFactory.class, new JAXBBlockFactoryImpl());
@@ -68,13 +93,22 @@
table.put(MessageFactory.class, new MessageFactoryImpl());
table.put(XMLPartFactory.class, new XMLPartFactoryImpl());
table.put(SAAJConverterFactory.class, new SAAJConverterFactoryImpl());
- table.put(EndpointLifecycleManagerFactory.class, new EndpointLifecycleManagerFactory());
+ table.put(EndpointLifecycleManagerFactory.class, new EndpointLifecycleManagerFactoryImpl());
table.put(HandlerLifecycleManagerFactory.class, new HandlerLifecycleManagerFactory());
table.put(ClassFinderFactory.class, new ClassFinderFactory());
table.put(JAXWSEndpointReferenceFactory.class, new JAXWSEndpointReferenceFactoryImpl());
table.put(Axis2EndpointReferenceFactory.class, new Axis2EndpointReferenceFactoryImpl());
table.put(ExecutorFactory.class, new JAXWSExecutorFactory());
table.put(ServiceInstanceFactory.class, new ServiceInstanceFactoryImpl());
+
+ // register the implementation responsible for both WebServiceContext
+ // injection and the updating of the WebServiceContext instances that
+ // have already been injected, we will register these by two different
+ // classes because it is possible that the implementation is in different
+ // classes
+ WebServiceContextInjectorImpl wsciImpl = new WebServiceContextInjectorImpl();
+ table.put(WebServiceContext.class, wsciImpl);
+ table.put(WebServiceContextInjector.class, wsciImpl);
}
/** FactoryRegistry is currently a static singleton */
@@ -82,21 +116,26 @@
}
/**
- * getFactory
- *
+ * Get the factory. This may be called frequently.
* @param intface of the Factory
* @return Object that is the factory implementation for the intface
*/
public static Object getFactory(Class intface) {
- return table.get(intface);
+ Map m = table;
+ return m.get(intface);
}
/**
- * setFactory
+ * Add the factory. This should be called infrequently.
* @param intface
* @param factoryObject
*/
public static void setFactory(Class intface, Object factoryObject) {
- table.put(intface, factoryObject);
+ synchronized(lockbox) {
+ // Use copy and put approach to ensure that "get" speed is fast.
+ Map<Class, Object> newMap = new HashMap<Class, Object>(table);
+ newMap.put(intface, factoryObject);
+ table = newMap;
+ }
}
}
Modified: webservices/axis2/branches/java/jaxws21/modules/jaxws/src/org/apache/axis2/jaxws/server/EndpointController.java
URL: http://svn.apache.org/viewvc/webservices/axis2/branches/java/jaxws21/modules/jaxws/src/org/apache/axis2/jaxws/server/EndpointController.java?rev=612147&r1=612146&r2=612147&view=diff
==============================================================================
--- webservices/axis2/branches/java/jaxws21/modules/jaxws/src/org/apache/axis2/jaxws/server/EndpointController.java (original)
+++ webservices/axis2/branches/java/jaxws21/modules/jaxws/src/org/apache/axis2/jaxws/server/EndpointController.java Tue Jan 15 08:21:22 2008
@@ -199,12 +199,13 @@
eic.setHandlers(new HandlerResolverImpl(endpointDesc.getServiceDescription()).getHandlerChain(endpointDesc.getPortInfo()));
}
- if (!Utils.bindingTypesMatch(request, endpointDesc.getServiceDescription())) {
- Protocol protocol = request.getMessage().getProtocol();
- MessageContext faultContext = Utils.createVersionMismatchMessage(request, protocol);
- eic.setResponseMessageContext(faultContext);
- return false;
- }
+ //Not needed since this is already handled when eic reaches this level
+ //if (!Utils.bindingTypesMatch(request, endpointDesc.getServiceDescription())) {
+ // Protocol protocol = request.getMessage().getProtocol();
+ // MessageContext faultContext = Utils.createVersionMismatchMessage(request, protocol);
+ // eic.setResponseMessageContext(faultContext);
+ // return false;
+ //}
MessageContext responseMsgContext = null;
Modified: webservices/axis2/branches/java/jaxws21/modules/jaxws/src/org/apache/axis2/jaxws/server/JAXWSMessageReceiver.java
URL: http://svn.apache.org/viewvc/webservices/axis2/branches/java/jaxws21/modules/jaxws/src/org/apache/axis2/jaxws/server/JAXWSMessageReceiver.java?rev=612147&r1=612146&r2=612147&view=diff
==============================================================================
--- webservices/axis2/branches/java/jaxws21/modules/jaxws/src/org/apache/axis2/jaxws/server/JAXWSMessageReceiver.java (original)
+++ webservices/axis2/branches/java/jaxws21/modules/jaxws/src/org/apache/axis2/jaxws/server/JAXWSMessageReceiver.java Tue Jan 15 08:21:22 2008
@@ -19,6 +19,9 @@
package org.apache.axis2.jaxws.server;
+import javax.xml.ws.Binding;
+import javax.xml.ws.WebServiceException;
+
import org.apache.axis2.AxisFault;
import org.apache.axis2.addressing.AddressingConstants;
import org.apache.axis2.context.OperationContext;
@@ -43,9 +46,6 @@
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
-import javax.xml.ws.Binding;
-import javax.xml.ws.WebServiceException;
-
/**
* The JAXWSMessageReceiver is the entry point, from the server's perspective, to the JAX-WS code.
* This will be called by the Axis Engine and is the end of the chain from an Axis2 perspective.
@@ -80,8 +80,8 @@
org.apache.axis2.description.Parameter svcClassParam =
service.getParameter(PARAM_SERVICE_CLASS);
-
try {
+
if (svcClassParam == null) {
throw new RuntimeException(
Messages.getMessage("JAXWSMessageReceiverNoServiceClass"));
Modified: webservices/axis2/branches/java/jaxws21/modules/jaxws/src/org/apache/axis2/jaxws/server/dispatcher/JavaBeanDispatcher.java
URL: http://svn.apache.org/viewvc/webservices/axis2/branches/java/jaxws21/modules/jaxws/src/org/apache/axis2/jaxws/server/dispatcher/JavaBeanDispatcher.java?rev=612147&r1=612146&r2=612147&view=diff
==============================================================================
--- webservices/axis2/branches/java/jaxws21/modules/jaxws/src/org/apache/axis2/jaxws/server/dispatcher/JavaBeanDispatcher.java (original)
+++ webservices/axis2/branches/java/jaxws21/modules/jaxws/src/org/apache/axis2/jaxws/server/dispatcher/JavaBeanDispatcher.java Tue Jan 15 08:21:22 2008
@@ -19,7 +19,9 @@
package org.apache.axis2.jaxws.server.dispatcher;
+import org.apache.axis2.AxisFault;
import org.apache.axis2.jaxws.ExceptionFactory;
+import org.apache.axis2.jaxws.binding.BindingUtils;
import org.apache.axis2.jaxws.context.utils.ContextUtils;
import org.apache.axis2.jaxws.core.MessageContext;
import org.apache.axis2.jaxws.core.util.MessageContextUtils;
@@ -41,8 +43,6 @@
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
-import javax.xml.ws.soap.SOAPBinding;
-import org.apache.axis2.AxisFault;
import java.lang.reflect.Method;
import java.util.concurrent.Executor;
import java.util.concurrent.FutureTask;
@@ -216,9 +216,8 @@
endpointDesc = mc.getEndpointDescription();
String bindingType = endpointDesc.getBindingType();
if (bindingType != null) {
- if (bindingType.equals(SOAPBinding.SOAP11HTTP_MTOM_BINDING)
- || bindingType.equals(SOAPBinding.SOAP12HTTP_MTOM_BINDING)) {
- mc.getMessage().setMTOMEnabled(true);
+ if (BindingUtils.isMTOMBinding(bindingType)) {
+ mc.getMessage().setMTOMEnabled(true);
}
}
@@ -311,8 +310,7 @@
String bindingType = epDesc.getBindingType();
if (bindingType != null) {
- if (bindingType.equals(SOAPBinding.SOAP11HTTP_MTOM_BINDING) ||
- bindingType.equals(SOAPBinding.SOAP12HTTP_MTOM_BINDING)) {
+ if (BindingUtils.isMTOMBinding(bindingType)) {
if (log.isDebugEnabled()) {
log.debug("MTOM enabled for the response message.");
}
Modified: webservices/axis2/branches/java/jaxws21/modules/jaxws/src/org/apache/axis2/jaxws/server/dispatcher/ProviderDispatcher.java
URL: http://svn.apache.org/viewvc/webservices/axis2/branches/java/jaxws21/modules/jaxws/src/org/apache/axis2/jaxws/server/dispatcher/ProviderDispatcher.java?rev=612147&r1=612146&r2=612147&view=diff
==============================================================================
--- webservices/axis2/branches/java/jaxws21/modules/jaxws/src/org/apache/axis2/jaxws/server/dispatcher/ProviderDispatcher.java (original)
+++ webservices/axis2/branches/java/jaxws21/modules/jaxws/src/org/apache/axis2/jaxws/server/dispatcher/ProviderDispatcher.java Tue Jan 15 08:21:22 2008
@@ -19,6 +19,7 @@
package org.apache.axis2.jaxws.server.dispatcher;
import org.apache.axis2.jaxws.ExceptionFactory;
+import org.apache.axis2.jaxws.binding.BindingUtils;
import org.apache.axis2.jaxws.context.utils.ContextUtils;
import org.apache.axis2.jaxws.core.MessageContext;
import org.apache.axis2.jaxws.core.util.MessageContextUtils;
@@ -52,7 +53,6 @@
import javax.xml.ws.Provider;
import javax.xml.ws.Service;
import javax.xml.ws.WebServiceException;
-import javax.xml.ws.soap.SOAPBinding;
import java.lang.reflect.Method;
import java.lang.reflect.ParameterizedType;
@@ -261,10 +261,9 @@
// Enable MTOM if indicated by the binding
String bindingType = endpointDesc.getBindingType();
if (bindingType != null) {
- if (bindingType.equals(SOAPBinding.SOAP11HTTP_MTOM_BINDING) ||
- bindingType.equals(SOAPBinding.SOAP12HTTP_MTOM_BINDING)) {
- message.setMTOMEnabled(true);
- }
+ if (BindingUtils.isMTOMBinding(bindingType)) {
+ message.setMTOMEnabled(true);
+ }
}
// Save off the protocol info so we can use it when creating the response message.
@@ -343,10 +342,9 @@
// Enable MTOM if indicated by the binding
String bindingType = endpointDesc.getBindingType();
if (bindingType != null) {
- if (bindingType.equals(SOAPBinding.SOAP11HTTP_MTOM_BINDING)
- || bindingType.equals(SOAPBinding.SOAP12HTTP_MTOM_BINDING)) {
- m.setMTOMEnabled(true);
- }
+ if (BindingUtils.isMTOMBinding(bindingType)) {
+ m.setMTOMEnabled(true);
+ }
}
response = MessageContextUtils.createResponseMessageContext(request);
@@ -608,23 +606,22 @@
}
private void initialize(MessageContext mc) {
-
+
mc.setOperationName(mc.getAxisMessageContext().getAxisOperation().getName());
endpointDesc = mc.getEndpointDescription();
String bindingType = endpointDesc.getBindingType();
if (bindingType != null) {
- if (bindingType.equals(SOAPBinding.SOAP11HTTP_MTOM_BINDING)
- || bindingType.equals(SOAPBinding.SOAP12HTTP_MTOM_BINDING)) {
+ if (BindingUtils.isMTOMBinding(bindingType)) {
mc.getMessage().setMTOMEnabled(true);
}
}
-
+
//Set SOAP Operation Related properties in SOAPMessageContext.
- ContextUtils.addWSDLProperties_provider(mc);
- }
+ ContextUtils.addWSDLProperties_provider(mc);
+ }
}
Modified: webservices/axis2/branches/java/jaxws21/modules/jaxws/src/org/apache/axis2/jaxws/server/endpoint/Utils.java
URL: http://svn.apache.org/viewvc/webservices/axis2/branches/java/jaxws21/modules/jaxws/src/org/apache/axis2/jaxws/server/endpoint/Utils.java?rev=612147&r1=612146&r2=612147&view=diff
==============================================================================
--- webservices/axis2/branches/java/jaxws21/modules/jaxws/src/org/apache/axis2/jaxws/server/endpoint/Utils.java (original)
+++ webservices/axis2/branches/java/jaxws21/modules/jaxws/src/org/apache/axis2/jaxws/server/endpoint/Utils.java Tue Jan 15 08:21:22 2008
@@ -20,7 +20,7 @@
package org.apache.axis2.jaxws.server.endpoint;
import org.apache.axis2.jaxws.ExceptionFactory;
-import org.apache.axis2.jaxws.binding.SOAPBinding;
+import org.apache.axis2.jaxws.binding.BindingUtils;
import org.apache.axis2.jaxws.core.MessageContext;
import org.apache.axis2.jaxws.core.util.MessageContextUtils;
import org.apache.axis2.jaxws.description.EndpointDescription;
@@ -75,12 +75,10 @@
log.debug(" binding type: " + bindingType);
}
- if (protocol.equals(Protocol.soap11)) {
- return (SOAPBinding.SOAP11HTTP_BINDING.equalsIgnoreCase(bindingType)) ||
- (SOAPBinding.SOAP11HTTP_MTOM_BINDING.equalsIgnoreCase(bindingType));
+ if (protocol.equals(Protocol.soap11)) {
+ return (BindingUtils.isSOAP11Binding(bindingType));
} else if (protocol.equals(Protocol.soap12)) {
- return (SOAPBinding.SOAP12HTTP_BINDING.equalsIgnoreCase(bindingType)) ||
- (SOAPBinding.SOAP12HTTP_MTOM_BINDING.equalsIgnoreCase(bindingType));
+ return (BindingUtils.isSOAP12Binding(bindingType));
} else if (protocol.equals(Protocol.rest)) {
return HTTPBinding.HTTP_BINDING.equalsIgnoreCase(bindingType);
}
Modified: webservices/axis2/branches/java/jaxws21/modules/jaxws/src/org/apache/axis2/jaxws/server/endpoint/injection/factory/ResourceInjectionFactory.java
URL: http://svn.apache.org/viewvc/webservices/axis2/branches/java/jaxws21/modules/jaxws/src/org/apache/axis2/jaxws/server/endpoint/injection/factory/ResourceInjectionFactory.java?rev=612147&r1=612146&r2=612147&view=diff
==============================================================================
--- webservices/axis2/branches/java/jaxws21/modules/jaxws/src/org/apache/axis2/jaxws/server/endpoint/injection/factory/ResourceInjectionFactory.java (original)
+++ webservices/axis2/branches/java/jaxws21/modules/jaxws/src/org/apache/axis2/jaxws/server/endpoint/injection/factory/ResourceInjectionFactory.java Tue Jan 15 08:21:22 2008
@@ -22,9 +22,15 @@
import org.apache.axis2.jaxws.i18n.Messages;
import org.apache.axis2.jaxws.injection.ResourceInjectionException;
+import org.apache.axis2.jaxws.registry.FactoryRegistry;
import org.apache.axis2.jaxws.server.endpoint.injection.ResourceInjector;
import org.apache.axis2.jaxws.server.endpoint.injection.impl.WebServiceContextInjectorImpl;
+/**
+ * This class is is responsible for creating instances that can
+ * handle resource injection.
+ *
+ */
public class ResourceInjectionFactory {
/**
@@ -35,12 +41,25 @@
// TODO Auto-generated constructor stub
}
+ /**
+ * This method retrieves the appropriate ResourceInjector instance
+ * based on the type that is supplied.
+ *
+ */
public static ResourceInjector createResourceInjector(Class resourceType)
- throws ResourceInjectionException {
- if (resourceType == WebServiceContext.class ||
- resourceType.isAssignableFrom(WebServiceContext.class)) {
- return new WebServiceContextInjectorImpl();
+ throws ResourceInjectionException {
+ Object obj = FactoryRegistry.getFactory(resourceType);
+ ResourceInjector injector = null;
+
+ // make sure we have a ResourceInjector instance
+ if (obj instanceof ResourceInjector) {
+ injector = (ResourceInjector) obj;
}
- throw new ResourceInjectionException(Messages.getMessage("ResourceInjectionFactoryErr1"));
+
+ if (injector == null) {
+ throw new ResourceInjectionException(Messages.getMessage("ResourceInjectionFactoryErr1"));
+ }
+
+ return injector;
}
}
Modified: webservices/axis2/branches/java/jaxws21/modules/jaxws/src/org/apache/axis2/jaxws/server/endpoint/lifecycle/factory/EndpointLifecycleManagerFactory.java
URL: http://svn.apache.org/viewvc/webservices/axis2/branches/java/jaxws21/modules/jaxws/src/org/apache/axis2/jaxws/server/endpoint/lifecycle/factory/EndpointLifecycleManagerFactory.java?rev=612147&r1=612146&r2=612147&view=diff
==============================================================================
--- webservices/axis2/branches/java/jaxws21/modules/jaxws/src/org/apache/axis2/jaxws/server/endpoint/lifecycle/factory/EndpointLifecycleManagerFactory.java (original)
+++ webservices/axis2/branches/java/jaxws21/modules/jaxws/src/org/apache/axis2/jaxws/server/endpoint/lifecycle/factory/EndpointLifecycleManagerFactory.java Tue Jan 15 08:21:22 2008
@@ -18,28 +18,13 @@
*/
package org.apache.axis2.jaxws.server.endpoint.lifecycle.factory;
-import org.apache.axis2.jaxws.i18n.Messages;
import org.apache.axis2.jaxws.server.endpoint.lifecycle.EndpointLifecycleException;
import org.apache.axis2.jaxws.server.endpoint.lifecycle.EndpointLifecycleManager;
-import org.apache.axis2.jaxws.server.endpoint.lifecycle.impl.EndpointLifecycleManagerImpl;
-public class EndpointLifecycleManagerFactory {
-
- public EndpointLifecycleManagerFactory() {
- super();
- }
+public interface EndpointLifecycleManagerFactory {
public EndpointLifecycleManager createEndpointLifecycleManager(Object endpointInstance)
- throws EndpointLifecycleException {
- if (endpointInstance == null) {
- throw new EndpointLifecycleException(
- Messages.getMessage("EndpointLifecycleManagerImplErr1"));
- }
- return new EndpointLifecycleManagerImpl(endpointInstance);
- }
-
- public EndpointLifecycleManager createEndpointLifecycleManager() {
+ throws EndpointLifecycleException;
- return new EndpointLifecycleManagerImpl();
- }
+ public EndpointLifecycleManager createEndpointLifecycleManager();
}
Modified: webservices/axis2/branches/java/jaxws21/modules/jaxws/src/org/apache/axis2/jaxws/server/endpoint/lifecycle/impl/EndpointLifecycleManagerImpl.java
URL: http://svn.apache.org/viewvc/webservices/axis2/branches/java/jaxws21/modules/jaxws/src/org/apache/axis2/jaxws/server/endpoint/lifecycle/impl/EndpointLifecycleManagerImpl.java?rev=612147&r1=612146&r2=612147&view=diff
==============================================================================
--- webservices/axis2/branches/java/jaxws21/modules/jaxws/src/org/apache/axis2/jaxws/server/endpoint/lifecycle/impl/EndpointLifecycleManagerImpl.java (original)
+++ webservices/axis2/branches/java/jaxws21/modules/jaxws/src/org/apache/axis2/jaxws/server/endpoint/lifecycle/impl/EndpointLifecycleManagerImpl.java Tue Jan 15 08:21:22 2008
@@ -47,11 +47,12 @@
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
-public class EndpointLifecycleManagerImpl extends BaseLifecycleManager implements EndpointLifecycleManager {
+public class EndpointLifecycleManagerImpl extends BaseLifecycleManager implements
+ EndpointLifecycleManager {
public static final String WEBSERVICE_MESSAGE_CONTEXT = "javax.xml.ws.WebServiceContext";
private static final Log log = LogFactory.getLog(EndpointLifecycleManagerImpl.class);
- public EndpointLifecycleManagerImpl(Object endpointInstance) {
+ public EndpointLifecycleManagerImpl(Object endpointInstance) {
this.instance = endpointInstance;
}
@@ -62,22 +63,18 @@
* @see org.apache.axis2.jaxws.server.endpoint.lifecycle.EndpointLifecycleManager#createServiceInstance(org.apache.axis2.jaxws.core.MessageContext, java.lang.Class)
*/
public Object createServiceInstance(MessageContext mc, Class serviceImplClass)
- throws LifecycleException, ResourceInjectionException {
+ throws LifecycleException,
+ ResourceInjectionException {
org.apache.axis2.context.MessageContext msgContext = mc.getAxisMessageContext();
// Get the ServiceDescription and injectionDesc which contain
// cached information
ServiceDescription serviceDesc = mc.getEndpointDescription().getServiceDescription();
- ResourceInjectionServiceRuntimeDescription injectionDesc = null;
- if (serviceDesc != null) {
- injectionDesc =
- ResourceInjectionServiceRuntimeDescriptionFactory
- .get(serviceDesc, serviceImplClass);
- }
+ ResourceInjectionServiceRuntimeDescription injectionDesc =
+ getInjectionDesc(serviceDesc, serviceImplClass);
+
- // See if there is an existing service object
- ServiceContext serviceContext = msgContext.getServiceContext();
- Object serviceimpl = serviceContext.getProperty(ServiceContext.SERVICE_OBJECT);
+ Object serviceimpl = retrieveServiceInstance(mc);
if (serviceimpl != null) {
this.instance = serviceimpl;
@@ -87,16 +84,8 @@
// If resource injection is needed, create the SOAPMessageContext and update the WebServiceContext
// Create MessageContext for current invocation.
- if (injectionDesc != null && injectionDesc.hasResourceAnnotation()) {
- javax.xml.ws.handler.MessageContext soapMessageContext =
- createSOAPMessageContext(mc);
- //Get WebServiceContext from ServiceContext
- WebServiceContext ws =
- (WebServiceContext)serviceContext.getProperty(WEBSERVICE_MESSAGE_CONTEXT);
- //Add the MessageContext for current invocation
- if (ws != null) {
- updateWebServiceContext(ws, soapMessageContext);
- }
+ if (hasResourceAnnotation(injectionDesc)) {
+ performWebServiceContextUpdate(mc);
}
//since service impl is there in service context , take that from there
@@ -112,35 +101,118 @@
// If resource injection is needed, create the SOAPMessageContext and build the WebServiceContext
// Create MessageContext for current invocation.
- if (injectionDesc != null && injectionDesc.hasResourceAnnotation()) {
- javax.xml.ws.handler.MessageContext soapMessageContext =
- createSOAPMessageContext(mc);
- // Create WebServiceContext
- WebServiceContextImpl wsContext = new WebServiceContextImpl();
- //Add MessageContext for this request.
- wsContext.setSoapMessageContext(soapMessageContext);
- // Inject WebServiceContext
- injectWebServiceContext(mc, wsContext, serviceimpl);
- serviceContext.setProperty(WEBSERVICE_MESSAGE_CONTEXT, wsContext);
+ if (hasResourceAnnotation(injectionDesc)) {
+ performWebServiceContextInjection(mc, serviceimpl);
}
+
//Invoke PostConstruct
if (injectionDesc != null && injectionDesc.getPostConstructMethod() != null) {
invokePostConstruct(injectionDesc.getPostConstructMethod());
}
+ ServiceContext serviceContext = msgContext.getServiceContext();
serviceContext.setProperty(ServiceContext.SERVICE_OBJECT, serviceimpl);
return serviceimpl;
}
}
+ /**
+ * This method locates an existing service implementation instance if
+ * one has been previously stored away.
+ */
+ protected Object retrieveServiceInstance(MessageContext mc) {
+ Object instance = null;
+ ServiceContext serviceContext = mc.getAxisMessageContext().getServiceContext();
+ instance = serviceContext.getProperty(ServiceContext.SERVICE_OBJECT);
+ return instance;
+ }
+
+ /**
+ * This method will provide the necessary function in order to inject
+ * a WebServiceContext instance on a member of the service implementation class.
+ */
+ protected void performWebServiceContextInjection(MessageContext mc, Object serviceImpl)
+ throws ResourceInjectionException {
+ WebServiceContext wsContext = createWebServiceContext(mc);
+ // Inject WebServiceContext
+ injectWebServiceContext(mc, wsContext, serviceImpl);
+ saveWebServiceContext(mc, wsContext);
+ }
+
+ /**
+ * This method will provide the necessary function in order to update
+ * an existing WebServiceContext instance with a MessageContext for
+ * the current request.
+ */
+ protected void performWebServiceContextUpdate(MessageContext mc)
+ throws ResourceInjectionException {
+ javax.xml.ws.handler.MessageContext soapMessageContext = createSOAPMessageContext(mc);
+ ServiceContext serviceContext = mc.getAxisMessageContext().getServiceContext();
+
+ //Get WebServiceContext from ServiceContext
+ WebServiceContext ws =
+ (WebServiceContext) serviceContext.getProperty(WEBSERVICE_MESSAGE_CONTEXT);
+
+ //Add the MessageContext for current invocation
+ if (ws != null) {
+ updateWebServiceContext(ws, soapMessageContext);
+ }
+ }
+
+ /**
+ * This method will provide the function necessary to save the WebServiceContext
+ * associated with the endpoint.
+ */
+ protected void saveWebServiceContext(MessageContext mc, WebServiceContext wsContext) {
+ ServiceContext sc = mc.getAxisMessageContext().getServiceContext();
+ sc.setProperty(WEBSERVICE_MESSAGE_CONTEXT, wsContext);
+ }
+
+ /**
+ * This method will be responsible for creating an instance of a WebServiceContext
+ * and initializing the instance with a MessageContext.
+ */
+ protected WebServiceContext createWebServiceContext(MessageContext mc) {
+ javax.xml.ws.handler.MessageContext soapMessageContext = createSOAPMessageContext(mc);
+ // Create WebServiceContext
+ WebServiceContextImpl wsContext = new WebServiceContextImpl();
+ //Add MessageContext for this request.
+ wsContext.setSoapMessageContext(soapMessageContext);
+ return wsContext;
+ }
+
+ /**
+ * This method will retrieve a ResourceInjectionServiceRuntimeDescription if one
+ * is associated with the current ServiceDescription.
+ */
+ protected ResourceInjectionServiceRuntimeDescription getInjectionDesc(
+ ServiceDescription serviceDesc,
+ Class serviceImplClass) {
+ ResourceInjectionServiceRuntimeDescription injectionDesc = null;
+ if (serviceDesc != null) {
+ injectionDesc =
+ ResourceInjectionServiceRuntimeDescriptionFactory.get(serviceDesc,
+ serviceImplClass);
+ }
+
+ return injectionDesc;
+ }
+
+ /**
+ * This method indicates whether or not we need to perform WebServiceContext injection
+ * on a field within our endpoint instance.
+ */
+ protected boolean hasResourceAnnotation(ResourceInjectionServiceRuntimeDescription injectionDesc) {
+ return (injectionDesc != null && injectionDesc.hasResourceAnnotation());
+ }
+
private Object createServiceInstance(AxisService service, Class serviceImplClass) {
if (log.isDebugEnabled()) {
log.debug("Creating new instance of service endpoint");
}
if (serviceImplClass == null) {
- throw ExceptionFactory.makeWebServiceException(Messages.getMessage(
- "EndpointControllerErr5"));
+ throw ExceptionFactory.makeWebServiceException(Messages.getMessage("EndpointControllerErr5"));
}
Object instance = null;
@@ -151,51 +223,53 @@
Parameter serviceObjectParam =
service.getParameter(Constants.SERVICE_OBJECT_SUPPLIER);
- Class serviceObjectMaker = Loader.loadClass(classLoader, ((String)
- serviceObjectParam.getValue()).trim());
+ Class serviceObjectMaker =
+ Loader.loadClass(classLoader,
+ ((String) serviceObjectParam.getValue()).trim());
// Find static getServiceObject() method, call it if there
- Method method = serviceObjectMaker.
- getMethod("getServiceObject",
- new Class[]{AxisService.class});
+ Method method =
+ serviceObjectMaker.getMethod("getServiceObject",
+ new Class[] { AxisService.class });
if (method != null) {
- return method.invoke(serviceObjectMaker.newInstance(), new Object[]{service});
+ return method.invoke(serviceObjectMaker.newInstance(), new Object[] { service });
}
}
instance = serviceImplClass.newInstance();
} catch (IllegalAccessException e) {
- throw ExceptionFactory.makeWebServiceException(Messages.getMessage(
- "EndpointControllerErr6", serviceImplClass.getName()));
+ throw ExceptionFactory.makeWebServiceException(Messages.getMessage("EndpointControllerErr6",
+ serviceImplClass.getName()));
} catch (InstantiationException e) {
- throw ExceptionFactory.makeWebServiceException(Messages.getMessage(
- "EndpointControllerErr6", serviceImplClass.getName()));
+ throw ExceptionFactory.makeWebServiceException(Messages.getMessage("EndpointControllerErr6",
+ serviceImplClass.getName()));
} catch (Exception e) {
- throw ExceptionFactory.makeWebServiceException(Messages.getMessage(
- "EndpointControllerErr6", serviceImplClass.getName()));
+ throw ExceptionFactory.makeWebServiceException(Messages.getMessage("EndpointControllerErr6",
+ serviceImplClass.getName()));
}
return instance;
}
- private javax.xml.ws.handler.MessageContext createSOAPMessageContext(MessageContext mc) {
+ protected javax.xml.ws.handler.MessageContext createSOAPMessageContext(MessageContext mc) {
SoapMessageContext soapMessageContext =
- (SoapMessageContext)MessageContextFactory.createSoapMessageContext(mc);
+ (SoapMessageContext) MessageContextFactory.createSoapMessageContext(mc);
ContextUtils.addProperties(soapMessageContext, mc);
return soapMessageContext;
}
- private void injectWebServiceContext(MessageContext mc, WebServiceContext wsContext,
- Object serviceInstance) throws ResourceInjectionException {
+ protected void injectWebServiceContext(MessageContext mc, WebServiceContext wsContext,
+ Object serviceInstance)
+ throws ResourceInjectionException {
ResourceInjector ri =
ResourceInjectionFactory.createResourceInjector(WebServiceContext.class);
ri.inject(wsContext, serviceInstance);
}
- private void updateWebServiceContext(WebServiceContext wsContext,
- javax.xml.ws.handler.MessageContext soapMessageContext)
- throws ResourceInjectionException {
- WebServiceContextInjector wci = (WebServiceContextInjector)ResourceInjectionFactory
- .createResourceInjector(WebServiceContext.class);
+ protected void updateWebServiceContext(WebServiceContext wsContext,
+ javax.xml.ws.handler.MessageContext soapMessageContext)
+ throws ResourceInjectionException {
+ WebServiceContextInjector wci =
+ (WebServiceContextInjector) ResourceInjectionFactory.createResourceInjector(WebServiceContextInjector.class);
wci.addMessageContext(wsContext, soapMessageContext);
}
---------------------------------------------------------------------
To unsubscribe, e-mail: axis-cvs-unsubscribe@ws.apache.org
For additional commands, e-mail: axis-cvs-help@ws.apache.org