Author: scheu Date: Tue Jun 29 21:10:27 2010 New Revision: 959103 URL: http://svn.apache.org/viewvc?rev=959103&view=rev Log: AXIS2-4757 Contributor:Rich Scheuerle Support JAX-WS WebMethods that have @RequestWrapper or @ResponseWrapper annotations that use classes that don't have @XmlRootElement.
A validation test is also contributed. Modified: axis/axis2/java/core/trunk/modules/jaxws-integration/test/org/apache/axis2/jaxws/sample/addressbook/data/FindEntryByName.java axis/axis2/java/core/trunk/modules/jaxws-integration/test/org/apache/axis2/jaxws/sample/addressbook/data/FindEntryByNameResponse.java axis/axis2/java/core/trunk/modules/jaxws/src/org/apache/axis2/datasource/jaxb/JAXBDSContext.java axis/axis2/java/core/trunk/modules/jaxws/src/org/apache/axis2/jaxws/marshaller/factory/MethodMarshallerFactory.java axis/axis2/java/core/trunk/modules/jaxws/src/org/apache/axis2/jaxws/marshaller/impl/alt/DocLitWrappedMethodMarshaller.java axis/axis2/java/core/trunk/modules/jaxws/src/org/apache/axis2/jaxws/marshaller/impl/alt/DocLitWrappedPlusMethodMarshaller.java axis/axis2/java/core/trunk/modules/jaxws/src/org/apache/axis2/jaxws/runtime/description/marshal/MarshalServiceRuntimeDescription.java axis/axis2/java/core/trunk/modules/jaxws/src/org/apache/axis2/jaxws/runtime/description/marshal/impl/MarshalServiceRuntimeDescriptionImpl.java Modified: axis/axis2/java/core/trunk/modules/jaxws-integration/test/org/apache/axis2/jaxws/sample/addressbook/data/FindEntryByName.java URL: http://svn.apache.org/viewvc/axis/axis2/java/core/trunk/modules/jaxws-integration/test/org/apache/axis2/jaxws/sample/addressbook/data/FindEntryByName.java?rev=959103&r1=959102&r2=959103&view=diff ============================================================================== --- axis/axis2/java/core/trunk/modules/jaxws-integration/test/org/apache/axis2/jaxws/sample/addressbook/data/FindEntryByName.java (original) +++ axis/axis2/java/core/trunk/modules/jaxws-integration/test/org/apache/axis2/jaxws/sample/addressbook/data/FindEntryByName.java Tue Jun 29 21:10:27 2010 @@ -53,7 +53,8 @@ import javax.xml.bind.annotation.XmlType "firstname", "lastname" }) -...@xmlrootelement(name = "findEntryByName") +// Intentional comment to test support of wrapper classes that are not root elements +//@XmlRootElement(name = "findEntryByName") public class FindEntryByName { @XmlElement(namespace = "http://org/apache/axis2/jaxws/sample/addressbook", required = true, nillable = true) Modified: axis/axis2/java/core/trunk/modules/jaxws-integration/test/org/apache/axis2/jaxws/sample/addressbook/data/FindEntryByNameResponse.java URL: http://svn.apache.org/viewvc/axis/axis2/java/core/trunk/modules/jaxws-integration/test/org/apache/axis2/jaxws/sample/addressbook/data/FindEntryByNameResponse.java?rev=959103&r1=959102&r2=959103&view=diff ============================================================================== --- axis/axis2/java/core/trunk/modules/jaxws-integration/test/org/apache/axis2/jaxws/sample/addressbook/data/FindEntryByNameResponse.java (original) +++ axis/axis2/java/core/trunk/modules/jaxws-integration/test/org/apache/axis2/jaxws/sample/addressbook/data/FindEntryByNameResponse.java Tue Jun 29 21:10:27 2010 @@ -51,7 +51,8 @@ import javax.xml.bind.annotation.XmlType @XmlType(name = "", propOrder = { "entry" }) -...@xmlrootelement(name = "findEntryByNameResponse") +// Intentional comment to test support of wrapper classes that are not root elements +// @XmlRootElement(name = "findEntryByNameResponse") public class FindEntryByNameResponse { @XmlElement(namespace = "http://org/apache/axis2/jaxws/sample/addressbook", required = true) Modified: axis/axis2/java/core/trunk/modules/jaxws/src/org/apache/axis2/datasource/jaxb/JAXBDSContext.java URL: http://svn.apache.org/viewvc/axis/axis2/java/core/trunk/modules/jaxws/src/org/apache/axis2/datasource/jaxb/JAXBDSContext.java?rev=959103&r1=959102&r2=959103&view=diff ============================================================================== --- axis/axis2/java/core/trunk/modules/jaxws/src/org/apache/axis2/datasource/jaxb/JAXBDSContext.java (original) +++ axis/axis2/java/core/trunk/modules/jaxws/src/org/apache/axis2/datasource/jaxb/JAXBDSContext.java Tue Jun 29 21:10:27 2010 @@ -236,12 +236,17 @@ public class JAXBDSContext { } /** - * Set RPC Declared Type. The use of use this property if the message is style=document is - * discouraged. + * The procesess type to indicate the class of the target of the unmarshaling. + * This method should only be used in the cases where the element being unmarshaled + * is not known to the JAXBContext (examples include RPC/Literal processing + * and Doc/Literal Wrapped processing with a non-element wrapper class) * * @param type */ public void setProcessType(Class type) { + if (log.isDebugEnabled()) { + log.debug("Process Type set to: " + type); + } processType = type; } @@ -254,6 +259,9 @@ public class JAXBDSContext { } public void setIsxmlList(boolean isxmlList) { + if (log.isDebugEnabled()) { + log.debug("isxmlListSet to " + isxmlList); + } this.isxmlList = isxmlList; } Modified: axis/axis2/java/core/trunk/modules/jaxws/src/org/apache/axis2/jaxws/marshaller/factory/MethodMarshallerFactory.java URL: http://svn.apache.org/viewvc/axis/axis2/java/core/trunk/modules/jaxws/src/org/apache/axis2/jaxws/marshaller/factory/MethodMarshallerFactory.java?rev=959103&r1=959102&r2=959103&view=diff ============================================================================== --- axis/axis2/java/core/trunk/modules/jaxws/src/org/apache/axis2/jaxws/marshaller/factory/MethodMarshallerFactory.java (original) +++ axis/axis2/java/core/trunk/modules/jaxws/src/org/apache/axis2/jaxws/marshaller/factory/MethodMarshallerFactory.java Tue Jun 29 21:10:27 2010 @@ -102,6 +102,15 @@ public class MethodMarshallerFactory { public static MethodMarshaller getMarshaller(OperationDescription op, boolean isClient, ClassLoader cl) { + // Always make sure the MarshalServiceRuntimeDescription is built before getting the MethodMarshaller. + // Getting the MarshalServiceRuntimeDescription will ensure that it is built. + ServiceDescription serviceDesc = + op.getEndpointInterfaceDescription() + .getEndpointDescription() + .getServiceDescription(); + MarshalServiceRuntimeDescription marshalDesc = + MarshalServiceRuntimeDescriptionFactory.get(serviceDesc); + MethodMarshaller marshaller = null; if (op.getSoapBindingStyle() == SOAPBinding.Style.DOCUMENT) { marshaller = createDocLitMethodMarshaller(op, isClient, cl); Modified: axis/axis2/java/core/trunk/modules/jaxws/src/org/apache/axis2/jaxws/marshaller/impl/alt/DocLitWrappedMethodMarshaller.java URL: http://svn.apache.org/viewvc/axis/axis2/java/core/trunk/modules/jaxws/src/org/apache/axis2/jaxws/marshaller/impl/alt/DocLitWrappedMethodMarshaller.java?rev=959103&r1=959102&r2=959103&view=diff ============================================================================== --- axis/axis2/java/core/trunk/modules/jaxws/src/org/apache/axis2/jaxws/marshaller/impl/alt/DocLitWrappedMethodMarshaller.java (original) +++ axis/axis2/java/core/trunk/modules/jaxws/src/org/apache/axis2/jaxws/marshaller/impl/alt/DocLitWrappedMethodMarshaller.java Tue Jun 29 21:10:27 2010 @@ -33,6 +33,7 @@ import org.apache.axis2.jaxws.message.da import org.apache.axis2.jaxws.message.factory.JAXBBlockFactory; import org.apache.axis2.jaxws.message.factory.MessageFactory; import org.apache.axis2.jaxws.registry.FactoryRegistry; +import org.apache.axis2.jaxws.runtime.description.marshal.AnnotationDesc; import org.apache.axis2.jaxws.runtime.description.marshal.MarshalServiceRuntimeDescription; import org.apache.axis2.jaxws.utility.ConvertUtils; import org.apache.axis2.jaxws.wrapper.JAXBWrapperTool; @@ -91,9 +92,11 @@ public class DocLitWrappedMethodMarshall // Remember this unmarshal information so that we can speed up processing // the next time. - MethodMarshallerUtils.registerUnmarshalInfo(message.getMessageContext(), + if (shouldRegiserUnmarshalInfo(operationDesc, marshalDesc, endpointDesc)) { + MethodMarshallerUtils.registerUnmarshalInfo(message.getMessageContext(), packages, packagesKey); + } // Determine if a returnValue is expected. // The return value may be an child element @@ -109,6 +112,15 @@ public class DocLitWrappedMethodMarshall // Get this block JAXBBlockContext blockContext = new JAXBBlockContext(packages, packagesKey); blockContext.setWebServiceNamespace(ed.getTargetNamespace()); + + // If the wrapper is not a root element, then the process type + // must be set on the context so that "by type" unmarshal is performed. + if (!isResponseWrapperAnXmlRootElement(operationDesc, marshalDesc, endpointDesc)) { + String clsName = marshalDesc.getResponseWrapperClassName(operationDesc); + Class cls = loadClass(clsName,endpointDesc); + blockContext.setProcessType(cls); + } + JAXBBlockFactory factory = (JAXBBlockFactory)FactoryRegistry.getFactory(JAXBBlockFactory.class); Block block = message.getBodyBlock(blockContext, factory); @@ -220,14 +232,24 @@ public class DocLitWrappedMethodMarshall TreeSet<String> packages = marshalDesc.getPackages(); String packagesKey = marshalDesc.getPackagesKey(); - MethodMarshallerUtils.registerUnmarshalInfo(message.getMessageContext(), + if (shouldRegiserUnmarshalInfo(operationDesc, marshalDesc, endpointDesc)) { + MethodMarshallerUtils.registerUnmarshalInfo(message.getMessageContext(), packages, packagesKey); + } // In usage=WRAPPED, there will be a single JAXB block inside the body. // Get this block JAXBBlockContext blockContext = new JAXBBlockContext(packages, packagesKey); blockContext.setWebServiceNamespace(ed.getTargetNamespace()); + // If the wrapper is not a root element, then the process type + // must be set on the context so that "by type" unmarshal is performed. + if (!isRequestWrapperAnXmlRootElement(operationDesc, marshalDesc, endpointDesc)) { + String clsName = marshalDesc.getRequestWrapperClassName(operationDesc); + Class cls = loadClass(clsName,endpointDesc); + blockContext.setProcessType(cls); + } + JAXBBlockFactory factory = (JAXBBlockFactory)FactoryRegistry.getFactory(JAXBBlockFactory.class); Block block = message.getBodyBlock(blockContext, factory); @@ -370,12 +392,7 @@ public class DocLitWrappedMethodMarshall // Now create the single JAXB element String wrapperName = marshalDesc.getResponseWrapperClassName(operationDesc); - Class cls; - try { - cls = MethodMarshallerUtils.loadClass(wrapperName); - } catch (ClassNotFoundException e){ - cls = MethodMarshallerUtils.loadClass(wrapperName, endpointDesc.getAxisService().getClassLoader()); - } + Class cls = loadClass(wrapperName, endpointDesc); JAXBWrapperTool wrapperTool = new JAXBWrapperToolImpl(); Object object = wrapperTool.wrap(cls, nameList, objectList, declaredClassMap, marshalDesc.getPropertyDescriptorMap(cls)); @@ -476,12 +493,8 @@ public class DocLitWrappedMethodMarshall // Now create the single JAXB element String wrapperName = marshalDesc.getRequestWrapperClassName(operationDesc); - Class cls; - try { - cls = MethodMarshallerUtils.loadClass(wrapperName); - } catch (ClassNotFoundException e){ - cls = MethodMarshallerUtils.loadClass(wrapperName, endpointDesc.getAxisService().getClassLoader()); - } + Class cls = loadClass(wrapperName, endpointDesc); + JAXBWrapperTool wrapperTool = new JAXBWrapperToolImpl(); Object object = wrapperTool.wrap(cls, nameList, objectList, declaredClassMap, marshalDesc.getPropertyDescriptorMap(cls)); @@ -566,4 +579,96 @@ public class DocLitWrappedMethodMarshall } } + /** + * @param opDesc + * @param msrd + * @param endpointDesc + * @return true if should register UnmarshalInfo for faster processing + */ + boolean shouldRegiserUnmarshalInfo(OperationDescription opDesc, + MarshalServiceRuntimeDescription msrd, + EndpointDescription endpointDesc) { + // If either the request wrapper or the response wrapper is + // not a rendered as a root element, then "by type" unmarshaling + // is needed. In such cases faster unmarshaling should be disabled. + return isRequestWrapperAnXmlRootElement(opDesc, msrd, endpointDesc) && + isResponseWrapperAnXmlRootElement(opDesc, msrd, endpointDesc); + } + /** + * @param opDesc + * @param msrd + * @param endpointDesc + * @return true if request wrapper is a root element + */ + boolean isRequestWrapperAnXmlRootElement(OperationDescription opDesc, + MarshalServiceRuntimeDescription msrd, + EndpointDescription endpointDesc) { + boolean isRootElement = false; + String wrapperClassName = msrd.getRequestWrapperClassName(opDesc); + try { + + if (wrapperClassName != null) { + AnnotationDesc aDesc = msrd.getAnnotationDesc(wrapperClassName); + if (aDesc == null) { + Class cls = loadClass(wrapperClassName, endpointDesc); + aDesc = msrd.getAnnotationDesc(cls); + } + isRootElement = aDesc.hasXmlRootElement(); + } + + } catch (Throwable t) { + if (log.isDebugEnabled()) { + log.debug("An error occurred while processing class " + wrapperClassName + " exception is " + t); + log.debug("The error is ignored and processing continues."); + } + } + return isRootElement; + } + + /** + * @param opDesc + * @param msrd + * @param endpointDesc + * @return true if response wrapper is a root element + */ + boolean isResponseWrapperAnXmlRootElement(OperationDescription opDesc, + MarshalServiceRuntimeDescription msrd, + EndpointDescription endpointDesc) { + boolean isRootElement = false; + String wrapperClassName = msrd.getResponseWrapperClassName(opDesc); + try { + + if (wrapperClassName != null) { + AnnotationDesc aDesc = msrd.getAnnotationDesc(wrapperClassName); + if (aDesc == null) { + Class cls = loadClass(wrapperClassName, endpointDesc); + aDesc = msrd.getAnnotationDesc(cls); + } + isRootElement = aDesc.hasXmlRootElement(); + } + + } catch (Throwable t) { + if (log.isDebugEnabled()) { + log.debug("An error occurred while processing class " + wrapperClassName + " exception is " + t); + log.debug("The error is ignored and processing continues."); + } + } + return isRootElement; + } + + /** + * @param clsName + * @param endpontDesc + * @return + * @throws ClassNotFoundException + */ + Class loadClass(String clsName, EndpointDescription endpointDesc) throws ClassNotFoundException { + Class cls = null; + try { + cls = MethodMarshallerUtils.loadClass(clsName); + } catch (ClassNotFoundException e){ + cls = MethodMarshallerUtils.loadClass(clsName, endpointDesc.getAxisService().getClassLoader()); + } + return cls; + } } Modified: axis/axis2/java/core/trunk/modules/jaxws/src/org/apache/axis2/jaxws/marshaller/impl/alt/DocLitWrappedPlusMethodMarshaller.java URL: http://svn.apache.org/viewvc/axis/axis2/java/core/trunk/modules/jaxws/src/org/apache/axis2/jaxws/marshaller/impl/alt/DocLitWrappedPlusMethodMarshaller.java?rev=959103&r1=959102&r2=959103&view=diff ============================================================================== --- axis/axis2/java/core/trunk/modules/jaxws/src/org/apache/axis2/jaxws/marshaller/impl/alt/DocLitWrappedPlusMethodMarshaller.java (original) +++ axis/axis2/java/core/trunk/modules/jaxws/src/org/apache/axis2/jaxws/marshaller/impl/alt/DocLitWrappedPlusMethodMarshaller.java Tue Jun 29 21:10:27 2010 @@ -34,6 +34,7 @@ import org.apache.axis2.jaxws.message.da import org.apache.axis2.jaxws.message.factory.JAXBBlockFactory; import org.apache.axis2.jaxws.message.factory.MessageFactory; import org.apache.axis2.jaxws.registry.FactoryRegistry; +import org.apache.axis2.jaxws.runtime.description.marshal.AnnotationDesc; import org.apache.axis2.jaxws.runtime.description.marshal.MarshalServiceRuntimeDescription; import org.apache.axis2.jaxws.utility.ConvertUtils; import org.apache.axis2.jaxws.wrapper.JAXBWrapperTool; @@ -149,7 +150,15 @@ public class DocLitWrappedPlusMethodMars // In usage=WRAPPED, there will be a single JAXB block inside the body. // Get this block JAXBBlockContext blockContext = new JAXBBlockContext(packages, packagesKey); + blockContext.setWebServiceNamespace(ed.getTargetNamespace()); + // If the wrapper is not a root element, then the process type + // must be set on the context so that "by type" unmarshal is performed. + if (!isResponseWrapperAnXmlRootElement(operationDesc, marshalDesc, endpointDesc)) { + String clsName = marshalDesc.getResponseWrapperClassName(operationDesc); + Class cls = loadClass(clsName,endpointDesc); + blockContext.setProcessType(cls); + } JAXBBlockFactory factory = (JAXBBlockFactory)FactoryRegistry.getFactory(JAXBBlockFactory.class); Block block = message.getBodyBlock(blockContext, factory); @@ -313,6 +322,14 @@ public class DocLitWrappedPlusMethodMars // Get this block JAXBBlockContext blockContext = new JAXBBlockContext(packages, packagesKey); blockContext.setWebServiceNamespace(ed.getTargetNamespace()); + + // If the wrapper is not a root element, then the process type + // must be set on the context so that "by type" unmarshal is performed. + if (!isRequestWrapperAnXmlRootElement(operationDesc, marshalDesc, endpointDesc)) { + String clsName = marshalDesc.getRequestWrapperClassName(operationDesc); + Class cls = loadClass(clsName,endpointDesc); + blockContext.setProcessType(cls); + } JAXBBlockFactory factory = (JAXBBlockFactory)FactoryRegistry.getFactory(JAXBBlockFactory.class); Block block = message.getBodyBlock(blockContext, factory); @@ -531,12 +548,8 @@ public class DocLitWrappedPlusMethodMars // Now create the single JAXB element String wrapperName = marshalDesc.getResponseWrapperClassName(operationDesc); - Class cls; - try { - cls = MethodMarshallerUtils.loadClass(wrapperName); - } catch (ClassNotFoundException e){ - cls = MethodMarshallerUtils.loadClass(wrapperName, endpointDesc.getAxisService().getClassLoader()); - } + Class cls = loadClass(wrapperName, endpointDesc); + JAXBWrapperTool wrapperTool = new JAXBWrapperToolImpl(); Object object = wrapperTool.wrap(cls, nameList, objectList, declaredClassMap, marshalDesc.getPropertyDescriptorMap(cls)); @@ -665,12 +678,8 @@ public class DocLitWrappedPlusMethodMars // Now create the single JAXB element String wrapperName = marshalDesc.getRequestWrapperClassName(operationDesc); - Class cls; - try { - cls = MethodMarshallerUtils.loadClass(wrapperName); - } catch (ClassNotFoundException e){ - cls = MethodMarshallerUtils.loadClass(wrapperName, endpointDesc.getAxisService().getClassLoader()); - } + Class cls = loadClass(wrapperName, endpointDesc); + JAXBWrapperTool wrapperTool = new JAXBWrapperToolImpl(); Object object = wrapperTool.wrap(cls, nameList, objectList, declardClassMap, marshalDesc.getPropertyDescriptorMap(cls)); @@ -777,4 +786,81 @@ public class DocLitWrappedPlusMethodMars } } + /** + * @param opDesc + * @param msrd + * @param endpointDesc + * @return true if request wrapper is a root element + */ + boolean isRequestWrapperAnXmlRootElement(OperationDescription opDesc, + MarshalServiceRuntimeDescription msrd, + EndpointDescription endpointDesc) { + boolean isRootElement = false; + String wrapperClassName = msrd.getRequestWrapperClassName(opDesc); + try { + + if (wrapperClassName != null) { + AnnotationDesc aDesc = msrd.getAnnotationDesc(wrapperClassName); + if (aDesc == null) { + Class cls = loadClass(wrapperClassName, endpointDesc); + aDesc = msrd.getAnnotationDesc(cls); + } + isRootElement = aDesc.hasXmlRootElement(); + } + + } catch (Throwable t) { + if (log.isDebugEnabled()) { + log.debug("An error occurred while processing class " + wrapperClassName + " exception is " + t); + log.debug("The error is ignored and processing continues."); + } + } + return isRootElement; + } + + /** + * @param opDesc + * @param msrd + * @param endpointDesc + * @return true if response wrapper is a root element + */ + boolean isResponseWrapperAnXmlRootElement(OperationDescription opDesc, + MarshalServiceRuntimeDescription msrd, + EndpointDescription endpointDesc) { + boolean isRootElement = false; + String wrapperClassName = msrd.getResponseWrapperClassName(opDesc); + try { + + if (wrapperClassName != null) { + AnnotationDesc aDesc = msrd.getAnnotationDesc(wrapperClassName); + if (aDesc == null) { + Class cls = loadClass(wrapperClassName, endpointDesc); + aDesc = msrd.getAnnotationDesc(cls); + } + isRootElement = aDesc.hasXmlRootElement(); + } + + } catch (Throwable t) { + if (log.isDebugEnabled()) { + log.debug("An error occurred while processing class " + wrapperClassName + " exception is " + t); + log.debug("The error is ignored and processing continues."); + } + } + return isRootElement; + } + + /** + * @param clsName + * @param endpontDesc + * @return + * @throws ClassNotFoundException + */ + Class loadClass(String clsName, EndpointDescription endpointDesc) throws ClassNotFoundException { + Class cls = null; + try { + cls = MethodMarshallerUtils.loadClass(clsName); + } catch (ClassNotFoundException e){ + cls = MethodMarshallerUtils.loadClass(clsName, endpointDesc.getAxisService().getClassLoader()); + } + return cls; + } } Modified: axis/axis2/java/core/trunk/modules/jaxws/src/org/apache/axis2/jaxws/runtime/description/marshal/MarshalServiceRuntimeDescription.java URL: http://svn.apache.org/viewvc/axis/axis2/java/core/trunk/modules/jaxws/src/org/apache/axis2/jaxws/runtime/description/marshal/MarshalServiceRuntimeDescription.java?rev=959103&r1=959102&r2=959103&view=diff ============================================================================== --- axis/axis2/java/core/trunk/modules/jaxws/src/org/apache/axis2/jaxws/runtime/description/marshal/MarshalServiceRuntimeDescription.java (original) +++ axis/axis2/java/core/trunk/modules/jaxws/src/org/apache/axis2/jaxws/runtime/description/marshal/MarshalServiceRuntimeDescription.java Tue Jun 29 21:10:27 2010 @@ -40,13 +40,19 @@ public interface MarshalServiceRuntimeDe public String getPackagesKey(); /** - * Get the AnnotationDesc for this class. If one is not cached, a new one is creatd + * Gets/Creates the AnnotationDesc for this class. * * @param cls * @return AnnotationDesc */ public AnnotationDesc getAnnotationDesc(Class cls); + /** + * Gets the AnnotationDesc for this class if already determined + * @param clsName + * @return AnnotationDesc or null + */ + public AnnotationDesc getAnnotationDesc(String clsName); /** * Get the PropertyDescriptor map for the class. The key of the map is a child xml local name. Modified: axis/axis2/java/core/trunk/modules/jaxws/src/org/apache/axis2/jaxws/runtime/description/marshal/impl/MarshalServiceRuntimeDescriptionImpl.java URL: http://svn.apache.org/viewvc/axis/axis2/java/core/trunk/modules/jaxws/src/org/apache/axis2/jaxws/runtime/description/marshal/impl/MarshalServiceRuntimeDescriptionImpl.java?rev=959103&r1=959102&r2=959103&view=diff ============================================================================== --- axis/axis2/java/core/trunk/modules/jaxws/src/org/apache/axis2/jaxws/runtime/description/marshal/impl/MarshalServiceRuntimeDescriptionImpl.java (original) +++ axis/axis2/java/core/trunk/modules/jaxws/src/org/apache/axis2/jaxws/runtime/description/marshal/impl/MarshalServiceRuntimeDescriptionImpl.java Tue Jun 29 21:10:27 2010 @@ -28,25 +28,24 @@ import org.apache.axis2.jaxws.registry.F import org.apache.axis2.jaxws.runtime.description.marshal.AnnotationDesc; import org.apache.axis2.jaxws.runtime.description.marshal.FaultBeanDesc; import org.apache.axis2.jaxws.runtime.description.marshal.MarshalServiceRuntimeDescription; +import org.apache.axis2.jaxws.runtime.description.marshal.impl.AnnotationDescImpl; +import org.apache.axis2.jaxws.runtime.description.marshal.impl.MarshalServiceRuntimeDescriptionImpl; import org.apache.axis2.jaxws.utility.PropertyDescriptorPlus; import org.apache.axis2.jaxws.utility.XMLRootElementUtil; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; import java.lang.reflect.Method; import java.util.Map; import java.util.Map.Entry; import java.util.TreeSet; +import javax.xml.namespace.QName; + -/** - * @author scheu - * - */ -/** - * @author scheu - * - */ public class MarshalServiceRuntimeDescriptionImpl implements MarshalServiceRuntimeDescription { + private static final Log log = LogFactory.getLog(MarshalServiceRuntimeDescriptionImpl.class); private ServiceDescription serviceDesc; private String key; @@ -64,6 +63,10 @@ public class MarshalServiceRuntimeDescri protected MarshalServiceRuntimeDescriptionImpl(String key, ServiceDescription serviceDesc) { + if (log.isDebugEnabled()) { + QName qName = (serviceDesc == null) ? null : serviceDesc.getServiceQName(); + log.debug("Create MarshalServiceRuntimeDescriptionImpl for " + serviceDesc); + } this.serviceDesc = serviceDesc; this.key = key; } @@ -91,15 +94,33 @@ public class MarshalServiceRuntimeDescri } public AnnotationDesc getAnnotationDesc(Class cls) { - String className = cls.getCanonicalName(); + if (log.isDebugEnabled()) { + log.debug("getAnnotationDesc for class " + cls); + } + String className = cls.getCanonicalName(); AnnotationDesc aDesc = annotationMap.get(className); - if (aDesc != null) { - // Cache hit - return aDesc; + if (aDesc == null) { + // Cache miss + if (log.isDebugEnabled()) { + log.debug("creating AnnotationDesc"); + } + aDesc = AnnotationDescImpl.create(cls); } - // Cache miss...we cannot update the map because we don't want to introduce a sync call. - aDesc = AnnotationDescImpl.create(cls); - + + if (log.isDebugEnabled()) { + log.debug("getAnnotationDesc is " + aDesc); + } + return aDesc; + } + + public AnnotationDesc getAnnotationDesc(String clsName) { + if (log.isDebugEnabled()) { + log.debug("getAnnotationDesc for " + clsName); + } + AnnotationDesc aDesc = annotationMap.get(clsName); + if (log.isDebugEnabled()) { + log.debug("getAnnotationDesc is " + aDesc); + } return aDesc; }