Search in sources :

Example 6 with Submission

use of cn.edu.zjnu.acm.judge.domain.Submission in project judge by zjnu-acm.

the class StatusController method status.

@GetMapping(value = { "/status", "/submissions" }, produces = TEXT_HTML_VALUE)
@SuppressWarnings("AssignmentToMethodParameter")
public String status(HttpServletRequest request, @RequestParam(value = "problem_id", defaultValue = "") String pid, @RequestParam(value = "contest_id", required = false) Long contestId, @RequestParam(value = "language", defaultValue = "-1") int language, @RequestParam(value = "size", defaultValue = "20") int size, @RequestParam(value = "bottom", required = false) final Long bottom, @RequestParam(value = "score", required = false) Integer sc, @RequestParam(value = "user_id", defaultValue = "") String userId, @RequestParam(value = "top", required = false) final Long top, Authentication authentication, Model model) {
    long problemId = 0;
    String query = URLBuilder.fromRequest(request).replaceQueryParam("top").replaceQueryParam("bottom").toString();
    log.debug("query={}", query);
    Map<Long, long[]> problemsMap = Collections.emptyMap();
    if (contestId != null) {
        problemsMap = contestService.getProblemsMap(contestId);
    }
    try {
        problemId = Long.parseLong(pid);
    } catch (NumberFormatException ex) {
        if (contestId != null && pid.length() == 1) {
            // TODO the character is the index in the list.
            int x = Character.toUpperCase(pid.charAt(0)) - 'A';
            for (Map.Entry<Long, long[]> entry : problemsMap.entrySet()) {
                long key = entry.getKey();
                long[] value = entry.getValue();
                if (x == value[0]) {
                    problemId = key;
                    break;
                }
            }
        }
    }
    SubmissionQueryForm form = SubmissionQueryForm.builder().problem(problemId == 0 ? null : problemId).contest(contestId).score(sc).size(Math.max(Math.min(size, 500), 0)).top(top).bottom(bottom).user(StringUtils.hasText(userId) ? userId : null).language(language != -1 ? language : null).build();
    log.debug("{}", form);
    List<Submission> submissions = submissionMapper.findAllByCriteria(form);
    OptionalLong min = submissions.stream().mapToLong(Submission::getId).min();
    OptionalLong max = submissions.stream().mapToLong(Submission::getId).max();
    model.addAttribute("contestId", contestId);
    model.addAttribute("title", "Problem Status List");
    StringBuilder sb = new StringBuilder("<p align=center><font size=4 color=#339>Problem Status List</font></p>" + "<form method=get action='status'/><label for='pid'>Problem ID:</label><input id='pid' type=text name=problem_id size=8 value=\"").append(HtmlEscape.escapeHtml4Xml(pid)).append("\"/> <label for='uid'>User ID:</label><input id='uid' type=text name=user_id size=15 value=\"").append(HtmlEscape.escapeHtml4Xml(userId)).append("\"/>" + " <label for='languag'>Language:</label>" + "<select id='languag' size=\"1\" name=\"language\">" + "<option value=\"\">All</option>");
    for (Map.Entry<Integer, Language> entry : languageService.getAvailableLanguages().entrySet()) {
        int key = entry.getKey();
        Language value = entry.getValue();
        sb.append("<option value=\"").append(key).append("\"").append(key == language ? " selected" : "").append(">").append(HtmlEscape.escapeHtml4Xml(value.getName())).append("</option>");
    }
    sb.append("</select>");
    if (contestId != null) {
        sb.append("<input type=hidden name=contest_id value='").append(contestId).append("' />");
    }
    sb.append(" <button type=submit>Go</button></form>" + "<TABLE cellSpacing=0 cellPadding=0 width=100% border=1 class=table-back style=\"border-collapse: collapse\" bordercolor=#FFF>" + "<tr bgcolor=#6589D1><td align=center width=8%><b>Run ID</b></td><td align=center width=10%><b>User</b></td><td align=center width=6%><b>Problem</b></td>" + "<td align=center width=10%><b>Result</b></td><td align=center width=10%><b>Score</b></td><td align=center width=7%><b>Memory</b></td><td align=center width=7%><b>Time</b></td><td align=center width=7%><b>Language</b></td><td align=center width=7%><b>Code Length</b></td><td align=center width=17%><b>Submit Time</b></td></tr>");
    boolean admin = UserDetailsServiceImpl.isAdminLoginned(request);
    boolean sourceBrowser = UserDetailsServiceImpl.isSourceBrowser(request);
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    for (Submission submission : submissions) {
        long id = submission.getId();
        String user_id1 = submission.getUser();
        long problem_id1 = submission.getProblem();
        Long contest_id1 = submission.getContest();
        long[] num = problemsMap.getOrDefault(problem_id1, new long[] { -1 });
        int score = submission.getScore();
        Instant inDate = submission.getInDate();
        String language1 = languageService.getLanguageName(submission.getLanguage());
        String color;
        if (score == 100) {
            color = "blue";
        } else {
            color = "red";
        }
        sb.append("<tr align=center><td>").append(id).append("</td>");
        sb.append("<td><a href=userstatus?user_id=").append(user_id1).append(">").append(user_id1).append("</a></td>");
        if (contestId == null || num[0] == -1) {
            sb.append("<td><a href=showproblem?problem_id=").append(problem_id1).append(">").append(problem_id1).append("</a></td>");
        } else {
            sb.append("<td><a href=contests/").append(contestId).append("/problems/").append(num[1]).append(".html>").append(contestService.toProblemIndex(num[0])).append("</a></td>");
        }
        if (score == ResultType.COMPILE_ERROR) {
            if (submissionService.canView(request, submission)) {
                sb.append("<td><a href=\"showcompileinfo?solution_id=").append(id).append("\" target=_blank><font color=green>").append(ResultType.getResultDescription(score)).append("</font></a></td>");
            } else {
                sb.append("<td><font color=green>").append(ResultType.getResultDescription(score)).append("</font></td>");
            }
        } else if (submissionService.canView(request, submission)) {
            sb.append("<td><a href=showsolutiondetails?solution_id=").append(id).append(" target=_blank><strong><font color=").append(color).append(">").append(ResultType.getResultDescription(score)).append("</font></strong></a></td>");
        } else {
            sb.append("<td><font color=").append(color).append(">").append(ResultType.getResultDescription(score)).append("</font></a></td>");
        }
        if (score <= 100 && score >= 0) {
            sb.append("<td>").append(score).append("</td>");
        } else {
            sb.append("<td>&nbsp;</td>");
        }
        boolean ended = true;
        if (!admin && contest_id1 != null) {
            ended = contestMapper.findOne(contest_id1).isEnded();
        }
        if (score == 100 && ended) {
            sb.append("<td>").append(submission.getMemory()).append("K</td><td>").append(submission.getTime()).append("MS</td>");
        } else {
            sb.append("<td>&nbsp;</td><td>&nbsp;</td>");
        }
        if (admin || sourceBrowser || UserDetailsServiceImpl.isUser(authentication, user_id1)) {
            sb.append("<td><a href=showsource?solution_id=").append(id).append(" target=_blank>").append(language1).append("</a></td>");
        } else {
            sb.append("<td>").append(language1).append("</td>");
        }
        if (ended) {
            int sourceLength = submission.getSourceLength();
            String t = sourceLength > 2048 ? new DecimalFormat("0.00").format(sourceLength / 1024.) + " KB" : sourceLength + " B";
            sb.append("<td>").append(t).append("</td>");
        } else {
            sb.append("<td>&nbsp;</td>");
        }
        sb.append("<td>").append(sdf.format(Timestamp.from(inDate))).append("</td></tr>");
    }
    query = request.getContextPath() + query;
    sb.append("</table><p align=center>[<a href=\"").append(query).append("\">Top</a>]&nbsp;&nbsp;");
    query += query.contains("?") ? '&' : '?';
    sb.append("[<a href=\"").append(query).append("bottom=").append(max.isPresent() ? max.getAsLong() : "").append("\"><font color=blue>Previous Page</font></a>]" + "&nbsp;&nbsp;[<a href=\"").append(query).append("top=").append(min.isPresent() ? min.getAsLong() : "").append("\"><font color=blue>Next Page</font></a>]&nbsp;&nbsp;</p>" + "<script>!function(w){setTimeout(function(){w.location.reload()},60000)}(this)</script>");
    model.addAttribute("content", sb.toString());
    return "legacy";
}
Also used : Submission(cn.edu.zjnu.acm.judge.domain.Submission) Instant(java.time.Instant) DecimalFormat(java.text.DecimalFormat) Language(cn.edu.zjnu.acm.judge.domain.Language) SubmissionQueryForm(cn.edu.zjnu.acm.judge.data.form.SubmissionQueryForm) OptionalLong(java.util.OptionalLong) OptionalLong(java.util.OptionalLong) Map(java.util.Map) SimpleDateFormat(java.text.SimpleDateFormat) GetMapping(org.springframework.web.bind.annotation.GetMapping)

