Author: mcucchiara Date: Sun Oct 16 07:32:17 2011 New Revision: 1184773 URL: http://svn.apache.org/viewvc?rev=1184773&view=rev Log: Cache entry and entry factory (with test)
Added: commons/proper/ognl/branches/new-cache-approach/src/main/java/org/apache/commons/ognl/internal/entry/ commons/proper/ognl/branches/new-cache-approach/src/main/java/org/apache/commons/ognl/internal/entry/CacheEntry.java commons/proper/ognl/branches/new-cache-approach/src/main/java/org/apache/commons/ognl/internal/entry/CacheEntryFactory.java (contents, props changed) - copied, changed from r1182777, commons/proper/ognl/branches/new-cache-approach/src/main/java/org/apache/commons/ognl/internal/CacheEntryFactory.java commons/proper/ognl/branches/new-cache-approach/src/main/java/org/apache/commons/ognl/internal/entry/ClassCacheEntryFactory.java (contents, props changed) - copied, changed from r1182777, commons/proper/ognl/branches/new-cache-approach/src/main/java/org/apache/commons/ognl/internal/ClassCacheEntryFactory.java commons/proper/ognl/branches/new-cache-approach/src/main/java/org/apache/commons/ognl/internal/entry/ConstructorCacheEntryFactory.java commons/proper/ognl/branches/new-cache-approach/src/main/java/org/apache/commons/ognl/internal/entry/DeclaredMethodCacheEntry.java commons/proper/ognl/branches/new-cache-approach/src/main/java/org/apache/commons/ognl/internal/entry/DeclaredMethodCacheEntryFactory.java commons/proper/ognl/branches/new-cache-approach/src/main/java/org/apache/commons/ognl/internal/entry/FiedlCacheCacheEntryFactory.java commons/proper/ognl/branches/new-cache-approach/src/main/java/org/apache/commons/ognl/internal/entry/MatchingCacheEntryFactory.java commons/proper/ognl/branches/new-cache-approach/src/main/java/org/apache/commons/ognl/internal/entry/MatchingClassCacheEntryFactory.java commons/proper/ognl/branches/new-cache-approach/src/main/java/org/apache/commons/ognl/internal/entry/MethodCacheEntry.java commons/proper/ognl/branches/new-cache-approach/src/main/java/org/apache/commons/ognl/internal/entry/MethodCacheEntryFactory.java commons/proper/ognl/branches/new-cache-approach/src/main/java/org/apache/commons/ognl/internal/entry/ParametrizedCacheEntryFactory.java commons/proper/ognl/branches/new-cache-approach/src/main/java/org/apache/commons/ognl/internal/entry/PermissionCacheEntry.java commons/proper/ognl/branches/new-cache-approach/src/main/java/org/apache/commons/ognl/internal/entry/PermissionCacheEntryFactory.java commons/proper/ognl/branches/new-cache-approach/src/main/java/org/apache/commons/ognl/internal/entry/PropertyDescriptorCacheEntryFactory.java commons/proper/ognl/branches/new-cache-approach/src/test/java/org/apache/commons/ognl/internal/ commons/proper/ognl/branches/new-cache-approach/src/test/java/org/apache/commons/ognl/internal/ConcurrentHashMapCacheTest.java commons/proper/ognl/branches/new-cache-approach/src/test/java/org/apache/commons/ognl/internal/ConstructorCacheTest.java commons/proper/ognl/branches/new-cache-approach/src/test/java/org/apache/commons/ognl/internal/DeclaredMethodCacheTest.java commons/proper/ognl/branches/new-cache-approach/src/test/java/org/apache/commons/ognl/internal/FieldCacheTest.java commons/proper/ognl/branches/new-cache-approach/src/test/java/org/apache/commons/ognl/internal/PermissionCacheTest.java commons/proper/ognl/branches/new-cache-approach/src/test/java/org/apache/commons/ognl/internal/PropertyDescriptorCache.java commons/proper/ognl/branches/new-cache-approach/src/test/java/org/apache/commons/ognl/internal/entry/ Removed: commons/proper/ognl/branches/new-cache-approach/src/main/java/org/apache/commons/ognl/internal/CacheEntryFactory.java commons/proper/ognl/branches/new-cache-approach/src/main/java/org/apache/commons/ognl/internal/ClassCacheEntryFactory.java Added: commons/proper/ognl/branches/new-cache-approach/src/main/java/org/apache/commons/ognl/internal/entry/CacheEntry.java URL: http://svn.apache.org/viewvc/commons/proper/ognl/branches/new-cache-approach/src/main/java/org/apache/commons/ognl/internal/entry/CacheEntry.java?rev=1184773&view=auto ============================================================================== --- commons/proper/ognl/branches/new-cache-approach/src/main/java/org/apache/commons/ognl/internal/entry/CacheEntry.java (added) +++ commons/proper/ognl/branches/new-cache-approach/src/main/java/org/apache/commons/ognl/internal/entry/CacheEntry.java Sun Oct 16 07:32:17 2011 @@ -0,0 +1,10 @@ +package org.apache.commons.ognl.internal.entry; + +/** + * User: Maurizio Cucchiara + * Date: 10/13/11 + * Time: 9:46 PM + */ +public interface CacheEntry +{ +} Copied: commons/proper/ognl/branches/new-cache-approach/src/main/java/org/apache/commons/ognl/internal/entry/CacheEntryFactory.java (from r1182777, commons/proper/ognl/branches/new-cache-approach/src/main/java/org/apache/commons/ognl/internal/CacheEntryFactory.java) URL: http://svn.apache.org/viewvc/commons/proper/ognl/branches/new-cache-approach/src/main/java/org/apache/commons/ognl/internal/entry/CacheEntryFactory.java?p2=commons/proper/ognl/branches/new-cache-approach/src/main/java/org/apache/commons/ognl/internal/entry/CacheEntryFactory.java&p1=commons/proper/ognl/branches/new-cache-approach/src/main/java/org/apache/commons/ognl/internal/CacheEntryFactory.java&r1=1182777&r2=1184773&rev=1184773&view=diff ============================================================================== --- commons/proper/ognl/branches/new-cache-approach/src/main/java/org/apache/commons/ognl/internal/CacheEntryFactory.java (original) +++ commons/proper/ognl/branches/new-cache-approach/src/main/java/org/apache/commons/ognl/internal/entry/CacheEntryFactory.java Sun Oct 16 07:32:17 2011 @@ -19,7 +19,9 @@ * under the License. */ -package org.apache.commons.ognl.internal; +package org.apache.commons.ognl.internal.entry; + +import org.apache.commons.ognl.internal.CacheException; public interface CacheEntryFactory<K, V> { Propchange: commons/proper/ognl/branches/new-cache-approach/src/main/java/org/apache/commons/ognl/internal/entry/CacheEntryFactory.java ------------------------------------------------------------------------------ svn:eol-style = native Propchange: commons/proper/ognl/branches/new-cache-approach/src/main/java/org/apache/commons/ognl/internal/entry/CacheEntryFactory.java ------------------------------------------------------------------------------ svn:keywords = Date Author Id Revision HeadURL Copied: commons/proper/ognl/branches/new-cache-approach/src/main/java/org/apache/commons/ognl/internal/entry/ClassCacheEntryFactory.java (from r1182777, commons/proper/ognl/branches/new-cache-approach/src/main/java/org/apache/commons/ognl/internal/ClassCacheEntryFactory.java) URL: http://svn.apache.org/viewvc/commons/proper/ognl/branches/new-cache-approach/src/main/java/org/apache/commons/ognl/internal/entry/ClassCacheEntryFactory.java?p2=commons/proper/ognl/branches/new-cache-approach/src/main/java/org/apache/commons/ognl/internal/entry/ClassCacheEntryFactory.java&p1=commons/proper/ognl/branches/new-cache-approach/src/main/java/org/apache/commons/ognl/internal/ClassCacheEntryFactory.java&r1=1182777&r2=1184773&rev=1184773&view=diff ============================================================================== --- commons/proper/ognl/branches/new-cache-approach/src/main/java/org/apache/commons/ognl/internal/ClassCacheEntryFactory.java (original) +++ commons/proper/ognl/branches/new-cache-approach/src/main/java/org/apache/commons/ognl/internal/entry/ClassCacheEntryFactory.java Sun Oct 16 07:32:17 2011 @@ -19,7 +19,7 @@ * under the License. */ -package org.apache.commons.ognl.internal; +package org.apache.commons.ognl.internal.entry; public interface ClassCacheEntryFactory<T> extends CacheEntryFactory<Class<?>, T> Propchange: commons/proper/ognl/branches/new-cache-approach/src/main/java/org/apache/commons/ognl/internal/entry/ClassCacheEntryFactory.java ------------------------------------------------------------------------------ svn:eol-style = native Propchange: commons/proper/ognl/branches/new-cache-approach/src/main/java/org/apache/commons/ognl/internal/entry/ClassCacheEntryFactory.java ------------------------------------------------------------------------------ svn:keywords = Date Author Id Revision HeadURL Added: commons/proper/ognl/branches/new-cache-approach/src/main/java/org/apache/commons/ognl/internal/entry/ConstructorCacheEntryFactory.java URL: http://svn.apache.org/viewvc/commons/proper/ognl/branches/new-cache-approach/src/main/java/org/apache/commons/ognl/internal/entry/ConstructorCacheEntryFactory.java?rev=1184773&view=auto ============================================================================== --- commons/proper/ognl/branches/new-cache-approach/src/main/java/org/apache/commons/ognl/internal/entry/ConstructorCacheEntryFactory.java (added) +++ commons/proper/ognl/branches/new-cache-approach/src/main/java/org/apache/commons/ognl/internal/entry/ConstructorCacheEntryFactory.java Sun Oct 16 07:32:17 2011 @@ -0,0 +1,23 @@ +package org.apache.commons.ognl.internal.entry; + +import org.apache.commons.ognl.internal.CacheException; + +import java.lang.reflect.Constructor; +import java.util.Arrays; +import java.util.List; + +/** + * User: Maurizio Cucchiara + * Date: 10/16/11 + * Time: 8:51 AM + */ +public class ConstructorCacheEntryFactory + implements CacheEntryFactory<Class<?>, List<Constructor<?>>> +{ + public List<Constructor<?>> create( Class<?> key ) + throws CacheException + { + return Arrays.asList( key.getConstructors( ) ); + } +} + Added: commons/proper/ognl/branches/new-cache-approach/src/main/java/org/apache/commons/ognl/internal/entry/DeclaredMethodCacheEntry.java URL: http://svn.apache.org/viewvc/commons/proper/ognl/branches/new-cache-approach/src/main/java/org/apache/commons/ognl/internal/entry/DeclaredMethodCacheEntry.java?rev=1184773&view=auto ============================================================================== --- commons/proper/ognl/branches/new-cache-approach/src/main/java/org/apache/commons/ognl/internal/entry/DeclaredMethodCacheEntry.java (added) +++ commons/proper/ognl/branches/new-cache-approach/src/main/java/org/apache/commons/ognl/internal/entry/DeclaredMethodCacheEntry.java Sun Oct 16 07:32:17 2011 @@ -0,0 +1,63 @@ +package org.apache.commons.ognl.internal.entry; + +/** + * User: Maurizio Cucchiara + * Date: 10/15/11 + * Time: 9:02 AM + */ +public class DeclaredMethodCacheEntry + extends MethodCacheEntry +{ + + MethodType type; + + public enum MethodType + { + STATIC, NON_STATIC + } + + public DeclaredMethodCacheEntry( Class<?> targetClass ) + { + super( targetClass ); + } + + public DeclaredMethodCacheEntry( Class<?> targetClass, MethodType type) + { + super( targetClass ); + this.type = type; + } + + @Override + public boolean equals( Object o ) + { + if ( this == o ) + { + return true; + } + if ( !( o instanceof DeclaredMethodCacheEntry ) ) + { + return false; + } + + DeclaredMethodCacheEntry that = (DeclaredMethodCacheEntry) o; + + if ( type != that.type ) + { + return false; + } + if ( targetClass != that.targetClass ) + { + return false; + } + return true; + } + + @Override + public int hashCode( ) + { + int result = targetClass.hashCode( ); + if(type!=null) + result = 31 * result + type.hashCode(); + return result; + } +} Added: commons/proper/ognl/branches/new-cache-approach/src/main/java/org/apache/commons/ognl/internal/entry/DeclaredMethodCacheEntryFactory.java URL: http://svn.apache.org/viewvc/commons/proper/ognl/branches/new-cache-approach/src/main/java/org/apache/commons/ognl/internal/entry/DeclaredMethodCacheEntryFactory.java?rev=1184773&view=auto ============================================================================== --- commons/proper/ognl/branches/new-cache-approach/src/main/java/org/apache/commons/ognl/internal/entry/DeclaredMethodCacheEntryFactory.java (added) +++ commons/proper/ognl/branches/new-cache-approach/src/main/java/org/apache/commons/ognl/internal/entry/DeclaredMethodCacheEntryFactory.java Sun Oct 16 07:32:17 2011 @@ -0,0 +1,56 @@ +/* + * $Id: $ + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.commons.ognl.internal.entry; + +import java.lang.reflect.Method; +import java.lang.reflect.Modifier; + +/** + * User: mcucchiara + * Date: 13/10/11 + * Time: 13.00 + */ +public class DeclaredMethodCacheEntryFactory + extends MethodCacheEntryFactory<DeclaredMethodCacheEntry> +{ + @Override + protected boolean shouldCache( DeclaredMethodCacheEntry key, Method method ) + { + if ( key.type == null ) + { + return true; + } + else + { + boolean isStatic = Modifier.isStatic( method.getModifiers( ) ); + if ( key.type == DeclaredMethodCacheEntry.MethodType.STATIC ) + { + return isStatic; + } + else + { + return !isStatic; + } + } + + } +} Added: commons/proper/ognl/branches/new-cache-approach/src/main/java/org/apache/commons/ognl/internal/entry/FiedlCacheCacheEntryFactory.java URL: http://svn.apache.org/viewvc/commons/proper/ognl/branches/new-cache-approach/src/main/java/org/apache/commons/ognl/internal/entry/FiedlCacheCacheEntryFactory.java?rev=1184773&view=auto ============================================================================== --- commons/proper/ognl/branches/new-cache-approach/src/main/java/org/apache/commons/ognl/internal/entry/FiedlCacheCacheEntryFactory.java (added) +++ commons/proper/ognl/branches/new-cache-approach/src/main/java/org/apache/commons/ognl/internal/entry/FiedlCacheCacheEntryFactory.java Sun Oct 16 07:32:17 2011 @@ -0,0 +1,30 @@ +package org.apache.commons.ognl.internal.entry; + +import org.apache.commons.ognl.internal.CacheException; +import org.apache.commons.ognl.internal.entry.ClassCacheEntryFactory; + +import java.lang.reflect.Field; +import java.util.HashMap; +import java.util.Map; + +/** + * User: Maurizio Cucchiara + * Date: 10/15/11 + * Time: 9:47 AM + */ +public class FiedlCacheCacheEntryFactory + implements ClassCacheEntryFactory<Map<String, Field>> +{ + public Map<String, Field> create( Class<?> key ) + throws CacheException + { + Field[] declaredFields = key.getDeclaredFields( ); + HashMap<String, Field> result = new HashMap<String, Field>( declaredFields.length ); + for ( Field field : declaredFields ) + { + result.put( field.getName( ), field ); + } + return result; + } +} + Added: commons/proper/ognl/branches/new-cache-approach/src/main/java/org/apache/commons/ognl/internal/entry/MatchingCacheEntryFactory.java URL: http://svn.apache.org/viewvc/commons/proper/ognl/branches/new-cache-approach/src/main/java/org/apache/commons/ognl/internal/entry/MatchingCacheEntryFactory.java?rev=1184773&view=auto ============================================================================== --- commons/proper/ognl/branches/new-cache-approach/src/main/java/org/apache/commons/ognl/internal/entry/MatchingCacheEntryFactory.java (added) +++ commons/proper/ognl/branches/new-cache-approach/src/main/java/org/apache/commons/ognl/internal/entry/MatchingCacheEntryFactory.java Sun Oct 16 07:32:17 2011 @@ -0,0 +1,36 @@ +/* + * $Id: $ + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.commons.ognl.internal.entry; + +import org.apache.commons.ognl.internal.CacheException; +import org.apache.commons.ognl.internal.entry.CacheEntryFactory; + +/** + * User: mcucchiara + * Date: 12/10/11 + * Time: 18.56 + */ +public interface MatchingCacheEntryFactory<K,V> extends CacheEntryFactory<K,V> +{ + boolean match( V v ) + throws CacheException; +} Added: commons/proper/ognl/branches/new-cache-approach/src/main/java/org/apache/commons/ognl/internal/entry/MatchingClassCacheEntryFactory.java URL: http://svn.apache.org/viewvc/commons/proper/ognl/branches/new-cache-approach/src/main/java/org/apache/commons/ognl/internal/entry/MatchingClassCacheEntryFactory.java?rev=1184773&view=auto ============================================================================== --- commons/proper/ognl/branches/new-cache-approach/src/main/java/org/apache/commons/ognl/internal/entry/MatchingClassCacheEntryFactory.java (added) +++ commons/proper/ognl/branches/new-cache-approach/src/main/java/org/apache/commons/ognl/internal/entry/MatchingClassCacheEntryFactory.java Sun Oct 16 07:32:17 2011 @@ -0,0 +1,32 @@ +/* + * $Id: $ + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.commons.ognl.internal.entry; + +/** + * User: mcucchiara + * Date: 13/10/11 + * Time: 12.36 + */ +public interface MatchingClassCacheEntryFactory<T> + extends MatchingCacheEntryFactory<Class<?>, T>, ClassCacheEntryFactory<T> +{ +} Added: commons/proper/ognl/branches/new-cache-approach/src/main/java/org/apache/commons/ognl/internal/entry/MethodCacheEntry.java URL: http://svn.apache.org/viewvc/commons/proper/ognl/branches/new-cache-approach/src/main/java/org/apache/commons/ognl/internal/entry/MethodCacheEntry.java?rev=1184773&view=auto ============================================================================== --- commons/proper/ognl/branches/new-cache-approach/src/main/java/org/apache/commons/ognl/internal/entry/MethodCacheEntry.java (added) +++ commons/proper/ognl/branches/new-cache-approach/src/main/java/org/apache/commons/ognl/internal/entry/MethodCacheEntry.java Sun Oct 16 07:32:17 2011 @@ -0,0 +1,16 @@ +package org.apache.commons.ognl.internal.entry; + +/** + * User: Maurizio Cucchiara + * Date: 10/15/11 + * Time: 1:54 PM + */ +public class MethodCacheEntry implements CacheEntry +{ + public Class<?> targetClass; + + public MethodCacheEntry( Class<?> targetClass ) + { + this.targetClass = targetClass; + } +} Added: commons/proper/ognl/branches/new-cache-approach/src/main/java/org/apache/commons/ognl/internal/entry/MethodCacheEntryFactory.java URL: http://svn.apache.org/viewvc/commons/proper/ognl/branches/new-cache-approach/src/main/java/org/apache/commons/ognl/internal/entry/MethodCacheEntryFactory.java?rev=1184773&view=auto ============================================================================== --- commons/proper/ognl/branches/new-cache-approach/src/main/java/org/apache/commons/ognl/internal/entry/MethodCacheEntryFactory.java (added) +++ commons/proper/ognl/branches/new-cache-approach/src/main/java/org/apache/commons/ognl/internal/entry/MethodCacheEntryFactory.java Sun Oct 16 07:32:17 2011 @@ -0,0 +1,58 @@ +package org.apache.commons.ognl.internal.entry; + +import org.apache.commons.ognl.OgnlRuntime; +import org.apache.commons.ognl.internal.CacheException; + +import java.lang.reflect.Method; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * User: Maurizio Cucchiara + * Date: 10/15/11 + * Time: 4:42 PM + */ +public abstract class MethodCacheEntryFactory<T extends MethodCacheEntry> + implements CacheEntryFactory<T,Map<String, List<Method>>> +{ + public Map<String, List<Method>> create( T key ) + throws CacheException + { + Map<String, List<Method>> result = new HashMap<String, List<Method>>( 23 ); + + Class<?> c = key.targetClass; + while ( c != null ) + { + Method[] ma = c.getDeclaredMethods( ); + + for ( Method method : ma ) + { + // skip over synthetic methods + + if ( !OgnlRuntime.isMethodCallable( method ) ) + { + continue; + } + + if ( shouldCache( key, method ) ) + { + List<Method> ml = result.get( method.getName( ) ); + + if ( ml == null ) + { + ml = new ArrayList<Method>( ); + result.put( method.getName( ), ml ); + } + + ml.add( method ); + } + } + c = c.getSuperclass( ); + } + return result; + } + + protected abstract boolean shouldCache( T key, Method method ); +} Added: commons/proper/ognl/branches/new-cache-approach/src/main/java/org/apache/commons/ognl/internal/entry/ParametrizedCacheEntryFactory.java URL: http://svn.apache.org/viewvc/commons/proper/ognl/branches/new-cache-approach/src/main/java/org/apache/commons/ognl/internal/entry/ParametrizedCacheEntryFactory.java?rev=1184773&view=auto ============================================================================== --- commons/proper/ognl/branches/new-cache-approach/src/main/java/org/apache/commons/ognl/internal/entry/ParametrizedCacheEntryFactory.java (added) +++ commons/proper/ognl/branches/new-cache-approach/src/main/java/org/apache/commons/ognl/internal/entry/ParametrizedCacheEntryFactory.java Sun Oct 16 07:32:17 2011 @@ -0,0 +1,29 @@ +/* + * $Id: $ + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.commons.ognl.internal.entry; + +import java.util.Map; + +public interface ParametrizedCacheEntryFactory +{ + void setParameterValues( Map<String, String> parameters ); +} Added: commons/proper/ognl/branches/new-cache-approach/src/main/java/org/apache/commons/ognl/internal/entry/PermissionCacheEntry.java URL: http://svn.apache.org/viewvc/commons/proper/ognl/branches/new-cache-approach/src/main/java/org/apache/commons/ognl/internal/entry/PermissionCacheEntry.java?rev=1184773&view=auto ============================================================================== --- commons/proper/ognl/branches/new-cache-approach/src/main/java/org/apache/commons/ognl/internal/entry/PermissionCacheEntry.java (added) +++ commons/proper/ognl/branches/new-cache-approach/src/main/java/org/apache/commons/ognl/internal/entry/PermissionCacheEntry.java Sun Oct 16 07:32:17 2011 @@ -0,0 +1,41 @@ +package org.apache.commons.ognl.internal.entry; + +import java.lang.reflect.Method; + +public class PermissionCacheEntry implements CacheEntry +{ + public Method method; + + public PermissionCacheEntry( Method method ) + { + this.method = method; + } + + @Override + public boolean equals( Object o ) + { + if ( this == o ) + { + return true; + } + if ( !( o instanceof PermissionCacheEntry ) ) + { + return false; + } + + PermissionCacheEntry that = (PermissionCacheEntry) o; + + if ( method != null ? !method.equals( that.method ) : that.method != null ) + { + return false; + } + + return true; + } + + @Override + public int hashCode( ) + { + return method != null ? method.hashCode( ) : 0; + } +} Added: commons/proper/ognl/branches/new-cache-approach/src/main/java/org/apache/commons/ognl/internal/entry/PermissionCacheEntryFactory.java URL: http://svn.apache.org/viewvc/commons/proper/ognl/branches/new-cache-approach/src/main/java/org/apache/commons/ognl/internal/entry/PermissionCacheEntryFactory.java?rev=1184773&view=auto ============================================================================== --- commons/proper/ognl/branches/new-cache-approach/src/main/java/org/apache/commons/ognl/internal/entry/PermissionCacheEntryFactory.java (added) +++ commons/proper/ognl/branches/new-cache-approach/src/main/java/org/apache/commons/ognl/internal/entry/PermissionCacheEntryFactory.java Sun Oct 16 07:32:17 2011 @@ -0,0 +1,23 @@ +package org.apache.commons.ognl.internal.entry; + +import org.apache.commons.ognl.OgnlInvokePermission; +import org.apache.commons.ognl.internal.CacheException; + +import java.security.Permission; + +/** + * User: Maurizio Cucchiara + * Date: 10/14/11 + * Time: 9:53 PM + */ +public class PermissionCacheEntryFactory + implements CacheEntryFactory<PermissionCacheEntry,Permission> +{ + + public Permission create( PermissionCacheEntry key ) + throws CacheException + { + return new OgnlInvokePermission( "invoke." + key.method.getDeclaringClass( ).getName() + "." + key.method.getName( ) ); + } +} + Added: commons/proper/ognl/branches/new-cache-approach/src/main/java/org/apache/commons/ognl/internal/entry/PropertyDescriptorCacheEntryFactory.java URL: http://svn.apache.org/viewvc/commons/proper/ognl/branches/new-cache-approach/src/main/java/org/apache/commons/ognl/internal/entry/PropertyDescriptorCacheEntryFactory.java?rev=1184773&view=auto ============================================================================== --- commons/proper/ognl/branches/new-cache-approach/src/main/java/org/apache/commons/ognl/internal/entry/PropertyDescriptorCacheEntryFactory.java (added) +++ commons/proper/ognl/branches/new-cache-approach/src/main/java/org/apache/commons/ognl/internal/entry/PropertyDescriptorCacheEntryFactory.java Sun Oct 16 07:32:17 2011 @@ -0,0 +1,84 @@ +package org.apache.commons.ognl.internal.entry; + +import org.apache.commons.ognl.OgnlException; +import org.apache.commons.ognl.OgnlRuntime; +import org.apache.commons.ognl.internal.CacheException; + +import java.beans.IntrospectionException; +import java.beans.Introspector; +import java.beans.PropertyDescriptor; +import java.lang.reflect.Method; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * User: Maurizio Cucchiara + * Date: 10/15/11 + * Time: 8:08 AM + */ +public class PropertyDescriptorCacheEntryFactory + implements CacheEntryFactory<Class<?>, Map<String,PropertyDescriptor>> +{ + public Map<String,PropertyDescriptor> create( Class<?> targetClass) + throws CacheException + { + Map<String, PropertyDescriptor> result = new HashMap<String, PropertyDescriptor>( 101 ); + PropertyDescriptor[] pda; + try + { + pda = Introspector.getBeanInfo( targetClass ).getPropertyDescriptors( ); + + for ( int i = 0, icount = pda.length; i < icount; i++ ) + { + // workaround for Introspector bug 6528714 (bugs.sun.com) + if ( pda[i].getReadMethod( ) != null && !OgnlRuntime.isMethodCallable( pda[i].getReadMethod( ) ) ) + { + pda[i].setReadMethod( + findClosestMatchingMethod( targetClass, pda[i].getReadMethod( ), pda[i].getName( ), + pda[i].getPropertyType( ), true ) ); + } + if ( pda[i].getWriteMethod( ) != null && !OgnlRuntime.isMethodCallable( pda[i].getWriteMethod( ) ) ) + { + pda[i].setWriteMethod( + findClosestMatchingMethod( targetClass, pda[i].getWriteMethod( ), pda[i].getName( ), + pda[i].getPropertyType( ), false ) ); + } + + result.put( pda[i].getName( ), pda[i] ); + } + + OgnlRuntime.findObjectIndexedPropertyDescriptors( targetClass, result ); + } + catch ( IntrospectionException e ) + { + throw new CacheException( e ); + } + catch ( OgnlException e ) + { + throw new CacheException( e ); + } + return result; + } + + static Method findClosestMatchingMethod( Class<?> targetClass, Method m, String propertyName, Class<?> propertyType, + boolean isReadMethod ) + throws OgnlException + { + List<Method> methods = OgnlRuntime.getDeclaredMethods( targetClass, propertyName, !isReadMethod ); + + for ( Method method : methods ) + { + if ( method.getName( ).equals( m.getName( ) ) && m.getReturnType( ).isAssignableFrom( m.getReturnType( ) ) + && method.getReturnType( ) == propertyType + && method.getParameterTypes( ).length == m.getParameterTypes( ).length ) + { + return method; + } + } + + return m; + } + + +} Added: commons/proper/ognl/branches/new-cache-approach/src/test/java/org/apache/commons/ognl/internal/ConcurrentHashMapCacheTest.java URL: http://svn.apache.org/viewvc/commons/proper/ognl/branches/new-cache-approach/src/test/java/org/apache/commons/ognl/internal/ConcurrentHashMapCacheTest.java?rev=1184773&view=auto ============================================================================== --- commons/proper/ognl/branches/new-cache-approach/src/test/java/org/apache/commons/ognl/internal/ConcurrentHashMapCacheTest.java (added) +++ commons/proper/ognl/branches/new-cache-approach/src/test/java/org/apache/commons/ognl/internal/ConcurrentHashMapCacheTest.java Sun Oct 16 07:32:17 2011 @@ -0,0 +1,106 @@ +/* + * $Id: $ + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.commons.ognl.internal; + +import org.apache.commons.ognl.internal.entry.CacheEntryFactory; +import org.apache.commons.ognl.test.objects.Bean2; +import org.junit.Test; + +import java.lang.reflect.Method; +import java.util.ArrayList; +import java.util.List; + +import static junit.framework.Assert.assertNotNull; +import static org.junit.Assert.assertFalse; + +/** + * User: mcucchiara + * Date: 13/10/11 + * Time: 19.22 + */ +public class ConcurrentHashMapCacheTest +{ + private ConcurrentHashMapCacheTest.DummyEntryFactory entryFactory=new DummyEntryFactory( ); + private Cache<CacheEntry, List<Method>> cache = new ConcurrentHashMapCache<CacheEntry, List<Method>>( entryFactory ); + + + @Test + public void testGet( ) + throws Exception + { + + getMethods( new CacheEntry( Bean2.class, "bean3" ) ); + getMethods( new CacheEntry( Bean2.class, "id" ) ); + } + + private void getMethods( CacheEntry entry ) + throws CacheException + { + List<Method> methods = cache.get( entry); + assertNotNull( methods ); + assertFalse( methods.isEmpty( ) ); + } + + private class CacheEntry + { + private Class<?> clazz; + + private String methodName; + + private CacheEntry( Class<?> clazz, String methodName ) + { + this.clazz = clazz; + this.methodName = methodName; + } + + public Class<?> getClazz( ) + { + return clazz; + } + + public String getMethodName( ) + { + return methodName; + } + } + + private class DummyEntryFactory + implements CacheEntryFactory<CacheEntry, List<Method>> + { + public List<Method> create( CacheEntry key ) + throws CacheException + { + Method[] methods = key.getClazz( ).getMethods( ); + List<Method> list = new ArrayList<Method>( ); + for ( Method method : methods ) + { + String name = method.getName( ); + boolean isGet = name.substring( 3, name.length( ) ).equalsIgnoreCase( key.getMethodName( ) ); + if ( isGet ) + { + list.add( method ); + } + } + return list; + } + } +} Added: commons/proper/ognl/branches/new-cache-approach/src/test/java/org/apache/commons/ognl/internal/ConstructorCacheTest.java URL: http://svn.apache.org/viewvc/commons/proper/ognl/branches/new-cache-approach/src/test/java/org/apache/commons/ognl/internal/ConstructorCacheTest.java?rev=1184773&view=auto ============================================================================== --- commons/proper/ognl/branches/new-cache-approach/src/test/java/org/apache/commons/ognl/internal/ConstructorCacheTest.java (added) +++ commons/proper/ognl/branches/new-cache-approach/src/test/java/org/apache/commons/ognl/internal/ConstructorCacheTest.java Sun Oct 16 07:32:17 2011 @@ -0,0 +1,41 @@ +package org.apache.commons.ognl.internal; + +import org.apache.commons.ognl.internal.entry.CacheEntryFactory; +import org.apache.commons.ognl.test.objects.Root; +import org.junit.Test; + +import java.lang.reflect.Constructor; +import java.util.Arrays; +import java.util.List; + +import static junit.framework.Assert.assertEquals; +import static junit.framework.Assert.assertNotNull; + +/** + * User: Maurizio Cucchiara + * Date: 10/16/11 + * Time: 8:43 AM + */ +public class ConstructorCacheTest +{ + private int count; + ClassCache<List<Constructor<?>>> cache = new ConcurrentClassCache<List<Constructor<?>>>(new CacheEntryFactory<Class<?>, List<Constructor<?>>>( ) + { + public List<Constructor<?>> create( Class<?> key ) + throws CacheException + { + count++; + return Arrays.asList( key.getConstructors( ) ); + } + }); + + @Test + public void testGet() + throws CacheException + { + List<Constructor<?>> constructors = cache.get( Root.class ); + assertNotNull( constructors ); + cache.get( Root.class ); + assertEquals( 1, count); + } +} Added: commons/proper/ognl/branches/new-cache-approach/src/test/java/org/apache/commons/ognl/internal/DeclaredMethodCacheTest.java URL: http://svn.apache.org/viewvc/commons/proper/ognl/branches/new-cache-approach/src/test/java/org/apache/commons/ognl/internal/DeclaredMethodCacheTest.java?rev=1184773&view=auto ============================================================================== --- commons/proper/ognl/branches/new-cache-approach/src/test/java/org/apache/commons/ognl/internal/DeclaredMethodCacheTest.java (added) +++ commons/proper/ognl/branches/new-cache-approach/src/test/java/org/apache/commons/ognl/internal/DeclaredMethodCacheTest.java Sun Oct 16 07:32:17 2011 @@ -0,0 +1,43 @@ +package org.apache.commons.ognl.internal; + +import org.apache.commons.ognl.internal.entry.DeclaredMethodCacheEntry; +import org.apache.commons.ognl.internal.entry.DeclaredMethodCacheEntryFactory; +import org.apache.commons.ognl.test.objects.Root; +import org.junit.Test; + +import java.lang.reflect.Method; +import java.util.List; +import java.util.Map; + +import static junit.framework.Assert.assertNotNull; +import static junit.framework.Assert.assertTrue; + +/** + * User: Maurizio Cucchiara + * Date: 10/15/11 + * Time: 9:18 AM + */ +public class DeclaredMethodCacheTest +{ + Cache<DeclaredMethodCacheEntry, Map<String, List<Method>>> cache = + new ConcurrentHashMapCache<DeclaredMethodCacheEntry, Map<String, List<Method>>>(new DeclaredMethodCacheEntryFactory( ) ); + + @Test + public void testStaticGet( ) + throws Exception + { + Map<String, List<Method>> methods = cache.get( new DeclaredMethodCacheEntry( Root.class, DeclaredMethodCacheEntry.MethodType.STATIC) ); + assertNotNull( methods ); + assertTrue( methods.containsKey( "getStaticInt" ) ); + } + + @Test + public void testNonStaticGet( ) + throws Exception + { + Map<String, List<Method>> methods = cache.get( new DeclaredMethodCacheEntry( Root.class, DeclaredMethodCacheEntry.MethodType.NON_STATIC ) ); + assertNotNull( methods ); + assertTrue( methods.containsKey( "format" ) ); + } + +} Added: commons/proper/ognl/branches/new-cache-approach/src/test/java/org/apache/commons/ognl/internal/FieldCacheTest.java URL: http://svn.apache.org/viewvc/commons/proper/ognl/branches/new-cache-approach/src/test/java/org/apache/commons/ognl/internal/FieldCacheTest.java?rev=1184773&view=auto ============================================================================== --- commons/proper/ognl/branches/new-cache-approach/src/test/java/org/apache/commons/ognl/internal/FieldCacheTest.java (added) +++ commons/proper/ognl/branches/new-cache-approach/src/test/java/org/apache/commons/ognl/internal/FieldCacheTest.java Sun Oct 16 07:32:17 2011 @@ -0,0 +1,39 @@ +package org.apache.commons.ognl.internal; + +import org.apache.commons.ognl.internal.entry.FiedlCacheCacheEntryFactory; +import org.apache.commons.ognl.test.objects.Bean2; +import org.junit.Test; + +import java.lang.reflect.Field; +import java.util.Map; + +import static junit.framework.Assert.assertNotNull; +import static junit.framework.Assert.assertTrue; + +/** + * User: Maurizio Cucchiara + * Date: 10/15/11 + * Time: 8:00 AM + */ +public class FieldCacheTest +{ + ConcurrentHashMapCache<Class<?>, Map<String,Field>> cache = + new ConcurrentHashMapCache<Class<?>, Map<String,Field>>( new FiedlCacheCacheEntryFactory()); + + @Test + public void testGet( ) + throws Exception + { + Map<String, Field> d = getFields( Bean2.class ); + assertTrue( d.containsKey( "bean3" ) ); + assertTrue( d.containsKey( "_pageBreakAfter" ) ); + } + + private Map<String, Field> getFields( Class<?> entry ) + throws CacheException + { + Map<String, Field> descriptor = cache.get( entry ); + assertNotNull( descriptor ); + return descriptor; + } +} Added: commons/proper/ognl/branches/new-cache-approach/src/test/java/org/apache/commons/ognl/internal/PermissionCacheTest.java URL: http://svn.apache.org/viewvc/commons/proper/ognl/branches/new-cache-approach/src/test/java/org/apache/commons/ognl/internal/PermissionCacheTest.java?rev=1184773&view=auto ============================================================================== --- commons/proper/ognl/branches/new-cache-approach/src/test/java/org/apache/commons/ognl/internal/PermissionCacheTest.java (added) +++ commons/proper/ognl/branches/new-cache-approach/src/test/java/org/apache/commons/ognl/internal/PermissionCacheTest.java Sun Oct 16 07:32:17 2011 @@ -0,0 +1,37 @@ +package org.apache.commons.ognl.internal; + +import org.apache.commons.ognl.internal.entry.PermissionCacheEntry; +import org.apache.commons.ognl.internal.entry.PermissionCacheEntryFactory; +import org.apache.commons.ognl.test.objects.Bean2; +import org.junit.Test; + +import java.security.Permission; + +import static junit.framework.Assert.assertNotNull; + +/** + * User: Maurizio Cucchiara + * Date: 10/15/11 + * Time: 8:00 AM + */ +public class PermissionCacheTest +{ + ConcurrentHashMapCache<PermissionCacheEntry, Permission> cache = + new ConcurrentHashMapCache<PermissionCacheEntry, Permission>( new PermissionCacheEntryFactory()); + + @Test + public void testGet( ) + throws Exception + { + + getPermission( new PermissionCacheEntry( Bean2.class.getMethod( "getBean3" ) ) ); + getPermission( new PermissionCacheEntry( Bean2.class.getMethod( "getId" ) ) ); + } + + private void getPermission( PermissionCacheEntry entry ) + throws CacheException + { + Permission permission = cache.get( entry ); + assertNotNull( permission ); + } +} Added: commons/proper/ognl/branches/new-cache-approach/src/test/java/org/apache/commons/ognl/internal/PropertyDescriptorCache.java URL: http://svn.apache.org/viewvc/commons/proper/ognl/branches/new-cache-approach/src/test/java/org/apache/commons/ognl/internal/PropertyDescriptorCache.java?rev=1184773&view=auto ============================================================================== --- commons/proper/ognl/branches/new-cache-approach/src/test/java/org/apache/commons/ognl/internal/PropertyDescriptorCache.java (added) +++ commons/proper/ognl/branches/new-cache-approach/src/test/java/org/apache/commons/ognl/internal/PropertyDescriptorCache.java Sun Oct 16 07:32:17 2011 @@ -0,0 +1,40 @@ +package org.apache.commons.ognl.internal; + +import org.apache.commons.ognl.internal.entry.PropertyDescriptorCacheEntryFactory; +import org.apache.commons.ognl.test.objects.Bean2; +import org.junit.Test; + +import java.beans.PropertyDescriptor; +import java.util.Map; + +import static junit.framework.Assert.assertNotNull; +import static junit.framework.Assert.assertTrue; + +/** + * User: Maurizio Cucchiara + * Date: 10/15/11 + * Time: 8:00 AM + */ +public class PropertyDescriptorCache +{ + ConcurrentHashMapCache<Class<?>, Map<String,PropertyDescriptor>> cache = + new ConcurrentHashMapCache<Class<?>, Map<String,PropertyDescriptor>>( new PropertyDescriptorCacheEntryFactory()); + + @Test + public void testGet( ) + throws Exception + { + Map<String, PropertyDescriptor> d = getPropertyDescriptor( Bean2.class ); + assertTrue( d.containsKey( "id" ) ); + assertTrue( d.containsKey( "bean3" ) ); + assertTrue( d.containsKey( "carrier" ) ); + } + + private Map<String, PropertyDescriptor> getPropertyDescriptor( Class<?> entry ) + throws CacheException + { + Map<String, PropertyDescriptor> descriptor = cache.get( entry ); + assertNotNull( descriptor ); + return descriptor; + } +}