You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openwebbeans.apache.org by st...@apache.org on 2010/03/16 01:04:26 UTC

svn commit: r923512 - in /openwebbeans/trunk/webbeans-impl: ./ src/main/java/org/apache/webbeans/container/ src/main/java/org/apache/webbeans/intercept/ src/main/java/org/apache/webbeans/logger/ src/main/java/org/apache/webbeans/util/ src/main/resource...

Author: struberg
Date: Tue Mar 16 00:04:26 2010
New Revision: 923512

URL: http://svn.apache.org/viewvc?rev=923512&view=rev
Log:
OWB-313 implement beans caching + improve Interceptor code

Modified:
    openwebbeans/trunk/webbeans-impl/   (props changed)
    openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/container/BeanManagerImpl.java
    openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/container/InjectionResolver.java
    openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/intercept/InterceptorHandler.java
    openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/logger/WebBeansLogger.java
    openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/util/WebBeansUtil.java
    openwebbeans/trunk/webbeans-impl/src/main/resources/openwebbeans/Messages.properties

Propchange: openwebbeans/trunk/webbeans-impl/
------------------------------------------------------------------------------
--- svn:ignore (original)
+++ svn:ignore Tue Mar 16 00:04:26 2010
@@ -1,7 +1,11 @@
-.settings
 target
+.metadata
 .classpath
 .project
+.settings
 *.iml
 *.ipr
 *.iws
+.git
+.gitignore
+

Modified: openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/container/BeanManagerImpl.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/container/BeanManagerImpl.java?rev=923512&r1=923511&r2=923512&view=diff
==============================================================================
--- openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/container/BeanManagerImpl.java (original)
+++ openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/container/BeanManagerImpl.java Tue Mar 16 00:04:26 2010
@@ -652,6 +652,8 @@ public class BeanManagerImpl implements 
     @Override
     public Set<Bean<?>> getBeans(String name)
     {        
+        Asserts.assertNotNull(name, "name parameter can not be null");
+        
         return this.injectionResolver.implResolveByName(name);
     }
 
