Author: mcucchiara
Date: Sun Oct 16 21:27:18 2011
New Revision: 1184935
URL: http://svn.apache.org/viewvc?rev=1184935&view=rev
Log:
new GenericMethodParameterType cache implementation
Added:
commons/proper/ognl/branches/new-cache-approach/src/main/java/org/apache/commons/ognl/internal/entry/GenericMethodParameterTypeCacheEntry.java
commons/proper/ognl/branches/new-cache-approach/src/main/java/org/apache/commons/ognl/internal/entry/GenericMethodParameterTypeFactory.java
commons/proper/ognl/branches/new-cache-approach/src/test/java/org/apache/commons/ognl/internal/GenericMethodParameterTypeCacheTest.java
Modified:
commons/proper/ognl/branches/new-cache-approach/src/main/java/org/apache/commons/ognl/OgnlRuntime.java
commons/proper/ognl/branches/new-cache-approach/src/test/java/org/apache/commons/ognl/TestOgnlRuntime.java
commons/proper/ognl/branches/new-cache-approach/src/test/java/org/apache/commons/ognl/test/OgnlTestCase.java
Modified:
commons/proper/ognl/branches/new-cache-approach/src/main/java/org/apache/commons/ognl/OgnlRuntime.java
URL:
http://svn.apache.org/viewvc/commons/proper/ognl/branches/new-cache-approach/src/main/java/org/apache/commons/ognl/OgnlRuntime.java?rev=1184935&r1=1184934&r2=1184935&view=diff
==============================================================================
---
commons/proper/ognl/branches/new-cache-approach/src/main/java/org/apache/commons/ognl/OgnlRuntime.java
(original)
+++
commons/proper/ognl/branches/new-cache-approach/src/main/java/org/apache/commons/ognl/OgnlRuntime.java
Sun Oct 16 21:27:18 2011
@@ -23,14 +23,18 @@ package org.apache.commons.ognl;
import org.apache.commons.ognl.enhance.ExpressionCompiler;
import org.apache.commons.ognl.enhance.OgnlExpressionCompiler;
+import org.apache.commons.ognl.internal.Cache;
+import org.apache.commons.ognl.internal.CacheException;
import org.apache.commons.ognl.internal.ClassCache;
import org.apache.commons.ognl.internal.ClassCacheHandler;
import org.apache.commons.ognl.internal.ConcurrentClassCache;
import org.apache.commons.ognl.internal.ConcurrentHashMapCache;
-import org.apache.commons.ognl.internal.entry.FiedlCacheEntryFactory;
import org.apache.commons.ognl.internal.entry.ConstructorCacheEntryFactory;
import org.apache.commons.ognl.internal.entry.DeclaredMethodCacheEntry;
import org.apache.commons.ognl.internal.entry.DeclaredMethodCacheEntryFactory;
+import org.apache.commons.ognl.internal.entry.FiedlCacheEntryFactory;
+import
org.apache.commons.ognl.internal.entry.GenericMethodParameterTypeCacheEntry;
+import
org.apache.commons.ognl.internal.entry.GenericMethodParameterTypeFactory;
import org.apache.commons.ognl.internal.entry.PermissionCacheEntry;
import org.apache.commons.ognl.internal.entry.PermissionCacheEntryFactory;
import
org.apache.commons.ognl.internal.entry.PropertyDescriptorCacheEntryFactory;
@@ -41,10 +45,8 @@ import java.beans.IntrospectionException
import java.beans.Introspector;
import java.beans.MethodDescriptor;
import java.beans.PropertyDescriptor;
-import java.lang.reflect.Array;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
-import java.lang.reflect.GenericArrayType;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Member;
import java.lang.reflect.Method;
@@ -52,12 +54,10 @@ import java.lang.reflect.Modifier;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Proxy;
import java.lang.reflect.Type;
-import java.lang.reflect.TypeVariable;
import java.math.BigDecimal;
import java.math.BigInteger;
import java.security.Permission;
import java.util.ArrayList;
-import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.Enumeration;
@@ -181,7 +181,7 @@ public class OgnlRuntime
static final Map<Method, Class<?>[]> _methodParameterTypesCache = new
HashMap<Method, Class<?>[]>( 101 );
- static final Map<Method, Class<?>[]> _genericMethodParameterTypesCache =
new HashMap<Method, Class<?>[]>( 101 );
+ static final Cache<GenericMethodParameterTypeCacheEntry, Class<?>[]>
_genericMethodParameterTypesCache = new
ConcurrentHashMapCache<GenericMethodParameterTypeCacheEntry, Class<?>[]>( new
GenericMethodParameterTypeFactory( ) );;
static final Map<Constructor<?>, Class<?>[]> _ctorParameterTypesCache =
new HashMap<Constructor<?>, Class<?>[]>( 101 );
@@ -671,6 +671,7 @@ public class OgnlRuntime
* @return Array of parameter types for the given method.
*/
public static Class<?>[] findParameterTypes( Class<?> type, Method m )
+ throws CacheException
{
if ( type == null )
{
@@ -683,87 +684,18 @@ public class OgnlRuntime
return getParameterTypes( m );
}
- synchronized ( _genericMethodParameterTypesCache )
- {
- Class<?>[] types;
-
- if ( ( types = _genericMethodParameterTypesCache.get( m ) ) !=
null )
- {
- ParameterizedType genericSuperclass = (ParameterizedType)
type.getGenericSuperclass( );
- if ( Arrays.equals( types,
genericSuperclass.getActualTypeArguments( ) ) )
- {
- return types;
- }
- }
-
- ParameterizedType param = (ParameterizedType)
type.getGenericSuperclass( );
- Type[] genTypes = m.getGenericParameterTypes( );
- TypeVariable<?>[] declaredTypes = m.getDeclaringClass(
).getTypeParameters( );
-
- types = new Class[genTypes.length];
-
- for ( int i = 0; i < genTypes.length; i++ )
- {
- TypeVariable<?> paramType = null;
-
- if ( TypeVariable.class.isInstance( genTypes[i] ) )
- {
- paramType = (TypeVariable<?>) genTypes[i];
- }
- else if ( GenericArrayType.class.isInstance( genTypes[i] ) )
- {
- paramType = (TypeVariable<?>) ( (GenericArrayType)
genTypes[i] ).getGenericComponentType( );
- }
- else if ( ParameterizedType.class.isInstance( genTypes[i] ) )
- {
- types[i] = (Class<?>) ( (ParameterizedType) genTypes[i]
).getRawType( );
- continue;
- }
- else if ( Class.class.isInstance( genTypes[i] ) )
- {
- types[i] = (Class<?>) genTypes[i];
- continue;
- }
-
- Class<?> resolved = resolveType( param, paramType,
declaredTypes );
-
- if ( resolved != null )
- {
- if ( GenericArrayType.class.isInstance( genTypes[i] ) )
- {
- resolved = Array.newInstance( resolved, 0 ).getClass(
);
- }
-
- types[i] = resolved;
- continue;
- }
-
- types[i] = m.getParameterTypes( )[i];
- }
-
- _genericMethodParameterTypesCache.put( m, types );
-
- return types;
- }
- }
-
- static Class<?> resolveType( ParameterizedType param, TypeVariable<?> var,
TypeVariable<?>[] declaredTypes )
- {
- if ( param.getActualTypeArguments( ).length < 1 )
- {
- return null;
- }
+ Class<?>[] types = _genericMethodParameterTypesCache.get( new
GenericMethodParameterTypeCacheEntry( m, type ) );
- for ( int i = 0; i < declaredTypes.length; i++ )
+ /*if ( types != null )
{
- if ( !TypeVariable.class.isInstance( param.getActualTypeArguments(
)[i] )
- && declaredTypes[i].getName( ).equals( var.getName( ) ) )
+ ParameterizedType genericSuperclass = (ParameterizedType)
type.getGenericSuperclass( );
+ if ( Arrays.equals( types,
genericSuperclass.getActualTypeArguments( ) ) )
{
- return (Class<?>) param.getActualTypeArguments( )[i];
+ return types;
}
}
-
- return null;
+*/
+ return types;
}
static Class<?> findType( Type[] types, Class<?> type )
@@ -1916,7 +1848,7 @@ public class OgnlRuntime
* @param m The method to check.
* @return True if the method should be callable, false otherwise.
*/
- //TODO: the method was intented as private, so it needs to move in a util
class
+ //TODO: the method was intented as private, so it'd need to move in a util
class
public static boolean isMethodCallable( Method m )
{
return !( ( isJdk15( ) && m.isSynthetic( ) ) || Modifier.isVolatile(
m.getModifiers( ) ) );
Added:
commons/proper/ognl/branches/new-cache-approach/src/main/java/org/apache/commons/ognl/internal/entry/GenericMethodParameterTypeCacheEntry.java
URL:
http://svn.apache.org/viewvc/commons/proper/ognl/branches/new-cache-approach/src/main/java/org/apache/commons/ognl/internal/entry/GenericMethodParameterTypeCacheEntry.java?rev=1184935&view=auto
==============================================================================
---
commons/proper/ognl/branches/new-cache-approach/src/main/java/org/apache/commons/ognl/internal/entry/GenericMethodParameterTypeCacheEntry.java
(added)
+++
commons/proper/ognl/branches/new-cache-approach/src/main/java/org/apache/commons/ognl/internal/entry/GenericMethodParameterTypeCacheEntry.java
Sun Oct 16 21:27:18 2011
@@ -0,0 +1,56 @@
+package org.apache.commons.ognl.internal.entry;
+
+import java.lang.reflect.Method;
+
+/**
+* User: Maurizio Cucchiara
+* Date: 10/16/11
+* Time: 9:28 PM
+*/
+public class GenericMethodParameterTypeCacheEntry
+ implements CacheEntry
+{
+ Method method;
+
+ Class<?> type;
+
+ public GenericMethodParameterTypeCacheEntry( Method method, Class<?> type )
+ {
+ this.method = method;
+ this.type = type;
+ }
+
+ @Override
+ public boolean equals( Object o )
+ {
+ if ( this == o )
+ {
+ return true;
+ }
+ if ( !( o instanceof GenericMethodParameterTypeCacheEntry ) )
+ {
+ return false;
+ }
+
+ GenericMethodParameterTypeCacheEntry that =
(GenericMethodParameterTypeCacheEntry) o;
+
+ if ( !method.equals( that.method ) )
+ {
+ return false;
+ }
+ if ( !type.equals( that.type ) )
+ {
+ return false;
+ }
+
+ return true;
+ }
+
+ @Override
+ public int hashCode( )
+ {
+ int result = method.hashCode( );
+ result = 31 * result + type.hashCode( );
+ return result;
+ }
+}
Added:
commons/proper/ognl/branches/new-cache-approach/src/main/java/org/apache/commons/ognl/internal/entry/GenericMethodParameterTypeFactory.java
URL:
http://svn.apache.org/viewvc/commons/proper/ognl/branches/new-cache-approach/src/main/java/org/apache/commons/ognl/internal/entry/GenericMethodParameterTypeFactory.java?rev=1184935&view=auto
==============================================================================
---
commons/proper/ognl/branches/new-cache-approach/src/main/java/org/apache/commons/ognl/internal/entry/GenericMethodParameterTypeFactory.java
(added)
+++
commons/proper/ognl/branches/new-cache-approach/src/main/java/org/apache/commons/ognl/internal/entry/GenericMethodParameterTypeFactory.java
Sun Oct 16 21:27:18 2011
@@ -0,0 +1,89 @@
+package org.apache.commons.ognl.internal.entry;
+
+import org.apache.commons.ognl.internal.CacheException;
+
+import java.lang.reflect.Array;
+import java.lang.reflect.GenericArrayType;
+import java.lang.reflect.ParameterizedType;
+import java.lang.reflect.Type;
+import java.lang.reflect.TypeVariable;
+
+/**
+* User: Maurizio Cucchiara
+* Date: 10/16/11
+* Time: 9:29 PM
+*/
+public class GenericMethodParameterTypeFactory
+ implements CacheEntryFactory<GenericMethodParameterTypeCacheEntry,
Class<?>[]>
+{
+ public Class<?>[] create( GenericMethodParameterTypeCacheEntry entry )
+ throws CacheException
+ {
+ Class<?>[] types;
+
+ ParameterizedType param = (ParameterizedType)
entry.type.getGenericSuperclass( );
+ Type[] genTypes = entry.method.getGenericParameterTypes( );
+ TypeVariable<?>[] declaredTypes = entry.method.getDeclaringClass(
).getTypeParameters( );
+
+ types = new Class[genTypes.length];
+
+ for ( int i = 0; i < genTypes.length; i++ )
+ {
+ TypeVariable<?> paramType = null;
+
+ if ( TypeVariable.class.isInstance( genTypes[i] ) )
+ {
+ paramType = (TypeVariable<?>) genTypes[i];
+ }
+ else if ( GenericArrayType.class.isInstance( genTypes[i] ) )
+ {
+ paramType = (TypeVariable<?>) ( (GenericArrayType) genTypes[i]
).getGenericComponentType( );
+ }
+ else if ( ParameterizedType.class.isInstance( genTypes[i] ) )
+ {
+ types[i] = (Class<?>) ( (ParameterizedType) genTypes[i]
).getRawType( );
+ continue;
+ }
+ else if ( Class.class.isInstance( genTypes[i] ) )
+ {
+ types[i] = (Class<?>) genTypes[i];
+ continue;
+ }
+
+ Class<?> resolved = resolveType( param, paramType, declaredTypes );
+
+ if ( resolved != null )
+ {
+ if ( GenericArrayType.class.isInstance( genTypes[i] ) )
+ {
+ resolved = Array.newInstance( resolved, 0 ).getClass( );
+ }
+
+ types[i] = resolved;
+ continue;
+ }
+ types[i] = entry.method.getParameterTypes( )[i];
+ }
+
+ return types;
+ }
+
+ private Class<?> resolveType( ParameterizedType param, TypeVariable<?>
var, TypeVariable<?>[] declaredTypes )
+ {
+ if ( param.getActualTypeArguments( ).length < 1 )
+ {
+ return null;
+ }
+
+ for ( int i = 0; i < declaredTypes.length; i++ )
+ {
+ if ( !TypeVariable.class.isInstance( param.getActualTypeArguments(
)[i] )
+ && declaredTypes[i].getName( ).equals( var.getName( ) ) )
+ {
+ return (Class<?>) param.getActualTypeArguments( )[i];
+ }
+ }
+
+ return null;
+ }
+}
Modified:
commons/proper/ognl/branches/new-cache-approach/src/test/java/org/apache/commons/ognl/TestOgnlRuntime.java
URL:
http://svn.apache.org/viewvc/commons/proper/ognl/branches/new-cache-approach/src/test/java/org/apache/commons/ognl/TestOgnlRuntime.java?rev=1184935&r1=1184934&r2=1184935&view=diff
==============================================================================
---
commons/proper/ognl/branches/new-cache-approach/src/test/java/org/apache/commons/ognl/TestOgnlRuntime.java
(original)
+++
commons/proper/ognl/branches/new-cache-approach/src/test/java/org/apache/commons/ognl/TestOgnlRuntime.java
Sun Oct 16 21:27:18 2011
@@ -19,6 +19,7 @@
*/
package org.apache.commons.ognl;
+import org.apache.commons.ognl.internal.CacheException;
import org.apache.commons.ognl.test.objects.BaseGeneric;
import org.apache.commons.ognl.test.objects.Bean1;
import org.apache.commons.ognl.test.objects.Bean2;
@@ -361,7 +362,7 @@ public class TestOgnlRuntime
*/
@Test
public void testOGNLParameterDiscovery( )
- throws NoSuchMethodException
+ throws NoSuchMethodException, CacheException
{
Method saveMethod = GenericParent.class.getMethod( "save",
Object.class );
System.out.println( saveMethod );
Added:
commons/proper/ognl/branches/new-cache-approach/src/test/java/org/apache/commons/ognl/internal/GenericMethodParameterTypeCacheTest.java
URL:
http://svn.apache.org/viewvc/commons/proper/ognl/branches/new-cache-approach/src/test/java/org/apache/commons/ognl/internal/GenericMethodParameterTypeCacheTest.java?rev=1184935&view=auto
==============================================================================
---
commons/proper/ognl/branches/new-cache-approach/src/test/java/org/apache/commons/ognl/internal/GenericMethodParameterTypeCacheTest.java
(added)
+++
commons/proper/ognl/branches/new-cache-approach/src/test/java/org/apache/commons/ognl/internal/GenericMethodParameterTypeCacheTest.java
Sun Oct 16 21:27:18 2011
@@ -0,0 +1,34 @@
+package org.apache.commons.ognl.internal;
+
+import
org.apache.commons.ognl.internal.entry.GenericMethodParameterTypeCacheEntry;
+import
org.apache.commons.ognl.internal.entry.GenericMethodParameterTypeFactory;
+import org.apache.commons.ognl.test.objects.GameGeneric;
+import org.junit.Assert;
+import org.junit.Test;
+
+import java.io.Serializable;
+import java.lang.reflect.Method;
+
+/**
+ * User: Maurizio Cucchiara
+ * Date: 10/16/11
+ * Time: 9:44 AM
+ */
+public class GenericMethodParameterTypeCacheTest
+{
+ private ConcurrentHashMapCache<GenericMethodParameterTypeCacheEntry,
Class<?>[]> cache =
+ new ConcurrentHashMapCache<GenericMethodParameterTypeCacheEntry,
Class<?>[]>( new GenericMethodParameterTypeFactory( ) );
+
+ @Test
+ public void testGet( )
+ throws NoSuchMethodException, CacheException
+ {
+ Method m = GameGeneric.class.getMethod( "setIds", Serializable[].class
);
+ Class type = GameGeneric.class;
+ Class<?>[] types = cache.get( new
GenericMethodParameterTypeCacheEntry( m, type ) );
+
+ Assert.assertEquals( 1, types.length );
+ Assert.assertEquals( Long[].class, types[0] );
+ }
+
+}
Modified:
commons/proper/ognl/branches/new-cache-approach/src/test/java/org/apache/commons/ognl/test/OgnlTestCase.java
URL:
http://svn.apache.org/viewvc/commons/proper/ognl/branches/new-cache-approach/src/test/java/org/apache/commons/ognl/test/OgnlTestCase.java?rev=1184935&r1=1184934&r2=1184935&view=diff
==============================================================================
---
commons/proper/ognl/branches/new-cache-approach/src/test/java/org/apache/commons/ognl/test/OgnlTestCase.java
(original)
+++
commons/proper/ognl/branches/new-cache-approach/src/test/java/org/apache/commons/ognl/test/OgnlTestCase.java
Sun Oct 16 21:27:18 2011
@@ -199,7 +199,7 @@ public abstract class OgnlTestCase
} catch (Exception ex) {
if (RuntimeException.class.isInstance(ex) && ex.getCause() != null
&& Exception.class.isAssignableFrom(
ex.getCause().getClass())) {
- ex = (Exception) ((RuntimeException) ex).getCause();
+ ex = (Exception) ex.getCause( );
}
if (testedResult instanceof Class) {