package org.jblooming.http;
import org.jblooming.utilities.HttpUtilities;
import org.jblooming.tracer.Tracer;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpServletResponseWrapper;
import java.io.*;
import java.util.Iterator;
import java.util.Map;
import java.util.TreeMap;
public class HttpServletResponseCacher extends HttpServletResponseWrapper {
private String root;
private HttpServletRequest httpServletRequest;
private MyServletOutputStream sout;
private PrintWriter wout;
protected File file;
public HttpServletResponseCacher(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, String version) {
super(httpServletResponse);
this.root = version;
this.httpServletRequest = httpServletRequest;
}
public synchronized PrintWriter getWriter() throws IOException {
if (sout != null)
throw new IllegalStateException("getOtputStream was called yet");
if (wout == null) {
prepareLocalFile();
wout = new PrintWriter(new FileWriter(file));
}
return wout;
}
public synchronized ServletOutputStream getOutputStream() throws IOException {
if (wout != null)
throw new IllegalStateException("getWriter was called yet");
if (sout == null) {
prepareLocalFile();
sout = new MyServletOutputStream();
}
return sout;
}
private void prepareLocalFile() {
getLocalFile();
file.getParentFile().mkdirs();
}
public File getLocalFile() {
if (file == null) {
String s = getLocalFileName();
file = new File(s);
}
return file;
}
private String getLocalFileName() {
String fileNameFromUri = HttpUtilities.getFileNameFromUri(httpServletRequest);
TreeMap tm = new TreeMap(httpServletRequest.getParameterMap());
StringBuffer sb = new StringBuffer(fileNameFromUri);
for (Iterator iterator = tm.entrySet().iterator(); iterator.hasNext();) {
Map.Entry entry = (Map.Entry) iterator.next();
sb.append('_');
sb.append(entry.getKey());
String[] values = (String[]) entry.getValue();
if (values != null) {
for (int i = 0; i < values.length; i++) {
sb.append('=');
String value = values[i];
if (i > 0)
sb.append('@');
sb.append(value);
}
}
}
String s = root + sb.toString();
return s;
}
public void flush() {
try {
if (wout != null) {
wout.flush();
wout.close();
}
if (sout != null) {
sout.flush();
sout.close();
}
} catch (IOException e) {
Tracer.platformLogger.error(e);
}
}
private class MyServletOutputStream extends ServletOutputStream {
FileOutputStream out;
public MyServletOutputStream() throws FileNotFoundException {
out = new FileOutputStream(file);
}
public void write(int b) throws IOException {
if (out != null)
out.write(b);
}
public void flush() throws IOException {
if (out != null)
out.flush();
}
public void close() throws IOException {
if (out != null)
out.close();
out = null;
}
}
}