@Override
  public boolean processAssignReviewers(
      ProtocolDocument document, ProtocolAssignReviewersBean actionBean) {
    boolean isValid = true;
    List<ProtocolReviewerBean> reviewers = (List) actionBean.getReviewers();
    List<ProtocolOnlineReviewDocument> protocolOnlineReviewDocuments =
        (List)
            getProtocolOnlineReviewService()
                .getProtocolReviewDocumentsForCurrentSubmission(document.getProtocol());
    for (int i = 0; i < reviewers.size(); i++) {
      ProtocolReviewerBean reviewer = reviewers.get(i);
      if (!isReviewerValid(reviewer, i)) {
        isValid = false;
      } else if (StringUtils.isBlank(reviewer.getReviewerTypeCode())) {
        // get the review
        for (ProtocolOnlineReviewDocument pDocument : protocolOnlineReviewDocuments) {
          if (reviewer.isProtocolReviewerBeanForReviewer(
              pDocument.getProtocolOnlineReview().getProtocolReviewer())) {
            // the review exists and the user is asking to remove it...
            isValid &= isValidRemovalRequest(pDocument, reviewer, i);
            break;
          }
        }
      }
    }

    return isValid;
  }
  /**
   * This method tests if the fields for a given reviewer have legal values.
   *
   * @param reviewer
   * @param reviewerIndex - the index of the reviewer in the list of reviewers that was sent to the
   *     client
   */
  private boolean isReviewerValid(ProtocolReviewerBean reviewer, int reviewerIndex) {
    boolean isValid = true;
    String reviewerTypeCode = reviewer.getReviewerTypeCode();

    String propertyName =
        Constants.PROTOCOL_ASSIGN_REVIEWERS_PROPERTY_KEY
            + ".reviewer["
            + reviewerIndex
            + "].reviewerTypeCode";
    // R

    // test if type code is valid
    if (!StringUtils.isBlank(reviewerTypeCode) && isReviewerTypeInvalid(reviewerTypeCode)) {
      isValid = false;
      reportError(
          propertyName, KeyConstants.ERROR_PROTOCOL_REVIEWER_TYPE_INVALID, reviewer.getFullName());
    }

    return isValid;
  }
  public boolean isValidRemovalRequest(
      ProtocolOnlineReviewDocument document, ProtocolReviewerBean reviewer, int reviewerIndex) {
    boolean isValid = true;
    WorkflowDocument workflowDocument = document.getDocumentHeader().getWorkflowDocument();
    String propertyName =
        Constants.PROTOCOL_ASSIGN_REVIEWERS_PROPERTY_KEY
            + ".reviewer["
            + reviewerIndex
            + "].reviewerTypeCode";
    String documentRouteStatus = workflowDocument.getStatus().getCode();
    // 1. check to see the workflow status
    if (StringUtils.equals(KewApiConstants.ROUTE_HEADER_FINAL_CD, documentRouteStatus)) {
      // we just report the warning, the request is still valid - the action should prompt for
      // confirmation.
      reportWarning(
          propertyName,
          KeyConstants.ERROR_PROTOCOL_REVIEWER_CANNOT_REMOVE_REVIEW_FINAL,
          reviewer.getFullName());
    }

    if (document.getProtocolOnlineReview().getCommitteeScheduleMinutes().size() > 0) {
      // there are review comments that will be deleted by this operation
      // just report the warning.
      reportWarning(
          propertyName,
          KeyConstants.ERROR_PROTOCOL_REVIEWER_CANNOT_REMOVE_REVIEW_EXISTING_COMMENTS,
          reviewer.getFullName(),
          "" + document.getProtocolOnlineReview().getCommitteeScheduleMinutes().size());
    }

    if (StringUtils.equals(
        document.getProtocolOnlineReview().getProtocolOnlineReviewStatusCode(),
        ProtocolOnlineReviewStatus.FINAL_STATUS_CD)) {
      reportWarning(
          propertyName,
          KeyConstants.ERROR_PROTOCOL_REVIEWER_CANNOT_REMOVE_FINAL_REVIEW,
          reviewer.getFullName());
    }

    return isValid;
  }