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/02/18 19:36:19 UTC

svn commit: r911515 - in /openwebbeans/trunk/webbeans-impl/src: main/java/org/apache/webbeans/config/ main/java/org/apache/webbeans/util/ test/java/org/apache/webbeans/test/unittests/specializes/logger/

Author: gerdogdu
Date: Thu Feb 18 18:36:19 2010
New Revision: 911515

URL: http://svn.apache.org/viewvc?rev=911515&view=rev
Log:
[OWB-284] thanks to YING WANG

Modified:
    openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/config/BeansDeployer.java
    openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/util/WebBeansUtil.java
    openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/test/unittests/specializes/logger/LoggerSpecializationTest.java

Modified: openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/config/BeansDeployer.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/config/BeansDeployer.java?rev=911515&r1=911514&r2=911515&view=diff
==============================================================================
--- openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/config/BeansDeployer.java (original)
+++ openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/config/BeansDeployer.java Thu Feb 18 18:36:19 2010
@@ -20,6 +20,7 @@
 import java.util.HashSet;
 import java.util.Iterator;
 import java.util.Set;
+import java.util.ArrayList;
 
 import javax.enterprise.inject.Model;
 import javax.enterprise.inject.Specializes;
@@ -431,32 +432,31 @@
             Set<Class<?>> beanClasses = scanner.getBeanClasses();
             if (beanClasses != null && beanClasses.size() > 0)
             {
+                //superClassList is used to handle the case: Car, CarToyota, Bus, SchoolBus, CarFord
+                //for which case, the owb should throw exception that both CarToyota and CarFord are 
+                //specialize Car. 
                 Class<?> superClass = null;
+                ArrayList<Class<?>> superClassList = new ArrayList<Class<?>>();
+                ArrayList<Class<?>> specialClassList = new ArrayList<Class<?>>();
                 for(Class<?> specialClass : beanClasses)
                 {
                     if(AnnotationUtil.hasClassAnnotation(specialClass, Specializes.class))
                     {
-                        if (superClass == null)
+                        superClass = specialClass.getSuperclass();
+                        if(superClass.equals(Object.class))
                         {
-                            superClass = specialClass.getSuperclass();
-                            
-                            if(superClass.equals(Object.class))
-                            {
-                                throw new WebBeansConfigurationException(logger.getTokenString(OWBLogConst.EXCEPT_0003) + specialClass.getName()
-                                                                         + logger.getTokenString(OWBLogConst.EXCEPT_0004));
-                            }
+                            throw new WebBeansConfigurationException(logger.getTokenString(OWBLogConst.EXCEPT_0003) + specialClass.getName()
+                                                                     + logger.getTokenString(OWBLogConst.EXCEPT_0004));
                         }
-                        else
+                        if (superClassList.contains(superClass))
                         {
-                            if (superClass.equals(specialClass.getSuperclass()))
-                            {
-                                throw new InconsistentSpecializationException(logger.getTokenString(OWBLogConst.EXCEPT_0005) + superClass.getName());
-                            }
+                            throw new InconsistentSpecializationException(logger.getTokenString(OWBLogConst.EXCEPT_0005) + superClass.getName());
                         }
-                        
-                        WebBeansUtil.configureSpecializations(specialClass);                        
+                        superClassList.add(superClass);
+                        specialClassList.add(specialClass);
                     }
                 }
+                WebBeansUtil.configureSpecializations(specialClassList);                        
             }
 
             // XML Defined Specializations
@@ -483,6 +483,7 @@
         Iterator<Class<?>> it = clazzes.iterator();
         Class<?> superClass = null;
         Class<?> specialClass = null;
+        ArrayList<Class<?>> specialClassList = new ArrayList<Class<?>>();
         while (it.hasNext())
         {
             specialClass = it.next();
@@ -499,10 +500,9 @@
                                                                  + superClass.getName());
                 }
             }
-
-            WebBeansUtil.configureSpecializations(specialClass);
-
+            specialClassList.add(specialClass);
         }
