org.wings.recorder.Recorder Maven / Gradle / Ivy
The newest version!
/*
* Copyright 2000,2005 wingS development team.
*
* This file is part of wingS (http://wingsframework.org).
*
* wingS is free software; you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License
* as published by the Free Software Foundation; either version 2.1
* of the License, or (at your option) any later version.
*
* Please see COPYING for the complete licence.
*/
package org.wings.recorder;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpServletResponseWrapper;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.*;
/**
* @author hengels
*/
public class Recorder
implements Filter {
private final transient static Logger log = LoggerFactory.getLogger(Recorder.class);
public static final String RECORDER_START = "recorder_start";
public static final String RECORDER_STOP = "recorder_stop";
public static final String RECORDER_SCRIPT = "recorder_script";
private File file;
private List list;
private String scriptName = "Recording";
private String lookupName = "SessionServlet";
@Override
public void init(FilterConfig filterConfig) throws ServletException {
if (filterConfig.getInitParameter("wings.servlet.recorder.script") != null)
scriptName = filterConfig.getInitParameter("wings.servlet.recorder.script");
lookupName = filterConfig.getInitParameter("wings.servlet.lookupname");
if (lookupName == null || lookupName.trim().length() == 0) {
lookupName = "SessionServlet:" + filterConfig.getInitParameter("wings.mainclass");
}
log.info("wings.servlet.lookupname " + lookupName);
log.info("wings.servlet.recorder.script " + scriptName);
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain)
throws IOException, ServletException {
try {
if (servletRequest instanceof HttpServletRequest) {
HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest;
Map map = servletRequest.getParameterMap();
if (map.containsKey(RECORDER_SCRIPT)) {
log.info("recorder_script " + map.get(RECORDER_SCRIPT));
String[] values = (String[]) map.get(RECORDER_SCRIPT);
scriptName = values[0];
}
if (map.containsKey(RECORDER_START)) {
if (list != null)
return;
log.info(RECORDER_START);
list = new LinkedList();
} else if (map.containsKey(RECORDER_STOP)) {
if (list == null)
return;
log.info(RECORDER_STOP);
writeCode();
list = null;
} else if (list != null) {
String resource = httpServletRequest.getPathInfo();
log.debug("PATH_INFO: " + resource);
Request record;
if ("GET".equalsIgnoreCase(httpServletRequest.getMethod()))
record = new GET(resource);
else
record = new POST(resource);
Enumeration parameterNames = httpServletRequest.getParameterNames();
while (parameterNames.hasMoreElements()) {
String name = (String) parameterNames.nextElement();
String[] values = httpServletRequest.getParameterValues(name);
addEvent(record, name, values);
}
Enumeration headerNames = httpServletRequest.getHeaderNames();
while (headerNames.hasMoreElements()) {
String name = (String) headerNames.nextElement();
if (name.equalsIgnoreCase("cookie") ||
name.equalsIgnoreCase("referer"))
continue;
addHeader(record, name, httpServletRequest.getHeader(name));
}
list.add(record);
}
}
} finally {
if (servletResponse instanceof HttpServletResponse) {
filterChain.doFilter(servletRequest, new HttpServletResponseWrapper((HttpServletResponse) servletResponse) {
@Override
public ServletOutputStream getOutputStream() throws IOException {
final ServletOutputStream out = super.getOutputStream();
return new ServletOutputStream() {
@Override
public void write(int b) throws IOException {
out.write(b);
}
@Override
public void close() throws IOException {
super.println("
");
super.println("");
super.close();
}
};
}
});
} else
filterChain.doFilter(servletRequest, servletResponse);
}
}
private static void addHeader(Request record, String name, String value) {
if (record instanceof GET) {
GET get = (GET) record;
get.addHeader(name, value);
} else if (record instanceof POST) {
POST post = (POST) record;
post.addHeader(name, value);
}
}
private static void addEvent(Request record, String name, String... values) {
if (record instanceof GET) {
GET get = (GET) record;
get.addEvent(name, values);
} else if (record instanceof POST) {
POST post = (POST) record;
post.addEvent(name, values);
}
}
@Override
public void destroy() {
writeCode();
}
private void writeCode() {
if (list == null || list.size() == 0)
return;
PrintWriter out = null;
try {
for (Object aList1 : list) {
Request record = (Request) aList1;
if (!record.getResource().contains("."))
record.setResource("");
}
file = new File(scriptName + ".java");
out = new PrintWriter(new FileWriter(file));
out.println("import org.wings.recorder.*;");
out.println();
out.println("public class " + scriptName);
out.println(" extends Script");
out.println("{");
out.println(" public void execute()");
out.println(" throws Exception");
out.println(" {");
long millis = ((Request) list.get(0)).getMillis();
int index = 0;
for (Object aList : list) {
Request record = (Request) aList;
if (index > 0)
out.println();
out.println(" delay(" + (record.getMillis() - millis) + ");");
out.print(" " + record.getMethod() + " request" + index +
" = new " + record.getMethod() + "(\"" + record.getResource() + "\")");
for (Object o1 : record.getHeaders()) {
Request.Header header = (Request.Header) o1;
out.println();
out.print(" .addHeader(\"");
out.print(header.getName());
out.print("\", \"");
out.print(replace(header.getValue(), "\"", "\\\""));
out.print("\")");
}
for (Object o : record.getEvents()) {
Request.Event event = (Request.Event) o;
out.println();
out.print(" .addEvent(\"");
out.print(event.getName());
out.print("\", new String[] { \"");
for (int i = 0; i < event.getValues().length; i++) {
String value = event.getValues()[i];
if (i > 0)
out.print("\", \"");
out.print(replace(value, "\"", "\\\""));
}
out.print("\" })");
}
out.println(";");
out.println(" send(request" + index + ");");
millis = record.getMillis();
index++;
}
out.println(" }");
out.println("}");
out.flush();
} catch (Exception e) {
e.printStackTrace();
} finally {
try { out.close(); } catch (Exception ign) {/*ignored*/}
}
}
public static final String replace(String s,
String toFind, String replace) {
int indexOf = s.indexOf(toFind);
if (indexOf == -1) return s;
int lastindex = 0;
StringBuilder erg = new StringBuilder();
while (indexOf != -1) {
erg.append(s.substring(lastindex, indexOf)).append(replace);
lastindex = indexOf + toFind.length();
indexOf = s.indexOf(toFind, lastindex);
}
erg.append(s.substring(lastindex));
return erg.toString();
}
}