package org.psjava.judgesubmit;
import org.psjava.util.ZeroTo;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
class LightOJSubmitStatusReceiver implements SubmitStatusReceiver {
@Override
public SubmitStatus receive(JudgeHttpClient client, String submitId) throws IOException, SiteParsingException, InvalidInputException, JudgeServiceException {
return recv(submitId, client);
}
private static SubmitStatus recv(String submitId, JudgeHttpClient hc) throws IOException, JudgeServiceException, SiteParsingException, InvalidInputException {
String body = hc.receiveGetBodyString("/volume_showcode.php?sub_id=" + submitId, LightOJ.ENCODING);
if(body.contains("location.href='volume_usersubmissions.php'"))
throw InvalidSubmitIdException.create(submitId);
int p = 0;
String cellStart = "<td class=\"one\">";
for(int i : ZeroTo.get(5))
p = SiteParsingUtil.getStrictIndexOf(body, cellStart, p)+1;
long time = parseTime(SiteParsingUtil.extractMiddleString(body, p, ">", "<").trim());
p = SiteParsingUtil.getStrictIndexOf(body, cellStart, p)+1;
long memory = parseMemory(SiteParsingUtil.extractMiddleString(body, p, ">", "<").trim());
p = SiteParsingUtil.getStrictIndexOf(body, cellStart, p)+1;
String verdictString = SiteParsingUtil.extractMiddleString(body, p + 1, ";\">", "</div>").trim();
SubmitStatusCode code = getCodeMap().get(verdictString);
return new SubmitStatus(0, code, memory, time, null);
}
private static long parseMemory(String memoryString) throws SiteParsingException {
long memory;
if(memoryString.equals("-"))
memory = 0;
else
memory = SiteParsingUtil.parseInt(memoryString) * 1024;
return memory;
}
private static long parseTime(String timeString) throws SiteParsingException {
long time;
if(timeString.equals("-"))
time = 0;
else
time = (long)(SiteParsingUtil.parseDouble(timeString) * 1000);
return time;
}
private static Map<String, SubmitStatusCode> getCodeMap() {
Map<String, SubmitStatusCode> codeMap = new HashMap<String, SubmitStatusCode>();
codeMap.put("Accepted", SubmitStatusCode.ACCEPTED);
codeMap.put("Wrong Answer", SubmitStatusCode.WRONG_ANSWER);
codeMap.put("Compilation Error", SubmitStatusCode.COMPILE_ERROR);
codeMap.put("Presentation Error", SubmitStatusCode.PRESENTATION_ERROR);
codeMap.put("Runtime Error", SubmitStatusCode.RUNTIME_ERROR);
codeMap.put("Time Limit Exceeded", SubmitStatusCode.TIME_LIMIT_EXCEED);
codeMap.put("Memory Limit Exceeded", SubmitStatusCode.MEMORY_LIMITE_EXCEED);
codeMap.put("Judging...", SubmitStatusCode.JUDGING);
codeMap.put("Not Judged Yet", SubmitStatusCode.WAITING);
codeMap.put("Output Limit Exceeded", SubmitStatusCode.OUTPUT_LIMIT_EXCEED);
codeMap.put("Restricted Function", SubmitStatusCode.RESTRICTED_FUNCTION);
return codeMap;
}
}