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