+        WebBeansUtil.configureSpecializations(specialClassList);
     }
 
     /**

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=911515&r1=911514&r2=911515&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 Thu Feb 18 18:36:19 2010
@@ -1516,6 +1516,52 @@
         }
     }
     
+    /**
+     * Return true if a list of beans are directly specialized/extended each other.
+     * 
+     * @param beans, a set of specialized beans.
+     * 
+     * @return
+     */
+    protected static boolean isDirectlySpecializedBeanSet(Set<Bean<?>> beans) {
+    	
+    	ArrayList<AbstractOwbBean<?>> beanList = new ArrayList<AbstractOwbBean<?>>();
+
+    	for(Bean<?> bb : beans) 
+    	{
+    		AbstractOwbBean<?>bean = (AbstractOwbBean<?>)bb;
+    		beanList.add(bean);
+    	}
+    	
+    	java.util.Collections.sort(beanList, new java.util.Comparator() 
+    	{
+    		public int compare(Object o1, Object o2) 
+    		{
+    			AbstractOwbBean<?> b1 = (AbstractOwbBean<?>)o1;
+    			AbstractOwbBean<?> b2 = (AbstractOwbBean<?>)o2;
+    			Class c1 = b1.getReturnType();
+    			Class c2 = b2.getReturnType();
+    			if (c2.isAssignableFrom(c1)) return 1;
+    			if (c1.isAssignableFrom(c2)) return -1;
+    			throw new InconsistentSpecializationException(c1 + " and " + c2 + "are not assignable to each other." );
+    		}
+    	});
+
+    	for(int i=0; i<beanList.size() - 1; i++) 
+    	{
+    		if (!beanList.get(i).getReturnType().equals(beanList.get(i+1).getReturnType().getSuperclass()))
+    				return false;
+    	}
+    	return true;
+    }
+
+    public static void configureSpecializations(List<Class<?>> beanClasses)
+    {
+    	for(Class<?> clazz : beanClasses) 
+    	{
+    		configureSpecializations(clazz, beanClasses);
+    	}
+	}
 
     /**
      * Configures the bean specializations.
@@ -1530,29 +1576,40 @@
      * @throws InconsistentSpecializationException related with priority
      * @throws WebBeansConfigurationException any other exception
      */