@@ -667,6 +669,8 @@ public class BeanManagerImpl implements 
     @Override
     public Object getInjectableReference(InjectionPoint injectionPoint, CreationalContext<?> ownerCreationalContext)
     {
+        Asserts.assertNotNull(injectionPoint, "injectionPoint parameter can not be null");
+
         //Injected instance
         Object instance = null;
         
@@ -757,6 +761,8 @@ public class BeanManagerImpl implements 
     @Override
     public Object getReference(Bean<?> bean, Type beanType, CreationalContext<?> creationalContext)
     {
+        Asserts.assertNotNull(bean, "bean parameter can not be null");
+
         Context context = null;
         Object instance = null;
 

Modified: openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/container/InjectionResolver.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/container/InjectionResolver.java?rev=923512&r1=923511&r2=923512&view=diff
==============================================================================
--- openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/container/InjectionResolver.java (original)
+++ openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/container/InjectionResolver.java Tue Mar 16 00:04:26 2010
@@ -19,7 +19,9 @@ import java.lang.reflect.Type;
 import java.lang.reflect.TypeVariable;
 import java.util.HashSet;
 import java.util.Iterator;
+import java.util.Map;
 import java.util.Set;
+import java.util.concurrent.ConcurrentHashMap;
 
 import javax.enterprise.event.Event;
 import javax.enterprise.inject.Instance;
@@ -33,6 +35,7 @@ import org.apache.webbeans.component.Abs
 import org.apache.webbeans.config.WebBeansFinder;
 import org.apache.webbeans.exception.WebBeansConfigurationException;
 import org.apache.webbeans.exception.inject.NullableDependencyException;
+import org.apache.webbeans.logger.WebBeansLogger;
 import org.apache.webbeans.util.AnnotationUtil;
 import org.apache.webbeans.util.Asserts;
 import org.apache.webbeans.util.ClassUtil;
@@ -43,7 +46,7 @@ import org.apache.webbeans.util.WebBeans
  * 
  * <p>
  * It is a singleton class per ClassLoader per JVM. It is
- * responsible for resolbing the bean instances at the injection points for 
+ * responsible for resolving the bean instances at the injection points for 
  * its bean manager.
  * </p>
  * 
@@ -52,10 +55,23 @@ import org.apache.webbeans.util.WebBeans
  */
 public class InjectionResolver
 {
+    private static final WebBeansLogger logger = WebBeansLogger.getLogger(InjectionResolver.class);
+
     /**Bean Manager*/
     private BeanManagerImpl manager;
     
     /**
+     * This Map contains all resolved beans via it's type and qualifiers.
+     * If a bean have resolved as not existing, the entry will contain <code>null</code> as value.
+     */
+    private Map<String, Set<Bean<?>>> resolvedBeansByType = new ConcurrentHashMap<String, Set<Bean<?>>>();
+    
+    /**
+     * This Map contains all resolved beans via it's ExpressionLanguage name.
+     */
+    private Map<String, Set<Bean<?>>> resolvedBeansByName = new ConcurrentHashMap<String, Set<Bean<?>>>();
+    
+    /**
      * Creates a new injection resolve for given bean manager.
      * 
      * @param manager bean manager
@@ -256,6 +272,12 @@ public class InjectionResolver
     {
         Asserts.assertNotNull(name, "name parameter can not be null");
 
+        String cacheKey = name;
+        if (resolvedBeansByName.containsKey(cacheKey))
+        {
+            return resolvedBeansByName.get(cacheKey); 
+        }
+
         Set<Bean<?>> resolvedComponents = new HashSet<Bean<?>>();        
         Set<Bean<?>> deployedComponents = this.manager.getBeans();
         
@@ -286,7 +308,10 @@ public class InjectionResolver
                 return specializedComponents;
             }            
         }
-                
+        
+        resolvedBeansByType.put(cacheKey, resolvedComponents);
+        logger.debug("DEBUG_ADD_BYNYME_CACHE_BEANS", cacheKey);
+
         return resolvedComponents;
     }
      
@@ -342,15 +367,22 @@ public class InjectionResolver
      * @param <T> bean type info
      * @param injectionPointType injection point api type
      * @param injectionPointTypeArguments actual type arguments if parameterized type
-     * @param qualifier qualifier of the injection point
+     * @param qualifiers qualifiers of the injection point
      * @return set of resolved beans
      */
-    public Set<Bean<?>> implResolveByType(Type injectionPointType, Annotation... qualifier)
+    public Set<Bean<?>> implResolveByType(Type injectionPointType, Annotation... qualifiers)
     {
-        Asserts.assertNotNull(injectionPointType, "injectionPointType parameter can not be null");
-        Asserts.assertNotNull(qualifier, "qualifier parameter can not be null");
+        //X TODO maybe we need to stringify the qualifiers manually im a loop...
+        String cacheKey = getBeanCacheKey(injectionPointType, qualifiers);
+
+        
+        if (resolvedBeansByType.containsKey(cacheKey))
+        {
+            return resolvedBeansByType.get(cacheKey); 
+        }
         
         Set<Bean<?>> results = new HashSet<Bean<?>>();
+        
         Set<Bean<?>> deployedComponents = this.manager.getBeans();
 
         boolean currentQualifier = false;
@@ -358,16 +390,16 @@ public class InjectionResolver
         
         if(isInstanceOrEventInjection(injectionPointType))
         {
-            qualifier = new Annotation[1];
-            qualifier[0] = new AnyLiteral();
+            qualifiers = new Annotation[1];
+            qualifiers[0] = new AnyLiteral();
         }
         
         else
         {
-            if (qualifier.length == 0)
+            if (qualifiers.length == 0)
             {
-                qualifier = new Annotation[1];
-                qualifier[0] = new DefaultLiteral();
+                qualifiers = new Annotation[1];
+                qualifiers[0] = new DefaultLiteral();
                 currentQualifier = true;
             }                        
         }
@@ -389,25 +421,22 @@ public class InjectionResolver
                 continue;
             }
 
-            else
+            Set<Type> componentApiTypes = component.getTypes();
+            Iterator<Type> itComponentApiTypes = componentApiTypes.iterator();
+            while (itComponentApiTypes.hasNext())
             {
-                Set<Type> componentApiTypes = component.getTypes();
-                Iterator<Type> itComponentApiTypes = componentApiTypes.iterator();
-                while (itComponentApiTypes.hasNext())
+                Type componentApiType = itComponentApiTypes.next();
+                
+                if(ClassUtil.isAssignable(componentApiType, injectionPointType))
                 {
-                    Type componentApiType = itComponentApiTypes.next();                    
-                    
-                    if(ClassUtil.isAssignable(componentApiType, injectionPointType))
-                    {
-                        results.add((Bean<?>) component);
-                        break;                                            
-                    }                    
+                    results.add((Bean<?>) component);
+                    break;
                 }
-            }            
+            }
         }
  
         //Look for qualifiers
-        results = findByQualifier(results, qualifier);
+        results = findByQualifier(results, qualifiers);
         
         //Look for alternative
         results = findByAlternatives(results);
@@ -417,13 +446,26 @@ public class InjectionResolver
         if(results.size() > 1)
         {
             //Look for specialization
-            results = findBySpecialization(results);            
+            results = findBySpecialization(results);
 
         }
         
+        resolvedBeansByType.put(cacheKey, results);
+        logger.debug("DEBUG_ADD_BYTYPE_CACHE_BEANS", cacheKey);
+        
         return results;
     }
     
