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() {
}
}