001: /*
002: * Copyright 2000,2005 wingS development team.
003: *
004: * This file is part of wingS (http://wingsframework.org).
005: *
006: * wingS is free software; you can redistribute it and/or modify
007: * it under the terms of the GNU Lesser General Public License
008: * as published by the Free Software Foundation; either version 2.1
009: * of the License, or (at your option) any later version.
010: *
011: * Please see COPYING for the complete licence.
012: */
013: package org.wings.recorder;
014:
015: import org.apache.commons.logging.Log;
016: import org.apache.commons.logging.LogFactory;
017: import org.wings.util.SStringBuilder;
018:
019: import javax.servlet.*;
020: import javax.servlet.http.HttpServletRequest;
021: import javax.servlet.http.HttpServletResponse;
022: import javax.servlet.http.HttpServletResponseWrapper;
023: import java.io.File;
024: import java.io.FileWriter;
025: import java.io.IOException;
026: import java.io.PrintWriter;
027: import java.util.*;
028:
029: /**
030: * @author hengels
031: */
032: public class Recorder implements Filter {
033: private final transient static Log log = LogFactory
034: .getLog(Recorder.class);
035: public static final String RECORDER_START = "recorder_start";
036: public static final String RECORDER_STOP = "recorder_stop";
037: public static final String RECORDER_SCRIPT = "recorder_script";
038:
039: private File file;
040: private List list;
041: private String scriptName = "Recording";
042: private String lookupName = "SessionServlet";
043:
044: public void init(FilterConfig filterConfig) throws ServletException {
045: if (filterConfig
046: .getInitParameter("wings.servlet.recorder.script") != null)
047: scriptName = filterConfig
048: .getInitParameter("wings.servlet.recorder.script");
049:
050: lookupName = filterConfig
051: .getInitParameter("wings.servlet.lookupname");
052:
053: if (lookupName == null || lookupName.trim().length() == 0) {
054: lookupName = "SessionServlet:"
055: + filterConfig.getInitParameter("wings.mainclass");
056: }
057:
058: log.info("wings.servlet.lookupname " + lookupName);
059: log.info("wings.servlet.recorder.script " + scriptName);
060: }
061:
062: public void doFilter(ServletRequest servletRequest,
063: ServletResponse servletResponse, FilterChain filterChain)
064: throws IOException, ServletException {
065: try {
066: if (servletRequest instanceof HttpServletRequest) {
067: HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest;
068: Map map = servletRequest.getParameterMap();
069: if (map.containsKey(RECORDER_SCRIPT)) {
070: log.info("recorder_script "
071: + map.get(RECORDER_SCRIPT));
072: String[] values = (String[]) map
073: .get(RECORDER_SCRIPT);
074: scriptName = values[0];
075: }
076: if (map.containsKey(RECORDER_START)) {
077: if (list != null)
078: return;
079: log.info(RECORDER_START);
080: list = new LinkedList();
081: } else if (map.containsKey(RECORDER_STOP)) {
082: if (list == null)
083: return;
084: log.info(RECORDER_STOP);
085: writeCode();
086: list = null;
087: } else if (list != null) {
088: String resource = httpServletRequest.getPathInfo();
089: log.debug("PATH_INFO: " + resource);
090:
091: Request record;
092: if ("GET".equalsIgnoreCase(httpServletRequest
093: .getMethod()))
094: record = new GET(resource);
095: else
096: record = new POST(resource);
097:
098: Enumeration parameterNames = httpServletRequest
099: .getParameterNames();
100: while (parameterNames.hasMoreElements()) {
101: String name = (String) parameterNames
102: .nextElement();
103: String[] values = httpServletRequest
104: .getParameterValues(name);
105: addEvent(record, name, values);
106: }
107: Enumeration headerNames = httpServletRequest
108: .getHeaderNames();
109: while (headerNames.hasMoreElements()) {
110: String name = (String) headerNames
111: .nextElement();
112: if (name.equalsIgnoreCase("cookie")
113: || name.equalsIgnoreCase("referer"))
114: continue;
115: addHeader(record, name, httpServletRequest
116: .getHeader(name));
117: }
118: list.add(record);
119: }
120: }
121: } finally {
122: if (servletResponse instanceof HttpServletResponse) {
123: filterChain.doFilter(servletRequest,
124: new HttpServletResponseWrapper(
125: (HttpServletResponse) servletResponse) {
126: public ServletOutputStream getOutputStream()
127: throws IOException {
128: final ServletOutputStream out = super
129: .getOutputStream();
130: return new ServletOutputStream() {
131: public void write(int b)
132: throws IOException {
133: out.write(b);
134: }
135:
136: public void close()
137: throws IOException {
138: super
139: .println("<hr/><div align=\"center\">");
140: super
141: .println("<form method=\"get\" action=\"\">");
142: super
143: .println("<input type=\"text\" name=\"recorder_script\" value=\""
144: + scriptName
145: + "\">");
146: super
147: .println("<input type=\"submit\" name=\"recorder_start\" value=\"start\">");
148: super
149: .println("<input type=\"submit\" name=\"recorder_stop\" value=\"stop\">");
150: super .println("</div></form>");
151: super .close();
152: }
153: };
154: }
155: });
156: } else
157: filterChain.doFilter(servletRequest, servletResponse);
158: }
159: }
160:
161: private void addHeader(Request record, String name, String value) {
162: if (record instanceof GET) {
163: GET get = (GET) record;
164: get.addHeader(name, value);
165: } else if (record instanceof POST) {
166: POST post = (POST) record;
167: post.addHeader(name, value);
168: }
169: }
170:
171: private void addEvent(Request record, String name, String[] values) {
172: if (record instanceof GET) {
173: GET get = (GET) record;
174: get.addEvent(name, values);
175: } else if (record instanceof POST) {
176: POST post = (POST) record;
177: post.addEvent(name, values);
178: }
179: }
180:
181: public void destroy() {
182: writeCode();
183: }
184:
185: private void writeCode() {
186: PrintWriter out = null;
187: if (list == null || list.size() == 0)
188: return;
189: try {
190: for (Iterator iterator = list.iterator(); iterator
191: .hasNext();) {
192: Request record = (Request) iterator.next();
193: if (record.getResource().indexOf(".") == -1)
194: record.setResource("");
195: }
196:
197: file = new File(scriptName + ".java");
198: out = new PrintWriter(new FileWriter(file));
199: out.println("import org.wings.recorder.*;");
200: out.println();
201: out.println("public class " + scriptName);
202: out.println(" extends Script");
203: out.println("{");
204: out.println(" public void execute()");
205: out.println(" throws Exception");
206: out.println(" {");
207:
208: long millis = ((Request) list.get(0)).getMillis();
209:
210: int index = 0;
211: for (Iterator iterator = list.iterator(); iterator
212: .hasNext();) {
213: Request record = (Request) iterator.next();
214: if (index > 0)
215: out.println();
216: out.println(" delay("
217: + (record.getMillis() - millis) + ");");
218: out.print(" " + record.getMethod() + " request"
219: + index + " = new " + record.getMethod()
220: + "(\"" + record.getResource() + "\")");
221:
222: for (Iterator iterator2 = record.getHeaders()
223: .iterator(); iterator2.hasNext();) {
224: Request.Header header = (Request.Header) iterator2
225: .next();
226: out.println();
227: out.print(" .addHeader(\"");
228: out.print(header.getName());
229: out.print("\", \"");
230: out.print(replace(header.getValue(), "\"", "\\\""));
231: out.print("\")");
232: }
233: for (Iterator iterator2 = record.getEvents().iterator(); iterator2
234: .hasNext();) {
235: Request.Event event = (Request.Event) iterator2
236: .next();
237: out.println();
238: out.print(" .addEvent(\"");
239: out.print(event.getName());
240: out.print("\", new String[] { \"");
241: for (int i = 0; i < event.getValues().length; i++) {
242: String value = event.getValues()[i];
243: if (i > 0)
244: out.print("\", \"");
245: out.print(replace(value, "\"", "\\\""));
246: }
247: out.print("\" })");
248: }
249: out.println(";");
250: out.println(" send(request" + index + ");");
251: millis = record.getMillis();
252: index++;
253: }
254:
255: out.println(" }");
256: out.println("}");
257: out.flush();
258: } catch (Exception e) {
259: e.printStackTrace();
260: } finally {
261: try {
262: out.close();
263: } catch (Exception ign) {/*ignored*/
264: }
265: }
266: }
267:
268: public static final String replace(String s, String toFind,
269: String replace) {
270: SStringBuilder erg = new SStringBuilder();
271:
272: int lastindex = 0;
273: int indexOf = s.indexOf(toFind);
274: if (indexOf == -1)
275: return s;
276: while (indexOf != -1) {
277: erg.append(s.substring(lastindex, indexOf)).append(replace);
278: lastindex = indexOf + toFind.length();
279: indexOf = s.indexOf(toFind, lastindex);
280: }
281:
282: erg.append(s.substring(lastindex));
283:
284: return erg.toString();
285: }
286: }
|