Author: markt
Date: Mon Oct 20 02:11:55 2008
New Revision: 706159
URL: http://svn.apache.org/viewvc?rev=706159&view=rev
Log:
Default JNDI name for annotation lookup should be based on the class where the
annotation was found which isn't always the class of the instance being created.
Reported as part of the follow-up to
https://issues.apache.org/bugzilla/show_bug.cgi?id=45285
Based on a patch for 6.0.x provided by Florent BENOIT.
Modified:
tomcat/trunk/java/org/apache/catalina/core/DefaultInstanceManager.java
Modified: tomcat/trunk/java/org/apache/catalina/core/DefaultInstanceManager.java
URL:
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/core/DefaultInstanceManager.java?rev=706159&r1=706158&r2=706159&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/catalina/core/DefaultInstanceManager.java
(original)
+++ tomcat/trunk/java/org/apache/catalina/core/DefaultInstanceManager.java Mon
Oct 20 02:11:55 2008
@@ -252,25 +252,31 @@
Field[] fields = clazz.getDeclaredFields();
for (Field field : fields) {
if (injections != null &&
injections.containsKey(field.getName())) {
- lookupFieldResource(context, instance, field,
injections.get(field.getName()));
+ lookupFieldResource(context, instance, field,
+ injections.get(field.getName()), clazz);
} else if (field.isAnnotationPresent(Resource.class)) {
Resource annotation = field.getAnnotation(Resource.class);
- lookupFieldResource(context, instance, field,
annotation.name());
+ lookupFieldResource(context, instance, field,
+ annotation.name(), clazz);
} else if (field.isAnnotationPresent(EJB.class)) {
EJB annotation = field.getAnnotation(EJB.class);
- lookupFieldResource(context, instance, field,
annotation.name());
+ lookupFieldResource(context, instance, field,
+ annotation.name(), clazz);
} else if (field.isAnnotationPresent(WebServiceRef.class)) {
WebServiceRef annotation =
field.getAnnotation(WebServiceRef.class);
- lookupFieldResource(context, instance, field,
annotation.name());
+ lookupFieldResource(context, instance, field,
+ annotation.name(), clazz);
} else if
(field.isAnnotationPresent(PersistenceContext.class)) {
PersistenceContext annotation =
field.getAnnotation(PersistenceContext.class);
- lookupFieldResource(context, instance, field,
annotation.name());
+ lookupFieldResource(context, instance, field,
+ annotation.name(), clazz);
} else if (field.isAnnotationPresent(PersistenceUnit.class)) {
PersistenceUnit annotation =
field.getAnnotation(PersistenceUnit.class);
- lookupFieldResource(context, instance, field,
annotation.name());
+ lookupFieldResource(context, instance, field,
+ annotation.name(), clazz);
}
}
@@ -281,28 +287,34 @@
if (injections != null && methodName.startsWith("set") &&
methodName.length() > 3) {
String fieldName =
Character.toLowerCase(methodName.charAt(3)) + methodName.substring(4);
if (injections.containsKey(fieldName)) {
- lookupMethodResource(context, instance, method,
injections.get(fieldName));
+ lookupMethodResource(context, instance, method,
+ injections.get(fieldName), clazz);
break;
}
}
if (method.isAnnotationPresent(Resource.class)) {
Resource annotation = method.getAnnotation(Resource.class);
- lookupMethodResource(context, instance, method,
annotation.name());
+ lookupMethodResource(context, instance, method,
+ annotation.name(), clazz);
} else if (method.isAnnotationPresent(EJB.class)) {
EJB annotation = method.getAnnotation(EJB.class);
- lookupMethodResource(context, instance, method,
annotation.name());
+ lookupMethodResource(context, instance, method,
+ annotation.name(), clazz);
} else if (method.isAnnotationPresent(WebServiceRef.class)) {
WebServiceRef annotation =
method.getAnnotation(WebServiceRef.class);
- lookupMethodResource(context, instance, method,
annotation.name());
+ lookupMethodResource(context, instance, method,
+ annotation.name(), clazz);
} else if
(method.isAnnotationPresent(PersistenceContext.class)) {
PersistenceContext annotation =
method.getAnnotation(PersistenceContext.class);
- lookupMethodResource(context, instance, method,
annotation.name());
+ lookupMethodResource(context, instance, method,
+ annotation.name(), clazz);
} else if (method.isAnnotationPresent(PersistenceUnit.class)) {
PersistenceUnit annotation =
method.getAnnotation(PersistenceUnit.class);
- lookupMethodResource(context, instance, method,
annotation.name());
+ lookupMethodResource(context, instance, method,
+ annotation.name(), clazz);
}
}
clazz = clazz.getSuperclass();
@@ -378,11 +390,12 @@
* @param instance object to inject into
* @param field field target for injection
* @param name jndi name value is bound under
+ * @param clazz class annotation is defined in
* @throws IllegalAccessException if field is inaccessible
* @throws javax.naming.NamingException if value is not accessible in
naming context
*/
protected static void lookupFieldResource(Context context,
- Object instance, Field field, String name)
+ Object instance, Field field, String name, Class<?> clazz)
throws NamingException, IllegalAccessException {
Object lookedupResource;
@@ -392,7 +405,8 @@
(name.length() > 0)) {
lookedupResource = context.lookup(name);
} else {
- lookedupResource = context.lookup(instance.getClass().getName() +
"/" + field.getName());
+ lookedupResource =
+ context.lookup(clazz.getName() + "/" + field.getName());
}
accessibility = field.isAccessible();
@@ -408,13 +422,14 @@
* @param instance object to inject into
* @param method field target for injection
* @param name jndi name value is bound under
+ * @param clazz class annotation is defined in
* @throws IllegalAccessException if method is inaccessible
* @throws javax.naming.NamingException if value is not accessible in
naming context
* @throws java.lang.reflect.InvocationTargetException
* if setter call fails
*/
protected static void lookupMethodResource(Context context,
- Object instance, Method method, String name)
+ Object instance, Method method, String name, Class<?> clazz)
throws NamingException, IllegalAccessException,
InvocationTargetException {
if (!method.getName().startsWith("set")
@@ -430,8 +445,8 @@
(name.length() > 0)) {
lookedupResource = context.lookup(name);
} else {
- lookedupResource =
- context.lookup(instance.getClass().getName() + "/" +
method.getName().substring(3));
+ lookedupResource = context.lookup(
+ clazz.getName() + "/" + method.getName().substring(3));
}
accessibility = method.isAccessible();
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]