us.mn.state.health.lims.testreflex.action.TestReflexUpdateAction.java Source code

Java tutorial

Introduction

Here is the source code for us.mn.state.health.lims.testreflex.action.TestReflexUpdateAction.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.
 *
 * Contributor(s): CIRG, University of Washington, Seattle WA.
 */
package us.mn.state.health.lims.testreflex.action;

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

import org.apache.commons.beanutils.PropertyUtils;
import org.apache.commons.validator.GenericValidator;
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 us.mn.state.health.lims.common.action.BaseAction;
import us.mn.state.health.lims.common.action.BaseActionForm;
import us.mn.state.health.lims.common.exception.LIMSDuplicateRecordException;
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.resources.ResourceLocator;
import us.mn.state.health.lims.common.util.validator.ActionError;
import us.mn.state.health.lims.hibernate.HibernateUtil;
import us.mn.state.health.lims.scriptlet.dao.ScriptletDAO;
import us.mn.state.health.lims.scriptlet.daoimpl.ScriptletDAOImpl;
import us.mn.state.health.lims.scriptlet.valueholder.Scriptlet;
import us.mn.state.health.lims.test.dao.TestDAO;
import us.mn.state.health.lims.test.daoimpl.TestDAOImpl;
import us.mn.state.health.lims.test.valueholder.Test;
import us.mn.state.health.lims.testanalyte.dao.TestAnalyteDAO;
import us.mn.state.health.lims.testanalyte.daoimpl.TestAnalyteDAOImpl;
import us.mn.state.health.lims.testanalyte.valueholder.TestAnalyte;
import us.mn.state.health.lims.testreflex.dao.TestReflexDAO;
import us.mn.state.health.lims.testreflex.daoimpl.TestReflexDAOImpl;
import us.mn.state.health.lims.testreflex.valueholder.TestReflex;
import us.mn.state.health.lims.testresult.dao.TestResultDAO;
import us.mn.state.health.lims.testresult.daoimpl.TestResultDAOImpl;
import us.mn.state.health.lims.testresult.valueholder.TestResult;

