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