us.mn.state.health.lims.result.action.ResultsLogbookUpdateAction.java Source code

Java tutorial

Introduction

Here is the source code for us.mn.state.health.lims.result.action.ResultsLogbookUpdateAction.java

Source

/**
 * The contents of this file are subject to the Mozilla Public License
 * Version 1.1 (the "License"); you may not use this file except in
 * compliance with the License. You may obtain a copy of the License at
 * http://www.mozilla.org/MPL/
 *
 * Software distributed under the License is distributed on an "AS IS"
 * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
 * License for the specific language governing rights and limitations under
 * the License.
 *
 * The Original Code is OpenELIS code.
 *
 * Copyright (C) CIRG, University of Washington, Seattle WA.  All Rights Reserved.
 *
 */
package us.mn.state.health.lims.result.action;

import org.apache.commons.validator.GenericValidator;
import org.apache.struts.Globals;
import org.apache.struts.action.*;
import org.hibernate.StaleObjectStateException;
import org.hibernate.Transaction;
import org.json.simple.JSONArray;
import org.json.simple.JSONObject;
import org.json.simple.parser.JSONParser;
import org.json.simple.parser.ParseException;
import us.mn.state.health.lims.analysis.dao.AnalysisDAO;
import us.mn.state.health.lims.analysis.daoimpl.AnalysisDAOImpl;
import us.mn.state.health.lims.analysis.valueholder.Analysis;
import us.mn.state.health.lims.common.action.BaseAction;
import us.mn.state.health.lims.common.action.BaseActionForm;
import us.mn.state.health.lims.common.action.IActionConstants;
import us.mn.state.health.lims.common.exception.LIMSRuntimeException;
import us.mn.state.health.lims.common.formfields.FormFields;
import us.mn.state.health.lims.common.formfields.FormFields.Field;
import us.mn.state.health.lims.common.services.*;
import us.mn.state.health.lims.common.services.DisplayListService.ListType;
import us.mn.state.health.lims.common.services.NoteService.NoteType;
import us.mn.state.health.lims.common.services.StatusService.AnalysisStatus;
import us.mn.state.health.lims.common.services.StatusService.OrderStatus;
import us.mn.state.health.lims.common.services.beanAdapters.ResultSaveBeanAdapter;
import us.mn.state.health.lims.common.services.registration.ResultUpdateRegister;
import us.mn.state.health.lims.common.services.registration.interfaces.IResultUpdate;
import us.mn.state.health.lims.common.services.serviceBeans.ResultSaveBean;
import us.mn.state.health.lims.common.util.ConfigurationProperties;
import us.mn.state.health.lims.common.util.ConfigurationProperties.Property;
import us.mn.state.health.lims.common.util.DateUtil;
import us.mn.state.health.lims.common.util.IdValuePair;
import us.mn.state.health.lims.common.util.StringUtil;
import us.mn.state.health.lims.common.util.validator.ActionError;
import us.mn.state.health.lims.hibernate.HibernateUtil;
import us.mn.state.health.lims.note.dao.NoteDAO;
import us.mn.state.health.lims.note.daoimpl.NoteDAOImpl;
import us.mn.state.health.lims.note.valueholder.Note;
import us.mn.state.health.lims.patient.valueholder.Patient;
import us.mn.state.health.lims.referral.dao.ReferralDAO;
import us.mn.state.health.lims.referral.dao.ReferralResultDAO;
import us.mn.state.health.lims.referral.dao.ReferralTypeDAO;
import us.mn.state.health.lims.referral.daoimpl.ReferralDAOImpl;
import us.mn.state.health.lims.referral.daoimpl.ReferralResultDAOImpl;
import us.mn.state.health.lims.referral.daoimpl.ReferralTypeDAOImpl;
import us.mn.state.health.lims.referral.valueholder.Referral;
import us.mn.state.health.lims.referral.valueholder.ReferralResult;
import us.mn.state.health.lims.referral.valueholder.ReferralType;
import us.mn.state.health.lims.result.action.util.*;
import us.mn.state.health.lims.result.dao.ResultDAO;
import us.mn.state.health.lims.result.dao.ResultInventoryDAO;
import us.mn.state.health.lims.result.dao.ResultSignatureDAO;
import us.mn.state.health.lims.result.daoimpl.ResultDAOImpl;
import us.mn.state.health.lims.result.daoimpl.ResultInventoryDAOImpl;
import us.mn.state.health.lims.result.daoimpl.ResultSignatureDAOImpl;
import us.mn.state.health.lims.result.valueholder.Result;
import us.mn.state.health.lims.result.valueholder.ResultInventory;
import us.mn.state.health.lims.result.valueholder.ResultSignature;
import us.mn.state.health.lims.resultlimits.dao.ResultLimitDAO;
import us.mn.state.health.lims.resultlimits.daoimpl.ResultLimitDAOImpl;
import us.mn.state.health.lims.resultlimits.valueholder.ResultLimit;
import us.mn.state.health.lims.sample.dao.SampleDAO;
import us.mn.state.health.lims.sample.daoimpl.SampleDAOImpl;
import us.mn.state.health.lims.sample.valueholder.Sample;
import us.mn.state.health.lims.test.beanItems.TestResultItem;
import us.mn.state.health.lims.testreflex.action.util.TestReflexBean;
import us.mn.state.health.lims.testreflex.action.util.TestReflexUtil;
import us.mn.state.health.lims.typeoftestresult.valueholder.TypeOfTestResult.ResultType;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.sql.Timestamp;
import java.util.*;