+    private String getBeanCacheKey(Type injectionPointType, Annotation... qualifiers)
+    {
+        StringBuilder cacheKey = new StringBuilder(injectionPointType.toString());
+        for (Annotation a : qualifiers)
+        {
+            cacheKey.append('@').append(a.toString());
+        }
+        return cacheKey.toString();
+    }
+
     /**
      * Returns specialized beans if exists, otherwise return input result
      * 

Modified: openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/intercept/InterceptorHandler.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/intercept/InterceptorHandler.java?rev=923512&r1=923511&r2=923512&view=diff
==============================================================================
--- openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/intercept/InterceptorHandler.java (original)
+++ openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/intercept/InterceptorHandler.java Tue Mar 16 00:04:26 2010
@@ -162,7 +162,8 @@ public abstract class InterceptorHandler
                 InjectionTargetBean<?> injectionTarget = (InjectionTargetBean<?>) this.bean;
 
                 // toString is supported but no other object method names!!!
-                if ((!ClassUtil.isObjectMethod(method.getName()) || method.getName().equals("toString")) && InterceptorUtil.isWebBeansBusinessMethod(method))
+                if ((!ClassUtil.isObjectMethod(method.getName()) || method.getName().equals("toString")) 
+                    && InterceptorUtil.isWebBeansBusinessMethod(method))
                 {
 
                     DelegateHandler delegateHandler = null;
@@ -188,30 +189,35 @@ public abstract class InterceptorHandler
                     }
 
                     // Run around invoke chain
-                    List<InterceptorData> stack = injectionTarget.getInterceptorStack();
+                    List<InterceptorData> interceptorStack = injectionTarget.getInterceptorStack();
 
-                    List<InterceptorData> temp = new ArrayList<InterceptorData>(stack);
-
-                    // Filter both EJB and WebBeans interceptors
-                    filterCommonInterceptorStackList(temp, method, ownerCreationalContext);
-
-                    // If there are both interceptors and decorators, add hook
-                    // point to the end of the interceptor stack.
-                    if (decorators != null && temp.size() > 0)
+                    if (interceptorStack.size() > 0)
                     {
-                        WebBeansDecoratorInterceptor lastInterceptor = new WebBeansDecoratorInterceptor(delegateHandler, instance);
-                        InterceptorDataImpl data = new InterceptorDataImpl(true);
-                        data.setInterceptorInstance(lastInterceptor);
-                        data.setAroundInvoke(lastInterceptor.getClass().getDeclaredMethods()[0]);
-                        temp.add(data);
-                    }
-
-                    // Call Around Invokes
-                    if (WebBeansUtil.isContainsInterceptorMethod(temp, InterceptorType.AROUND_INVOKE))
-                    {
-                        return callAroundInvokes(method, arguments, WebBeansUtil.getInterceptorMethods(temp, InterceptorType.AROUND_INVOKE));
+                        List<InterceptorData> filteredInterceptorStack = new ArrayList<InterceptorData>(interceptorStack);
+    
+                        // Filter both EJB and WebBeans interceptors
+                        filterCommonInterceptorStackList(filteredInterceptorStack, method, ownerCreationalContext);
+    
+                        injectInterceptorFields(filteredInterceptorStack, ownerCreationalContext);
+    
+                        // If there are both interceptors and decorators, add hook
+                        // point to the end of the interceptor stack.
+                        if (decorators != null && filteredInterceptorStack.size() > 0)
+                        {
+                            WebBeansDecoratorInterceptor lastInterceptor = new WebBeansDecoratorInterceptor(delegateHandler, instance);
+                            InterceptorDataImpl data = new InterceptorDataImpl(true);
+                            data.setInterceptorInstance(lastInterceptor);
+                            data.setAroundInvoke(lastInterceptor.getClass().getDeclaredMethods()[0]);
+                            filteredInterceptorStack.add(data);
+                        }
+    
+                        // Call Around Invokes
+                        if (WebBeansUtil.isContainsInterceptorMethod(filteredInterceptorStack, InterceptorType.AROUND_INVOKE))
+                        {
+                            return callAroundInvokes(method, arguments, WebBeansUtil.getInterceptorMethods(filteredInterceptorStack, InterceptorType.AROUND_INVOKE));
+                        }
                     }
-
+                    
                     // If there are Decorators, allow the delegate handler to
                     // manage the stack
                     if (decorators != null)
@@ -297,7 +303,7 @@ public abstract class InterceptorHandler
         return false;
     }
 
-    private void filterCommonInterceptorStackList(final List<InterceptorData> stack, Method method, CreationalContextImpl<?> ownerCreationalContext)
+    private void filterCommonInterceptorStackList(List<InterceptorData> stack, Method method, CreationalContextImpl<?> ownerCreationalContext)
     {
         Iterator<InterceptorData> it = stack.iterator();
         while (it.hasNext())
@@ -310,7 +316,6 @@ public abstract class InterceptorHandler
             }
         }
         
-        injectInterceptorFields(stack, ownerCreationalContext);
     }
     
     

Modified: openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/logger/WebBeansLogger.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/logger/WebBeansLogger.java?rev=923512&r1=923511&r2=923512&view=diff
==============================================================================
--- openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/logger/WebBeansLogger.java (original)
+++ openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/logger/WebBeansLogger.java Tue Mar 16 00:04:26 2010
@@ -80,7 +80,7 @@ public final class WebBeansLogger
         logger.logp(log_level, this.caller.getName(), Thread.currentThread().getStackTrace()[4].getMethodName(), messageKey);
     }
 
-    private void wblLog(Level log_level, String messageKey, Object args[])
+    private void wblLog(Level log_level, String messageKey, Object... args)
     {
         checkNullLogger();
         logger.logp(log_level, this.caller.getName(), Thread.currentThread().getStackTrace()[4].getMethodName(), messageKey, args);
@@ -92,7 +92,7 @@ public final class WebBeansLogger
         logger.logp(log_level, this.caller.getName(), Thread.currentThread().getStackTrace()[4].getMethodName(), messageKey, e);
     }
 
-    private void wblLog(Level log_level, String messageKey, Object args[], Throwable e)
+    private void wblLog(Level log_level, Throwable e, String messageKey, Object... args)
     {
         checkNullLogger();
         logger.logp(log_level, this.caller.getName(), Thread.currentThread().getStackTrace()[3].getMethodName(), constructMessage(messageKey, args), e);
@@ -123,7 +123,7 @@ public final class WebBeansLogger
         this.wblLog(WebBeansLogger.WBL_ERROR, messageKey);
     }
 
-    public void error(String messageKey, Object args[])
+    public void error(String messageKey, Object... args)
     {
         this.wblLog(WebBeansLogger.WBL_ERROR, messageKey, args);
     }
@@ -133,7 +133,7 @@ public final class WebBeansLogger
         this.wblLog(WebBeansLogger.WBL_ERROR, messageKey, e);
     }
 
-    public void error(String messageKey, Object args[], Throwable e)
+    public void error(String messageKey, Throwable e, Object... args)
     {
         this.wblLog(WebBeansLogger.WBL_ERROR, messageKey, args, e);
     }
@@ -143,7 +143,7 @@ public final class WebBeansLogger
         this.wblLog(WebBeansLogger.WBL_WARN, messageKey);
     }
 
-    public void warn(String messageKey, Object args[])
+    public void warn(String messageKey, Object... args)
     {
         this.wblLog(WebBeansLogger.WBL_WARN, messageKey, args);
     }
@@ -158,7 +158,7 @@ public final class WebBeansLogger
     	this.wblLog(WebBeansLogger.WBL_INFO, messageKey);
     }
 
-    public void info(String messageKey, Object args[])
+    public void info(String messageKey, Object... args)
     {
         this.wblLog(WebBeansLogger.WBL_INFO, messageKey, args);
     }
@@ -173,9 +173,9 @@ public final class WebBeansLogger
         this.wblLog(WebBeansLogger.WBL_DEBUG, messageKey);
     }
 
-    public void debug(String messageKey, Object args[])
+    public void debug(String messageKey, Object... args)
     {
-        this.wblLog(WebBeansLogger.WBL_WARN, messageKey, args);
+        this.wblLog(WebBeansLogger.WBL_DEBUG, messageKey, args);
     }
 
     public void debug(String messageKey, Throwable e)
@@ -188,7 +188,7 @@ public final class WebBeansLogger
         this.wblLog(WebBeansLogger.WBL_TRACE, messageKey);
     }
 
-    public void trace(String messageKey, Object args[])
+    public void trace(String messageKey, Object... args)
     {
         this.wblLog(WebBeansLogger.WBL_TRACE, messageKey, args);
     }
@@ -198,7 +198,7 @@ public final class WebBeansLogger
         this.wblLog(WebBeansLogger.WBL_TRACE, messageKey, e);
     }
 
-    private String constructMessage(String messageKey, Object args[])
+    private String constructMessage(String messageKey, Object... args)
     {
     	MessageFormat msgFrmt;
     	String formattedString;

Modified: openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/util/WebBeansUtil.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/util/WebBeansUtil.java?rev=923512&r1=923511&r2=923512&view=diff
==============================================================================
--- openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/util/WebBeansUtil.java (original)
+++ openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/util/WebBeansUtil.java Tue Mar 16 00:04:26 2010
@@ -220,10 +220,10 @@ public final class WebBeansUtil
      */
     public static void checkGenericType(Bean<?> bean)
     {
-    	Asserts.assertNotNull(bean);
-    	
-    	Class<?> clazz = bean.getBeanClass();
-    	
+        Asserts.assertNotNull(bean);
+
+        Class<?> clazz = bean.getBeanClass();
+
         if (ClassUtil.isDefinitionConstainsTypeVariables(clazz))
         {
             if(!bean.getScope().equals(Dependent.class))
@@ -232,8 +232,8 @@ public final class WebBeansUtil
             }
         }
     }
