You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openwebbeans.apache.org by ge...@apache.org on 2010/04/28 10:38:16 UTC
svn commit: r938818 - in
/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans:
config/ lifecycle/ portable/
Author: gerdogdu
Date: Wed Apr 28 08:38:16 2010
New Revision: 938818
URL: http://svn.apache.org/viewvc?rev=938818&view=rev
Log:
Cache of Annotated types.
Modified:
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/config/OwbParametrizedTypeImpl.java
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/lifecycle/AbstractLifeCycle.java
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/portable/AbstractAnnotated.java
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/portable/AbstractAnnotatedMember.java
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/portable/AnnotatedElementFactory.java
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/portable/AnnotatedParameterImpl.java
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/portable/AnnotatedTypeImpl.java
Modified: openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/config/OwbParametrizedTypeImpl.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/config/OwbParametrizedTypeImpl.java?rev=938818&r1=938817&r2=938818&view=diff
==============================================================================
--- openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/config/OwbParametrizedTypeImpl.java (original)
+++ openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/config/OwbParametrizedTypeImpl.java Wed Apr 28 08:38:16 2010
@@ -23,7 +23,7 @@ import java.lang.reflect.Type;
public class OwbParametrizedTypeImpl implements ParameterizedType
{
- private Class<?> clazz;
+ private final Class<?> clazz;
public OwbParametrizedTypeImpl(Class<?> clazz)
{
Modified: openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/lifecycle/AbstractLifeCycle.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/lifecycle/AbstractLifeCycle.java?rev=938818&r1=938817&r2=938818&view=diff
==============================================================================
--- openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/lifecycle/AbstractLifeCycle.java (original)
+++ openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/lifecycle/AbstractLifeCycle.java Wed Apr 28 08:38:16 2010
@@ -31,6 +31,7 @@ import org.apache.webbeans.container.Inj
import org.apache.webbeans.corespi.ServiceLoader;
import org.apache.webbeans.logger.WebBeansLogger;
import org.apache.webbeans.plugins.PluginLoader;
+import org.apache.webbeans.portable.AnnotatedElementFactory;
import org.apache.webbeans.portable.events.ExtensionLoader;
import org.apache.webbeans.portable.events.discovery.BeforeShutdownImpl;
import org.apache.webbeans.proxy.JavassistProxyFactory;
@@ -160,6 +161,9 @@ public abstract class AbstractLifeCycle
//Delte proxies
JavassistProxyFactory.clear();
+ //Delete AnnotateTypeCache
+ AnnotatedElementFactory.clear();
+
//After Stop
afterStopApplication(endObject);
Modified: openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/portable/AbstractAnnotated.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/portable/AbstractAnnotated.java?rev=938818&r1=938817&r2=938818&view=diff
==============================================================================
--- openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/portable/AbstractAnnotated.java (original)
+++ openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/portable/AbstractAnnotated.java Wed Apr 28 08:38:16 2010
@@ -30,7 +30,7 @@ import org.apache.webbeans.util.ClassUti
abstract class AbstractAnnotated implements Annotated
{
/**Base type of an annotated element*/
- private Type baseType = null;
+ private final Type baseType;
/**Type closures*/
private Set<Type> typeClosures = new HashSet<Type>();
Modified: openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/portable/AbstractAnnotatedMember.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/portable/AbstractAnnotatedMember.java?rev=938818&r1=938817&r2=938818&view=diff
==============================================================================
--- openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/portable/AbstractAnnotatedMember.java (original)
+++ openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/portable/AbstractAnnotatedMember.java Wed Apr 28 08:38:16 2010
@@ -37,10 +37,10 @@ import org.apache.webbeans.util.ClassUti
abstract class AbstractAnnotatedMember<X> extends AbstractAnnotated implements AnnotatedMember<X>
{
/**Annotated type that owns this member*/
- private AnnotatedType<X> declaringType;
+ private final AnnotatedType<X> declaringType;
/**Member type*/
- protected Member javaMember;
+ protected final Member javaMember;
/**
* Creates a new instance.
Modified: openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/portable/AnnotatedElementFactory.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/portable/AnnotatedElementFactory.java?rev=938818&r1=938817&r2=938818&view=diff
==============================================================================
--- openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/portable/AnnotatedElementFactory.java (original)
+++ openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/portable/AnnotatedElementFactory.java Wed Apr 28 08:38:16 2010
@@ -16,6 +16,8 @@ package org.apache.webbeans.portable;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ConcurrentMap;
import javax.enterprise.inject.spi.Annotated;
import javax.enterprise.inject.spi.AnnotatedConstructor;
@@ -23,6 +25,7 @@ import javax.enterprise.inject.spi.Annot
import javax.enterprise.inject.spi.AnnotatedMethod;
import javax.enterprise.inject.spi.AnnotatedType;
+import org.apache.webbeans.util.Asserts;
import org.apache.webbeans.util.SecurityUtil;
/**
@@ -32,6 +35,25 @@ import org.apache.webbeans.util.Security
*/
public final class AnnotatedElementFactory
{
+ //Cache of the AnnotatedType
+ private static ConcurrentMap<Class<?>, AnnotatedType<?>> annotatedTypeCache =
+ new ConcurrentHashMap<Class<?>, AnnotatedType<?>>();
+
+ //Cache of AnnotatedConstructor
+ private static ConcurrentMap<Constructor<?>, AnnotatedConstructor<?>> annotatedConstructorCache =
+ new ConcurrentHashMap<Constructor<?>, AnnotatedConstructor<?>>();
+
+ //Cache of AnnotatedMethod
+ private static ConcurrentMap<Method, AnnotatedMethod<?>> annotatedMethodCache =
+ new ConcurrentHashMap<Method, AnnotatedMethod<?>>();
+
+ //Cache of AnnotatedField
+ private static ConcurrentMap<Field, AnnotatedField<?>> annotatedFieldCache =
+ new ConcurrentHashMap<Field, AnnotatedField<?>>();
+
+ /**
+ * No instantiate.
+ */
private AnnotatedElementFactory()
{
// Emtpty
@@ -47,27 +69,42 @@ public final class AnnotatedElementFacto
@SuppressWarnings("unchecked")
public static <X> AnnotatedType<X> newAnnotatedType(Class<X> annotatedClass)
{
- AnnotatedTypeImpl<X> annotatedType = new AnnotatedTypeImpl<X>(annotatedClass);
-
- Field[] fields = SecurityUtil.doPrivilegedGetDeclaredFields(annotatedClass);
- Method[] methods = SecurityUtil.doPrivilegedGetDeclaredMethods(annotatedClass);
- Constructor<X>[] ctxs = (Constructor<X>[])SecurityUtil.doPrivilegedGetDeclaredConstructors(annotatedClass);
- for(Field f : fields)
- {
- AnnotatedField<X> af = new AnnotatedFieldImpl<X>(f, annotatedType);
- annotatedType.addAnnotatedField(af);
- }
-
- for(Method m : methods)
+ Asserts.assertNotNull(annotatedClass, "annotatedClass is null");
+ AnnotatedTypeImpl<X> annotatedType = null;
+ if(annotatedTypeCache.containsKey(annotatedClass))
{
- AnnotatedMethod<X> am = new AnnotatedMethodImpl<X>(m,annotatedType);
- annotatedType.addAnnotatedMethod(am);
+ annotatedType = (AnnotatedTypeImpl<X>)annotatedTypeCache.get(annotatedClass);
}
-
- for(Constructor<X> ct : ctxs)
+ else
{
- AnnotatedConstructor<X> ac = new AnnotatedConstructorImpl<X>(ct,annotatedType);
- annotatedType.addAnnotatedConstructor(ac);
+ annotatedType = new AnnotatedTypeImpl<X>(annotatedClass);
+
+ Field[] fields = SecurityUtil.doPrivilegedGetDeclaredFields(annotatedClass);
+ Method[] methods = SecurityUtil.doPrivilegedGetDeclaredMethods(annotatedClass);
+ Constructor<X>[] ctxs = (Constructor<X>[])SecurityUtil.doPrivilegedGetDeclaredConstructors(annotatedClass);
+ for(Field f : fields)
+ {
+ AnnotatedField<X> af = new AnnotatedFieldImpl<X>(f, annotatedType);
+ annotatedType.addAnnotatedField(af);
+ }
+
+ for(Method m : methods)
+ {
+ AnnotatedMethod<X> am = new AnnotatedMethodImpl<X>(m,annotatedType);
+ annotatedType.addAnnotatedMethod(am);
+ }
+
+ for(Constructor<X> ct : ctxs)
+ {
+ AnnotatedConstructor<X> ac = new AnnotatedConstructorImpl<X>(ct,annotatedType);
+ annotatedType.addAnnotatedConstructor(ac);
+ }
+
+ AnnotatedTypeImpl<X> oldType = (AnnotatedTypeImpl<X>)annotatedTypeCache.putIfAbsent(annotatedClass, annotatedType);
+ if(oldType != null)
+ {
+ annotatedType = oldType;
+ }
}
return annotatedType;
@@ -80,9 +117,26 @@ public final class AnnotatedElementFacto
* @param constructor constructor
* @return new annotated constructor
*/
+ @SuppressWarnings("unchecked")
public static <X> AnnotatedConstructor<X> newAnnotatedConstructor(Constructor<X> constructor)
{
- return new AnnotatedConstructorImpl<X>(constructor);
+ Asserts.assertNotNull(constructor, "constructor is null");
+ AnnotatedConstructorImpl<X> annConstructor = null;
+ if(annotatedConstructorCache.containsKey(constructor))
+ {
+ annConstructor = (AnnotatedConstructorImpl<X>)annotatedConstructorCache.get(constructor);
+ }
+ else
+ {
+ annConstructor = new AnnotatedConstructorImpl<X>(constructor);
+ AnnotatedConstructorImpl<X> old = (AnnotatedConstructorImpl<X>)annotatedConstructorCache.putIfAbsent(constructor, annConstructor);
+ if(old != null)
+ {
+ annConstructor = old;
+ }
+ }
+
+ return annConstructor;
}
/**
@@ -93,9 +147,28 @@ public final class AnnotatedElementFacto
* @param declaringClass declaring class
* @return new annotated field
*/
+ @SuppressWarnings("unchecked")
public static <X> AnnotatedField<X> newAnnotatedField(Field field, Class<X> declaringClass)
{
- return new AnnotatedFieldImpl<X>(field);
+ Asserts.assertNotNull(field, "field is null");
+ Asserts.assertNotNull(declaringClass, "declaringClass is null");
+
+ AnnotatedFieldImpl<X> annotField = null;
+ if(annotatedFieldCache.containsKey(field))
+ {
+ annotField = (AnnotatedFieldImpl<X>)annotatedFieldCache.get(field);
+ }
+ else
+ {
+ annotField = new AnnotatedFieldImpl<X>(field);
+ AnnotatedFieldImpl<X> old = (AnnotatedFieldImpl<X>) annotatedFieldCache.putIfAbsent(field, annotField);
+ if(old != null)
+ {
+ annotField = old;
+ }
+ }
+
+ return annotField;
}
/**
@@ -106,9 +179,38 @@ public final class AnnotatedElementFacto
* @param declaringClass declaring class info
* @return new annotated method
*/
+ @SuppressWarnings("unchecked")
public static <X> AnnotatedMethod<X> newAnnotatedMethod(Method method, Class<X> declaringClass)
{
- return new AnnotatedMethodImpl<X>(method);
+ Asserts.assertNotNull(method, "method is null");
+ Asserts.assertNotNull(declaringClass, "declaringClass is null");
+
+ AnnotatedMethodImpl<X> annotMethod = null;
+ if(annotatedMethodCache.containsKey(method))
+ {
+ annotMethod = (AnnotatedMethodImpl<X>)annotatedMethodCache.get(method);
+ }
+ else
+ {
+ annotMethod = new AnnotatedMethodImpl<X>(method);
+ AnnotatedMethodImpl<X> old = (AnnotatedMethodImpl<X>) annotatedMethodCache.putIfAbsent(method, annotMethod);
+ if(old != null)
+ {
+ annotMethod = old;
+ }
+ }
+
+ return annotMethod;
+ }
+
+ /**
+ * Clear caches.
+ */
+ public static void clear()
+ {
+ annotatedTypeCache.clear();
+ annotatedConstructorCache.clear();
+ annotatedFieldCache.clear();
+ annotatedMethodCache.clear();
}
-
}
Modified: openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/portable/AnnotatedParameterImpl.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/portable/AnnotatedParameterImpl.java?rev=938818&r1=938817&r2=938818&view=diff
==============================================================================
--- openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/portable/AnnotatedParameterImpl.java (original)
+++ openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/portable/AnnotatedParameterImpl.java Wed Apr 28 08:38:16 2010
@@ -28,10 +28,10 @@ import javax.enterprise.inject.spi.Annot
class AnnotatedParameterImpl<X> extends AbstractAnnotated implements AnnotatedParameter<X>
{
/**Declaring callable*/
- private AnnotatedCallable<X> declaringCallable;
+ private final AnnotatedCallable<X> declaringCallable;
/**Parameter position*/
- private int position;
+ private final int position;
AnnotatedParameterImpl(Type baseType, AnnotatedCallable<X> declaringCallable, int position)
{
Modified: openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/portable/AnnotatedTypeImpl.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/portable/AnnotatedTypeImpl.java?rev=938818&r1=938817&r2=938818&view=diff
==============================================================================
--- openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/portable/AnnotatedTypeImpl.java (original)
+++ openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/portable/AnnotatedTypeImpl.java Wed Apr 28 08:38:16 2010
@@ -32,7 +32,7 @@ import javax.enterprise.inject.spi.Annot
class AnnotatedTypeImpl<X> extends AbstractAnnotated implements AnnotatedType<X>
{
/**Annotated class*/
- private Class<X> annotatedClass;
+ private final Class<X> annotatedClass;
/**Constructors*/
private Set<AnnotatedConstructor<X>> constructors = new HashSet<AnnotatedConstructor<X>>();