package org.psjava.judgesubmit; import java.io.IOException; import java.util.Map; import org.psjava.ds.map.MutableMap; import org.psjava.goods.GoodMutableMapFactory; public class POJSubmitter implements Submitter { @Override public String submitAndGetId(JudgeHttpClient hc, String problemId, String userId, String password, Language language, String code) throws IOException, InvalidInputException, SiteParsingException, JudgeServiceException { login(hc, userId, password); submit(hc, problemId, language, code); return receiveLastSubmitId(hc, problemId, userId, language); } private static String toLangauageCode(Language language) { return getLanguageCodeMap().get(language); } public static MutableMap<Language, String> getLanguageCodeMap() { MutableMap<Language, String> map = GoodMutableMapFactory.getInstance().create(); map.put(Language.JAVA, "2"); map.put(Language.CPP, "0"); map.put(Language.C, "1"); return map; } private static void login(JudgeHttpClient hc, String userId, String password) throws IOException, JudgeServiceException, InvalidInputException { Map<String, String> param = StringMapFromVarargs.create("user_id1", userId, "password1", password); String html = hc.receivePostBodyString("/login", param, POJ.ENCODING); if (html.contains("Login failed!")) throw InvalidLogInDataException.create(); } private static void submit(JudgeHttpClient hc, String problemId, Language language, String code) throws IOException, JudgeServiceException, InvalidInputException, SiteParsingException { Map<String, String> param = StringMapFromVarargs.create("problem_id", problemId, "language", toLangauageCode(language), "source", code); String html = hc.receivePostBodyString("/submit", param, POJ.ENCODING); if (html.contains("Error")) throw new InvalidInputException(SiteParsingUtil.extractMiddleString(html, 0, "<li>", "</li>")); } private static String receiveLastSubmitId(JudgeHttpClient hc, String problemId, String userId, Language language) throws IOException, JudgeServiceException, SiteParsingException { String url = String.format("/status?problem_id=%s&user_id=%s&language=%s", problemId, userId, toLangauageCode(language)); String statusHtml = hc.receiveGetBodyString(url, POJ.ENCODING); return SiteParsingUtil.extractMiddleString(statusHtml, 0, POJSubmitStatusReceiver.SUBMIT_ID_PART_START, "<"); } }