User: starksm Date: 02/02/08 00:00:19 Modified: src/main/org/jboss/ejb CacheKey.java Log: Until CacheKey is dropped, have it use the bean key equals and hashCode methods if they are implemented by the bean key class. Revision Changes Path 1.20 +56 -48 jboss/src/main/org/jboss/ejb/CacheKey.java Index: CacheKey.java =================================================================== RCS file: /cvsroot/jboss/jboss/src/main/org/jboss/ejb/CacheKey.java,v retrieving revision 1.19 retrieving revision 1.20 diff -u -r1.19 -r1.20 --- CacheKey.java 12 Jan 2002 21:14:26 -0000 1.19 +++ CacheKey.java 8 Feb 2002 08:00:19 -0000 1.20 @@ -10,7 +10,7 @@ import java.io.ObjectOutput; import java.io.ObjectInput; import java.io.IOException; - +import java.lang.reflect.Method; import java.rmi.MarshalledObject; import org.jboss.logging.Logger; @@ -29,12 +29,14 @@ * * @author <a href="mailto:[EMAIL PROTECTED]">Marc Fleury</a> * @author <a href="[EMAIL PROTECTED]">Bill Burke</a> - * @version $Revision: 1.19 $ + * @author <a href="[EMAIL PROTECTED]">Scott Stark</a> + * @version $Revision: 1.20 $ */ public class CacheKey implements Externalizable { // Constants ----------------------------------------------------- + static final long serialVersionUID = -7108821554259950778L; // Attributes ---------------------------------------------------- @@ -67,46 +69,47 @@ // Public -------------------------------------------------------- - public CacheKey() { + public CacheKey() + { // For externalization only } - public CacheKey(Object id) { + public CacheKey(Object id) + { // why does this throw an error and not an IllegalArgumentException ? if (id == null) throw new Error("id may not be null"); - this.id = null; - - try { - - // Equals rely on the MarshalledObject itself - mo = new MarshalledObject(id); - - /* - * FIXME MARCF: The reuse of the primary key is an "exception" and this fix makes - everyone pay an hefty price. If we really want this behavior we can put it in - the cache. Is there a test for this? - - // Make a copy of the id to enforce copy semantics and - // allow reuse of the original primary key - this.id = mo.get(); - + this.id = id; + try + { + /* See if the key directly implements equals and hashCode. The + *getDeclaredMethod method only returns method declared in the argument + *class, not its superclasses. */ - this.id = id; - - // Precompute the hashCode (speed) - hashCode = mo.hashCode(); + try + { + Class[] equalsArgs = {Object.class}; + Method equals = id.getClass().getDeclaredMethod("equals", equalsArgs); + Class[] hashCodeArgs = {}; + Method hash = id.getClass().getDeclaredMethod("hashCode", hashCodeArgs); + // Both equals and hashCode are defined, use the id methods + hashCode = id.hashCode(); + } + catch(NoSuchMethodException ex) + { + // Rely on the MarshalledObject for equals and hashCode + mo = new MarshalledObject(id); + // Precompute the hashCode (speed) + hashCode = mo.hashCode(); + } } - catch (Exception e) { - // - // should probably throw a nested exception here, but - // for now instead of printStackTrace, lets log it - // - Logger log = Logger.getLogger(this.getClass()); - log.error("failed to initialize", e); + catch (Exception e) + { + Logger log = Logger.getLogger(getClass()); + log.error("failed to initialize, id="+id, e); } } - + // Z implementation ---------------------------------------------- // Package protected --------------------------------------------- @@ -137,29 +140,34 @@ * these should be overwritten by extending Cache key * since they define what the cache does in the first place */ - public int hashCode() { + public int hashCode() + { // we default to the pK id return hashCode; } - /** - * equals() - * - * We base the equals on the equality of the underlying key - * in this fashion we make sure that we cannot have duplicate - * hashes in the maps. - * The fast way (and right way) to do this implementation - * is with a incremented cachekey. It is more complex but worth - * the effort this is a FIXME (MF) - * The following implementation is fool-proof + /** This method uses the id implementation of equals if the mo is + *null since this indicates that the id class did implement equals. + *If mo is not null, then the MarshalledObject equals is used to + *compare keys based on their serialized form. Relying on the + *serialized form does not always work. */ - public boolean equals(Object object) { - if (object instanceof CacheKey) { - return (mo.equals(((CacheKey) object).mo)); + public boolean equals(Object object) + { + boolean equals = false; + if (object instanceof CacheKey) + { + CacheKey ckey = (CacheKey) object; + Object key = ckey.id; + // If mo is null, the id class implements equals + if( mo == null ) + equals = id.equals(key); + else + equals = mo.equals(ckey.mo); } - return false; + return equals; } - + public String toString() { return id.toString();
_______________________________________________ Jboss-development mailing list [EMAIL PROTECTED] https://lists.sourceforge.net/lists/listinfo/jboss-development