User: starksm 
  Date: 02/02/07 23:49:40

  Modified:    src/main/org/jboss/ejb Tag: Branch_2_4 CacheKey.java
  Log:
  Fix problem with cast in equals
  
  Revision  Changes    Path
  No                   revision
  
  
  No                   revision
  
  
  1.12.2.2  +157 -138  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.12.2.1
  retrieving revision 1.12.2.2
  diff -u -r1.12.2.1 -r1.12.2.2
  --- CacheKey.java     20 Nov 2001 09:42:48 -0000      1.12.2.1
  +++ CacheKey.java     8 Feb 2002 07:49:40 -0000       1.12.2.2
  @@ -1,150 +1,169 @@
   /*
  -* JBoss, the OpenSource EJB server
  -*
  -* Distributable under LGPL license.
  -* See terms of license at gnu.org.
  -*/
  + * JBoss, the OpenSource EJB server
  + *
  + * Distributable under LGPL license.
  + * See terms of license at gnu.org.
  + */
   package org.jboss.ejb;
   
  +import java.lang.reflect.Method;
   import java.rmi.MarshalledObject;
   
   import org.apache.log4j.Category;
   
   /**
  -*   CacheKey
  -* 
  -*   CacheKey is an encapsulation of both the PrimaryKey and a cache specific key
  -*   
  -*   This implementation is a safer implementation in the sense that it doesn't rely 
  -*   on the user supplied hashcode and equals.   It is also fast since the hashCode 
operation 
  -*   is pre-calculated.
  -*
  -*   @see org.jboss.ejb.plugins.NoPassivationInstanceCache.java
  -*   @see org.jboss.ejb.plugins.EntityInstanceCache
  -*   @see org.jboss.ejb.plugins.EntityProxy
  -*   @author <a href="[EMAIL PROTECTED]">Marc Fleury</a>
  -*   @author <a href="[EMAIL PROTECTED]">Bill Burke</a>
  -*   @author <a href="[EMAIL PROTECTED]">Scott Stark</a>
  -*   @version $Revision: 1.12.2.1 $
  -*/
  + *   CacheKey
  + *
  + *   CacheKey is an encapsulation of both the PrimaryKey and a cache specific key
  + *
  + *   This implementation is a safer implementation in the sense that it doesn't rely
  + *   on the user supplied hashcode and equals.   It is also fast since the hashCode 
