View Javadoc

1   package org.seasar.cubby.tomcat55.valves;
2   
3   import java.io.IOException;
4   import java.lang.reflect.Field;
5   import java.lang.reflect.Method;
6   import java.util.ArrayList;
7   import java.util.Collections;
8   import java.util.Iterator;
9   import java.util.List;
10  import java.util.Map;
11  import java.util.StringTokenizer;
12  
13  import javax.servlet.ServletException;
14  
15  import org.apache.catalina.connector.Request;
16  import org.apache.catalina.connector.Response;
17  import org.apache.catalina.util.StringManager;
18  import org.apache.catalina.valves.ValveBase;
19  import org.apache.commons.logging.Log;
20  
21  public class StaticReferenceCleanerValve extends ValveBase {
22  
23  	private static final String info = "org.seasar.cubby.tomcat55.valves.StaticReferenceCleanerValve/1.0";
24  
25  	private static StringManager sm = StringManager
26  			.getManager(Constants.Package);
27  
28  	private String methods;
29  
30  	private String maps;
31  
32  	public String getInfo() {
33  		return info;
34  	}
35  
36  	public String getMethods() {
37  		return methods;
38  	}
39  
40  	public void setMethods(final String methods) {
41  		this.methods = methods;
42  
43  		this.methodNames = new ArrayList();
44  		final StringTokenizer tokenizer = new StringTokenizer(methods, ",");
45  		while (tokenizer.hasMoreTokens()) {
46  			this.methodNames.add(tokenizer.nextToken());
47  		}
48  	}
49  
50  	public String getMaps() {
51  		return maps;
52  	}
53  
54  	public void setMaps(final String maps) {
55  		this.maps = maps;
56  
57  		this.mapNames = new ArrayList();
58  		final StringTokenizer tokenizer = new StringTokenizer(maps, ",");
59  		while (tokenizer.hasMoreTokens()) {
60  			this.mapNames.add(tokenizer.nextToken());
61  		}
62  	}
63  
64  	private List methodNames = Collections.EMPTY_LIST;
65  
66  	private List mapNames = Collections.EMPTY_LIST;
67  
68  	public void invoke(final Request request, final Response response)
69  			throws IOException, ServletException {
70  		try {
71  			getNext().invoke(request, response);
72  		} finally {
73  			clean();
74  		}
75  	}
76  
77  	private void clean() {
78  		final Log log = getContainer().getLogger();
79  		for (final Iterator i = methodNames.iterator(); i.hasNext();) {
80  			final StringTokenizer tokenizer = new StringTokenizer((String) i
81  					.next(), "#");
82  			final String className = tokenizer.nextToken();
83  			final String methodName = tokenizer.nextToken();
84  
85  			try {
86  				final Class clazz = Class.forName(className);
87  				final Method method = clazz.getMethod(methodName, new Class[0]);
88  				method.invoke(null, null);
89  				if (log.isDebugEnabled()) {
90  					log.debug(sm.getString(
91  							"staticReferenceCleanerValve.methodInvokeSucceed",
92  							method));
93  				}
94  			} catch (final Exception e) {
95  				if (log.isWarnEnabled()) {
96  					log.warn(sm.getString(
97  							"staticReferenceCleanerValve.methodInvokeFailed",
98  							className, methodName), e);
99  				}
100 			}
101 		}
102 
103 		for (final Iterator i = mapNames.iterator(); i.hasNext();) {
104 			final StringTokenizer tokenizer = new StringTokenizer((String) i
105 					.next(), "#");
106 			final String className = tokenizer.nextToken();
107 			final String mapFieldName = tokenizer.nextToken();
108 
109 			try {
110 				final Class clazz = Class.forName(className);
111 				final Field field = clazz.getDeclaredField(mapFieldName);
112 				field.setAccessible(true);
113 				final Map map = (Map) field.get(null);
114 				map.clear();
115 				if (log.isDebugEnabled()) {
116 					log.debug(sm.getString(
117 							"staticReferenceCleanerValve.mapFieldClearSucceed",
118 							field));
119 				}
120 			} catch (final Exception e) {
121 				if (log.isWarnEnabled()) {
122 					log.warn(sm.getString(
123 							"staticReferenceCleanerValve.mapFieldClearFailed",
124 							className, maps), e);
125 				}
126 			}
127 		}
128 
129 	}
130 
131 }