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;