private static void checkRegularDataCorrect(
      AccountAttributes account,
      String courseId,
      String courseName,
      List<String> coursePaginationList) {
    String expectedCourseId = courseId;
    String actualCourseId = data.getCourseId();
    assertEquals(expectedCourseId, actualCourseId);

    String expectedCourseName = courseName;
    String actualCourseName = data.getCourseName();
    assertEquals(expectedCourseName, actualCourseName);

    int index = coursePaginationList.indexOf(courseId);
    String expectedPreviousPageLink =
        index > 0 ? coursePaginationList.get(index - 1) : "javascript:;";
    String expectedNextPageLink =
        index < coursePaginationList.size() - 1
            ? coursePaginationList.get(index + 1)
            : "javascript:;";
    List<String> expectedCoursePaginationList = coursePaginationList;
    String expectedActiveCourseClass = "active";
    String expectedActiveCourse = courseId;
    String expectedUserCommentsLink = Const.ActionURIs.STUDENT_COMMENTS_PAGE;
    expectedUserCommentsLink =
        Url.addParamToUrl(expectedUserCommentsLink, Const.ParamsNames.USER_ID, account.googleId);
    CoursePagination actualCoursePagination = data.getCoursePagination();
    assertEquals(expectedPreviousPageLink, actualCoursePagination.getPreviousPageLink());
    assertEquals(expectedNextPageLink, actualCoursePagination.getNextPageLink());
    assertEquals(expectedCoursePaginationList, actualCoursePagination.getCoursePaginationList());
    assertEquals(expectedActiveCourseClass, actualCoursePagination.getActiveCourseClass());
    assertEquals(expectedActiveCourse, actualCoursePagination.getActiveCourse());
    assertEquals(expectedUserCommentsLink, actualCoursePagination.getUserCommentsLink());
  }
  @SuppressWarnings("deprecation")
  private void testCreateInstructorAction() throws Exception {

    InstructorAttributes instructor = new InstructorAttributes();

    String shortName = "Instrúctör";
    instructor.name = "AHPUiT Instrúctör";
    instructor.email = "*****@*****.**";
    String institute = "TEAMMATES Test Institute 1";
    String demoCourseId = "AHPUiT.instr1.gma-demo";

    ______TS(
        "action success : create instructor account and the account is created successfully after user's verification");

    BackDoor.deleteAccount(TestProperties.inst().TEST_INSTRUCTOR_ACCOUNT);
    BackDoor.deleteCourse(demoCourseId);
    BackDoor.deleteInstructor(demoCourseId, instructor.email);

    homePage.createInstructor(shortName, instructor, institute);

    String expectedjoinUrl = Config.APP_URL + Const.ActionURIs.INSTRUCTOR_COURSE_JOIN;

    expectedjoinUrl =
        Url.addParamToUrl(
            expectedjoinUrl,
            Const.ParamsNames.REGKEY,
            StringHelper.encrypt(BackDoor.getKeyForInstructor(demoCourseId, instructor.email)));

    expectedjoinUrl =
        Url.addParamToUrl(expectedjoinUrl, Const.ParamsNames.INSTRUCTOR_INSTITUTION, institute);

    homePage
        .getStatus()
        .contains(
            "Instructor AHPUiT Instrúctör has been successfully created with join link:\n"
                + expectedjoinUrl);
    homePage.logout();
    // verify the instructor and the demo course have been created
    assertNotNull(BackDoor.getCourse(demoCourseId));
    assertNotNull(BackDoor.getInstructorByEmail(instructor.email, demoCourseId));

    // get the joinURL which sent to the requester's email
    String joinActionUrl =
        TestProperties.inst().TEAMMATES_URL + Const.ActionURIs.INSTRUCTOR_COURSE_JOIN;

    String joinLink =
        Url.addParamToUrl(
            joinActionUrl,
            Const.ParamsNames.REGKEY,
            StringHelper.encrypt(BackDoor.getKeyForInstructor(demoCourseId, instructor.email)));

    joinLink = Url.addParamToUrl(joinLink, Const.ParamsNames.INSTRUCTOR_INSTITUTION, institute);

    // simulate the user's verification here because it is added by admin
    browser.driver.get(joinLink);
    confirmationPage =
        createCorrectLoginPageType(browser.driver.getPageSource())
            .loginAsJoiningInstructor(
                TestProperties.inst().TEST_INSTRUCTOR_ACCOUNT,
                TestProperties.inst().TEST_INSTRUCTOR_PASSWORD);
    confirmationPage.clickCancelButton();

    browser.driver.get(joinLink);
    confirmationPage =
        createCorrectLoginPageType(browser.driver.getPageSource())
            .loginAsJoiningInstructor(
                TestProperties.inst().TEST_INSTRUCTOR_ACCOUNT,
                TestProperties.inst().TEST_INSTRUCTOR_PASSWORD);
    confirmationPage.clickConfirmButton();

    // check a account has been created for the requester successfully
    assertNotNull(BackDoor.getAccount(TestProperties.inst().TEST_INSTRUCTOR_ACCOUNT));

    // verify sample course is accessible for newly joined instructor as an instructor

    ______TS("new instructor can see sample course in homepage");
    InstructorHomePage instructorHomePage =
        AppPage.getNewPageInstance(browser, InstructorHomePage.class);
    instructorHomePage.verifyHtmlMainContent("/newlyJoinedInstructorHomePage.html");

    ______TS("new instructor can access sample coure enroll page");
    InstructorCourseEnrollPage enrollPage = instructorHomePage.clickCourseErollLink(demoCourseId);
    enrollPage.verifyHtmlMainContent("/newlyJoinedInstructorCourseEnrollPage.html");

    ______TS("new instructor can access sample coure details page");
    instructorHomePage = enrollPage.goToPreviousPage(InstructorHomePage.class);
    InstructorCourseDetailsPage detailsPage = instructorHomePage.clickCourseViewLink(demoCourseId);
    detailsPage.verifyHtmlMainContent("/newlyJoinedInstructorCourseDetailsPage.html");

    ______TS("new instructor can access sample coure edit page");
    instructorHomePage = detailsPage.goToPreviousPage(InstructorHomePage.class);
    InstructorCourseEditPage editPage = instructorHomePage.clickCourseEditLink(demoCourseId);
    editPage.verifyHtmlMainContent("/newlyJoinedInstructorCourseEditPage.html");

    ______TS("new instructor can access sample coure feedback session adding page");
    instructorHomePage = editPage.goToPreviousPage(InstructorHomePage.class);
    InstructorFeedbacksPage feedbacksPage =
        instructorHomePage.clickCourseAddEvaluationLink(demoCourseId);
    feedbacksPage.verifyHtmlMainContent("/newlyJoinedInstructorFeedbacksPage.html");

    ______TS("new instructor can archive sample course");
    instructorHomePage = feedbacksPage.goToPreviousPage(InstructorHomePage.class);
    instructorHomePage.clickArchiveCourseLinkAndConfirm(demoCourseId);
    instructorHomePage.verifyHtmlMainContent(
        "/newlyJoinedInstructorHomePageSampleCourseArchived.html");

    ______TS("new instructor can unarchive sample course");
    String url =
        Url.addParamToUrl(
            TestProperties.inst().TEAMMATES_URL + Const.ActionURIs.INSTRUCTOR_COURSES_PAGE,
            Const.ParamsNames.USER_ID,
            TestProperties.inst().TEST_INSTRUCTOR_ACCOUNT);
    browser.driver.get(url);
    InstructorCoursesPage coursesPage =
        AppPage.getNewPageInstance(browser, InstructorCoursesPage.class);
    coursesPage.unarchiveCourse(demoCourseId);
    coursesPage.verifyHtmlMainContent(
        "/newlyJoinedInstructorCoursesPageSampleCourseUnarhived.html");

    ______TS("new instructor can access sample course students page");
    coursesPage
        .loadStudentsTab()
        .verifyHtmlMainContent("/newlyJoinedInstructorStudentListPage.html");
    ______TS("new instructor can access sample course comments page");
    coursesPage
        .loadInstructorCommentsTab()
        .verifyHtmlMainContent("/newlyJoinedInstructorCommentsPage.html");

    ______TS("new instructor can view feedbackSession result of sample course");
    coursesPage.loadInstructorHomeTab();
    instructorHomePage = AppPage.getNewPageInstance(browser, InstructorHomePage.class);
    instructorHomePage
        .clickFeedbackSessionViewResultsLink(
            "AHPUiT.instr1.gma-demo", "Second team feedback session")
        .verifyHtmlMainContent("/newlyJoinedInstructorFeedbackResultsPage.html");

    ______TS("new instructor can edit feedbackSession of sample course");
    instructorHomePage.loadInstructorHomeTab();
    InstructorFeedbackEditPage feedbackEditPage =
        instructorHomePage.clickFeedbackSessionEditLink(
            "AHPUiT.instr1.gma-demo", "Second team feedback session");

    feedbackEditPage.clickEditSessionButton();

    FeedbackSessionAttributes feedbackSession =
        BackDoor.getFeedbackSession("AHPUiT.instr1.gma-demo", "Second team feedback session");
    feedbackEditPage.editFeedbackSession(
        feedbackSession.startTime,
        feedbackSession.endTime,
        new Text("updated instructions"),
        feedbackSession.gracePeriod);
    instructorHomePage.verifyHtmlMainContent(
        "/newlyJoinedInstructorFeedbackSessionSuccessEdited.html");

    ______TS("new instructor can click submit button of sample feedbackSession");
    instructorHomePage.loadInstructorHomeTab();
    FeedbackSubmitPage fbsp =
        instructorHomePage.clickFeedbackSessionSubmitLink(
            "AHPUiT.instr1.gma-demo", "Second team feedback session");
    fbsp.verifyHtmlMainContent("/newlyJoinedInstructorFeedbackSubmissionEditPage.html");

    ______TS("new instructor can send reminder of sample course");
    instructorHomePage.loadInstructorHomeTab();
    feedbacksPage =
        instructorHomePage.clickFeedbackSessionRemindLink(
            "AHPUiT.instr1.gma-demo", "Second team feedback session");
    feedbacksPage.verifyHtmlMainContent("/newlyJoinedInstructorFeedbackSessionRemind.html");

    ______TS("new instructor can unpublish feedbackSession of sample course");
    instructorHomePage.loadInstructorHomeTab();
    feedbacksPage =
        instructorHomePage.clickFeedbackSessionUnpublishLink(
            "AHPUiT.instr1.gma-demo", "Second team feedback session");
    feedbacksPage.verifyHtmlMainContent("/newlyJoinedInstructorFeedbackSessionUnpublished.html");

    ______TS("new instructor can publish feedbackSession of sample course");
    instructorHomePage.loadInstructorHomeTab();
    feedbacksPage =
        instructorHomePage.clickFeedbackSessionPublishLink(
            "AHPUiT.instr1.gma-demo", "Second team feedback session");
    feedbacksPage.verifyHtmlMainContent("/newlyJoinedInstructorFeedbackSessionPublished.html");

    feedbacksPage.logout();

    ______TS("action failure : invalid parameter");

    Url homeUrl = createUrl(Const.ActionURIs.ADMIN_HOME_PAGE);
    homePage = loginAdminToPage(browser, homeUrl, AdminHomePage.class);

    instructor.email = "AHPUiT.email.tmt";
    homePage
        .createInstructor(shortName, instructor, institute)
        .verifyStatus(
            String.format(
                FieldValidator.EMAIL_ERROR_MESSAGE,
                instructor.email,
                FieldValidator.REASON_INCORRECT_FORMAT));

    ______TS("action success: course is accessible for newly joined instructor as student");
    // in staging server, the student account uses the hardcoded email above, so this can only be
    // test on dev server
    if (!TestProperties.inst().TEAMMATES_URL.contains("local")) {

      BackDoor.deleteCourse(demoCourseId);
      BackDoor.deleteAccount(TestProperties.inst().TEST_INSTRUCTOR_ACCOUNT);
      BackDoor.deleteInstructor(demoCourseId, instructor.email);
      return;
    }

    // verify sample course is accessible for newly joined instructor as an student

    StudentHomePage studentHomePage =
        HomePage.getNewInstance(browser)
            .clickStudentLogin()
            .loginAsStudent(
                TestProperties.inst().TEST_INSTRUCTOR_ACCOUNT,
                TestProperties.inst().TEST_INSTRUCTOR_PASSWORD);

    studentHomePage.verifyContains(demoCourseId);
    studentHomePage.clickViewTeam();

    StudentCourseDetailsPage courseDetailsPage =
        AppPage.getNewPageInstance(browser, StudentCourseDetailsPage.class);
    courseDetailsPage.verifyHtmlMainContent("/newlyJoinedInstructorStudentCourseDetailsPage.html");

    studentHomePage = courseDetailsPage.goToPreviousPage(StudentHomePage.class);
    studentHomePage.getViewFeedbackButton("First team feedback session").click();
    StudentFeedbackResultsPage sfrp =
        AppPage.getNewPageInstance(browser, StudentFeedbackResultsPage.class);
    sfrp.verifyHtmlMainContent("/newlyJoinedInstructorStudentFeedbackResultsPage.html");

    studentHomePage = sfrp.goToPreviousPage(StudentHomePage.class);
    studentHomePage.getEditFeedbackButton("First team feedback session").click();
    FeedbackSubmitPage fsp = AppPage.getNewPageInstance(browser, FeedbackSubmitPage.class);
    fsp.verifyHtmlMainContent("/newlyJoinedInstructorStudentFeedbackSubmissionEdit.html");

    studentHomePage = fsp.loadStudentHomeTab();
    StudentCommentsPage scp = studentHomePage.loadStudentCommentsTab();
    scp.verifyHtmlMainContent("/newlyJoinedInstructorStudentCommentsPage.html");

    studentHomePage = scp.loadStudentHomeTab();

    StudentProfilePage spp = studentHomePage.loadProfileTab();
    spp.verifyContains("Student Profile");
    spp.verifyContains("AHPUiT Instrúctör");

    studentHomePage.logout();

    // login in as instructor again to test sample course deletion
    instructorHomePage =
        HomePage.getNewInstance(browser)
            .clickInstructorLogin()
            .loginAsInstructor(
                TestProperties.inst().TEST_INSTRUCTOR_ACCOUNT,
                TestProperties.inst().TEST_INSTRUCTOR_PASSWORD);

    instructorHomePage.clickAndConfirm(instructorHomePage.getDeleteCourseLink(demoCourseId));
    assertTrue(
        instructorHomePage
            .getStatus()
            .contains("The course " + demoCourseId + " has been deleted."));

    instructorHomePage.logout();

    BackDoor.deleteAccount(TestProperties.inst().TEST_INSTRUCTOR_ACCOUNT);
    BackDoor.deleteCourse(demoCourseId);
    BackDoor.deleteInstructor(demoCourseId, instructor.email);
  }
  @Override
  public ActionResult execute() throws EntityDoesNotExistException {

    String courseId = getRequestParamValue(Const.ParamsNames.COURSE_ID);
    String evalName = getRequestParamValue(Const.ParamsNames.EVALUATION_NAME);
    String fromEmail = getRequestParamValue(Const.ParamsNames.FROM_EMAIL);
    String teamName = getRequestParamValue(Const.ParamsNames.TEAM_NAME);

    if (isParameterNull(courseId)
        || isParameterNull(evalName)
        || isParameterNull(fromEmail)
        || isParameterNull(teamName)) {
      return redirectAndShowExpiredRequest();
    } else {

      String[] toEmails = getRequestParamValues(Const.ParamsNames.TO_EMAIL);
      String[] points = getRequestParamValues(Const.ParamsNames.POINTS);
      String[] justifications = getRequestParamValues(Const.ParamsNames.JUSTIFICATION);
      String[] comments = getRequestParamValues(Const.ParamsNames.COMMENTS);

      EvaluationAttributes eval = logic.getEvaluation(courseId, evalName);

      if (eval.getStatus() == EvalStatus.PUBLISHED) {
        throw new UnauthorizedAccessException(Const.Tooltips.EVALUATION_STATUS_PUBLISHED);
      } else if (eval.getStatus() == EvalStatus.CLOSED) {
        throw new UnauthorizedAccessException(Const.Tooltips.EVALUATION_STATUS_CLOSED);
      } else if (eval.getStatus() == EvalStatus.AWAITING) {
        throw new UnauthorizedAccessException(Const.Tooltips.EVALUATION_STATUS_AWAITING);
      } else if (eval.getStatus() == EvalStatus.DOES_NOT_EXIST) {
        throw new UnauthorizedAccessException(Const.StatusMessages.EVALUATION_DELETED);
      }

      // extract submission data
      ArrayList<SubmissionAttributes> submissionData = new ArrayList<SubmissionAttributes>();
      int submissionCount = (toEmails == null ? 0 : toEmails.length);
      boolean emptyPointExists = false;
      for (int i = 0; i < submissionCount; i++) {
        SubmissionAttributes sub = new SubmissionAttributes();
        sub.course = courseId;
        sub.evaluation = evalName;
        sub.justification = new Text(justifications[i]);

        if (eval.p2pEnabled) {
          sub.p2pFeedback = new Text(comments[i]);
        }

        try {
          sub.points = Integer.parseInt(points[i]);
        } catch (NumberFormatException e) {
          // The point dropdown is unfilled and is blank
          sub.points = Const.POINTS_NOT_SUBMITTED;
          emptyPointExists = true;
        }

        sub.reviewee = toEmails[i];
        sub.reviewer = fromEmail;
        sub.team = teamName;
        submissionData.add(sub);
      }

      if (emptyPointExists) {
        isError = true;
        statusToUser.add("Please give contribution scale to everyone");
      }

      new GateKeeper()
          .verifyAccessible(
              logic.getStudentForGoogleId(courseId, account.googleId), submissionData);

      try {
        logic.updateSubmissions(submissionData);
        statusToAdmin =
            createLogMesage(
                courseId,
                evalName,
                teamName,
                fromEmail,
                toEmails,
                points,
                justifications,
                comments);
      } catch (InvalidParametersException e) {
        // TODO: Let the user retry?
        setStatusForException(e);
      }

      RedirectResult response;
      if (isError) {
        String submissionUrl = Const.ActionURIs.STUDENT_EVAL_SUBMISSION_EDIT_PAGE;
        submissionUrl = Url.addParamToUrl(submissionUrl, Const.ParamsNames.COURSE_ID, courseId);
        submissionUrl =
            Url.addParamToUrl(submissionUrl, Const.ParamsNames.EVALUATION_NAME, evalName);
        submissionUrl =
            Url.addParamToUrl(submissionUrl, Const.ParamsNames.USER_ID, account.googleId);
        response = createRedirectResult(submissionUrl);
      } else {
        statusToUser.add(
            String.format(
                Const.StatusMessages.STUDENT_EVALUATION_SUBMISSION_RECEIVED,
                Sanitizer.sanitizeForHtml(evalName),
                courseId));
        String submissionUrl = Const.ActionURIs.STUDENT_HOME_PAGE;

        String submittedEvaluationName = courseId + evalName;
        submissionUrl =
            Url.addParamToUrl(
                submissionUrl,
                Const.ParamsNames.CHECK_PERSISTENCE_EVALUATION,
                submittedEvaluationName);
        log.info(submittedEvaluationName);
        response = createRedirectResult(submissionUrl);
      }
      return response;
    }
  }