package org.iatoki.judgels.uriel.controllers.apis; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; import org.apache.commons.io.FileUtils; import org.iatoki.judgels.FileSystemProvider; import org.iatoki.judgels.gabriel.blackbox.BlackBoxGradingSource; import org.iatoki.judgels.sandalphon.adapters.impls.BlackBoxSubmissionAdapter; import org.iatoki.judgels.sandalphon.SubmissionException; import org.iatoki.judgels.sandalphon.services.SubmissionService; import org.iatoki.judgels.uriel.Contest; import org.iatoki.judgels.uriel.UrielProperties; import org.iatoki.judgels.uriel.config.SubmissionLocalFile; import org.iatoki.judgels.uriel.services.ContestService; import play.db.jpa.Transactional; import play.mvc.Controller; import play.mvc.Http; import play.mvc.Result; import javax.inject.Inject; import javax.inject.Named; import javax.inject.Singleton; import java.io.File; import java.io.IOException; import java.util.Map; @Singleton @Named public final class ContestTestingAPIController extends Controller { private final ContestService contestService; private final SubmissionService submissionService; private final FileSystemProvider submissionLocalFileSystemProvider; @Inject public ContestTestingAPIController(ContestService contestService, SubmissionService submissionService, @SubmissionLocalFile FileSystemProvider submissionLocalFileSystemProvider) { this.contestService = contestService; this.submissionService = submissionService; this.submissionLocalFileSystemProvider = submissionLocalFileSystemProvider; } @Transactional public Result singleFileBlackBoxSubmit() { Http.MultipartFormData body = request().body().asMultipartFormData(); Map<String, String[]> form = body.asFormUrlEncoded(); String testingSecret = form.get("stressTestSecret")[0]; if (!testingSecret.equals(UrielProperties.getInstance().getUrielStressTestSecret())) { return notFound(); } String contestJid = form.get("contestJid")[0]; Contest contest = contestService.findContestByJid(contestJid); String userJid = form.get("userJid")[0]; String problemJid = form.get("problemJid")[0]; String language = form.get("problemLanguage")[0]; String engine = form.get("problemEngine")[0]; Http.MultipartFormData.FilePart filePart = body.getFile("source"); String filename = filePart.getFilename(); File file = filePart.getFile(); String fileContent; try { fileContent = FileUtils.readFileToString(file); } catch (IOException e) { return badRequest(); } BlackBoxSubmissionAdapter adapter = new BlackBoxSubmissionAdapter(); String submissionJid; try { BlackBoxGradingSource source = (BlackBoxGradingSource) adapter.createBlackBoxGradingSourceFromNewSubmission(language, ImmutableList.of("source"), ImmutableMap.of("source", filename), ImmutableMap.of("source", fileContent)); submissionJid = submissionService.submit(problemJid, contest.getJid(), engine, language, null, source, userJid, "localhost"); adapter.storeSubmissionFiles(submissionLocalFileSystemProvider, null, submissionJid, source); } catch (SubmissionException e) { return badRequest(); } return ok(submissionJid); } }