From: David J. <d_j...@us...> - 2002-08-16 03:01:32
|
User: d_jencks Date: 02/08/15 20:01:30 Modified: src/main/org/jboss/resource/connectionmanager Tag: Branch_3_2 CachedConnectionManager.java Log: Fixed bug 595738. Wrap keys to use == rather than equals in a hashmap Revision Changes Path No revision No revision 1.8.2.1 +31 -3 jbosscx/src/main/org/jboss/resource/connectionmanager/CachedConnectionManager.java Index: CachedConnectionManager.java =================================================================== RCS file: /cvsroot/jboss/jbosscx/src/main/org/jboss/resource/connectionmanager/CachedConnectionManager.java,v retrieving revision 1.8 retrieving revision 1.8.2.1 diff -u -r1.8 -r1.8.2.1 --- CachedConnectionManager.java 1 Aug 2002 05:04:03 -0000 1.8 +++ CachedConnectionManager.java 16 Aug 2002 03:01:29 -0000 1.8.2.1 @@ -101,7 +101,7 @@ * @param key an <code>Object</code> value * @exception ResourceException if an error occurs */ - public void pushMetaAwareObject(final Object key, Set unsharableResources) + public void pushMetaAwareObject(final Object rawKey, Set unsharableResources) throws ResourceException { LinkedList stack = (LinkedList)currentObjects.get(); @@ -109,7 +109,7 @@ { if (log.isTraceEnabled()) { - log.trace("new stack for key: " + key); + log.trace("new stack for key: " + rawKey); } // end of if () stack = new LinkedList(); currentObjects.set(stack); @@ -118,13 +118,15 @@ { if (log.isTraceEnabled()) { - log.trace("old stack for key: " + key); + log.trace("old stack for key: " + rawKey); } // end of if () //At one time I attempted to recycle connections held over method calls. //This caused problems if the other method call started a new transaction. //To assure optimal use of connections, close them before calling out. } // end of else //check for reentrancy, reconnect if not reentrant. + //wrap key to be based on == rather than equals + Object key = new IdentityWrapper(rawKey); if (!stack.contains(key)) { reconnect(key, unsharableResources); @@ -388,6 +390,32 @@ } // end of for () + } + } + + /** + * The class <code>IdentityWrapper</code> wraps objects so they may be used in hashmaps + * based on their object identity rather than equals implementation. Used for keys. + * + */ + private final static class IdentityWrapper + { + + private final Object o; + + IdentityWrapper(final Object o) + { + this.o = o; + } + + public boolean equals(Object other) + { + return (other instanceof IdentityWrapper) && o == ((IdentityWrapper)other).o; + } + + public int hashCode() + { + return o.hashCode(); } } |