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

Java tutorial

Introduction

Here is the source code for us.mn.state.health.lims.result.action.AmendedResultsEntryUpdateAction.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) The Minnesota Department of Health.  All Rights Reserved.
*/
package us.mn.state.health.lims.result.action;

import java.sql.Timestamp;
import java.util.List;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.beanutils.PropertyUtils;
import org.apache.struts.Globals;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.action.ActionMessages;
import org.apache.struts.action.ActionRedirect;

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.analysisqaevent.dao.AnalysisQaEventDAO;
import us.mn.state.health.lims.analysisqaevent.daoimpl.AnalysisQaEventDAOImpl;
import us.mn.state.health.lims.analysisqaevent.valueholder.AnalysisQaEvent;
import us.mn.state.health.lims.analysisqaeventaction.dao.AnalysisQaEventActionDAO;
import us.mn.state.health.lims.analysisqaeventaction.daoimpl.AnalysisQaEventActionDAOImpl;
import us.mn.state.health.lims.analysisqaeventaction.valueholder.AnalysisQaEventAction;
import us.mn.state.health.lims.common.action.BaseActionForm;
import us.mn.state.health.lims.common.exception.LIMSRuntimeException;
import us.mn.state.health.lims.common.log.LogEvent;
import us.mn.state.health.lims.common.util.StringUtil;
import us.mn.state.health.lims.common.util.SystemConfiguration;
import us.mn.state.health.lims.common.util.validator.ActionError;
import us.mn.state.health.lims.hibernate.HibernateUtil;
import us.mn.state.health.lims.login.valueholder.UserSessionData;
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.referencetables.valueholder.ReferenceTables;
import us.mn.state.health.lims.result.dao.ResultDAO;
import us.mn.state.health.lims.result.daoimpl.ResultDAOImpl;
import us.mn.state.health.lims.result.valueholder.Result;
import us.mn.state.health.lims.result.valueholder.Test_TestAnalyte;
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;

/**
 * @author diane benz 
 *         bugzilla 2227 Amended Results
 *         To change this generated comment
 *         edit the template variable "typecomment":
 *         Window>Preferences>Java>Templates. To enable and disable the creation
 *         of type comments go to Window>Preferences>Java>Code Generation.
 */
public class AmendedResultsEntryUpdateAction extends ResultsEntryBaseAction {

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

        String forward = FWD_SUCCESS;
        request.setAttribute(ALLOW_EDITS_KEY, "true");
        request.setAttribute(PREVIOUS_DISABLED, "true");
        request.setAttribute(NEXT_DISABLED, "true");
        String amendedAnalysisId = null;

        if (request.getParameter(ANALYSIS_ID) != null) {
            amendedAnalysisId = (String) request.getParameter(ANALYSIS_ID);
        }

        BaseActionForm dynaForm = (BaseActionForm) form;

        List testTestAnalytes = (List) dynaForm.get("testTestAnalytes");
        String accessionNumber = (String) dynaForm.get("accessionNumber");
        Timestamp sampleLastupdated = (Timestamp) dynaForm.get("sampleLastupdated");

        ActionMessages errors = null;

        // initialize the form
        dynaForm.initialize(mapping);

        // 1926 get sysUserId from login module
        UserSessionData usd = (UserSessionData) request.getSession().getAttribute(USER_SESSION_DATA);
        String sysUserId = String.valueOf(usd.getSystemUserId());

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

