KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > wings > recorder > Recorder


1 /* $Id: Recorder.java,v 1.4 2004/12/01 07:54:26 hengels Exp $ */
2 /*
3  * $Id: Recorder.java,v 1.4 2004/12/01 07:54:26 hengels Exp $
4  * Copyright 2000,2005 wingS development team.
5  *
6  * This file is part of wingS (http://www.j-wings.org).
7  *
8  * wingS is free software; you can redistribute it and/or modify
9  * it under the terms of the GNU Lesser General Public License
10  * as published by the Free Software Foundation; either version 2.1
11  * of the License, or (at your option) any later version.
12  *
13  * Please see COPYING for the complete licence.
14  */

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 JavaDoc;
22 import javax.servlet.http.HttpServletResponse JavaDoc;
23 import javax.servlet.http.HttpServletResponseWrapper JavaDoc;
24 import java.io.File JavaDoc;
25 import java.io.FileWriter JavaDoc;
26 import java.io.IOException JavaDoc;
27 import java.io.PrintWriter JavaDoc;
28 import java.util.*;
29
30 /**
31  * @author hengels
32  */

33 public class Recorder
34         implements Filter {
35     private final transient static Log log = LogFactory.getLog(Recorder.class);
36     public static final String JavaDoc RECORDER_START = "recorder_start";
37     public static final String JavaDoc RECORDER_STOP = "recorder_stop";
38     public static final String JavaDoc RECORDER_SCRIPT = "recorder_script";
39
40     private File JavaDoc file;
41     private List list;
42     private String JavaDoc scriptName = "Recording";
43     private String JavaDoc 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 JavaDoc servletRequest, ServletResponse JavaDoc servletResponse, FilterChain filterChain)
60             throws IOException JavaDoc, ServletException {
61         try {
62             if (servletRequest instanceof HttpServletRequest JavaDoc) {
63                 HttpServletRequest JavaDoc httpServletRequest = (HttpServletRequest JavaDoc) servletRequest;
64                 Map map = servletRequest.getParameterMap();
65                 if (map.containsKey(RECORDER_SCRIPT)) {
66                     log.info("recorder_script " + map.get(RECORDER_SCRIPT));
67                     String JavaDoc[] values = (String JavaDoc[]) 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 JavaDoc 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 JavaDoc name = (String JavaDoc) parameterNames.nextElement();
94                         String JavaDoc[] values = httpServletRequest.getParameterValues(name);
95                         addEvent(record, name, values);
96                     }
97                     Enumeration headerNames = httpServletRequest.getHeaderNames();
98                     while (headerNames.hasMoreElements()) {
99                         String JavaDoc name = (String JavaDoc) 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 JavaDoc) {
110                 filterChain.doFilter(servletRequest, new HttpServletResponseWrapper JavaDoc((HttpServletResponse JavaDoc) servletResponse) {
111                     public ServletOutputStream getOutputStream() throws IOException JavaDoc {
112                         final ServletOutputStream out = super.getOutputStream();
113                         return new ServletOutputStream() {
114                             public void write(int b) throws IOException JavaDoc {
115                                 out.write(b);
116                             }
117
118                             public void close() throws IOException JavaDoc {
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 JavaDoc name, String JavaDoc 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 JavaDoc name, String JavaDoc[] 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 JavaDoc 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 JavaDoc(scriptName + ".java");
171             out = new PrintWriter JavaDoc(new FileWriter JavaDoc(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 JavaDoc 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 JavaDoc e) {
225             e.printStackTrace();
226         } finally {
227             try { out.close(); } catch (Exception JavaDoc ign) {}
228             ;
229         }
230     }
231
232     public static final String JavaDoc replace(String JavaDoc s,
233                                        String JavaDoc toFind, String JavaDoc replace) {
234         StringBuffer JavaDoc erg = new StringBuffer JavaDoc();
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