package org.psjava.judgesubmit; import java.io.File; import java.io.FileNotFoundException; import java.io.IOException; import java.util.Collection; import java.util.HashSet; import java.util.Scanner; import java.util.Set; import japa.parser.ParseException; public class JudgeSubmit { public static SubmitStatus submitAngGetResult(JudgeSite site, String problemId, String userId, String password, String code, Language language, Collection<String> searchDirs, SubmitMonitorListener listener, boolean shrink, File wordFileOrNull) throws IOException, SiteParsingException, InvalidInputException, JudgeServiceException { JudgeHttpClient client = RealJudgeHttpClient.create(site.getSocketConnectionData()); if (!searchDirs.isEmpty()) code = CodeCombineAdapter.combine(code, language, searchDirs); if (shrink) code = getShrinked(code, language); if (wordFileOrNull != null) code = WordReplacer.getReplaced(code, readWordSet(wordFileOrNull)); return submitAngGetResult(client, site, problemId, userId, password, code, language, searchDirs, listener); } private static String getShrinked(String code, Language language) { if(language == Language.JAVA) { try { code = JavaShrinker.cunstructShirinked(code); } catch (ParseException e) { // shrink 포기. TODO 사용자에게 알려주는게 좋을까? } } code = code.replaceAll("\n", "").replaceAll("\r", ""); return code; } private static Set<String> readWordSet(File wordsFile) throws FileNotFoundException { Set<String> words = new HashSet<String>(); Scanner scan = new Scanner(wordsFile); while(scan.hasNext()) words.add(scan.next()); scan.close(); return words; } protected static SubmitStatus submitAngGetResult(JudgeHttpClient client, JudgeSite site, String problemId, String userId, String password, String code, Language language, Collection<String> searchDirs, SubmitMonitorListener listener) throws IOException, InvalidInputException, SiteParsingException, JudgeServiceException { String submitId = site.getSubmitter().submitAndGetId(client, problemId, userId, password, language, code); SubmitStatus finalStatus; while (true) { SubmitStatus status = site.getSubmitStatusReceiver().receive(client, submitId); listener.statusChanged(status); if (!Console.ON_PROGRESS.contains(status.getCode())) { finalStatus = status; break; } } if (finalStatus.getCode() == SubmitStatusCode.COMPILE_ERROR) listener.onCompileError(site.getCompileErrorMessageReceiver().receive(client, userId, password, submitId)); return finalStatus; } private JudgeSubmit() { } }