public class ResultsLogbookUpdateAction extends BaseAction {

    private AnalysisDAO analysisDAO = new AnalysisDAOImpl();
    private ResultDAO resultDAO = new ResultDAOImpl();
    private ResultSignatureDAO resultSigDAO = new ResultSignatureDAOImpl();
    private ResultInventoryDAO resultInventoryDAO = new ResultInventoryDAOImpl();
    private NoteDAO noteDAO = new NoteDAOImpl();
    private SampleDAO sampleDAO = new SampleDAOImpl();
    private ReferralDAO referralDAO = new ReferralDAOImpl();
    private ReferralResultDAO referralResultDAO = new ReferralResultDAOImpl();
    private ResultLimitDAO resultLimitDAO = new ResultLimitDAOImpl();

    private static final String RESULT_SUBJECT = "Result Note";
    private static String REFERRAL_CONFORMATION_ID;

    private boolean useTechnicianName = ConfigurationProperties.getInstance()
            .isPropertyValueEqual(Property.resultTechnicianName, "true");
    private boolean alwaysValidate = ConfigurationProperties.getInstance()
            .isPropertyValueEqual(Property.ALWAYS_VALIDATE_RESULTS, "true");
    private boolean supportReferrals = FormFields.getInstance().useField(Field.ResultsReferral);
    private String statusRuleSet = ConfigurationProperties.getInstance()
            .getPropertyValueUpperCase(Property.StatusRules);

    static {
        ReferralTypeDAO referralTypeDAO = new ReferralTypeDAOImpl();
        ReferralType referralType = referralTypeDAO.getReferralTypeByName("Confirmation");
        if (referralType != null) {
            REFERRAL_CONFORMATION_ID = referralType.getId();
        }
    }