Example 7 with Submission

use of cn.edu.zjnu.acm.judge.domain.Submission in project judge by zjnu-acm.

the class JudgeService method toCompletableFuture.

CompletableFuture<?> toCompletableFuture(Executor executor, long submissionId) {
    return CompletableFuture.runAsync(() -> {
        Submission submission = submissionMapper.findOne(submissionId);
        if (submission == null) {
            throw new BusinessException(BusinessCode.SUBMISSION_NOT_FOUND);
        }
        Problem problem = problemService.findOneNoI18n(submission.getProblem());
        RunRecord runRecord = RunRecord.builder().submissionId(submission.getId()).language(languageService.getAvailableLanguage(submission.getLanguage())).problemId(submission.getProblem()).userId(submission.getUser()).source(submissionMapper.findSourceById(submissionId)).memoryLimit(problem.getMemoryLimit()).timeLimit(problem.getTimeLimit()).build();
        judgeInternal(runRecord);
    }, executor);
}
Also used : RunRecord(cn.edu.zjnu.acm.judge.data.dto.RunRecord) BusinessException(cn.edu.zjnu.acm.judge.exception.BusinessException) Submission(cn.edu.zjnu.acm.judge.domain.Submission) Problem(cn.edu.zjnu.acm.judge.domain.Problem)

