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]