-    
-    
+
+
     /**
      * Check producer method/field bean return type. 
      * @param bean producer bean instance
@@ -241,34 +241,34 @@ public final class WebBeansUtil
      */
     public static void checkProducerGenericType(Bean<?> bean,Member member)
     {
-    	Asserts.assertNotNull(bean,"Bean is null");
-    	
-    	Type type = null;
-    	
-    	if(bean instanceof ProducerMethodBean)
-    	{
-    		type = ((ProducerMethodBean<?>)bean).getCreatorMethod().getGenericReturnType();
-    	}
-    	else if(bean instanceof ProducerFieldBean)
-    	{
-    		type = ((ProducerFieldBean<?>)bean).getCreatorField().getGenericType();
-    	}
-    	else
-    	{
-    		throw new IllegalArgumentException("Bean must be Producer Field or Method Bean instance : " + bean);
-    	}
-    	
-    	String message = "Producer Field/Method Bean with name : " + member.getName() + " in bean class : " + member.getDeclaringClass().getName(); 
-    	
-    	if(checkGenericForProducers(type, message))
-    	{
+        Asserts.assertNotNull(bean,"Bean is null");
+
+        Type type = null;
+
+        if(bean instanceof ProducerMethodBean)
+        {
+            type = ((ProducerMethodBean<?>)bean).getCreatorMethod().getGenericReturnType();
+        }
+        else if(bean instanceof ProducerFieldBean)
+        {
+            type = ((ProducerFieldBean<?>)bean).getCreatorField().getGenericType();
+        }
+        else
+        {
+            throw new IllegalArgumentException("Bean must be Producer Field or Method Bean instance : " + bean);
+        }
+
+        String message = "Producer Field/Method Bean with name : " + member.getName() + " in bean class : " + member.getDeclaringClass().getName(); 
+
+        if(checkGenericForProducers(type, message))
+        {
             if(!bean.getScope().equals(Dependent.class))
             {
                 throw new WebBeansConfigurationException(message + " scope must bee @Dependent");
             }
-    	}
+        }
     }
