Author: remm Date: Wed May 3 02:11:13 2006 New Revision: 399216 URL: http://svn.apache.org/viewcvs?rev=399216&view=rev Log: - Add resource injection for tags (listeners are being handled in the servlet container).
Modified: tomcat/tc6.0.x/trunk/java/org/apache/jasper/compiler/Generator.java tomcat/tc6.0.x/trunk/java/org/apache/jasper/runtime/AnnotationProcessor.java tomcat/tc6.0.x/trunk/java/org/apache/jasper/runtime/TagHandlerPool.java Modified: tomcat/tc6.0.x/trunk/java/org/apache/jasper/compiler/Generator.java URL: http://svn.apache.org/viewcvs/tomcat/tc6.0.x/trunk/java/org/apache/jasper/compiler/Generator.java?rev=399216&r1=399215&r2=399216&view=diff ============================================================================== --- tomcat/tc6.0.x/trunk/java/org/apache/jasper/compiler/Generator.java (original) +++ tomcat/tc6.0.x/trunk/java/org/apache/jasper/compiler/Generator.java Wed May 3 02:11:13 2006 @@ -504,7 +504,8 @@ } out.printin("private javax.el.ExpressionFactory "); out.print(VAR_EXPRESSIONFACTORY); - out.println(";\n"); + out.println(";"); + out.println(); } /** @@ -2370,6 +2371,11 @@ generateSetters(n, tagHandlerVar, handlerInfo, true); + // Resource injection + out.printin("org.apache.jasper.runtime.AnnotationProcessor.postConstruct("); + out.print(tagHandlerVar); + out.println(");"); + // Set the body if (findJspBody(n) == null) { /* @@ -2410,6 +2416,11 @@ // Declare and synchronize AT_END scripting variables declareScriptingVars(n, VariableInfo.AT_END); syncScriptingVars(n, VariableInfo.AT_END); + + // Resource injection + out.printin("org.apache.jasper.runtime.AnnotationProcessor.preDestroy("); + out.print(tagHandlerVar); + out.println(");"); n.setEndJavaLine(out.getJavaLine()); } Modified: tomcat/tc6.0.x/trunk/java/org/apache/jasper/runtime/AnnotationProcessor.java URL: http://svn.apache.org/viewcvs/tomcat/tc6.0.x/trunk/java/org/apache/jasper/runtime/AnnotationProcessor.java?rev=399216&r1=399215&r2=399216&view=diff ============================================================================== --- tomcat/tc6.0.x/trunk/java/org/apache/jasper/runtime/AnnotationProcessor.java (original) +++ tomcat/tc6.0.x/trunk/java/org/apache/jasper/runtime/AnnotationProcessor.java Wed May 3 02:11:13 2006 @@ -24,6 +24,8 @@ import javax.annotation.EJB; import javax.annotation.PostConstruct; import javax.annotation.Resource; +import javax.naming.Context; +import javax.naming.InitialContext; import javax.naming.NamingException; import javax.persistence.PersistenceContext; import javax.persistence.PersistenceUnit; @@ -38,15 +40,71 @@ * @version $Revision: 303236 $, $Date: 2006-03-09 16:46:52 -0600 (Thu, 09 Mar 2006) $ */ public class AnnotationProcessor { - + /** - * Call postConstruct method on the specified instance. + * Call postConstruct method on the specified instance. Note: In Jasper, this + * calls naming resources injection as well. */ public static void postConstruct(Object instance) - throws IllegalAccessException, InvocationTargetException { + throws IllegalAccessException, InvocationTargetException, NamingException { + // Initialize fields annotations + Field[] fields = instance.getClass().getFields(); + for (int i = 0; i < fields.length; i++) { + if (fields[i].isAnnotationPresent(Resource.class)) { + Resource annotation = (Resource) fields[i].getAnnotation(Resource.class); + lookupFieldResource(instance, fields[i], annotation.name()); + } + if (fields[i].isAnnotationPresent(EJB.class)) { + EJB annotation = (EJB) fields[i].getAnnotation(EJB.class); + lookupFieldResource(instance, fields[i], annotation.name()); + } + if (fields[i].isAnnotationPresent(WebServiceRef.class)) { + WebServiceRef annotation = + (WebServiceRef) fields[i].getAnnotation(WebServiceRef.class); + lookupFieldResource(instance, fields[i], annotation.name()); + } + if (fields[i].isAnnotationPresent(PersistenceContext.class)) { + PersistenceContext annotation = + (PersistenceContext) fields[i].getAnnotation(PersistenceContext.class); + lookupFieldResource(instance, fields[i], annotation.name()); + } + if (fields[i].isAnnotationPresent(PersistenceUnit.class)) { + PersistenceUnit annotation = + (PersistenceUnit) fields[i].getAnnotation(PersistenceUnit.class); + lookupFieldResource(instance, fields[i], annotation.name()); + } + } + + // Initialize methods annotations Method[] methods = instance.getClass().getMethods(); + for (int i = 0; i < methods.length; i++) { + if (methods[i].isAnnotationPresent(Resource.class)) { + Resource annotation = (Resource) methods[i].getAnnotation(Resource.class); + lookupMethodResource(instance, methods[i], annotation.name()); + } + if (methods[i].isAnnotationPresent(EJB.class)) { + EJB annotation = (EJB) methods[i].getAnnotation(EJB.class); + lookupMethodResource(instance, methods[i], annotation.name()); + } + if (methods[i].isAnnotationPresent(WebServiceRef.class)) { + WebServiceRef annotation = + (WebServiceRef) methods[i].getAnnotation(WebServiceRef.class); + lookupMethodResource(instance, methods[i], annotation.name()); + } + if (methods[i].isAnnotationPresent(PersistenceContext.class)) { + PersistenceContext annotation = + (PersistenceContext) methods[i].getAnnotation(PersistenceContext.class); + lookupMethodResource(instance, methods[i], annotation.name()); + } + if (methods[i].isAnnotationPresent(PersistenceUnit.class)) { + PersistenceUnit annotation = + (PersistenceUnit) methods[i].getAnnotation(PersistenceUnit.class); + lookupMethodResource(instance, methods[i], annotation.name()); + } + } + Method postConstruct = null; for (int i = 0; i < methods.length; i++) { if (methods[i].isAnnotationPresent(PostConstruct.class)) { @@ -107,80 +165,15 @@ /** - * Inject resources in specified instance. - */ - public static void injectNamingResources(javax.naming.Context context, Object instance) - throws IllegalAccessException, InvocationTargetException, NamingException { - - // Initialize fields annotations - Field[] fields = instance.getClass().getFields(); - for (int i = 0; i < fields.length; i++) { - if (fields[i].isAnnotationPresent(Resource.class)) { - Resource annotation = (Resource) fields[i].getAnnotation(Resource.class); - lookupFieldResource(context, instance, fields[i], annotation.name()); - } - if (fields[i].isAnnotationPresent(EJB.class)) { - EJB annotation = (EJB) fields[i].getAnnotation(EJB.class); - lookupFieldResource(context, instance, fields[i], annotation.name()); - } - if (fields[i].isAnnotationPresent(WebServiceRef.class)) { - WebServiceRef annotation = - (WebServiceRef) fields[i].getAnnotation(WebServiceRef.class); - lookupFieldResource(context, instance, fields[i], annotation.name()); - } - if (fields[i].isAnnotationPresent(PersistenceContext.class)) { - PersistenceContext annotation = - (PersistenceContext) fields[i].getAnnotation(PersistenceContext.class); - lookupFieldResource(context, instance, fields[i], annotation.name()); - } - if (fields[i].isAnnotationPresent(PersistenceUnit.class)) { - PersistenceUnit annotation = - (PersistenceUnit) fields[i].getAnnotation(PersistenceUnit.class); - lookupFieldResource(context, instance, fields[i], annotation.name()); - } - } - - // Initialize methods annotations - Method[] methods = instance.getClass().getMethods(); - for (int i = 0; i < methods.length; i++) { - if (methods[i].isAnnotationPresent(Resource.class)) { - Resource annotation = (Resource) methods[i].getAnnotation(Resource.class); - lookupMethodResource(context, instance, methods[i], annotation.name()); - } - if (methods[i].isAnnotationPresent(EJB.class)) { - EJB annotation = (EJB) methods[i].getAnnotation(EJB.class); - lookupMethodResource(context, instance, methods[i], annotation.name()); - } - if (methods[i].isAnnotationPresent(WebServiceRef.class)) { - WebServiceRef annotation = - (WebServiceRef) methods[i].getAnnotation(WebServiceRef.class); - lookupMethodResource(context, instance, methods[i], annotation.name()); - } - if (methods[i].isAnnotationPresent(PersistenceContext.class)) { - PersistenceContext annotation = - (PersistenceContext) methods[i].getAnnotation(PersistenceContext.class); - lookupMethodResource(context, instance, methods[i], annotation.name()); - } - if (methods[i].isAnnotationPresent(PersistenceUnit.class)) { - PersistenceUnit annotation = - (PersistenceUnit) methods[i].getAnnotation(PersistenceUnit.class); - lookupMethodResource(context, instance, methods[i], annotation.name()); - } - } - - } - - - /** * Inject resources in specified field. */ - protected static void lookupFieldResource(javax.naming.Context context, - Object instance, Field field, String name) + protected static void lookupFieldResource(Object instance, Field field, String name) throws NamingException, IllegalAccessException { Object lookedupResource = null; boolean accessibility = false; + Context context = (Context) (new InitialContext()).lookup("java:comp/env"); if ((name != null) && (name.length() > 0)) { lookedupResource = context.lookup(name); @@ -198,8 +191,7 @@ /** * Inject resources in specified method. */ - protected static void lookupMethodResource(javax.naming.Context context, - Object instance, Method method, String name) + protected static void lookupMethodResource(Object instance, Method method, String name) throws NamingException, IllegalAccessException, InvocationTargetException { if (!method.getName().startsWith("set") @@ -211,6 +203,7 @@ Object lookedupResource = null; boolean accessibility = false; + Context context = (Context) (new InitialContext()).lookup("java:comp/env"); if ((name != null) && (name.length() > 0)) { lookedupResource = context.lookup(name); Modified: tomcat/tc6.0.x/trunk/java/org/apache/jasper/runtime/TagHandlerPool.java URL: http://svn.apache.org/viewcvs/tomcat/tc6.0.x/trunk/java/org/apache/jasper/runtime/TagHandlerPool.java?rev=399216&r1=399215&r2=399216&view=diff ============================================================================== --- tomcat/tc6.0.x/trunk/java/org/apache/jasper/runtime/TagHandlerPool.java (original) +++ tomcat/tc6.0.x/trunk/java/org/apache/jasper/runtime/TagHandlerPool.java Wed May 3 02:11:13 2006 @@ -19,6 +19,9 @@ import javax.servlet.jsp.JspException; import javax.servlet.jsp.tagext.Tag; import javax.servlet.ServletConfig; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; import org.apache.jasper.Constants; /** @@ -33,6 +36,8 @@ public static String OPTION_TAGPOOL="tagpoolClassName"; public static String OPTION_MAXSIZE="tagpoolMaxSize"; + private Log log = LogFactory.getLog(TagHandlerPool.class); + // index of next available tag handler private int current; @@ -113,7 +118,9 @@ // Out of sync block - there is no need for other threads to // wait for us to construct a tag for this thread. try { - return (Tag) handlerClass.newInstance(); + Tag instance = (Tag) handlerClass.newInstance(); + AnnotationProcessor.postConstruct(instance); + return instance; } catch (Exception e) { throw new JspException(e.getMessage(), e); } @@ -135,6 +142,12 @@ } // There is no need for other threads to wait for us to release handler.release(); + try { + AnnotationProcessor.preDestroy(handler); + } catch (Exception e) { + log.warn("Error processing preDestroy on tag instance of " + + handler.getClass().getName(), e); + } } /** @@ -142,9 +155,15 @@ * handler pool. */ public synchronized void release() { - for (int i=current; i>=0; i--) { - handlers[i].release(); - } + for (int i = current; i >= 0; i--) { + handlers[i].release(); + try { + AnnotationProcessor.preDestroy(handlers[i]); + } catch (Exception e) { + log.warn("Error processing preDestroy on tag instance of " + + handlers[i].getClass().getName(), e); + } + } } protected static String getOption( ServletConfig config, String name, String defaultV) { --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]