/**
   * @param assessment
   * @param username
   * @param speciesID
   * @param displayName
   * @return
   */
  private AssessmentIOWriteResult assignIDAndSave(AssessmentData assessment, String username)
      throws RegionConflictException {
    if (assessment.getAssessmentID().equals("new")) {
      if (assessment.getType().equals(BaseAssessment.DRAFT_ASSESSMENT_STATUS))
        assessment.setAssessmentID(getNextDraftID(vfs, assessment.getSpeciesID()));
      else if (assessment.getType().equals(BaseAssessment.PUBLISHED_ASSESSMENT_STATUS))
        assessment.setAssessmentID(pubIDFactory.getNextIDAsString());
      else // TODO: Figure out if we're going to need multiple user assessments per species.
      assessment.setAssessmentID(assessment.getSpeciesID());
    }

    return saveAssessment(assessment, username);
  }
  private void deleteAssessmentsForTaxon(
      String taxonID, String type, String user, Request request, Response response) {
    List<AssessmentData> assessments = AssessmentIO.readAllAssessmentsForTaxon(vfs, taxonID, user);
    for (AssessmentData cur : assessments) {
      deleteAssessment(request, response, cur.getAssessmentID(), cur.getType(), user);

      // If it's locked, force the release and delete again. Taxomatic operations are almighty.
      if (response.getStatus() == Status.CLIENT_ERROR_LOCKED) {
        Lock lock =
            FileLocker.impl.getAssessmentPersistentLock(cur.getAssessmentID(), cur.getType());
        FileLocker.impl.persistentEagerRelease(
            cur.getAssessmentID(), cur.getType(), lock.getUsername());
        deleteAssessment(request, response, cur.getAssessmentID(), cur.getType(), user);
      }
    }
  }
  private AssessmentIOWriteResult saveAssessment(AssessmentData assessment, String username)
      throws RegionConflictException {
    if (assessment.getType().equals(BaseAssessment.DRAFT_ASSESSMENT_STATUS)) {
      List<AssessmentData> compareTo =
          AssessmentIO.readAllDraftAssessments(vfs, assessment.getSpeciesID());

      for (AssessmentData cur : compareTo) {
        if (cur.getRegionIDs().containsAll(assessment.getRegionIDs())
            || cur.isGlobal() && assessment.isGlobal()) {
          if (!cur.getAssessmentID().equals(assessment.getAssessmentID()))
            throw new RegionConflictException();
        }
      }
    }

    return AssessmentIO.writeAssessment(assessment, username, vfs, true);
  }