Author: simonetripodi
Date: Tue May 17 19:50:19 2011
New Revision: 1104495

URL: http://svn.apache.org/viewvc?rev=1104495&view=rev
Log:
cached object types safety driven by key types

Modified:
    
incubator/ognl/trunk/src/main/java/org/apache/commons/ognl/internal/ClassCache.java
    
incubator/ognl/trunk/src/main/java/org/apache/commons/ognl/internal/ClassCacheImpl.java
    
incubator/ognl/trunk/src/main/java/org/apache/commons/ognl/internal/Entry.java

Modified: 
incubator/ognl/trunk/src/main/java/org/apache/commons/ognl/internal/ClassCache.java
URL: 
http://svn.apache.org/viewvc/incubator/ognl/trunk/src/main/java/org/apache/commons/ognl/internal/ClassCache.java?rev=1104495&r1=1104494&r2=1104495&view=diff
==============================================================================
--- 
incubator/ognl/trunk/src/main/java/org/apache/commons/ognl/internal/ClassCache.java
 (original)
+++ 
incubator/ognl/trunk/src/main/java/org/apache/commons/ognl/internal/ClassCache.java
 Tue May 17 19:50:19 2011
@@ -33,7 +33,7 @@ public interface ClassCache
 
     int getSize();
 
-    Object get( Class key );
+    <T> T get( Class<T> key );
 
-    Object put( Class key, Object value );
+    <T> T put( Class<T> key, T value );
 }

Modified: 
incubator/ognl/trunk/src/main/java/org/apache/commons/ognl/internal/ClassCacheImpl.java
URL: 
http://svn.apache.org/viewvc/incubator/ognl/trunk/src/main/java/org/apache/commons/ognl/internal/ClassCacheImpl.java?rev=1104495&r1=1104494&r2=1104495&view=diff
==============================================================================
--- 
incubator/ognl/trunk/src/main/java/org/apache/commons/ognl/internal/ClassCacheImpl.java
 (original)
+++ 
incubator/ognl/trunk/src/main/java/org/apache/commons/ognl/internal/ClassCacheImpl.java
 Tue May 17 19:50:19 2011
@@ -36,7 +36,7 @@ public class ClassCacheImpl
     /* ...and now you see why. The table size is used as a mask for generating 
hashes */
     private static final int TABLE_SIZE_MASK = TABLE_SIZE - 1;
 
-    private Entry[] _table;
+    private Entry<?>[] _table;
 
     private ClassCacheInspector _classInspector;
 
@@ -67,35 +67,42 @@ public class ClassCacheImpl
         return _size;
     }
 
-    public final Object get( Class key )
+    public final <T> T get( Class<T> key )
     {
-        Object result = null;
+        T result = null;
         int i = key.hashCode() & TABLE_SIZE_MASK;
 
-        for ( Entry entry = _table[i]; entry != null; entry = entry.next )
+        @SuppressWarnings( "unchecked" ) // entry type is driven by the class
+        Entry<T> entry = (Entry<T>) _table[i];
+
+        while ( entry != null )
         {
             if ( entry.key == key )
             {
                 result = entry.value;
                 break;
             }
+
+            entry = entry.next;
         }
 
         return result;
     }
 
-    public final Object put( Class key, Object value )
+    public final <T> T put( Class<T> key, T value )
     {
         if ( _classInspector != null && !_classInspector.shouldCache( key ) )
             return value;
 
-        Object result = null;
+        T result = null;
         int i = key.hashCode() & TABLE_SIZE_MASK;
-        Entry entry = _table[i];
+
+        @SuppressWarnings( "unchecked" ) // entry type is driven by the class
+        Entry<T> entry = (Entry<T>) _table[i];
 
         if ( entry == null )
         {
-            _table[i] = new Entry( key, value );
+            _table[i] = new Entry<T>( key, value );
             _size++;
         }
         else
@@ -121,7 +128,7 @@ public class ClassCacheImpl
                         if ( entry.next == null )
                         {
                             /* add value */
-                            entry.next = new Entry( key, value );
+                            entry.next = new Entry<T>( key, value );
                             break;
                         }
                     }

Modified: 
incubator/ognl/trunk/src/main/java/org/apache/commons/ognl/internal/Entry.java
URL: 
http://svn.apache.org/viewvc/incubator/ognl/trunk/src/main/java/org/apache/commons/ognl/internal/Entry.java?rev=1104495&r1=1104494&r2=1104495&view=diff
==============================================================================
--- 
incubator/ognl/trunk/src/main/java/org/apache/commons/ognl/internal/Entry.java 
(original)
+++ 
incubator/ognl/trunk/src/main/java/org/apache/commons/ognl/internal/Entry.java 
Tue May 17 19:50:19 2011
@@ -22,16 +22,16 @@ package org.apache.commons.ognl.internal
 /**
  * Used by {@link ClassCacheImpl} to store entries in the cache.
  */
-class Entry
+class Entry<T>
 {
 
-    Entry next;
+    Entry<T> next;
 
-    Class key;
+    Class<T> key;
 
-    Object value;
+    T value;
 
-    public Entry( Class key, Object value )
+    public Entry( Class<T> key, T value )
     {
         this.key = key;
         this.value = value;


Reply via email to