        if (!StringUtil.isNullorNill(amendedAnalysisId)) {

            ResultDAO resultDAO = new ResultDAOImpl();
            AnalysisDAO analysisDAO = new AnalysisDAOImpl();
            NoteDAO noteDAO = new NoteDAOImpl();
            SampleDAO sampleDAO = new SampleDAOImpl();
            AnalysisQaEventDAO analysisQaEventDAO = new AnalysisQaEventDAOImpl();
            AnalysisQaEventActionDAO analysisQaEventActionDAO = new AnalysisQaEventActionDAOImpl();

            try {

                // get old analysis and copy to new one
                Analysis analysisToAmend = new Analysis();
                analysisToAmend.setId(amendedAnalysisId);
                analysisDAO.getData(analysisToAmend);
                Analysis amendedAnalysis = new Analysis();

                PropertyUtils.copyProperties(amendedAnalysis, analysisToAmend);
                amendedAnalysis.setId(null);
                amendedAnalysis.setLastupdated(null);
                amendedAnalysis.setSysUserId(sysUserId);

                String revisionString = analysisToAmend.getRevision();
                int revision = 0;
                if (!StringUtil.isNullorNill(revisionString)) {
                    try {
                        revision = Integer.parseInt(revisionString);
                    } catch (NumberFormatException nfe) {
                        //bugzilla 2154
                        LogEvent.logError("AmendedResultsEntryUpdateAction", "performAction()", nfe.toString());
                    }
                }
                amendedAnalysis.setRevision(String.valueOf(++revision));
                amendedAnalysis.setStatus(SystemConfiguration.getInstance().getAnalysisStatusResultCompleted());
                amendedAnalysis.setPrintedDate(null);
                //bugzilla 2013 added duplicateCheck parameter
                analysisDAO.insertData(amendedAnalysis, false);

                //find qa events attached to analysisToAmend and clone them to the amenedAnalysis
                AnalysisQaEvent analysisQaEventToAmend = new AnalysisQaEvent();
                analysisQaEventToAmend.setAnalysis(analysisToAmend);
                List qaEvents = analysisQaEventDAO.getAnalysisQaEventsByAnalysis(analysisQaEventToAmend);
                if (qaEvents != null && qaEvents.size() > 0) {
                    for (int y = 0; y < qaEvents.size(); y++) {
                        analysisQaEventToAmend = (AnalysisQaEvent) qaEvents.get(y);
                        AnalysisQaEvent amendedAnalysisQaEvent = new AnalysisQaEvent();

                        AnalysisQaEventAction analysisQaEventActionToAmend = new AnalysisQaEventAction();
                        analysisQaEventActionToAmend.setAnalysisQaEvent(analysisQaEventToAmend);
                        List qaEventActionsToAmend = analysisQaEventActionDAO
                                .getAnalysisQaEventActionsByAnalysisQaEvent(analysisQaEventActionToAmend);
                        PropertyUtils.copyProperties(amendedAnalysisQaEvent, analysisQaEventToAmend);

                        amendedAnalysisQaEvent.setId(null);
                        amendedAnalysisQaEvent.setAnalysis(amendedAnalysis);
                        amendedAnalysisQaEvent.setLastupdated(null);
                        amendedAnalysisQaEvent.setSysUserId(sysUserId);
                        analysisQaEventDAO.insertData(amendedAnalysisQaEvent);

                        //get actions also
                        if (qaEventActionsToAmend != null && qaEventActionsToAmend.size() > 0) {
                            for (int z = 0; z < qaEventActionsToAmend.size(); z++) {
                                analysisQaEventActionToAmend = (AnalysisQaEventAction) qaEventActionsToAmend.get(z);
                                AnalysisQaEventAction amendedAnalysisQaEventAction = new AnalysisQaEventAction();
                                PropertyUtils.copyProperties(amendedAnalysisQaEventAction,
                                        analysisQaEventActionToAmend);

                                amendedAnalysisQaEventAction.setId(null);
                                amendedAnalysisQaEventAction.setAnalysisQaEvent(amendedAnalysisQaEvent);
                                amendedAnalysisQaEventAction.setLastupdated(null);
                                amendedAnalysisQaEventAction.setSysUserId(sysUserId);
                                analysisQaEventActionDAO.insertData(amendedAnalysisQaEventAction);
                            }
                        }
                    }
                }

                //create copies of results
                List resultsToAmend = resultDAO.getResultsByAnalysis(analysisToAmend);

                for (int i = 0; i < resultsToAmend.size(); i++) {
                    Result resultToAmend = (Result) resultsToAmend.get(i);
                    Result amendedResult = new Result();

                    PropertyUtils.copyProperties(amendedResult, resultToAmend);
                    amendedResult.setId(null);
                    amendedResult.setAnalysis(amendedAnalysis);
                    amendedResult.setLastupdated(null);
                    amendedResult.setSysUserId(sysUserId);
                    resultDAO.insertData(amendedResult);

                    //find other analyses on this sample that have this result/analysis as a parent and unlink/link to this one
                    List childAnalyses = analysisDAO.getAllChildAnalysesByResult(resultToAmend);
                    for (int j = 0; j < childAnalyses.size(); j++) {
                        Analysis childAnalysis = (Analysis) childAnalyses.get(j);
                        childAnalysis.setParentAnalysis(amendedAnalysis);
                        childAnalysis.setParentResult(amendedResult);
                        childAnalysis.setSysUserId(sysUserId);

                        //this is for optimistic locking - we need the correct lastupdated 
                        for (int x = 0; x < testTestAnalytes.size(); x++) {
                            Test_TestAnalyte test_testAnalyte = (Test_TestAnalyte) testTestAnalytes.get(x);
                            Analysis analysis = test_testAnalyte.getAnalysis();

                            if (analysis.getId().equals(childAnalysis.getId())) {
                                childAnalysis.setLastupdated(analysis.getLastupdated());
                                break;
                            }

                        }

                        analysisDAO.updateData(childAnalysis);
                    }

                    //create copies of notes (attached to new results)
                    Note note = new Note();
                    //bugzilla 2571 go through ReferenceTablesDAO to get reference tables info
                    ReferenceTables referenceTables = new ReferenceTables();
                    referenceTables.setId(SystemConfiguration.getInstance().getResultReferenceTableId());
                    note.setReferenceTables(referenceTables);
                    note.setReferenceId(resultToAmend.getId());
                    List notesByResult = noteDAO.getAllNotesByRefIdRefTable(note);

                    for (int x = 0; x < notesByResult.size(); x++) {
                        Note noteToAmend = (Note) notesByResult.get(x);
                        Note amendedNote = new Note();
                        PropertyUtils.copyProperties(amendedNote, noteToAmend);
                        amendedNote.setId(null);
                        amendedNote.setReferenceId(amendedResult.getId());
                        amendedNote.setLastupdated(null);
                        //per Nancy retain user id of original author of note
                        // Also!!!! Note needs to have systemUser (for Note mapping) AND sysUserId (for audit trail) set!!!!
                        amendedNote.setSystemUser(noteToAmend.getSystemUser());
                        amendedNote.setSysUserId(sysUserId);
                        noteDAO.insertData(amendedNote);
                    }

                }

                //update sample status
                Sample sample = sampleDAO.getSampleByAccessionNumber(accessionNumber);
                //this is for optimistic locking...(sampleLastupdated was stored in form from initial read)
                sample.setLastupdated(sampleLastupdated);
                sample.setSysUserId(sysUserId);
                sample.setStatus(SystemConfiguration.getInstance().getSampleStatusEntry2Complete());
                sampleDAO.updateData(sample);

                tx.commit();
            } catch (LIMSRuntimeException lre) {
                //bugzilla 2154
                LogEvent.logError("AmendedResultsEntryUpdateAction", "performAction()", lre.toString());
                tx.rollback();

                errors = new ActionMessages();
                ActionError error = null;
                if (lre.getException() instanceof org.hibernate.StaleObjectStateException) {

                    error = new ActionError("errors.OptimisticLockException", null, null);
                } else {
                    error = new ActionError("errors.InsertException", null, null);
                }
                errors.add(ActionMessages.GLOBAL_MESSAGE, error);
                saveErrors(request, errors);
                request.setAttribute(Globals.ERROR_KEY, errors);

                forward = FWD_FAIL;

            } finally {
                HibernateUtil.closeSession();
            }

        } else {
            forward = FWD_FAIL;
        }

        return getForward(mapping.findForward(forward), accessionNumber);

    }

    protected String getPageTitleKey() {
        return null;
    }

    protected String getPageSubtitleKey() {
        return null;
    }

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

        return redirect;

    }

}