/** Validate course_completed entries (course_completed.csv) */
  public void validateCourseCompleted() {
    String file = "course_completed.csv";

    // CHECK ALL ENTRIES FOR BLANK FIELDS
    for (int i = 0; i < entries.size(); i++) {
      boolean rowHasMissingFields = false;
      // Line Number. First row (index 0) is data row. So +2 to get line number.
      int line = i + 2;
      ArrayList<String> rowMessageList = new ArrayList<>();
      String[] row = entries.get(i);

      rowHasMissingFields = tool.rowHasMissingFields(row, rowMessageList);

      if (rowHasMissingFields) {
        blacklistedEntries.add(row);

        String[] message = rowMessageList.toArray(new String[0]);
        errorList.add(new BootstrapError(file, line, message));
      }
    }

    // STEP 2: CHECK ALL FOR invalidExamDate invalidStart, invalidEnd
    for (int i = 0; i < entries.size(); i++) {
      boolean rowHasInvalidUserId = false;
      boolean rowHasInvalidCourse = false;
      boolean rowHasDuplicatePrimaryKey = false;

      int line = i + 2;
      ArrayList<String> rowMessageList = new ArrayList<>();
      String[] row = entries.get(i);

      // if not already blacklisted due to error
      if (!blacklistedEntries.contains(row)) {

        rowHasInvalidUserId = tool.rowHasInvalidUserId(row, rowMessageList);
        rowHasInvalidCourse = tool.rowHasInvalidCourse(row, rowMessageList);

        // if there are duplicates, the latest/bottomest row will be accepted.
        // The earlier rows will be errored.
        String foreignKey = "userid";
        String primaryKey = "code";
        // rowHasDuplicatePrimaryKey =
        // tool.rowHasDuplicatePrimaryKey(foreignKey,primaryKey,row,rowMessageList);
        /*
         * NO NEED TO TEST FOR DUPLICATES
         */

        // Blacklist row if any of the validations blacklistedEntries are "true"
        if (rowHasInvalidCourse || rowHasInvalidUserId || rowHasDuplicatePrimaryKey) {
          blacklistedEntries.add(row); // add row to blackList

          String[] message = rowMessageList.toArray(new String[0]);
          errorList.add(new BootstrapError(file, line, message));
        }
      }
    } // end of 2nd for-loop

    // STEP 2: CHECK ALL FOR invalidExamDate invalidStart, invalidEnd
    for (int i = 0; i < entries.size(); i++) {
      boolean rowHasInvalidCourseCompleted = false;

      int line = i + 2;
      ArrayList<String> rowMessageList = new ArrayList<>();
      String[] row = entries.get(i);

      // if not already blacklisted due to error
      if (!blacklistedEntries.contains(row)) {

        rowHasInvalidCourseCompleted = tool.rowHasInvalidCourseCompleted(row, rowMessageList);

        // Blacklist row if any of the validations blacklistedEntries are "true"
        if (rowHasInvalidCourseCompleted) {
          blacklistedEntries.add(row); // add row to blackList

          String[] message = rowMessageList.toArray(new String[0]);
          errorList.add(new BootstrapError(file, line, message));
        }
      }
    } // end of 3rd for-loop
    // method ends
  }