Example 8 with Submission

use of cn.edu.zjnu.acm.judge.domain.Submission in project judge by zjnu-acm.

the class ContestProblemController method status.

@GetMapping(value = "{pid}/status", produces = TEXT_HTML_VALUE)
public String status(@PathVariable("contestId") long contestId, @PathVariable("pid") int problemNum, @PageableDefault(size = 20, sort = { "time", "memory", "code_length" }) Pageable pageable, Model model, Authentication authentication, HttpServletRequest request) {
    // check if problem exists and not disabled
    contestService.findOneByIdAndNotDisabled(contestId);
    Problem problem = contestService.getProblem(contestId, problemNum, null);
    Page<Submission> page = submissionService.bestSubmission(contestId, problem.getOrigin(), pageable, problem.getSubmitUser());
    model.addAttribute("page", page);
    List<ScoreCount> list = submissionMapper.groupByScore(contestId, problem.getOrigin());
    ArrayList<String> scores = new ArrayList<>(list.size());
    ArrayList<Long> counts = new ArrayList<>(list.size());
    ArrayList<String> urls = new ArrayList<>(list.size());
    for (ScoreCount scoreCount : list) {
        int score = scoreCount.getScore();
        scores.add(ResultType.getShowsourceString(score));
        counts.add(scoreCount.getCount());
        urls.add(request.getContextPath() + "/status?contest_id=" + contestId + "&problem_id=" + problem.getOrigin() + "&score=" + score);
    }
    boolean isAdmin = UserDetailsServiceImpl.isAdminLoginned(request);
    boolean isSourceBrowser = UserDetailsServiceImpl.isSourceBrowser(request);
    boolean canView = isAdmin || isSourceBrowser;
    request.setAttribute("page", page);
    request.setAttribute("sa", Arrays.asList(counts, scores, urls));
    request.setAttribute("problem", problem);
    request.setAttribute("url", URLBuilder.fromRequest(request).replaceQueryParam("page").toString());
    request.setAttribute("contestId", contestId);
    request.setAttribute("canView", canView);
    request.setAttribute("authentication", authentication);
    return "contests/problems-status";
}
Also used : ScoreCount(cn.edu.zjnu.acm.judge.data.dto.ScoreCount) Submission(cn.edu.zjnu.acm.judge.domain.Submission) ArrayList(java.util.ArrayList) Problem(cn.edu.zjnu.acm.judge.domain.Problem) GetMapping(org.springframework.web.bind.annotation.GetMapping)

Example 9 with Submission

use of cn.edu.zjnu.acm.judge.domain.Submission in project judge by zjnu-acm.

the class ShowSourceController method showSource.

@Secured("ROLE_USER")
@GetMapping("/showsource")
@SuppressWarnings("AssignmentToMethodParameter")
public String showSource(HttpServletRequest request, @RequestParam("solution_id") long submissionId, @RequestParam(value = "style", required = false) Integer style, Authentication authentication) {
    Submission submission = submissionMapper.findOne(submissionId);
    if (submission == null) {
        throw new BusinessException(BusinessCode.SUBMISSION_NOT_FOUND, submissionId);
    }
    contestOnlyService.checkViewSource(request, submission);
    String userId = authentication != null ? authentication.getName() : null;
    if (!submissionService.canView(request, submission)) {
        throw new MessageException("You have no permission to view the source.", HttpStatus.FORBIDDEN);
    }
    String language = languageService.getLanguageName(submission.getLanguage());
    if (style == null) {
        style = userPerferenceMapper.getStyle(userId);
    } else {
        userPerferenceMapper.setStyle(userId, style);
    }
    String source = submissionMapper.findSourceById(submissionId);
    request.setAttribute("submission", submission);
    if (submission.getContest() != null) {
        request.setAttribute("contestId", submission.getContest());
    }
    request.setAttribute("language", language);
    request.setAttribute("result", ResultType.getShowsourceString(submission.getScore()));
    request.setAttribute("style", style);
    request.setAttribute("source", source);
    return "submissions/source";
}
Also used : BusinessException(cn.edu.zjnu.acm.judge.exception.BusinessException) Submission(cn.edu.zjnu.acm.judge.domain.Submission) MessageException(cn.edu.zjnu.acm.judge.exception.MessageException) GetMapping(org.springframework.web.bind.annotation.GetMapping) Secured(org.springframework.security.access.annotation.Secured)

