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

Eric Covener commented on OWB-431:
----------------------------------

IMHO the spec could only have meant "assignable from" and not "assignable to".  
That would stop us from inverting the two types in question in our comparison:


If a producer produces "T extends Pet" (upper bound of "Pet")
... and Pet extends Animal
... and Dog extends Pet.


Consider injection points:

  @Inject @Default Dog d;
  @Inject @Default Animal a;


When the spec says "actual type is assignable to the upper bound" I think they 
MUST have intended
"actual type is assignable _from_ the upper bound"

I assume everyone agrees that the Animal injection is satisfiable (we can 
produce a Pet, which is an Animal) and the Dog injection is not satisfiable:

Since the spec says "actual type (Dog or Animal) is assignable _to_ the upper 
bound (Pet)" we reverse the arguments:

   if (!Pet.isAssignableFrom(Dog)) {  // wrong result, our code expects to call 
dog.bark() but we're just producing a Pet!  
        return false;
   }

   if (!Pet.isAssignableFrom(Animal)) { // wrong result, Pet clearly fulfills 
the injection point of Animal
        return false;
   }

But the real test for the injection point being satisfied should not be 
reversed:

   if (!Dog.isAssignableFrom(Pet)) { // we can't inject a pet into a field that 
wants a dog
        return false;
   }

  if (!Animal.isAssignableFrom(Pet)) { // 
        return false;
   }




> Generic Type Inheritance not resolved correctly
> -----------------------------------------------
>
>                 Key: OWB-431
>                 URL: https://issues.apache.org/jira/browse/OWB-431
>             Project: OpenWebBeans
>          Issue Type: Bug
>          Components: Injection and Lookup
>    Affects Versions: 1.0.0-alpha-1
>         Environment: standard OWB configuration
>            Reporter: Bill Wigger
>            Assignee: Gurkan Erdogdu
>            Priority: Minor
>             Fix For: 1.0.0-alpha-2
>
>         Attachments: ClassUtilPatch.txt, ClassUtilPatch2.txt
>
>   Original Estimate: 2h
>  Remaining Estimate: 2h
>
> WebBean is defined as:
> @Named
> public class MethodTypeProduces1<T extends Bc> {
>       @Produces @Dependent @Named("ProMethodParameterized3") ArrayList<T> 
> methodPT3() {
> and injected as:
> @Named
> @Dependent
> public class ProMethodTestGroup3A {
>       public @Inject @Dependent @Named("ProMethodParameterized3") 
> ArrayList<Dc> pt3;
>         
> with BC extending DC as follows:
> public class Bc extends Dc implements Fi {
> gives this error:
> Jul 28, 2010 9:26:51 AM org.apache.webbeans.config.BeansDeployer deploy
> SEVERE: 
> Throwable occurred: javax.enterprise.inject.UnsatisfiedResolutionException: 
> Api type [java.util.ArrayList] is not found with the qualifiers 
> [...@javax.inject.named(value=ProMethodParameterized3)] for injection into 
> Field Injection Point, field name :  pt3, Bean Owner : 
> [Name:proMethodTestGroup3A,WebBeans Type:MANAGED,API 
> Types:[com.ibm.jcdi.test.ProMethodTestGroup3A,java.lang.Object],Qualifiers:[javax.enterprise.inject.Any,javax.enterprise.inject.Default,javax.inject.Named]]
>       at 
> org.apache.webbeans.container.ResolutionUtil.checkResolvedBeans(ResolutionUtil.java:121)
>       at 
> org.apache.webbeans.container.InjectionResolver.checkInjectionPoints(InjectionResolver.java:185)
>       at 
> org.apache.webbeans.container.BeanManagerImpl.validate(BeanManagerImpl.java:1025)
> injection should be checked/resolved here in 
> org.apache.webbeans.util.ClassUtil,  but this method returns false
>     public static boolean checkRequiredTypeIsClassAndBeanTypeIsVariable(Type 
> beanTypeArg, Type requiredTypeArg)
>     {
>         Class<?> clazzRequiredType = (Class<?>)requiredTypeArg;
>         TypeVariable<?> tvBeanTypeArg = (TypeVariable<?>)beanTypeArg;
>         Type tvBound = tvBeanTypeArg.getBounds()[0];
>         if(tvBound instanceof Class)
>         {
>             Class<?> clazzTvBound = (Class<?>)tvBound;
>             if(clazzTvBound != Object.class)
>             {
>                 if(!clazzTvBound.isAssignableFrom(clazzRequiredType))
>                 {
>                     return false;
>                 }                                    
>             }            
>         }
>         return true;
>     }
> But since clazzTvBound is Bc  and classRequiredType is Dc
> Bc.isAssignableFrom(Dc) returns false,  so the ! is true,  and the function 
> returns false.
> fix seems to simply go back to the old code in this routine, this code was 
> changeed on 4/28, and
> I can't see why is was changed.
> But the check needs to verify that the required class can be assigned from 
> the given bean class, as follows:
>         if(tvBound instanceof Class)
>         {
>             Class<?> clazzTvBound = (Class<?>)tvBound;
>             if(clazzRequiredType.isAssignableFrom(clazzTvBound))
>             {
>                 return true;
>             }                    
>         }
>         return false;
> There is also a similar incorrect injection exception using the above 
> example, but with an injection of:
> public class TG4 <T extends Dc> {
>       public @Inject @Dependent @Named("ProMethodParameterized3") 
> ArrayList<T> ptT;
> I think the line of code in error here is in the method: 
> (same class as in the previous problem: org.apache.webbeans.util.ClassUtil)
> public static boolean checkBeanTypeAndRequiredIsTypeVariable(Type 
> beanTypeArg, Type requiredTypeArg)
> where:    
> if(clazzTvBeanBound.isAssignableFrom(clazzTvRequiredBound))
> should be replaced with:
> (clazzTvRequiredBound.isAssignableFrom(clazzTvBeanBound))

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