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?

Best regards,
Konstantin Kolinko

---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org
For additional commands, e-mail: dev-h...@tomcat.apache.org

Reply via email to