Konstantin Kolinko <knst.koli...@gmail.com> wrote:
>2012/6/3 <ma...@apache.org>: >> Author: markt >> Date: Sat Jun 2 21:18:53 2012 >> New Revision: 1345580 >> >> URL: http://svn.apache.org/viewvc?rev=1345580&view=rev >> Log: >> Fix https://issues.apache.org/bugzilla/show_bug.cgi?id=53333 >> Validate JNDI resource types against injection target types and use >target types when no type is specified for the resource. >> Based on a patch by Violeta Georgieva. >> >> Modified: >> > tomcat/trunk/java/org/apache/catalina/deploy/LocalStrings.properties >> tomcat/trunk/java/org/apache/catalina/deploy/NamingResources.java >> > >> --- tomcat/trunk/java/org/apache/catalina/deploy/NamingResources.java >(original) >> +++ tomcat/trunk/java/org/apache/catalina/deploy/NamingResources.java >Sat Jun > >> + private Class<?> getInjectionTargetType(Context context, >> + ResourceBase resource) { >> + >> + Class<?> result = null; >> + >> + for (InjectionTarget injectionTarget : >resource.getInjectionTargets()) { >> + Class<?> clazz = Introspection.loadClass( >> + context, injectionTarget.getTargetClass()); >> + if (clazz == null) { >> + // Can't load class - therefore ignore this target >> + continue; >> + } >> + >> + // Look for a match >> + String targetName = injectionTarget.getTargetName(); >> + // Look for a setter match first >> + Class<?> targetType = getSetterType(clazz, targetName); >> + if (targetType == null) { >> + // Try a field match if no setter match >> + targetType = getFieldType(clazz,targetName); >> + } >> + if (targetType == null) { >> + // No match - ignore this injection target >> + continue; >> + } >> + targetType = convertPrimitiveType(targetType); >> + >> + // Figure out the common type - if there is one >> + if (result == null) { >> + result = targetType; >> + } else if (targetType.isAssignableFrom(result)) { >> + // NO-OP - This will work >> + } else if (result.isAssignableFrom(targetType)) { >> + // Need to use more specific type >> + result = targetType; >> + } else { >> + // Incompatible types >> + return null; >> + } >> + } >> + return result; >> + } > >Does something guarantee that there is always common type among >injection targets? > >Can there be two disjoint interfaces A and B, which are both >implemented by a resource, so assignment to A or B should succeed, but >getInjectionTargetType() will result in a failure? Potentially, yes. That case needs to be handled too but in my view only if a type is defined in web.xml. I don't think it is reasonable to find a suitable type if injection targets define disparate interfaces with no concrete type in web.xml. Mark --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org