Author: scheu Date: Sat Jul 3 11:16:36 2010 New Revision: 960201 URL: http://svn.apache.org/viewvc?rev=960201&view=rev Log: AXIS2-4708 Contributor:Rich Scheuerle Small change to enhance lookup of JAXBContext objects
Modified: axis/axis2/java/core/trunk/modules/jaxws/src/org/apache/axis2/jaxws/message/databinding/JAXBUtils.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/src/org/apache/axis2/jaxws/message/databinding/JAXBUtils.java URL: http://svn.apache.org/viewvc/axis/axis2/java/core/trunk/modules/jaxws/src/org/apache/axis2/jaxws/message/databinding/JAXBUtils.java?rev=960201&r1=960200&r2=960201&view=diff ============================================================================== --- axis/axis2/java/core/trunk/modules/jaxws/src/org/apache/axis2/jaxws/message/databinding/JAXBUtils.java (original) +++ axis/axis2/java/core/trunk/modules/jaxws/src/org/apache/axis2/jaxws/message/databinding/JAXBUtils.java Sat Jul 3 11:16:36 2010 @@ -22,6 +22,7 @@ package org.apache.axis2.jaxws.message.d import org.apache.axis2.java.security.AccessController; import org.apache.axis2.jaxws.ExceptionFactory; import org.apache.axis2.jaxws.i18n.Messages; +import org.apache.axis2.jaxws.message.databinding.JAXBUtilsMonitor; import org.apache.axis2.jaxws.message.factory.ClassFinderFactory; import org.apache.axis2.jaxws.registry.FactoryRegistry; import org.apache.axis2.jaxws.utility.ClassUtils; @@ -208,7 +209,7 @@ public class JAXBUtils { log.debug(pkg); } } - JAXBUtilsMonitor.addPackageKey(key); + JAXBUtilsMonitor.addPackageKey(contextPackages.toString()); // Get or Create The InnerMap using the package key ConcurrentHashMap<ClassLoader, JAXBContextValue> innerMap = null; 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=960201&r1=960200&r2=960201&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 Sat Jul 3 11:16:36 2010 @@ -90,7 +90,7 @@ public class MarshalServiceRuntimeDescri void setPackages(TreeSet<String> packages) { this.packages = packages; - this.packagesKey = packages.toString(); // Unique key for searches + this.packagesKey = getObjectIdentity(packages); // Unique key for searches } public AnnotationDesc getAnnotationDesc(Class cls) { @@ -266,5 +266,39 @@ public class MarshalServiceRuntimeDescri public MessageFactory getMessageFactory() { return messageFactory; } + + /** + * Java does not provide a way to uniquely identify an object. This makes + * it difficult to distinguish one object from another in a trace. The + * default Object.toString() produces a string of the form: + * + * obj.getClass().getName() + "@" + Integer.toHexString(obj.hashCode()) + * + * This is "as-good-as-it-gets". If 'hashCode' has been overridden, it gets + * worse. Specifically, if hashCode has been overriden such that: + * + * obj1.equals(obj2) ==> obj1.hashCode() == obj2.hashCode() + * + * then it becomes impossible to distinguish between obj1 and obj2 in a trace: + * - dumping values is (almost) guaranteed to reveal that both have same content. + * - dumping hashCode (see Object.toString() comment above) gives same hashCode. + * + * [For example, JNDI Reference objects exhibit this behavior] + * + * The purpose of getObjectIdentity is to attempt to duplicate the "original" + * behavior of Object.toString(). On some JVMs, the 'original' hashCode + * corresponds to a memory reference to the object - which is unique. + * + * This is NOT guaranteed to work on all JVMs. But again, this seems to be + * "as-good-as-it-gets". + * + * @return obj.getClass().getName() + "@" + Integer.toHexString(System.identityHashCode(obj)); + */ + private static String getObjectIdentity(Object obj) { + if (obj == null) { + return "null"; + } + return obj.getClass().getName() + "@" + Integer.toHexString(System.identityHashCode(obj)); + } }