1 2 15 package org.wings.recorder; 16 17 import org.apache.commons.logging.Log; 18 import org.apache.commons.logging.LogFactory; 19 20 import javax.servlet.*; 21 import javax.servlet.http.HttpServletRequest ; 22 import javax.servlet.http.HttpServletResponse ; 23 import javax.servlet.http.HttpServletResponseWrapper ; 24 import java.io.File ; 25 import java.io.FileWriter ; 26 import java.io.IOException ; 27 import java.io.PrintWriter ; 28 import java.util.*; 29 30 33 public class Recorder 34 implements Filter { 35 private final transient static Log log = LogFactory.getLog(Recorder.class); 36 public static final String RECORDER_START = "recorder_start"; 37 public static final String RECORDER_STOP = "recorder_stop"; 38 public static final String RECORDER_SCRIPT = "recorder_script"; 39 40 private File file; 41 private List list; 42 private String scriptName = "Recording"; 43 private String lookupName = "SessionServlet"; 44 45 public void init(FilterConfig filterConfig) throws ServletException { 46 if (filterConfig.getInitParameter("wings.servlet.recorder.script") != null) 47 scriptName = filterConfig.getInitParameter("wings.servlet.recorder.script"); 48 49 lookupName = filterConfig.getInitParameter("wings.servlet.lookupname"); 50 51 if (lookupName == null || lookupName.trim().length() == 0) { 52 lookupName = "SessionServlet:" + filterConfig.getInitParameter("wings.mainclass"); 53 } 54 55 log.info("wings.servlet.lookupname " + lookupName); 56 log.info("wings.servlet.recorder.script " + scriptName); 57 } 58 59 public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) 60 throws IOException , ServletException { 61 try { 62 if (servletRequest instanceof HttpServletRequest ) { 63 HttpServletRequest httpServletRequest = (HttpServletRequest ) servletRequest; 64 Map map = servletRequest.getParameterMap(); 65 if (map.containsKey(RECORDER_SCRIPT)) { 66 log.info("recorder_script " + map.get(RECORDER_SCRIPT)); 67 String [] values = (String []) map.get(RECORDER_SCRIPT); 68 scriptName = values[0]; 69 } 70 if (map.containsKey(RECORDER_START)) { 71 if (list != null) 72 return; 73 log.info(RECORDER_START); 74 list = new LinkedList(); 75 } else if (map.containsKey(RECORDER_STOP)) { 76 if (list == null) 77 return; 78 log.info(RECORDER_STOP); 79 writeCode(); 80 list = null; 81 } else if (list != null) { 82 String resource = httpServletRequest.getPathInfo(); 83 log.debug("PATH_INFO: " + resource); 84 85 Request record; 86 if ("GET".equalsIgnoreCase(httpServletRequest.getMethod())) 87 record = new GET(resource); 88 else 89 record = new POST(resource); 90 91 Enumeration parameterNames = httpServletRequest.getParameterNames(); 92 while (parameterNames.hasMoreElements()) { 93 String name = (String ) parameterNames.nextElement(); 94 String [] values = httpServletRequest.getParameterValues(name); 95 addEvent(record, name, values); 96 } 97 Enumeration headerNames = httpServletRequest.getHeaderNames(); 98 while (headerNames.hasMoreElements()) { 99 String name = (String ) headerNames.nextElement(); 100 if (name.equalsIgnoreCase("cookie") || 101 name.equalsIgnoreCase("referer")) 102 continue; 103 addHeader(record, name, httpServletRequest.getHeader(name)); 104 } 105 list.add(record); 106 } 107 } 108 } finally { 109 if (servletResponse instanceof HttpServletResponse ) { 110 filterChain.doFilter(servletRequest, new HttpServletResponseWrapper ((HttpServletResponse ) servletResponse) { 111 public ServletOutputStream getOutputStream() throws IOException { 112 final ServletOutputStream out = super.getOutputStream(); 113 return new ServletOutputStream() { 114 public void write(int b) throws IOException { 115 out.write(b); 116 } 117 118 public void close() throws IOException { 119 super.println("<hr/><div align=\"center\">"); 120 super.println("<form method=\"get\" action=\"\">"); 121 super.println("<input type=\"text\" name=\"recorder_script\" value=\"" + scriptName + "\">"); 122 super.println("<input type=\"submit\" name=\"recorder_start\" value=\"start\">"); 123 super.println("<input type=\"submit\" name=\"recorder_stop\" value=\"stop\">"); 124 super.println("</div></form>"); 125 super.close(); 126 } 127 }; 128 } 129 }); 130 } else 131 filterChain.doFilter(servletRequest, servletResponse); 132 } 133 } 134 135 private void addHeader(Request record, String name, String value) { 136 if (record instanceof GET) { 137 GET get = (GET) record; 138 get.addHeader(name, value); 139 } else if (record instanceof POST) { 140 POST post = (POST) record; 141 post.addHeader(name, value); 142 } 143 } 144 145 private void addEvent(Request record, String name, String [] values) { 146 if (record instanceof GET) { 147 GET get = (GET) record; 148 get.addEvent(name, values); 149 } else if (record instanceof POST) { 150 POST post = (POST) record; 151 post.addEvent(name, values); 152 } 153 } 154 155 public void destroy() { 156 writeCode(); 157 } 158 159 private void writeCode() { 160 PrintWriter out = null; 161 if (list == null || list.size() == 0) 162 return; 163 try { 164 for (Iterator iterator = list.iterator(); iterator.hasNext();) { 165 Request record = (Request) iterator.next(); 166 if (record.getResource().indexOf(".") == -1) 167 record.setResource(""); 168 } 169 170 file = new File (scriptName + ".java"); 171 out = new PrintWriter (new FileWriter (file)); 172 out.println("import org.wings.recorder.*;"); 173 out.println(); 174 out.println("public class " + scriptName); 175 out.println(" extends Script"); 176 out.println("{"); 177 out.println(" public void execute()"); 178 out.println(" throws Exception"); 179 out.println(" {"); 180 181 long millis = ((Request) list.get(0)).getMillis(); 182 183 int index = 0; 184 for (Iterator iterator = list.iterator(); iterator.hasNext();) { 185 Request record = (Request) iterator.next(); 186 if (index > 0) 187 out.println(); 188 out.println(" delay(" + (record.getMillis() - millis) + ");"); 189 out.print(" " + record.getMethod() + " request" + index + 190 " = new " + record.getMethod() + "(\"" + record.getResource() + "\")"); 191 192 for (Iterator iterator2 = record.getHeaders().iterator(); iterator2.hasNext();) { 193 Request.Header header = (Request.Header) iterator2.next(); 194 out.println(); 195 out.print(" .addHeader(\""); 196 out.print(header.getName()); 197 out.print("\", \""); 198 out.print(replace(header.getValue(), "\"", "\\\"")); 199 out.print("\")"); 200 } 201 for (Iterator iterator2 = record.getEvents().iterator(); iterator2.hasNext();) { 202 Request.Event event = (Request.Event) iterator2.next(); 203 out.println(); 204 out.print(" .addEvent(\""); 205 out.print(event.getName()); 206 out.print("\", new String[] { \""); 207 for (int i = 0; i < event.getValues().length; i++) { 208 String value = event.getValues()[i]; 209 if (i > 0) 210 out.print("\", \""); 211 out.print(replace(value, "\"", "\\\"")); 212 } 213 out.print("\" })"); 214 } 215 out.println(";"); 216 out.println(" send(request" + index + ");"); 217 millis = record.getMillis(); 218 index++; 219 } 220 221 out.println(" }"); 222 out.println("}"); 223 out.flush(); 224 } catch (Exception e) { 225 e.printStackTrace(); 226 } finally { 227 try { out.close(); } catch (Exception ign) {} 228 ; 229 } 230 } 231 232 public static final String replace(String s, 233 String toFind, String replace) { 234 StringBuffer erg = new StringBuffer (); 235 236 int lastindex = 0; 237 int indexOf = s.indexOf(toFind); 238 if (indexOf == -1) return s; 239 while (indexOf != -1) { 240 erg.append(s.substring(lastindex, indexOf)).append(replace); 241 lastindex = indexOf + toFind.length(); 242 indexOf = s.indexOf(toFind, lastindex); 243 } 244 245 erg.append(s.substring(lastindex)); 246 247 return erg.toString(); 248 } 249 } 250 | Popular Tags |