@SuppressWarnings("unchecked")
  private void setUpForNotes(Sample sample) {
    noteIdToIndicatorMap = new HashMap<String, String>();

    List<Result> results = resultDAO.getResultsForSample(sample);
    History searchHistory = new History();
    searchHistory.setReferenceTable(NOTE_TABLE_ID);
    historyList = new ArrayList<History>();

    Note searchNote = new Note();
    searchNote.setReferenceTableId(RESULT_TABLE_ID);
    for (Result result : results) {
      searchNote.setReferenceId(result.getId());

      List<Note> notes = noteDAO.getAllNotesByRefIdRefTable(searchNote);

      for (Note note : notes) {
        searchHistory.setReferenceId(note.getId());
        noteIdToIndicatorMap.put(
            note.getId(), TestService.getLocalizedTestName(result.getAnalysis().getTest()));
        historyList.addAll(auditTrailDAO.getHistoryByRefIdAndRefTableId(searchHistory));
      }
    }

    newValueMap = new HashMap<String, String>();
  }
 private void addResultSets(Analysis analysis, Result result) {
   Sample sample = analysis.getSampleItem().getSample();
   Patient patient = sampleHumanDAO.getPatientForSample(sample);
   List<DocumentTrack> documents =
       documentTrackDAO.getByTypeRecordAndTable(RESULT_REPORT_ID, RESULT_TABLE_ID, result.getId());
   if (documents.isEmpty()) {
     newResultSet.add(new ResultSet(result, null, null, patient, sample, null, false));
   } else {
     modifiedResultSet.add(new ResultSet(result, null, null, patient, sample, null, false));
   }
 }
  @Override
  protected ActionForward performAction(
      ActionMapping mapping,
      ActionForm form,
      HttpServletRequest request,
      HttpServletResponse response)
      throws Exception {

    String forward = FWD_SUCCESS;

    List<IResultUpdate> updaters = ValidationUpdateRegister.getRegisteredUpdaters();
    boolean areListeners = updaters != null && !updaters.isEmpty();

    request.getSession().setAttribute(SAVE_DISABLED, "true");

    BaseActionForm dynaForm = (BaseActionForm) form;

    ResultValidationPaging paging = new ResultValidationPaging();
    paging.updatePagedResults(request, dynaForm);
    List<AnalysisItem> resultItemList = paging.getResults(request);

    String testSectionName = (String) dynaForm.get("testSection");
    String testName = (String) dynaForm.get("testName");
    setRequestType(testSectionName);

    ActionMessages errors = validateModifiedItems(resultItemList);

    if (errors.size() > 0) {
      saveErrors(request, errors);
      request.setAttribute(Globals.ERROR_KEY, errors);
      return mapping.findForward(FWD_VALIDATION_ERROR);
    }

    createSystemUser();
    setSampleFinishedStatuses();

    noteUpdateList = new ArrayList<Note>();
    resultUpdateList = new ArrayList<Result>();
    analysisUpdateList = new ArrayList<Analysis>();
    modifiedResultSet = new ArrayList<ResultSet>();
    newResultSet = new ArrayList<ResultSet>();
    deletableList = new ArrayList<Result>();

    if (testSectionName.equals("serology")) {
      createUpdateElisaList(resultItemList);
    } else {
      createUpdateList(resultItemList, areListeners);
    }

    Transaction tx = HibernateUtil.getSession().beginTransaction();

    try {
      ResultSaveService.removeDeletedResultsInTransaction(deletableList, currentUserId);

      // update analysis
      for (Analysis analysis : analysisUpdateList) {
        analysisDAO.updateData(analysis);
      }

      for (Result result : resultUpdateList) {
        if (result.getId() != null) {
          resultDAO.updateData(result);
        } else {
          resultDAO.insertData(result);
        }
      }

      checkIfSamplesFinished(resultItemList);

      // update finished samples
      for (Sample sample : sampleUpdateList) {
        sampleDAO.updateData(sample);
      }

      // create or update notes
      for (Note note : noteUpdateList) {
        if (note != null) {
          if (note.getId() == null) {
            noteDAO.insertData(note);
          } else {
            noteDAO.updateData(note);
          }
        }
      }

      for (IResultUpdate updater : updaters) {
        updater.transactionalUpdate(this);
      }

      tx.commit();

    } catch (LIMSRuntimeException lre) {
      tx.rollback();
    }

    for (IResultUpdate updater : updaters) {
      updater.postTransactionalCommitUpdate(this);
    }

    if (isBlankOrNull(testSectionName)) {
      return mapping.findForward(forward);
    } else {
      Map<String, String> params = new HashMap<String, String>();
      params.put("type", testSectionName);
      params.put("test", testName);
      params.put("forward", forward);

      return getForwardWithParameters(mapping.findForward(forward), params);
    }
  }
  private ReferralItem getReferralItem(Referral referral) {
    boolean allReferralResultsHaveResults = true;
    List<ReferralResult> referralResults =
        referralResultDAO.getReferralResultsForReferral(referral.getId());
    for (ReferralResult referralResult : referralResults) {
      if (referralResult.getResult() == null
          || GenericValidator.isBlankOrNull(referralResult.getResult().getValue())) {
        allReferralResultsHaveResults = false;
        break;
      }
    }

    if (allReferralResultsHaveResults) {
      return null;
    }

    ReferralItem referralItem = new ReferralItem();

    AnalysisService analysisService = new AnalysisService(referral.getAnalysis());

    referralItem.setCanceled(false);
    referralItem.setReferredResultType("N");
    referralItem.setAccessionNumber(analysisService.getOrderAccessionNumber());

    TypeOfSample typeOfSample = analysisService.getTypeOfSample();
    referralItem.setSampleType(typeOfSample.getLocalizedName());

    referralItem.setReferringTestName(
        TestService.getUserLocalizedTestName(analysisService.getAnalysis().getTest()));
    List<Result> resultList = analysisService.getResults();
    String resultString = "";

    if (!resultList.isEmpty()) {
      Result result = resultList.get(0);
      resultString = getAppropriateResultValue(resultList);
      referralItem.setInLabResultId(result.getId());
    }

    referralItem.setReferralId(referral.getId());
    if (!referralResults.isEmpty()) {
      referralResults = setReferralItemForNextTest(referralItem, referralResults);
      if (!referralResults.isEmpty()) {
        referralItem.setAdditionalTests(getAdditionalReferralTests(referralResults));
      }
    }
    referralItem.setReferralResults(resultString);
    referralItem.setReferralDate(DateUtil.convertTimestampToStringDate(referral.getRequestDate()));
    referralItem.setReferredSendDate(getSendDateOrDefault(referral));
    referralItem.setReferrer(referral.getRequesterName());
    referralItem.setReferralReasonId(referral.getReferralReasonId());
    referralItem.setTestSelectionList(getTestsForTypeOfSample(typeOfSample));
    referralItem.setReferralId(referral.getId());
    if (referral.getOrganization() != null) {
      referralItem.setReferredInstituteId(referral.getOrganization().getId());
    }
    String notes = analysisService.getNotesAsString(true, true, "<br/>", false);
    if (notes != null) {
      referralItem.setPastNotes(notes);
    }

    return referralItem;
  }