what's up with the ArrayList? I'd prefer List..

On Thu, Feb 18, 2010 at 7:36 PM,  <gerdo...@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

Reply via email to