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; } }