operation
  + *   is pre-calculated.
  + *
  + *   @see org.jboss.ejb.plugins.NoPassivationInstanceCache.java
  + *   @see org.jboss.ejb.plugins.EntityInstanceCache
  + *   @see org.jboss.ejb.plugins.EntityProxy
  + *   @author <a href="[EMAIL PROTECTED]">Marc Fleury</a>
  + *   @author <a href="[EMAIL PROTECTED]">Bill Burke</a>
  + *   @author <a href="[EMAIL PROTECTED]">Scott Stark</a>
  + *   @version $Revision: 1.12.2.2 $
  + */
   public class CacheKey
  -    implements java.io.Externalizable
  +   implements java.io.Externalizable
   {
  -    // Constants -----------------------------------------------------
  -    
  -    // Attributes ----------------------------------------------------
  -    
  -    // The database primaryKey
  -    // This primaryKey is used by
  -    //
  -    // org.jboss.ejb.plugins.EntityInstanceCache.setKey() - to set the 
EntityEnterpriseContext id
  -    // org.jboss.ejb.plugins.jrmp.interfaces.EntityProxy.invoke():
  -    // - implementing Entity.toString() --> cacheKey.getId().toString()
  -    // - implementing Entity.hashCode() --> cacheKey.getId().hashCode()
  -    // - etc...
  -    // org.jboss.ejb.plugins.local.BaseLocalContainerInvoker.EntityProxy.getId()
  -    //
  -    protected Object id;
  -    public Object getId()
  -    {
  -     return id;
  -    }
  -     
  -    // The Marshalled Object representing the key
  -    protected MarshalledObject mo;
  -    
  -    // The Marshalled Object's hashcode
  -    protected int hashCode;
  -    
  -    // Static --------------------------------------------------------  
  -    
  -    // Public --------------------------------------------------------
  -    
  -    public CacheKey()
  -    {
  -     // For externalization only
  -    }
  -    public CacheKey(Object id)
  -    {
  -     if (id == null) throw new Error("id may not be null");
  -         
  -     this.id = id;
  -     try
  -        {
  -         // Equals rely on the MarshalledObject itself
  -         mo =  new MarshalledObject(id);
  -         // Precompute the hashCode (speed)
  -         hashCode = mo.hashCode();
  -     }
  -     catch (Exception e)
  -        {
  -           Category log = Category.getInstance(getClass());
  -           log.error("failed to initialize, id="+id, e);
  -        }
  -    }
  -
  -    // Z implementation ----------------------------------------------
  -    
  -    // Package protected ---------------------------------------------
  -    
  -    // Protected -----------------------------------------------------
  -    
  -    // Private -------------------------------------------------------
  -    
  -    public void writeExternal(java.io.ObjectOutput out)
  -     throws java.io.IOException
  -    {
  -        out.writeObject(id);
  -     out.writeObject(mo);
  -             out.writeInt(hashCode);
  -    }
  -   
  -    public void readExternal(java.io.ObjectInput in)
  -     throws java.io.IOException, ClassNotFoundException
  -    {
  -        id = in.readObject();
  -     mo = (MarshalledObject) in.readObject();
  -        hashCode = in.readInt();
  -    }
  +   // Constants -----------------------------------------------------
  +   static final long serialVersionUID = -7108821554259950778L;
  + 
  +   // Attributes ----------------------------------------------------
  +   
  +   // The database primaryKey
  +   // This primaryKey is used by
  +   //
  +   // org.jboss.ejb.plugins.EntityInstanceCache.setKey() - to set the 
EntityEnterpriseContext id
  +   // org.jboss.ejb.plugins.jrmp.interfaces.EntityProxy.invoke():
  +   // - implementing Entity.toString() --> cacheKey.getId().toString()
  +   // - implementing Entity.hashCode() --> cacheKey.getId().hashCode()
  +   // - etc...
  +   // org.jboss.ejb.plugins.local.BaseLocalContainerInvoker.EntityProxy.getId()
  +   //
  +   protected Object id;
  +   public Object getId()
  +   {
  +      return id;
  +   }
  +   
  +   // The Marshalled Object representing the key
  +   protected MarshalledObject mo;
  +   
  +   // The Marshalled Object's hashcode
  +   protected int hashCode;
  +   
  +   // Static --------------------------------------------------------
  +   
  +   // Public --------------------------------------------------------
  +   
  +   public CacheKey()
  +   {
  +      // For externalization only
  +   }
  +   public CacheKey(Object id)
  +   {
  +      if (id == null) throw new Error("id may not be null");
  +      
  +      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.
  +         */
  +         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)
  +      {
  +         Category log = Category.getInstance(getClass());
  +         log.error("failed to initialize, id="+id, e);
  +      }
  +   }
   
  -    // HashCode and Equals over write --------------------------------
  -    
  -    /**
  -     * these should be overwritten by extending Cache key
  -     * since they define what the cache does in the first place
  -     */
  -    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
  -     */
  -    public boolean equals(Object object)
  -    {
  -        if (object instanceof CacheKey)
  -        {
  -            return (mo.equals(((CacheKey) object).mo));
  -        }
  -        return false;
  -    }
  -     
  -    public String toString()
  -    {
  -     return id.toString();
  -    }
  -    
  -    // Inner classes -------------------------------------------------
  +   // Z implementation ----------------------------------------------
  +   
  +   // Package protected ---------------------------------------------
  +   
  +   // Protected -----------------------------------------------------
  +   
  +   // Private -------------------------------------------------------
  +   
  +   public void writeExternal(java.io.ObjectOutput out)
  +      throws java.io.IOException
  +   {
  +      out.writeObject(id);
  +      out.writeObject(mo);
  +      out.writeInt(hashCode);
  +   }
  +   
  +   public void readExternal(java.io.ObjectInput in)
  +      throws java.io.IOException, ClassNotFoundException
  +   {
  +      id = in.readObject();
  +      mo = (MarshalledObject) in.readObject();
  +      hashCode = in.readInt();
  +   }
  +   
  +   // HashCode and Equals over write --------------------------------
  +   
  +   /**
  +    * these should be overwritten by extending Cache key
  +    * since they define what the cache does in the first place
  +    */
  +   public int hashCode()
  +   {
  +      // we default to the pK id
  +      return hashCode;
  +   }
  +   
  +   
  +   /** 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)
  +   {
  +      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 equals;
  +   }
  +
  +   public String toString()
  +   {
  +      return id.toString();
  +   }
  +   
  +   // Inner classes -------------------------------------------------
   }
  -
  
  
  

_______________________________________________
Jboss-development mailing list
[EMAIL PROTECTED]
https://lists.sourceforge.net/lists/listinfo/jboss-development

Reply via email to