package org.psjava.judgesubmit;
import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Map;
import java.util.TreeMap;
import org.apache.commons.lang3.StringEscapeUtils;
import org.psjava.ds.array.DynamicArray;
import org.psjava.util.Pair;
import org.puredevteam.httpclient.SocketConnectionData;
public class RecordingHttpClient {
public static JudgeHttpClient create(SocketConnectionData conn) {
final JudgeHttpClient real = RealJudgeHttpClient.create(conn);
final String caller = toCallerKey(Thread.currentThread().getStackTrace()[2]);
final DynamicArray<Pair<String, String>> resultList = DynamicArray.create();
return new JudgeHttpClient() {
@Override
public void clearCookie() {
real.clearCookie(); // TODO record this and simulate in mock.
}
@Override
public String receivePostBodyString(String path, Map<String, String> param, String encoding) throws IOException, JudgeServiceException {
String key = toPostRequestKey(path, param, encoding);
String body = real.receivePostBodyString(path, param, encoding);
addResult(resultList, key, body);
return body;
}
@Override
public String receiveGetBodyString(String path, String encoding) throws IOException, JudgeServiceException {
String key = toGetResultKey(path, encoding);
String body = real.receiveGetBodyString(path, encoding);
addResult(resultList, key, body);
return body;
}
private void addResult(final DynamicArray<Pair<String, String>> resultList, String key, String r) {
resultList.addToLast(Pair.create(key, r));
File f = getRecordFile(caller);
try {
PrintWriter writer = new PrintWriter(f, "UTF-8");
for (Pair<String, String> p : resultList) {
writer.println(StringEscapeUtils.escapeJava(p.v1));
writer.println(StringEscapeUtils.escapeJava(p.v2));
}
writer.close();
} catch (IOException e) {
throw new RuntimeException(e);
}
}
};
}
public static String toCallerKey(StackTraceElement calledStack) {
return calledStack.getClassName() + "." + calledStack.getMethodName();
}
public static String toPostRequestKey(String path, Map<String, String> param, String encoding) {
return path + ":POST:" + new TreeMap<String, String>(param).toString() + ":" + encoding;
}
public static String toGetResultKey(String path, String encoding) {
return path + ":GET:" + encoding;
}
public static File getRecordFile(final String caller) {
File dir = new File(System.getProperty("user.dir") + "/src/test/resources");
if (!dir.exists())
throw new RuntimeException();
return new File(dir.getAbsolutePath() + "/" + caller + ".txt");
}
}