    protected ActionForward performAction(ActionMapping mapping, ActionForm form, HttpServletRequest request,
            HttpServletResponse response) throws Exception {

        String forward = FWD_SUCCESS;
        List<IResultUpdate> updaters = ResultUpdateRegister.getRegisteredUpdaters();

        BaseActionForm dynaForm = (BaseActionForm) form;

        ResultsPaging paging = new ResultsPaging();
        paging.updatePagedResults(request, dynaForm);
        List<TestResultItem> tests = paging.getResults(request);

        ResultsUpdateDataSet actionDataSet = new ResultsUpdateDataSet(currentUserId);
        actionDataSet.filterModifiedItems(tests);

        ActionMessages errors = actionDataSet.validateModifiedItems();

        if (errors.size() > 0) {
            saveErrors(request, errors);
            request.setAttribute(Globals.ERROR_KEY, errors);

            return mapping.findForward(FWD_VALIDATION_ERROR);
        }

        createResultsFromItems(actionDataSet);
        createAnalysisOnlyUpdates(actionDataSet);

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

        try {
            for (Note note : actionDataSet.getNoteList()) {
                noteDAO.insertData(note);
            }

            for (ResultSet resultSet : actionDataSet.getNewResults()) {

                resultDAO.insertData(resultSet.result);

                if (resultSet.signature != null) {
                    resultSet.signature.setResultId(resultSet.result.getId());
                    resultSigDAO.insertData(resultSet.signature);
                }

                if (resultSet.testKit != null && resultSet.testKit.getInventoryLocationId() != null) {
                    resultSet.testKit.setResultId(resultSet.result.getId());
                    resultInventoryDAO.insertData(resultSet.testKit);
                }
            }

            for (Referral referral : actionDataSet.getSavableReferrals()) {
                if (referral != null) {
                    saveReferralsWithRequiredObjects(referral);
                }
            }

            for (ResultSet resultSet : actionDataSet.getModifiedResults()) {
                resultDAO.updateData(resultSet.result);

                if (resultSet.signature != null) {
                    resultSet.signature.setResultId(resultSet.result.getId());
                    if (resultSet.alwaysInsertSignature) {
                        resultSigDAO.insertData(resultSet.signature);
                    } else {
                        resultSigDAO.updateData(resultSet.signature);
                    }
                }

                if (resultSet.testKit != null && resultSet.testKit.getInventoryLocationId() != null) {
                    resultSet.testKit.setResultId(resultSet.result.getId());
                    if (resultSet.testKit.getId() == null) {
                        resultInventoryDAO.insertData(resultSet.testKit);
                    } else {
                        resultInventoryDAO.updateData(resultSet.testKit);
                    }
                }
            }

            for (Analysis analysis : actionDataSet.getModifiedAnalysis()) {
                analysisDAO.updateData(analysis);
            }

            ResultSaveService.removeDeletedResultsInTransaction(actionDataSet.getDeletableResults(), currentUserId);

            setTestReflexes(actionDataSet);

            setSampleStatus(actionDataSet);

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

            tx.commit();

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

            ActionError error;
            if (lre.getException() instanceof StaleObjectStateException) {
                error = new ActionError("errors.OptimisticLockException", null, null);
            } else {
                lre.printStackTrace();
                error = new ActionError("errors.UpdateException", null, null);
            }

            errors.add(ActionMessages.GLOBAL_MESSAGE, error);
            saveErrors(request, errors);
            request.setAttribute(Globals.ERROR_KEY, errors);

            return mapping.findForward(FWD_FAIL);

        }

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

        setSuccessFlag(request, forward);

        if (GenericValidator.isBlankOrNull(dynaForm.getString("logbookType"))) {
            return mapping.findForward(forward);
        } else {
            Map<String, String> params = new HashMap<String, String>();
            params.put("type", dynaForm.getString("logbookType"));
            params.put("forward", forward);
            return getForwardWithParameters(mapping.findForward(forward), params);
        }
    }

    private void saveReferralsWithRequiredObjects(Referral referral) {
        if (referral.getId() != null) {
            referralDAO.updateData(referral);
        } else {
            referralDAO.insertData(referral);
            ReferralResult referralResult = new ReferralResult();
            referralResult.setReferralId(referral.getId());
            referralResult.setSysUserId(currentUserId);
            referralResultDAO.insertData(referralResult);
        }
    }

    protected void setTestReflexes(ResultsUpdateDataSet actionDataSet) {
        TestReflexUtil testReflexUtil = new TestReflexUtil();
        testReflexUtil.setCurrentUserId(currentUserId);
        testReflexUtil.addNewTestsToDBForReflexTests(convertToTestReflexBeanList(actionDataSet.getNewResults()));
        testReflexUtil.updateModifiedReflexes(convertToTestReflexBeanList(actionDataSet.getModifiedResults()));
    }