-    
+
     /**
      * Check generic types for producer method and fields.
      * @param type generic return type
@@ -278,37 +278,37 @@ public final class WebBeansUtil
     //Helper method
     private static boolean checkGenericForProducers(Type type, String message)
     {
-    	boolean result = false;
-    	
-    	if(type instanceof TypeVariable)
-    	{
-    		throw new WebBeansConfigurationException(message + " return type can not be type variable");
-    	}
-    	
-    	if(ClassUtil.isParametrizedType(type))
-    	{
-    		Type[] actualTypes = ClassUtil.getActualTypeArguements(type);
-    		
-    		if(actualTypes.length == 0)
-    		{
-        		throw new WebBeansConfigurationException(message + " return type must define actual type arguments or type variable");
-    		}
-    		
-    		for(Type actualType : actualTypes)
-    		{
-    			if(ClassUtil.isWildCardType(actualType))
-    			{
-    				throw new WebBeansConfigurationException(message + " return type can not define wildcard actual type argument");
-    			}
-    			
-    			if(ClassUtil.isTypeVariable(actualType))
-    			{
-    				result = true; 
-    			}
-    		}    		
-    	}
-    	
-    	return result;
+        boolean result = false;
+
+        if(type instanceof TypeVariable)
+        {
+            throw new WebBeansConfigurationException(message + " return type can not be type variable");
+        }
+
+        if(ClassUtil.isParametrizedType(type))
+        {
+            Type[] actualTypes = ClassUtil.getActualTypeArguements(type);
+
+            if(actualTypes.length == 0)
+            {
+                throw new WebBeansConfigurationException(message + " return type must define actual type arguments or type variable");
+            }
+
+            for(Type actualType : actualTypes)
+            {
+                if(ClassUtil.isWildCardType(actualType))
+                {
+                    throw new WebBeansConfigurationException(message + " return type can not define wildcard actual type argument");
+                }
+
+                if(ClassUtil.isTypeVariable(actualType))
+                {
+                    result = true; 
+                }
+            }    		
+        }
+
+        return result;
     }
     
     /**
@@ -1788,103 +1788,103 @@ public final class WebBeansUtil
         List<ProducerMethodBean> producerBeans = new ArrayList<ProducerMethodBean>();
         for(Bean b : beans) 
         {
-        	if (b instanceof ProducerMethodBean) 
-        	{
-        		producerBeans.add((ProducerMethodBean)b);
-        	}
+            if (b instanceof ProducerMethodBean) 
+            {
+                producerBeans.add((ProducerMethodBean)b);
+            }
         }
-        
+
         // create sorted bean helper.
         SortedListHelper<ProducerMethodBean> producerBeanListHelper = new
-        	SortedListHelper<ProducerMethodBean>(new ArrayList<ProducerMethodBean>(), 
-        		new Comparator<ProducerMethodBean> () 
-        		{
-	        		public int compare(ProducerMethodBean e1, ProducerMethodBean e2) 
-	        		{
-	        			if (e1.getBeanClass().isAssignableFrom(e2.getBeanClass())) 
-	        			{
-	        				return -1;
-	        			} 
-	        			else if (e1.equals(e2)) 
-	        			{
-	        				return 0;
-	        			}
-	        			return 1;
-	        		}
-        	});
-        
+        SortedListHelper<ProducerMethodBean>(new ArrayList<ProducerMethodBean>(), 
+                new Comparator<ProducerMethodBean> () 
+                {
+            public int compare(ProducerMethodBean e1, ProducerMethodBean e2) 
+            {
+                if (e1.getBeanClass().isAssignableFrom(e2.getBeanClass())) 
+                {
+                    return -1;
+                } 
+                else if (e1.equals(e2)) 
+                {
+                    return 0;
+                }
+                return 1;
+            }
+                });
+
         while(true) 
         {
-        	pbean = null;
-        	method = null;
-        	producerBeanListHelper.clear();
-        	
-        	//locate a specialized bean 
-        	for(ProducerMethodBean pb : producerBeans) 
-            {
-        		if (pb.isSpecializedBean()) 
-            	{	
-            		pbean = pb;
-            		method = pb.getCreatorMethod();
-            		producerBeanListHelper.add(pb);
-            		break;
-            	}
+            pbean = null;
+            method = null;
+            producerBeanListHelper.clear();
+
+            //locate a specialized bean 
+            for(ProducerMethodBean pb : producerBeans) 
+            {
+                if (pb.isSpecializedBean()) 
+                {	
+                    pbean = pb;
+                    method = pb.getCreatorMethod();
+                    producerBeanListHelper.add(pb);
+                    break;
+                }
             }
             if (pbean == null) break;
-            
+
             pLeft = pRight = pbean;
             boolean pLeftContinue = true;
             boolean pRightContinue = true;
-            
+
             // find all pbean's super beans and sub sub beans
             while(pLeftContinue || pRightContinue)
             {
-            	pLeftContinue = pRightContinue = false;
-	            for(ProducerMethodBean pb : producerBeans) 
-	            {
-	            	//left
-	            	if (pLeft!= null &&
-            			pLeft.getBeanClass().getSuperclass().equals(pb.getBeanClass()))
-	            	{
-	            		Method superMethod = ClassUtil.getClassMethodWithTypes(pb.getBeanClass(), method.getName(), Arrays.asList(method.getParameterTypes()));
-	               		if (superMethod != null)
-	    				{
-	               			producerBeanListHelper.add(pb);
-	               			pLeft = (pb.isSpecializedBean()) ? pb : null; 
-	    				} 
-	               		else {
-	               			pLeft = null;
-	               		}
-	               		if (pLeft != null) pLeftContinue = true; 
-	            	}
-	            	//right
-	            	if (pRight != null && 
-	            		pb.getBeanClass().getSuperclass().equals(pRight.getBeanClass()))
-	            	{
-	            		if (!pb.isSpecializedBean()) 
-	            		{
-	            			pRight = null;
-	            		} else {
-		            		Method superMethod = ClassUtil.getClassMethodWithTypes(pb.getBeanClass(), method.getName(), Arrays.asList(method.getParameterTypes()));
-		               		if (superMethod != null)
-		    				{
-		               			producerBeanListHelper.add(pb);
-		               			pRight = pb;
-		    				} else 
-		    				{
-		    					pRight = null;
-		    				}
-	            		}
-	               		if (pRight != null) pRightContinue = true; 
-	            	}
-	            } // for
+                pLeftContinue = pRightContinue = false;
+                for(ProducerMethodBean pb : producerBeans) 
+                {
+                    //left
+                    if (pLeft!= null &&
+                            pLeft.getBeanClass().getSuperclass().equals(pb.getBeanClass()))
+                    {
+                        Method superMethod = ClassUtil.getClassMethodWithTypes(pb.getBeanClass(), method.getName(), Arrays.asList(method.getParameterTypes()));
+                        if (superMethod != null)
+                        {
+                            producerBeanListHelper.add(pb);
+                            pLeft = (pb.isSpecializedBean()) ? pb : null; 
+                        } 
+                        else {
+                            pLeft = null;
+                        }
+                        if (pLeft != null) pLeftContinue = true; 
+                    }
+                    //right
+                    if (pRight != null && 
+                            pb.getBeanClass().getSuperclass().equals(pRight.getBeanClass()))
+                    {
+                        if (!pb.isSpecializedBean()) 
+                        {
+                            pRight = null;
+                        } else {
+                            Method superMethod = ClassUtil.getClassMethodWithTypes(pb.getBeanClass(), method.getName(), Arrays.asList(method.getParameterTypes()));
+                            if (superMethod != null)
+                            {
+                                producerBeanListHelper.add(pb);
+                                pRight = pb;
+                            } else 
+                            {
+                                pRight = null;
+                            }
+                        }
+                        if (pRight != null) pRightContinue = true; 
+                    }
+                } // for
             } // while
-            
+
             //remove the group from producer bean list
             for(ProducerMethodBean pb : producerBeanListHelper.getList())
-    		{
-            	producerBeans.remove(pb);
-    		}
+            {
+                producerBeans.remove(pb);
+            }
             //configure the directly extended producer beans
             configSpecializedProducerMethodBeans(producerBeanListHelper.getList());
         }

Modified: openwebbeans/trunk/webbeans-impl/src/main/resources/openwebbeans/Messages.properties
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/resources/openwebbeans/Messages.properties?rev=923512&r1=923511&r2=923512&view=diff
==============================================================================
--- openwebbeans/trunk/webbeans-impl/src/main/resources/openwebbeans/Messages.properties (original)
+++ openwebbeans/trunk/webbeans-impl/src/main/resources/openwebbeans/Messages.properties Tue Mar 16 00:04:26 2010
@@ -104,4 +104,7 @@ EXCEPT_0012 = All elements in the beans.
 EXCEPT_0013 = Unable to read root element of the given input stream.
 EXCEPT_0014 = Multiple classes with name \: 
 
+DEBUG_ADD_BYTYPE_CACHE_BEANS = Adding resolved beans with key {0} to cache.
+DEBUG_ADD_BYNAME_CACHE_BEANS = Adding resolved EL beans with key {0} to cache.
+ 
 #========= END OF TRANSLATED MESSAGES =================================