[ 
https://issues.apache.org/jira/browse/OWB-279?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12834467#action_12834467
 ] 

Gurkan Erdogdu commented on OWB-279:
------------------------------------

YANG,
Sorry but could you repatch against rev. r910691 after check-out latest 
version. Thanks;

> Indirect specialization (4.3.1) throws InconsistentSpecializationException
> --------------------------------------------------------------------------
>
>                 Key: OWB-279
>                 URL: https://issues.apache.org/jira/browse/OWB-279
>             Project: OpenWebBeans
>          Issue Type: Bug
>          Components: Injection and Lookup
>    Affects Versions: M3
>            Reporter: YING WANG
>            Assignee: Gurkan Erdogdu
>             Fix For: M4
>
>         Attachments: owb279.svn.patch, owb299-patch.jar, specialize2.jar
>
>
> I have a list of specializes/extends beans (Car <- CarToyota <- 
> CarToyotaCamry <- CarToyotaCamryHybird). However the test throws
> org.apache.webbeans.exception.inject.InconsistentSpecializationException: 
> More than one specialized bean for class : class 
> org.apache.webbeans.newtests.specializes2.CarToyota is enabled in the 
> deployment.
> According to 4.3.1 X,Y,Z case, indirect specialization should work and 
> CarToyotaCamryHybird should be enabled in the above test case. Please help 
> review the test case (will upload later) and the following patches. 
> ==============WebBeansUtil.java=======================
>     /**
>      * verify a list of beans are directly specialized/extended each other.
>      * 
>      * @param resolvers
>      * @return
>      */
>     public static boolean isDirectlySpecialized(Set<Bean<?>> beans) {
>       ArrayList<AbstractBean<?>> beanList = new ArrayList<AbstractBean<?>>();
>       for(Bean<?> bb : beans) {
>               AbstractBean<?>bean = (AbstractBean<?>)bb;
>               beanList.add(bean);
>       }
>       
>       java.util.Collections.sort(beanList, new java.util.Comparator() {
>               public int compare(Object o1, Object o2) {
>                       AbstractBean<?> b1 = (AbstractBean<?>)o1;
>                       AbstractBean<?> b2 = (AbstractBean<?>)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;
>     }
>     
> and in WebBeansUtil.configureSpecializations( ), verify the resolvers are 
> directly specialized/extended when size  > 1.
>                                                                        
>             if(resolvers.size() > 1 && !isDirectlySpecialized(resolvers))
>             {   throw new InconsistentSpecializationException("More than one 
> specialized bean for class : " + specializedClass + " is enabled in the 
> deployment.");
>             }
>             
> ==============BeansDeployer.java=======================
> added  superClassList  local variable. If beanClasses contains:
> Car, CarToyota(s), Bus, ShoolBus(s), CarFord(s), current logic will not find 
> CarFord and carToyota will both specialize Car.
>     protected void checkSpecializations(ScannerService scanner)
>     {
>         logger.info(OWBLogConst.INFO_0029);
>         
>         try
>         {
>             Set<Class<?>> beanClasses = scanner.getBeanClasses();
>             if (beanClasses != null && beanClasses.size() > 0)
>             {
>               // make sure we do not have 2 specialized beans shares the same 
> super class
>               Class<?> superClass = null;
>                 ArrayList<Class<?>> superClassList = new 
> ArrayList<Class<?>>();
>                 for(Class<?> specialClass : beanClasses)
>                 {
>                     if(AnnotationUtil.hasClassAnnotation(specialClass, 
> Specializes.class))
>                     {
>                       superClass = specialClass.getSuperclass();
>                         if(superClass.equals(Object.class))
>                         {
>                             throw new 
> WebBeansConfigurationException(logger.getTokenString(OWBLogConst.EXCEPT_0003) 
> + specialClass.getName()
>                                                                      + 
> logger.getTokenString(OWBLogConst.EXCEPT_0004));
>                         }
>                       
>                         if 
> (superClassList.contains(specialClass.getSuperclass()))
>                         {
>                             throw new 
> InconsistentSpecializationException(logger.getTokenString(OWBLogConst.EXCEPT_0005)
>  + superClass.getName());
>                         }
>                         
>                         WebBeansUtil.configureSpecializations(specialClass);  
>                       
>                     }
>                 }
>               }
>             // XML Defined Specializations
>             checkXMLSpecializations();            
>         }
>         catch(Exception e)
>         {
>             throw new WebBeansDeploymentException(e);
>         }
>         
>         logger.info(OWBLogConst.INFO_0030);
>     }
>  

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.

Reply via email to