    private List<TestReflexBean> convertToTestReflexBeanList(List<ResultSet> resultSetList) {
        List<TestReflexBean> reflexBeanList = new ArrayList<TestReflexBean>();

        for (ResultSet resultSet : resultSetList) {
            TestReflexBean reflex = new TestReflexBean();
            reflex.setPatient(resultSet.patient);

            if (resultSet.triggersToSelectedReflexesMap.size() > 0 && resultSet.multipleResultsForAnalysis) {
                for (String trigger : resultSet.triggersToSelectedReflexesMap.keySet()) {
                    if (trigger.equals(resultSet.result.getValue())) {
                        HashMap<String, List<String>> reducedMap = new HashMap<String, List<String>>(1);
                        reducedMap.put(trigger, resultSet.triggersToSelectedReflexesMap.get(trigger));
                        reflex.setTriggersToSelectedReflexesMap(reducedMap);
                    }
                }
                if (reflex.getTriggersToSelectedReflexesMap() == null) {
                    reflex.setTriggersToSelectedReflexesMap(new HashMap<String, List<String>>());
                }
            } else {
                reflex.setTriggersToSelectedReflexesMap(resultSet.triggersToSelectedReflexesMap);
            }

            reflex.setResult(resultSet.result);
            reflex.setSample(resultSet.sample);
            reflexBeanList.add(reflex);
        }

        return reflexBeanList;
    }

    private void setSampleStatus(ResultsUpdateDataSet actionDataSet) {
        Set<Sample> sampleSet = new HashSet<Sample>();

        for (ResultSet resultSet : actionDataSet.getNewResults()) {
            sampleSet.add(resultSet.sample);
        }

        String sampleTestingStartedId = StatusService.getInstance().getStatusID(OrderStatus.Started);
        String sampleNonConformingId = StatusService.getInstance()
                .getStatusID(OrderStatus.NonConforming_depricated);

        for (Sample sample : sampleSet) {
            if (!(sample.getStatusId().equals(sampleNonConformingId)
                    || sample.getStatusId().equals(sampleTestingStartedId))) {
                Sample newSample = new Sample();
                newSample.setId(sample.getId());
                sampleDAO.getData(newSample);

                newSample.setStatusId(sampleTestingStartedId);
                newSample.setSysUserId(currentUserId);
                sampleDAO.updateData(newSample);
            }
        }
    }

    private void createAnalysisOnlyUpdates(ResultsUpdateDataSet actionDataSet) {
        for (TestResultItem testResultItem : actionDataSet.getAnalysisOnlyChangeResults()) {
            AnalysisService analysisService = new AnalysisService(testResultItem.getAnalysisId());
            analysisService.getAnalysis().setSysUserId(currentUserId);
            analysisService.getAnalysis()
                    .setCompletedDate(DateUtil.convertStringDateToSqlDate(testResultItem.getTestDate()));
            analysisService.getAnalysis().setAnalysisType(testResultItem.getAnalysisMethod());
            actionDataSet.getModifiedAnalysis().add(analysisService.getAnalysis());
        }
    }

