@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 @RequireCSRFCheck public Result postAddProblem(long contestId) throws ContestNotFoundException { Contest contest = contestService.findContestById(contestId); if (contest.isLocked() || !isAllowedToSuperviseProblems(contest)) { return ContestControllerUtils.getInstance() .tryEnteringContest(contest, IdentityUtils.getUserJid()); } Form<ContestProblemAddForm> contestProblemCreateForm = Form.form(ContestProblemAddForm.class).bindFromRequest(); if (formHasErrors(contestProblemCreateForm)) { return showAddProblem(contestProblemCreateForm, contest); } ContestProblemAddForm contestProblemAddData = contestProblemCreateForm.get(); if (contestProblemService.isProblemInContestByJidOrAlias( contest.getJid(), contestProblemAddData.problemJid, contestProblemAddData.alias)) { contestProblemCreateForm.reject("error.problem.create.problemJidOrAliasUsed"); return showAddProblem(contestProblemCreateForm, contest); } SandalphonProblem sandalphonProblem; try { sandalphonProblem = sandalphonClientAPI.findClientProblem( contestProblemAddData.problemJid, contestProblemAddData.problemSecret); } catch (JudgelsAPIClientException e) { if (e.getStatusCode() >= Http.Status.INTERNAL_SERVER_ERROR) { contestProblemCreateForm.reject("error.system.sandalphon.connection"); } else { contestProblemCreateForm.reject("error.problem.create.problemJidOrSecretInvalid"); } return showAddProblem(contestProblemCreateForm, contest); } contestProblemService.createContestProblem( contest.getJid(), contestProblemAddData.problemJid, contestProblemAddData.problemSecret, contestProblemAddData.alias, contestProblemAddData.submissionsLimit, ContestProblemStatus.valueOf(contestProblemAddData.status), IdentityUtils.getUserJid(), IdentityUtils.getIpAddress()); JidCacheServiceImpl.getInstance() .putDisplayName( contestProblemAddData.problemJid, sandalphonProblem.getDisplayName(), IdentityUtils.getUserJid(), IdentityUtils.getIpAddress()); UrielControllerUtils.getInstance() .addActivityLog( BasicActivityKeys.ADD_IN.construct( CONTEST, contest.getJid(), contest.getName(), PROBLEM, contestProblemAddData.problemJid, sandalphonProblem.getSlug())); return redirect(routes.ContestProblemController.viewProblems(contest.getId())); }