Example 10 with Submission

use of cn.edu.zjnu.acm.judge.domain.Submission in project judge by zjnu-acm.

the class ShowSubmissionDetailsController method showSolutionDetails.

@GetMapping("/showsolutiondetails")
public String showSolutionDetails(HttpServletRequest request, @RequestParam("solution_id") long submissionId, Authentication authentication) {
    Submission submission = submissionMapper.findOne(submissionId);
    if (submission == null) {
        throw new BusinessException(BusinessCode.SUBMISSION_NOT_FOUND, submissionId);
    }
    Long contestId = submission.getContest();
    if (contestId != null) {
        Contest contest = contestMapper.findOne(contestId);
        if (contest != null) {
            request.setAttribute("contestId", contest.getId());
        }
    }
    if (!submissionService.canView(request, submission)) {
        throw new MessageException("You have no permission to view solution '" + submissionId + "'", HttpStatus.FORBIDDEN);
    }
    String submissionDetail = submissionMapper.getSubmissionDetail(submissionId);
    if (submissionDetail == null) {
        submissionDetail = "";
    }
    String[] detailsArray = submissionDetail.split(",");
    SubmissionDetail[] details = new SubmissionDetail[detailsArray.length / 4];
    for (int i = 0; i < detailsArray.length / 4; ++i) {
        details[i] = SubmissionDetail.builder().result(ResultType.getCaseScoreDescription(Integer.parseInt(detailsArray[i << 2]))).score(detailsArray[i << 2 | 1]).time(detailsArray[i << 2 | 2]).memory(detailsArray[i << 2 | 3]).build();
    }
    request.setAttribute("details", details);
    request.setAttribute("user", submission.getUser());
    request.setAttribute("problem", submission.getProblem());
    request.setAttribute("result", ResultType.getResultDescription(submission.getScore()));
    request.setAttribute("score", submission.getScore());
    request.setAttribute("time", submission.getTime());
    request.setAttribute("memory", submission.getMemory());
    return "submissions/detail";
}
Also used : BusinessException(cn.edu.zjnu.acm.judge.exception.BusinessException) Submission(cn.edu.zjnu.acm.judge.domain.Submission) MessageException(cn.edu.zjnu.acm.judge.exception.MessageException) SubmissionDetail(cn.edu.zjnu.acm.judge.data.dto.SubmissionDetail) Contest(cn.edu.zjnu.acm.judge.domain.Contest) GetMapping(org.springframework.web.bind.annotation.GetMapping)

Aggregations

Submission (cn.edu.zjnu.acm.judge.domain.Submission)13 GetMapping (org.springframework.web.bind.annotation.GetMapping)5 Test (org.junit.Test)4 SpringBootTest (org.springframework.boot.test.context.SpringBootTest)4 Problem (cn.edu.zjnu.acm.judge.domain.Problem)3 BusinessException (cn.edu.zjnu.acm.judge.exception.BusinessException)3 MvcResult (org.springframework.test.web.servlet.MvcResult)3 ScoreCount (cn.edu.zjnu.acm.judge.data.dto.ScoreCount)2 SubmissionQueryForm (cn.edu.zjnu.acm.judge.data.form.SubmissionQueryForm)2 MessageException (cn.edu.zjnu.acm.judge.exception.MessageException)2 Instant (java.time.Instant)2 ArrayList (java.util.ArrayList)2 RunRecord (cn.edu.zjnu.acm.judge.data.dto.RunRecord)1 SubmissionDetail (cn.edu.zjnu.acm.judge.data.dto.SubmissionDetail)1 BestSubmissionForm (cn.edu.zjnu.acm.judge.data.form.BestSubmissionForm)1 Contest (cn.edu.zjnu.acm.judge.domain.Contest)1 Language (cn.edu.zjnu.acm.judge.domain.Language)1 IOException (java.io.IOException)1 UncheckedIOException (java.io.UncheckedIOException)1 DecimalFormat (java.text.DecimalFormat)1