    private void createResultsFromItems(ResultsUpdateDataSet actionDataSet) {

        for (TestResultItem testResultItem : actionDataSet.getModifiedItems()) {
            AnalysisService analysisService = new AnalysisService(testResultItem.getAnalysisId());
            analysisService.getAnalysis().setStatusId(getStatusForTestResult(testResultItem));
            analysisService.getAnalysis().setSysUserId(currentUserId);
            handleReferrals(testResultItem, analysisService.getAnalysis(), actionDataSet);
            actionDataSet.getModifiedAnalysis().add(analysisService.getAnalysis());

            NoteService noteService = new NoteService(analysisService.getAnalysis());
            actionDataSet.addToNoteList(noteService.createSavableNote(NoteType.INTERNAL, testResultItem.getNote(),
                    RESULT_SUBJECT, currentUserId));

            if (testResultItem.isShadowRejected()) {
                String rejectedReasonId = testResultItem.getRejectReasonId();
                for (IdValuePair rejectReason : DisplayListService.getList(ListType.REJECTION_REASONS)) {
                    if (rejectedReasonId.equals(rejectReason.getId())) {
                        actionDataSet.addToNoteList(noteService.createSavableNote(NoteType.REJECTION_REASON,
                                rejectReason.getValue(), RESULT_SUBJECT, currentUserId));
                        break;
                    }
                }
            }

            ResultSaveBean bean = ResultSaveBeanAdapter.fromTestResultItem(testResultItem);
            ResultSaveService resultSaveService = new ResultSaveService(analysisService.getAnalysis(),
                    currentUserId);
            //deletable Results will be written to, not read
            List<Result> results = resultSaveService.createResultsFromTestResultItem(bean,
                    actionDataSet.getDeletableResults());

            analysisService.getAnalysis().setCorrectedSincePatientReport(
                    resultSaveService.isUpdatedResult() && analysisService.patientReportHasBeenDone());

            if (analysisService.hasBeenCorrectedSinceLastPatientReport()) {
                actionDataSet.addToNoteList(noteService.createSavableNote(NoteType.EXTERNAL,
                        StringUtil.getMessageForKey("note.corrected.result"), RESULT_SUBJECT, currentUserId));
            }

            //If there is more than one result then each user selected reflex gets mapped to that result
            for (Result result : results) {
                addResult(result, testResultItem, analysisService.getAnalysis(), results.size() > 1, actionDataSet);

                if (analysisShouldBeUpdated(testResultItem, result)) {
                    updateAnalysis(testResultItem, testResultItem.getTestDate(), analysisService.getAnalysis());
                }
            }
        }
    }

    private void handleReferrals(TestResultItem testResultItem, Analysis analysis,
            ResultsUpdateDataSet actionDataSet) {

        if (supportReferrals) {

            Referral referral = null;
            // referredOut means the referral checkbox was checked, repeating
            // analysis means that we have multi-select results, so only do one.
            if (testResultItem.isShadowReferredOut()
                    && !actionDataSet.getReferredAnalysisIds().contains(analysis.getId())) {
                actionDataSet.getReferredAnalysisIds().add(analysis.getId());
                // If it is a new result or there is no referral ID that means
                // that a new referral has to be created if it was checked and
                // it was canceled then we are un-canceling a canceled referral
                if (testResultItem.getResultId() == null
                        || GenericValidator.isBlankOrNull(testResultItem.getReferralId())) {
                    referral = new Referral();
                    referral.setReferralTypeId(REFERRAL_CONFORMATION_ID);
                    referral.setSysUserId(currentUserId);
                    referral.setRequestDate(new Timestamp(new Date().getTime()));
                    referral.setRequesterName(testResultItem.getTechnician());
                    referral.setAnalysis(analysis);
                    referral.setReferralReasonId(testResultItem.getReferralReasonId());
                } else if (testResultItem.isReferralCanceled()) {
                    referral = referralDAO.getReferralById(testResultItem.getReferralId());
                    referral.setCanceled(false);
                    referral.setSysUserId(currentUserId);
                    referral.setRequesterName(testResultItem.getTechnician());
                    referral.setReferralReasonId(testResultItem.getReferralReasonId());
                }

                actionDataSet.getSavableReferrals().add(referral);

            }
        }
    }

    protected boolean analysisShouldBeUpdated(TestResultItem testResultItem, Result result) {
        return result != null && !GenericValidator.isBlankOrNull(result.getValue())
                || (supportReferrals && ResultUtil.isReferred(testResultItem))
                || ResultUtil.isForcedToAcceptance(testResultItem) || testResultItem.isShadowRejected();
    }

