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 }