[ 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.