@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()));
  }