/**
 * @author diane benz
 *
 *         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 TestReflexUpdateAction extends BaseAction {

    private boolean isNew = false;
    private boolean useSecondTest = false;

    protected ActionForward performAction(ActionMapping mapping, ActionForm form, HttpServletRequest request,
            HttpServletResponse response) throws Exception {
        // The first job is to determine if we are coming to this action with an
        // ID parameter in the request. If there is no parameter, we are
        // creating a new TestReflex.
        // If there is a parameter present, we should bring up an existing
        // TestReflex to edit.

        String forward = FWD_SUCCESS;
        request.setAttribute(ALLOW_EDITS_KEY, "true");
        request.setAttribute(PREVIOUS_DISABLED, "false");
        request.setAttribute(NEXT_DISABLED, "false");
        TestDAO testDAO = new TestDAOImpl();
        ScriptletDAO scriptletDAO = new ScriptletDAOImpl();

        BaseActionForm dynaForm = (BaseActionForm) form;

        String id = request.getParameter(ID);
        isNew = StringUtil.isNullorNill(id) || "0".equals(id);

        useSecondTest = (Boolean) dynaForm.get("useSecondTest");

        // server-side validation (validation.xml)
        ActionMessages errors = dynaForm.validate(mapping, request);

        try {
            errors = validateAll(request, errors, dynaForm);
        } catch (Exception e) {
            // bugzilla 2154
            LogEvent.logError("TestReflexUpdateAction", "performAction()", e.toString());
            ActionError error = new ActionError("errors.ValidationException", null, null);
            errors.add(ActionMessages.GLOBAL_MESSAGE, error);
        }

        if (errors != null && errors.size() > 0) {
            saveErrors(request, errors);
            return mapping.findForward(FWD_FAIL);
        }

        String start = (String) request.getParameter("startingRecNo");
        String direction = (String) request.getParameter("direction");

        TestReflex testReflex = new TestReflex();
        TestReflex secondTestReflex = null;

        String loggedOnUserId = getSysUserId(request);

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

        Test reflexTest = loadTest(testDAO, dynaForm.getString("addedTestId"));
        Scriptlet reflexScriptlet = loadScriptlet(scriptletDAO, dynaForm.getString("actionScriptletId"));

        loadPrimaryTestReflex(testDAO, dynaForm, testReflex, loggedOnUserId, reflexTest, reflexScriptlet);

        if (useSecondTest) {
            secondTestReflex = new TestReflex();
            loadSecondaryTestReflex(testDAO, dynaForm, secondTestReflex, loggedOnUserId, reflexTest);
        }

        try {

            TestReflexDAO testReflexDAO = new TestReflexDAOImpl();

            if (!isNew) {
                testReflexDAO.updateData(testReflex);
            } else {
                testReflexDAO.insertData(testReflex);

                if (secondTestReflex != null) {

                    secondTestReflex.setSiblingReflexId(testReflex.getId());
                    testReflexDAO.insertData(secondTestReflex);

                    testReflex.setSiblingReflexId(secondTestReflex.getId());
                    testReflexDAO.updateData(testReflex);
                }
            }

            tx.commit();
        } catch (LIMSRuntimeException lre) {
            // bugzilla 2154
            LogEvent.logError("TestReflexUpdateAction", "performAction()", lre.toString());
            tx.rollback();
            errors = new ActionMessages();
            java.util.Locale locale = (java.util.Locale) request.getSession()
                    .getAttribute("org.apache.struts.action.LOCALE");
            ActionError error = null;
            if (lre.getException() instanceof org.hibernate.StaleObjectStateException) {
                error = new ActionError("errors.OptimisticLockException", null, null);
            } else {
                if (lre.getException() instanceof LIMSDuplicateRecordException) {
                    String messageKey = "testreflex.testreflex";
                    String msg = ResourceLocator.getInstance().getMessageResources().getMessage(locale, messageKey);
                    error = new ActionError("errors.DuplicateRecord", msg, null);

                } else {
                    error = new ActionError("errors.UpdateException", null, null);
                }
            }

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

            request.setAttribute(PREVIOUS_DISABLED, "true");
            request.setAttribute(NEXT_DISABLED, "true");
            forward = FWD_FAIL;

        } finally {
            HibernateUtil.closeSession();
        }
        if (forward.equals(FWD_FAIL))
            return mapping.findForward(forward);

        // initialize the form
        dynaForm.initialize(mapping);
        PropertyUtils.copyProperties(dynaForm, testReflex);

        if ("true".equalsIgnoreCase(request.getParameter("close"))) {
            forward = FWD_CLOSE;
        }

        if (testReflex.getId() != null && !testReflex.getId().equals("0")) {
            request.setAttribute(ID, testReflex.getId());

        }

        if (isNew) {
            forward = FWD_SUCCESS_INSERT;
        }

        return getForward(mapping.findForward(forward), id, start, direction);

    }

    private void loadSecondaryTestReflex(TestDAO testDAO, BaseActionForm dynaForm, TestReflex secondTestReflex,
            String loggedOnUserId, Test reflexTest) {
        secondTestReflex.setSysUserId(loggedOnUserId);

        TestResult secondTestResult = loadTestResult(dynaForm.getString("secondTestResultId"));
        TestAnalyte secondTestAnalyte = loadTestAnalyte(dynaForm.getString("secondTestAnalyteId"));
        Test secondTest = loadTest(testDAO, dynaForm.getString("secondTestId"));

        secondTestReflex.setTestResult(secondTestResult);
        secondTestReflex.setTestAnalyte(secondTestAnalyte);
        secondTestReflex.setTest(secondTest);
        secondTestReflex.setAddedTest(reflexTest);
    }

    private void loadPrimaryTestReflex(TestDAO testDAO, BaseActionForm dynaForm, TestReflex testReflex,
            String loggedOnUserId, Test reflexTest, Scriptlet reflexScriptlet) {
        testReflex.setSysUserId(loggedOnUserId);
        TestResult testResult = loadTestResult(dynaForm.getString("testResultId"));
        TestAnalyte testAnalyte = loadTestAnalyte(dynaForm.getString("testAnalyteId"));

        Test test = loadTest(testDAO, dynaForm.getString("testId"));

        testReflex.setTestResult(testResult);
        testReflex.setTestAnalyte(testAnalyte);
        testReflex.setTest(test);
        testReflex.setAddedTest(reflexTest);
        testReflex.setActionScriptlet(reflexScriptlet);
    }

    private Test loadTest(TestDAO testDAO, String id) {
        if (GenericValidator.isBlankOrNull(id)) {
            return null;
        }

        Test test = new Test();

        test.setId(id);
        testDAO.getData(test);
        return test;
    }

    private Scriptlet loadScriptlet(ScriptletDAO scriptletDAO, String id) {
        if (GenericValidator.isBlankOrNull(id)) {
            return null;
        }

        Scriptlet scriptlet = new Scriptlet();

        scriptlet.setId(id);
        scriptletDAO.getData(scriptlet);
        return scriptlet;
    }

    private TestResult loadTestResult(String testResultId) {
        TestResult testResult = new TestResult();
        TestResultDAO testResultDAO = new TestResultDAOImpl();

        testResult.setId(testResultId);
        testResultDAO.getData(testResult);

        return testResult;
    }

    private TestAnalyte loadTestAnalyte(String testAnalyteId) {
        TestAnalyteDAO teatAnalyteDAO = new TestAnalyteDAOImpl();
        TestAnalyte testAnalyte = new TestAnalyte();

        testAnalyte.setId(testAnalyteId);

        return teatAnalyteDAO.getData(testAnalyte);
    }

    protected String getPageTitleKey() {
        return isNew ? "testreflex.add.title" : "testreflex.edit.title";
    }

    protected String getPageSubtitleKey() {
        return isNew ? "testreflex.add.title" : "testreflex.edit.title";
    }

    protected ActionMessages validateAll(HttpServletRequest request, ActionMessages errors, BaseActionForm dynaForm)
            throws Exception {
        TestDAO testDAO = new TestDAOImpl();
        TestAnalyteDAO testAnalyteDAO = new TestAnalyteDAOImpl();
        TestResultDAO testResultDAO = new TestResultDAOImpl();

        String testResultSelected = (String) dynaForm.get("testResultId");
        validateTestResultExists(errors, testResultDAO, testResultSelected);

        String testAnalyteSelected = (String) dynaForm.get("testAnalyteId");
        validateTestAnalyteExists(errors, testAnalyteDAO, testAnalyteSelected);

        String testSelected = (String) dynaForm.get("testId");
        validateTestExists(errors, testDAO, testSelected, "testreflex.testId");

        String addedTestSelected = (String) dynaForm.get("addedTestId");
        validateTestExists(errors, testDAO, addedTestSelected, "testreflex.addedTestId");

        if (useSecondTest) {
            testResultSelected = (String) dynaForm.get("secondTestResultId");
            validateTestResultExists(errors, testResultDAO, testResultSelected);

            testAnalyteSelected = (String) dynaForm.get("secondTestAnalyteId");
            validateTestAnalyteExists(errors, testAnalyteDAO, testAnalyteSelected);

            testSelected = (String) dynaForm.get("secondTestId");
            validateTestExists(errors, testDAO, testSelected, "testreflex.testId");
        }

        return errors;
    }

    private void validateTestExists(ActionMessages errors, TestDAO testDAO, String testSelected, String errorMsgKey)
            throws Exception {
        if (!StringUtil.isNullorNill(testSelected)) {
            Test test = new Test();
            test.setId(testSelected);
            test = testDAO.getTestById(test);

            if (test == null) {
                ActionError error = new ActionError("errors.invalid", getMessageForKey(errorMsgKey), null);
                errors.add(ActionMessages.GLOBAL_MESSAGE, error);
            }
        }
    }

    private void validateTestAnalyteExists(ActionMessages errors, TestAnalyteDAO testAnalyteDAO,
            String testAnalyteSelected) throws Exception {
        if (!StringUtil.isNullorNill(testAnalyteSelected)) {
            TestAnalyte testAnalyte = new TestAnalyte();

            testAnalyte.setId(testAnalyteSelected);
            testAnalyte = testAnalyteDAO.getTestAnalyteById(testAnalyte);

            if (testAnalyte == null) {
                ActionError error = new ActionError("errors.invalid", getMessageForKey("testreflex.testAnalyteId"),
                        null);
                errors.add(ActionMessages.GLOBAL_MESSAGE, error);
            }
        }
    }

    private void validateTestResultExists(ActionMessages errors, TestResultDAO testResultDAO,
            String testResultSelected) throws Exception {
        if (!StringUtil.isNullorNill(testResultSelected)) {
            TestResult testResult = new TestResult();

            testResult.setId(testResultSelected);
            testResult = testResultDAO.getTestResultById(testResult);

            if (testResult == null) {
                ActionError error = new ActionError("errors.invalid", getMessageForKey("testreflex.testResultId"),
                        null);
                errors.add(ActionMessages.GLOBAL_MESSAGE, error);
            }
        }
    }

}