    private void addResult(Result result, TestResultItem testResultItem, Analysis analysis,
            boolean multipleResultsForAnalysis, ResultsUpdateDataSet actionDataSet) {
        boolean newResult = result.getId() == null;
        boolean newAnalysisInLoop = analysis != actionDataSet.getPreviousAnalysis();

        ResultSignature technicianResultSignature = null;

        if (useTechnicianName && newAnalysisInLoop) {
            technicianResultSignature = createTechnicianSignatureFromResultItem(testResultItem);
        }

        ResultInventory testKit = createTestKitLinkIfNeeded(testResultItem, ResultsLoadUtility.TESTKIT);

        analysis.setReferredOut(testResultItem.isReferredOut());
        analysis.setEnteredDate(DateUtil.getNowAsTimestamp());

        if (newResult) {
            analysis.setEnteredDate(DateUtil.getNowAsTimestamp());
            analysis.setRevision("1");
        } else if (newAnalysisInLoop) {
            analysis.setRevision(String.valueOf(Integer.parseInt(analysis.getRevision()) + 1));
        }

        SampleService sampleService = new SampleService(testResultItem.getAccessionNumber());
        Patient patient = sampleService.getPatient();

        Map<String, List<String>> triggersToReflexesMap = new HashMap<String, List<String>>();

        getSelectedReflexes(testResultItem.getReflexJSONResult(), triggersToReflexesMap);

        if (newResult) {
            actionDataSet.getNewResults().add(new ResultSet(result, technicianResultSignature, testKit, patient,
                    sampleService.getSample(), triggersToReflexesMap, multipleResultsForAnalysis));
        } else {
            actionDataSet.getModifiedResults().add(new ResultSet(result, technicianResultSignature, testKit,
                    patient, sampleService.getSample(), triggersToReflexesMap, multipleResultsForAnalysis));
        }

        actionDataSet.setPreviousAnalysis(analysis);
    }

    private void getSelectedReflexes(String reflexJSONResult, Map<String, List<String>> triggersToReflexesMap) {
        if (!GenericValidator.isBlankOrNull(reflexJSONResult)) {
            JSONParser parser = new JSONParser();
            try {
                JSONObject jsonResult = (JSONObject) parser.parse(reflexJSONResult.replaceAll("'", "\""));

                for (Object compoundReflexes : jsonResult.values()) {
                    if (compoundReflexes != null) {
                        String triggerIds = (String) ((JSONObject) compoundReflexes).get("triggerIds");
                        List<String> selectedReflexIds = new ArrayList<String>();
                        JSONArray selectedReflexes = (JSONArray) ((JSONObject) compoundReflexes).get("selected");
                        for (Object selectedReflex : selectedReflexes) {
                            selectedReflexIds.add(((String) selectedReflex));
                        }
                        triggersToReflexesMap.put(triggerIds.trim(), selectedReflexIds);
                    }
                }
            } catch (ParseException e) {
                e.printStackTrace();
            }
        }
    }

    private String getStatusForTestResult(TestResultItem testResult) {
        if (testResult.isShadowRejected()) {
            return StatusService.getInstance().getStatusID(AnalysisStatus.TechnicalRejected);
        } else if (alwaysValidate || !testResult.isValid() || ResultUtil.isForcedToAcceptance(testResult)) {
            return StatusService.getInstance().getStatusID(AnalysisStatus.TechnicalAcceptance);
        } else if (noResults(testResult.getShadowResultValue(), testResult.getMultiSelectResultValues(),
                testResult.getResultType())) {
            return StatusService.getInstance().getStatusID(AnalysisStatus.NotStarted);
        } else {
            ResultLimit resultLimit = resultLimitDAO.getResultLimitById(testResult.getResultLimitId());
            if (resultLimit != null && resultLimit.isAlwaysValidate()) {
                return StatusService.getInstance().getStatusID(AnalysisStatus.TechnicalAcceptance);
            }

            return StatusService.getInstance().getStatusID(AnalysisStatus.Finalized);
        }
    }

    private boolean noResults(String value, String multiSelectValue, String type) {

        return (GenericValidator.isBlankOrNull(value) && GenericValidator.isBlankOrNull(multiSelectValue))
                || (ResultType.DICTIONARY.matches(type) && "0".equals(value));
    }

