@Transactional public Result refreshProblems(long contestId) throws ContestNotFoundException, ContestProblemNotFoundException { Contest contest = contestService.findContestById(contestId); if (contest.isLocked() || !ContestControllerUtils.getInstance() .isManagerOrAbove(contest, IdentityUtils.getUserJid())) { return ContestControllerUtils.getInstance() .tryEnteringContest(contest, IdentityUtils.getUserJid()); } for (ContestProblem problem : contestProblemService.getOpenedProblemsInContest(contest.getJid())) { SandalphonProblem sandalphonProblem; try { sandalphonProblem = sandalphonClientAPI.findClientProblem( problem.getProblemJid(), problem.getProblemSecret()); } catch (JudgelsAPIClientException e) { continue; } JidCacheServiceImpl.getInstance() .putDisplayName( problem.getProblemJid(), sandalphonProblem.getDisplayName(), IdentityUtils.getUserJid(), IdentityUtils.getIpAddress()); } return redirect(routes.ContestProblemController.viewProblems(contest.getId())); }
@Transactional(readOnly = true) public Result viewProblem(long contestId, long contestProblemId) throws ContestNotFoundException, ContestProblemNotFoundException { Contest contest = contestService.findContestById(contestId); ContestProblem contestProblem = contestProblemService.findContestProblemById(contestProblemId); if (!ContestControllerUtils.getInstance() .isAllowedToEnterContest(contest, IdentityUtils.getUserJid()) || !isAllowedToViewProblem(contest, contestProblem)) { return ContestControllerUtils.getInstance() .tryEnteringContest(contest, IdentityUtils.getUserJid()); } long submissionsLeft = -1; if (contestProblem.getSubmissionsLimit() != 0) { submissionsLeft = contestProblem.getSubmissionsLimit() - programmingSubmissionService.countProgrammingSubmissionsByUserJid( contest.getJid(), contestProblem.getProblemJid(), IdentityUtils.getUserJid()); } SandalphonProgrammingProblemStatementRenderRequestParam param = new SandalphonProgrammingProblemStatementRenderRequestParam(); param.setProblemSecret(contestProblem.getProblemSecret()); param.setCurrentMillis(System.currentTimeMillis()); param.setStatementLanguage(ContestControllerUtils.getInstance().getCurrentStatementLanguage()); param.setSwitchStatementLanguageUrl( routes.ContestProblemController.switchLanguage(contestId, contestProblemId) .absoluteURL(request(), request().secure())); param.setPostSubmitUrl( org.iatoki.judgels.uriel.contest.submission.programming.routes .ContestProgrammingSubmissionController.postSubmitProblem( contest.getId(), contestProblem.getProblemJid()) .absoluteURL(request(), request().secure())); param.setReasonNotAllowedToSubmit(null); Set<String> allowedGradingLanguages; if (contest.isICPC()) { allowedGradingLanguages = ((ICPCContestStyleConfig) contest.getStyleConfig()) .getLanguageRestriction() .getAllowedLanguageNames(); } else { allowedGradingLanguages = ((IOIContestStyleConfig) contest.getStyleConfig()) .getLanguageRestriction() .getAllowedLanguageNames(); } param.setAllowedGradingLanguages(StringUtils.join(allowedGradingLanguages, ",")); String requestUrl = sandalphonClientAPI.getProgrammingProblemStatementRenderAPIEndpoint( contestProblem.getProblemJid()); String requestBody = sandalphonClientAPI.constructProgrammingProblemStatementRenderAPIRequestBody( contestProblem.getProblemJid(), param); LazyHtml content; if (UrielProperties.getInstance().isContestCritial(contest.getJid())) { content = new LazyHtml( viewProblemCriticalView.render( requestUrl, requestBody, submissionsLeft, contestProblem.getStatus() == ContestProblemStatus.CLOSED, contest, contestProblem)); } else { content = new LazyHtml( viewProblemView.render( requestUrl, requestBody, submissionsLeft, contestProblem.getStatus() == ContestProblemStatus.CLOSED)); } ContestControllerUtils.getInstance() .appendTabsLayout(content, contest, IdentityUtils.getUserJid()); UrielControllerUtils.getInstance().appendSidebarLayout(content); appendBreadcrumbsLayout( content, contest, new InternalLink( Messages.get("status.contestant"), routes.ContestProblemController.viewUsedProblems(contest.getId())), new InternalLink( contestProblem.getAlias(), routes.ContestProblemController.viewProblem(contest.getId(), contestProblem.getId()))); UrielControllerUtils.getInstance().appendTemplateLayout(content, "Contest - Problem - View"); return UrielControllerUtils.getInstance().lazyOk(content); }