-    public static void configureSpecializations(Class<?> specializedClass)
+    protected static void configureSpecializations(Class<?> specializedClass, List<Class<?>> beanClasses)
     {
         Asserts.nullCheckForClass(specializedClass);
 
         Bean<?> superBean = null;
         Bean<?> specialized = null;
         Set<Bean<?>> resolvers = null;
+        AlternativesManager altManager = AlternativesManager.getInstance();
         
-        if ((resolvers = isConfiguredWebBeans(specializedClass,true)) != null)
+        if ((resolvers = isConfiguredWebBeans(specializedClass, true)) != null)
         {            
             if(resolvers.isEmpty())
             {
                 throw new InconsistentSpecializationException("Specialized bean for class : " + specializedClass + " is not enabled in the deployment.");
             }
             
+            specialized = resolvers.iterator().next();
+            
             if(resolvers.size() > 1)
             {
-                throw new InconsistentSpecializationException("More than one specialized bean for class : " + specializedClass + " is enabled in the deployment.");
+            	if (!isDirectlySpecializedBeanSet(resolvers)) 
+            	{
+            		throw new InconsistentSpecializationException("More than one specialized bean for class : " + specializedClass + " is enabled in the deployment.");
+            	}
+            	// find the widest bean which satisfies the specializedClass
+                for( Bean<?> sp : resolvers) {
+                	if (sp == specialized) continue;
+                	if (((AbstractOwbBean<?>)sp).getReturnType().isAssignableFrom(((AbstractOwbBean<?>)specialized).getReturnType())) 
+                	{
+                		specialized = sp;
+                	}
+                }
             }
             
-                                   
-            specialized = resolvers.iterator().next();
-            
             Class<?> superClass = specializedClass.getSuperclass();
             
             resolvers = isConfiguredWebBeans(superClass,false);
@@ -1573,7 +1630,23 @@
                         
             if (superBean != null)
             {
-                ((AbstractOwbBean<?>)superBean).setEnabled(false);
+            	// Recursively configure super class first if super class is also a special bean.
+            	// So the name and bean meta data could be populated to this beanclass.  
+            	if (beanClasses.contains(superClass) && ((AbstractOwbBean<?>)superBean).isEnabled()) 
+            	{
+            		configureSpecializations(superClass, beanClasses);
+            	}
+            	
+            	if (!AnnotationUtil.hasClassAnnotation(specializedClass, Alternative.class)) 
+            	{
+            		//disable superbean if the current bean is not an alternative 
+            		((AbstractOwbBean<?>)superBean).setEnabled(false);
+            	} 
+            	else if(altManager.isClassAlternative(specializedClass)) 
+            	{
+            		//disable superbean if the current bean is an enabled alternative 
+            		((AbstractOwbBean<?>)superBean).setEnabled(false);
+            	}
                                 
                 AbstractOwbBean<?> comp = (AbstractOwbBean<?>)specialized;
 

Modified: openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/test/unittests/specializes/logger/LoggerSpecializationTest.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/test/unittests/specializes/logger/LoggerSpecializationTest.java?rev=911515&r1=911514&r2=911515&view=diff
==============================================================================
--- openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/test/unittests/specializes/logger/LoggerSpecializationTest.java (original)
+++ openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/test/unittests/specializes/logger/LoggerSpecializationTest.java Thu Feb 18 18:36:19 2010
@@ -14,7 +14,7 @@
 package org.apache.webbeans.test.unittests.specializes.logger;
 
 import java.io.InputStream;
-
+import java.util.ArrayList;
 import javax.enterprise.inject.spi.Bean;
 
 import junit.framework.Assert;
@@ -91,7 +91,9 @@
         defineManagedBean(SystemLogger.class);
         defineManagedBean(MockSpecializedLogger.class);
         
-        WebBeansUtil.configureSpecializations(MockSpecializedLogger.class);
+        ArrayList<Class<?>> specialClassList = new ArrayList<Class<?>>();
+        specialClassList.add(MockSpecializedLogger.class);
+        WebBeansUtil.configureSpecializations(specialClassList);
         
         Bean<SpecializedInjector> bean = defineManagedBean(SpecializedInjector.class);
         Object instance = getManager().getReference(bean, SpecializedInjector.class, getManager().createCreationalContext(bean));



Re: svn commit: r911515 - in /openwebbeans/trunk/webbeans-impl/src: main/java/org/apache/webbeans/config/ main/java/org/apache/webbeans/util/ test/java/org/apache/webbeans/test/unittests/specializes/logger/

Posted by Matthias Wessendorf <ma...@apache.org>.
what's up with the ArrayList? I'd prefer List..


On Thu, Feb 18, 2010 at 7:36 PM,  <ge...@apache.org> wrote:
> Author: gerdogdu
> Date: Thu Feb 18 18:36:19 2010
> New Revision: 911515
>
> URL: http://svn.apache.org/viewvc?rev=911515&view=rev
> Log:
> [OWB-284] thanks to YING WANG
>
> Modified:
>    openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/config/BeansDeployer.java
>    openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/util/WebBeansUtil.java
>    openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/test/unittests/specializes/logger/LoggerSpecializationTest.java
>
> Modified: openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/config/BeansDeployer.java
> URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/config/BeansDeployer.java?rev=911515&r1=911514&r2=911515&view=diff
> ==============================================================================
> --- openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/config/BeansDeployer.java (original)
> +++ openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/config/BeansDeployer.java Thu Feb 18 18:36:19 2010
> @@ -20,6 +20,7 @@
>  import java.util.HashSet;
>  import java.util.Iterator;
>  import java.util.Set;
> +import java.util.ArrayList;
>
>  import javax.enterprise.inject.Model;
>  import javax.enterprise.inject.Specializes;
> @@ -431,32 +432,31 @@
>             Set<Class<?>> beanClasses = scanner.getBeanClasses();
>             if (beanClasses != null && beanClasses.size() > 0)
>             {
> +                //superClassList is used to handle the case: Car, CarToyota, Bus, SchoolBus, CarFord
> +                //for which case, the owb should throw exception that both CarToyota and CarFord are
> +                //specialize Car.
>                 Class<?> superClass = null;
> +                ArrayList<Class<?>> superClassList = new ArrayList<Class<?>>();
> +                ArrayList<Class<?>> specialClassList = new ArrayList<Class<?>>();
>                 for(Class<?> specialClass : beanClasses)
>                 {
>                     if(AnnotationUtil.hasClassAnnotation(specialClass, Specializes.class))
>                     {
> -                        if (superClass == null)
> +                        superClass = specialClass.getSuperclass();
> +                        if(superClass.equals(Object.class))
>                         {
> -                            superClass = specialClass.getSuperclass();
> -
> -                            if(superClass.equals(Object.class))
> -                            {
> -                                throw new WebBeansConfigurationException(logger.getTokenString(OWBLogConst.EXCEPT_0003) + specialClass.getName()
> -                                                                         + logger.getTokenString(OWBLogConst.EXCEPT_0004));
> -                            }
> +                            throw new WebBeansConfigurationException(logger.getTokenString(OWBLogConst.EXCEPT_0003) + specialClass.getName()
> +                                                                     + logger.getTokenString(OWBLogConst.EXCEPT_0004));
>                         }
> -                        else
> +                        if (superClassList.contains(superClass))
>                         {
> -                            if (superClass.equals(specialClass.getSuperclass()))
> -                            {
> -                                throw new InconsistentSpecializationException(logger.getTokenString(OWBLogConst.EXCEPT_0005) + superClass.getName());
> -                            }
> +                            throw new InconsistentSpecializationException(logger.getTokenString(OWBLogConst.EXCEPT_0005) + superClass.getName());
>                         }
> -
> -                        WebBeansUtil.configureSpecializations(specialClass);
> +                        superClassList.add(superClass);
> +                        specialClassList.add(specialClass);
>                     }
>                 }
> +                WebBeansUtil.configureSpecializations(specialClassList);
>             }
>
>             // XML Defined Specializations
> @@ -483,6 +483,7 @@
>         Iterator<Class<?>> it = clazzes.iterator();
>         Class<?> superClass = null;
>         Class<?> specialClass = null;
> +        ArrayList<Class<?>> specialClassList = new ArrayList<Class<?>>();
>         while (it.hasNext())
>         {
>             specialClass = it.next();
> @@ -499,10 +500,9 @@
>                                                                  + superClass.getName());
>                 }
>             }
> -
> -            WebBeansUtil.configureSpecializations(specialClass);
> -
> +            specialClassList.add(specialClass);
>         }
> +        WebBeansUtil.configureSpecializations(specialClassList);
>     }
>
>     /**
>
> 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=911515&r1=911514&r2=911515&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 Thu Feb 18 18:36:19 2010
> @@ -1516,6 +1516,52 @@
>         }
>     }
>
> +    /**
> +     * Return true if a list of beans are directly specialized/extended each other.
> +     *
> +     * @param beans, a set of specialized beans.
> +     *
> +     * @return
> +     */
> +    protected static boolean isDirectlySpecializedBeanSet(Set<Bean<?>> beans) {
> +
> +       ArrayList<AbstractOwbBean<?>> beanList = new ArrayList<AbstractOwbBean<?>>();
> +
> +       for(Bean<?> bb : beans)
> +       {
> +               AbstractOwbBean<?>bean = (AbstractOwbBean<?>)bb;
> +               beanList.add(bean);
> +       }
> +
> +       java.util.Collections.sort(beanList, new java.util.Comparator()
> +       {
> +               public int compare(Object o1, Object o2)
> +               {
> +                       AbstractOwbBean<?> b1 = (AbstractOwbBean<?>)o1;
> +                       AbstractOwbBean<?> b2 = (AbstractOwbBean<?>)o2;
> +                       Class c1 = b1.getReturnType();
> +                       Class c2 = b2.getReturnType();
> +                       if (c2.isAssignableFrom(c1)) return 1;
> +                       if (c1.isAssignableFrom(c2)) return -1;
> +                       throw new InconsistentSpecializationException(c1 + " and " + c2 + "are not assignable to each other." );
> +               }
> +       });
> +
> +       for(int i=0; i<beanList.size() - 1; i++)
> +       {
> +               if (!beanList.get(i).getReturnType().equals(beanList.get(i+1).getReturnType().getSuperclass()))
> +                               return false;
> +       }
> +       return true;
> +    }
> +
> +    public static void configureSpecializations(List<Class<?>> beanClasses)
> +    {
> +       for(Class<?> clazz : beanClasses)
> +       {
> +               configureSpecializations(clazz, beanClasses);
> +       }
> +       }
>
>     /**
>      * Configures the bean specializations.
> @@ -1530,29 +1576,40 @@
>      * @throws InconsistentSpecializationException related with priority
>      * @throws WebBeansConfigurationException any other exception
>      */
> -    public static void configureSpecializations(Class<?> specializedClass)
> +    protected static void configureSpecializations(Class<?> specializedClass, List<Class<?>> beanClasses)
>     {
>         Asserts.nullCheckForClass(specializedClass);
>
>         Bean<?> superBean = null;
>         Bean<?> specialized = null;
>         Set<Bean<?>> resolvers = null;
> +        AlternativesManager altManager = AlternativesManager.getInstance();
>
> -        if ((resolvers = isConfiguredWebBeans(specializedClass,true)) != null)
> +        if ((resolvers = isConfiguredWebBeans(specializedClass, true)) != null)
>         {
>             if(resolvers.isEmpty())
>             {
>                 throw new InconsistentSpecializationException("Specialized bean for class : " + specializedClass + " is not enabled in the deployment.");
>             }
>
> +            specialized = resolvers.iterator().next();
> +
>             if(resolvers.size() > 1)
>             {
> -                throw new InconsistentSpecializationException("More than one specialized bean for class : " + specializedClass + " is enabled in the deployment.");
> +               if (!isDirectlySpecializedBeanSet(resolvers))
> +               {
> +                       throw new InconsistentSpecializationException("More than one specialized bean for class : " + specializedClass + " is enabled in the deployment.");
> +               }
> +               // find the widest bean which satisfies the specializedClass
> +                for( Bean<?> sp : resolvers) {
> +                       if (sp == specialized) continue;
> +                       if (((AbstractOwbBean<?>)sp).getReturnType().isAssignableFrom(((AbstractOwbBean<?>)specialized).getReturnType()))
> +                       {
> +                               specialized = sp;
> +                       }
> +                }
>             }
>
> -
> -            specialized = resolvers.iterator().next();
> -
>             Class<?> superClass = specializedClass.getSuperclass();
>
>             resolvers = isConfiguredWebBeans(superClass,false);
> @@ -1573,7 +1630,23 @@
>
>             if (superBean != null)
>             {
> -                ((AbstractOwbBean<?>)superBean).setEnabled(false);
> +               // Recursively configure super class first if super class is also a special bean.
> +               // So the name and bean meta data could be populated to this beanclass.
> +               if (beanClasses.contains(superClass) && ((AbstractOwbBean<?>)superBean).isEnabled())
> +               {
> +                       configureSpecializations(superClass, beanClasses);
> +               }
> +
> +               if (!AnnotationUtil.hasClassAnnotation(specializedClass, Alternative.class))
> +               {
> +                       //disable superbean if the current bean is not an alternative
> +                       ((AbstractOwbBean<?>)superBean).setEnabled(false);
> +               }
> +               else if(altManager.isClassAlternative(specializedClass))
> +               {
> +                       //disable superbean if the current bean is an enabled alternative
> +                       ((AbstractOwbBean<?>)superBean).setEnabled(false);
> +               }
>
>                 AbstractOwbBean<?> comp = (AbstractOwbBean<?>)specialized;
>
>
> Modified: openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/test/unittests/specializes/logger/LoggerSpecializationTest.java
> URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/test/unittests/specializes/logger/LoggerSpecializationTest.java?rev=911515&r1=911514&r2=911515&view=diff
> ==============================================================================
> --- openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/test/unittests/specializes/logger/LoggerSpecializationTest.java (original)
> +++ openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/test/unittests/specializes/logger/LoggerSpecializationTest.java Thu Feb 18 18:36:19 2010
> @@ -14,7 +14,7 @@
>  package org.apache.webbeans.test.unittests.specializes.logger;
>
>  import java.io.InputStream;
> -
> +import java.util.ArrayList;
>  import javax.enterprise.inject.spi.Bean;
>
>  import junit.framework.Assert;
> @@ -91,7 +91,9 @@
>         defineManagedBean(SystemLogger.class);
>         defineManagedBean(MockSpecializedLogger.class);
>
> -        WebBeansUtil.configureSpecializations(MockSpecializedLogger.class);
> +        ArrayList<Class<?>> specialClassList = new ArrayList<Class<?>>();
> +        specialClassList.add(MockSpecializedLogger.class);
> +        WebBeansUtil.configureSpecializations(specialClassList);
>
>         Bean<SpecializedInjector> bean = defineManagedBean(SpecializedInjector.class);
>         Object instance = getManager().getReference(bean, SpecializedInjector.class, getManager().createCreationalContext(bean));
>
>
>



-- 
Matthias Wessendorf

blog: http://matthiaswessendorf.wordpress.com/
sessions: http://www.slideshare.net/mwessendorf
twitter: http://twitter.com/mwessendorf