    private ResultInventory createTestKitLinkIfNeeded(TestResultItem testResult, String testKitName) {
        ResultInventory testKit = null;

        if ((TestResultItem.ResultDisplayType.SYPHILIS == testResult.getRawResultDisplayType()
                || TestResultItem.ResultDisplayType.HIV == testResult.getRawResultDisplayType())
                && ResultsLoadUtility.TESTKIT.equals(testKitName)) {

            testKit = createTestKit(testResult, testKitName, testResult.getTestKitId());
        }

        return testKit;
    }

    private ResultInventory createTestKit(TestResultItem testResult, String testKitName, String testKitId)
            throws LIMSRuntimeException {
        ResultInventory testKit;
        testKit = new ResultInventory();

        if (!GenericValidator.isBlankOrNull(testKitId)) {
            testKit.setId(testKitId);
            resultInventoryDAO.getData(testKit);
        }

        testKit.setInventoryLocationId(testResult.getTestKitInventoryId());
        testKit.setDescription(testKitName);
        testKit.setSysUserId(currentUserId);
        return testKit;
    }

    private void updateAnalysis(TestResultItem testResultItem, String testDate, Analysis analysis) {
        analysis.setAnalysisType(testResultItem.getAnalysisMethod());
        analysis.setStartedDateForDisplay(testDate);

        // This needs to be refactored -- part of the logic is in
        // getStatusForTestResult. RetroCI over rides to whatever was set before
        if (statusRuleSet.equals(IActionConstants.STATUS_RULES_RETROCI)) {
            if (!StatusService.getInstance().getStatusID(AnalysisStatus.Canceled).equals(analysis.getStatusId())) {
                analysis.setCompletedDate(DateUtil.convertStringDateToSqlDate(testDate));
                analysis.setStatusId(StatusService.getInstance().getStatusID(AnalysisStatus.TechnicalAcceptance));
            }
        } else if (StatusService.getInstance().matches(analysis.getStatusId(), AnalysisStatus.Finalized)
                || StatusService.getInstance().matches(analysis.getStatusId(), AnalysisStatus.TechnicalAcceptance)
                || (analysis.isReferredOut()
                        && !GenericValidator.isBlankOrNull(testResultItem.getShadowResultValue()))) {
            analysis.setCompletedDate(DateUtil.convertStringDateToSqlDate(testDate));
        }

    }

    private ResultSignature createTechnicianSignatureFromResultItem(TestResultItem testResult) {
        ResultSignature sig = null;

        // The technician signature may be blank if the user changed a
        // conclusion and then changed it back. It will be dirty
        // but will not need a signature
        if (!GenericValidator.isBlankOrNull(testResult.getTechnician())) {
            sig = new ResultSignature();

            if (!GenericValidator.isBlankOrNull(testResult.getTechnicianSignatureId())) {
                sig.setId(testResult.getTechnicianSignatureId());
                resultSigDAO.getData(sig);
            }

            sig.setIsSupervisor(false);
            sig.setNonUserName(testResult.getTechnician());

            sig.setSysUserId(currentUserId);
        }
        return sig;
    }

    protected ActionForward getForward(ActionForward forward, String accessionNumber) {
        ActionRedirect redirect = new ActionRedirect(forward);
        if (!StringUtil.isNullorNill(accessionNumber))
            redirect.addParameter(ACCESSION_NUMBER, accessionNumber);

        return redirect;

    }

    protected ActionForward getForward(ActionForward forward, String accessionNumber, String analysisId) {
        ActionRedirect redirect = new ActionRedirect(forward);
        if (!StringUtil.isNullorNill(accessionNumber))
            redirect.addParameter(ACCESSION_NUMBER, accessionNumber);

        if (!StringUtil.isNullorNill(analysisId))
            redirect.addParameter(ANALYSIS_ID, analysisId);

        return redirect;

    }

    @Override
    protected String getPageSubtitleKey() {
        return "banner.menu.results";
    }

    @Override
    protected String getPageTitleKey() {
        return "banner.menu.results";
    }

}