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;
+    }
+}


Reply via email to