[
https://issues.apache.org/jira/browse/OWB-279?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12834323#action_12834323
]
Gurkan Erdogdu commented on OWB-279:
------------------------------------
Hello YING,
Patch is great but could you attach SVN diff as a patch therefore we are able
to see what you change. Also patch on last revision. 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: 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.