us.mn.state.health.lims.testanalyte.daoimpl.TestAnalyteTestResultDAOImpl.java Source code

Java tutorial

Introduction

Here is the source code for us.mn.state.health.lims.testanalyte.daoimpl.TestAnalyteTestResultDAOImpl.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.testanalyte.daoimpl;

import java.util.ArrayList;
import java.util.Hashtable;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
import java.util.Vector;

import org.apache.commons.beanutils.PropertyUtils;
import org.hibernate.Session;
import org.hibernate.Transaction;

import us.mn.state.health.lims.common.daoimpl.BaseDAOImpl;
import us.mn.state.health.lims.common.exception.LIMSRuntimeException;
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.log.LogEvent;
import us.mn.state.health.lims.test.valueholder.Test;
import us.mn.state.health.lims.testanalyte.dao.TestAnalyteTestResultDAO;
import us.mn.state.health.lims.testanalyte.valueholder.TestAnalyte;
import us.mn.state.health.lims.testresult.valueholder.TestResult;
import us.mn.state.health.lims.hibernate.HibernateUtil;

/**
 * @author diane benz
 */
/**
 * @author diane benz
 */
public class TestAnalyteTestResultDAOImpl extends BaseDAOImpl implements TestAnalyteTestResultDAO {

    /*
     * (non-Javadoc)
     * 
     * @see us.mn.state.health.lims.testanalyte.dao.TestAnalyteTestResultDAO#insertData(us.mn.state.health.lims.test.valueholder.Test,
     *      java.util.List, java.util.List) TODO: test this
     */
    public boolean insertData(Test test, List testAnalytes, List testResults) throws LIMSRuntimeException {
        Transaction tx = null;
        Session session = null;

        try {
            session = HibernateUtil.getSession();
            tx = session.beginTransaction();

            long maxNum = getMaximumResultGroupForTest(test);
            for (int i = 0; i < testAnalytes.size(); i++) {

                // Test Analyte
                // adjust resultGroup number depending on maximum existing rg
                // for test
                TestAnalyte ta = (TestAnalyte) testAnalytes.get(i);
                int rg = Integer.parseInt(ta.getResultGroup());
                ta.setResultGroup(String.valueOf(rg + maxNum));

                session.save(ta);
                session.flush();
                session.clear();

            }
            for (int j = 0; j < testResults.size(); j++) {
                // Test Result table
                // adjust resultGroup number depending on maximum existing rg
                // for test
                TestResult tr = (TestResult) testResults.get(j);
                int rg = Integer.parseInt(tr.getResultGroup());
                tr.setResultGroup(String.valueOf(rg + maxNum));

                session.save(tr);
                session.flush();
                session.clear();
            }

            tx.commit();

        } catch (Exception e) {
            //bugzilla 2154
            LogEvent.logError("TestAnalyteTestResultDAOImpl", "insertData()", e.toString());
            if (tx != null)
                tx.rollback();
            throw new LIMSRuntimeException("Error in TestAnalyteTestResult insertData()", e);
        }
        return true;
    }

    /*
     * (non-Javadoc)
     * 
     * @see us.mn.state.health.lims.testanalyte.dao.TestAnalyteTestResultDAO#updateData(us.mn.state.health.lims.test.valueholder.Test,
     *      java.util.List, java.util.List, java.util.List, java.util.List)
     */
    public void updateData(Test test, List allOldTestAnalytes, List allOldTestResults, List allNewTestAnalytes,
            List allNewTestResults) throws LIMSRuntimeException {

        Transaction tx = null;
        Session session = null;

        try {
            session = HibernateUtil.getSession();
            tx = session.beginTransaction();

            // this stores all testResult Ids (test results can be shared
            // amongst components)
            Hashtable allOldTestResultsForTest = new Hashtable();
            Hashtable allNewTestResultsForTest = new Hashtable();

            // load hashtables
            if (allNewTestResults != null) {
                for (int j = 0; j < allNewTestResults.size(); j++) {
                    TestResult tr = (TestResult) allNewTestResults.get(j);
                    if (!StringUtil.isNullorNill(tr.getId())) {
                        allNewTestResultsForTest.put(tr.getId(), tr);
                    }
                }
            }

            if ((allOldTestResults != null) && (allOldTestResults.size() > 0)) {

                for (int j = 0; j < allOldTestResults.size(); j++) {
                    TestResult tr = (TestResult) allOldTestResults.get(j);
                    allOldTestResultsForTest.put(tr.getId(), tr);
                }

            }

            // Get a List of allNewTrIds (all new test result Ids) from
            // Hashtable allNewTestResultsForTest
            // Note : this does not include new ones that don't have an id yet!!
            Set allNewTrIdsSet = (Set) allNewTestResultsForTest.keySet();
            Iterator allNewTrIdsIt = allNewTrIdsSet.iterator();
            List allNewTrIds = new ArrayList();

            while (allNewTrIdsIt.hasNext()) {
                allNewTrIds.add(allNewTrIdsIt.next());
            }

            // Get a List of allOldTrIds (all old test result Ids) from
            // Hashtable allOldTestResultsForTest
            Set allOldTrIdsSet = (Set) allOldTestResultsForTest.keySet();
            Iterator allOldTrIdsIt = allOldTrIdsSet.iterator();
            List allOldTrIds = new ArrayList();

            while (allOldTrIdsIt.hasNext()) {
                allOldTrIds.add(allOldTrIdsIt.next());
            }

            // Loop through all new test analytes
            for (int i = 0; i < allNewTestAnalytes.size(); i++) {
                TestAnalyte testAnalyte = (TestAnalyte) allNewTestAnalytes.get(i);
                List testResults = new ArrayList();
                List oldTestResults = new ArrayList();
                TestAnalyte testAnalyteClone;
                //bug#1342
                String analyteType;

                if (!StringUtil.isNullorNill(testAnalyte.getId())) {
                    // UPDATE
                    testAnalyteClone = readTestAnalyte(testAnalyte.getId());
                    oldTestResults = testAnalyteClone.getTestResults();

                    //bug#1342 recover old test analyte type (R/N) as this is not submitted
                    //correctly when select is disabled and User re-sorts
                    analyteType = testAnalyteClone.getTestAnalyteType();
                    PropertyUtils.copyProperties(testAnalyteClone, testAnalyte);

                    //bug#1342 recover old test analyte type (R/N) as this is not submitted
                    //correctly when select is disabled and User resorts
                    if (testAnalyte.getTestAnalyteType() == null) {
                        testAnalyteClone.setTestAnalyteType(analyteType);
                    }
                    // list of testResults
                    testResults = testAnalyteClone.getTestResults();

                    session.merge(testAnalyteClone);
                    session.flush();
                    session.clear();

                } else {
                    // INSERT
                    testAnalyte.setId(null);

                    // list of testResults
                    testResults = testAnalyte.getTestResults();

                    session.save(testAnalyte);
                    session.flush();
                    session.clear();

                }

                List newIds = new ArrayList();
                List oldIds = new ArrayList();

                if (testResults != null) {
                    for (int j = 0; j < testResults.size(); j++) {
                        TestResult tr = (TestResult) testResults.get(j);
                        newIds.add(tr.getId());
                    }
                }

                if ((oldTestResults != null) && (oldTestResults.size() > 0)) {
                    List listOfOldOnesToRemove = new ArrayList();
                    for (int j = 0; j < oldTestResults.size(); j++) {
                        TestResult tr = (TestResult) oldTestResults.get(j);
                        oldIds.add(tr.getId());
                        if (!newIds.contains(tr.getId())) {
                            // remove ones that are to be deleted
                            listOfOldOnesToRemove.add(new Integer(j));
                        }
                    }

                    int decreaseOTRIndexBy = 0;
                    int decreaseOIIndexBy = 0;
                    for (int j = 0; j < listOfOldOnesToRemove.size(); j++) {
                        oldTestResults
                                .remove(((Integer) listOfOldOnesToRemove.get(j)).intValue() - decreaseOTRIndexBy++);
                        oldIds.remove(((Integer) listOfOldOnesToRemove.get(j)).intValue() - decreaseOIIndexBy++);

                    }
                }

                //Loop through new testResults for this particular testAnalyte
                if (testResults != null) {
                    for (int j = 0; j < testResults.size(); j++) {
                        TestResult teRe = (TestResult) testResults.get(j);

                        int index = oldIds.indexOf(teRe.getId());

                        if (!StringUtil.isNullorNill(teRe.getId())
                                && allOldTestResultsForTest.containsKey(teRe.getId())) {
                            //UPDATE
                            TestResult testResultClone = readTestResult(teRe.getId());
                            PropertyUtils.copyProperties(testResultClone, teRe);
                            if (index >= 0) {
                                oldTestResults.set(index, testResultClone);
                            } else {
                                oldTestResults.add(testResultClone);
                            }
                            session.merge(teRe);
                            session.flush();
                            session.clear();

                        } else {
                            //INSERT
                            oldTestResults.add(teRe);
                            session.save(teRe);
                            session.flush();
                            session.clear();
                        }

                    }

                }

                // remove test analytes from total list which holds all test analytes to be deleted (this is not a
                // candidate for delete because it is amongst the new test
                // analytes list!)
                if (allOldTestAnalytes != null) {
                    for (int x = 0; x < allOldTestAnalytes.size(); x++) {
                        TestAnalyte ta = (TestAnalyte) allOldTestAnalytes.get(x);
                        if (ta.getId().equals(testAnalyte.getId())) {
                            allOldTestAnalytes.remove(x);
                            break;
                        }
                    }
                }
            }

            // BEGIN OF DELETE

            // Delete any left-over old test analytes
            if ((allOldTestAnalytes != null) && (allOldTestAnalytes.size() > 0)) {
                for (int i = 0; i < allOldTestAnalytes.size(); i++) {
                    TestAnalyte testAnalyte = (TestAnalyte) allOldTestAnalytes.get(i);

                    session.delete(testAnalyte);
                    session.flush();
                    session.clear();
                }
            }

            // Delete any left-over old test results
            if ((allOldTrIds != null) && (allOldTrIds.size() > 0)) {
                for (int i = 0; i < allOldTrIds.size(); i++) {
                    if (!allNewTrIds.contains(allOldTrIds.get(i))) {
                        TestResult testResult = (TestResult) allOldTestResultsForTest.get(allOldTrIds.get(i));

                        session.delete(testResult);
                        session.flush();
                        session.clear();
                    }
                }
            }
            // END OF DELETE

            tx.commit();

        } catch (Exception e) {
            //bugzilla 2154
            LogEvent.logError("TestAnalyteTestResultDAOImpl", "updateData()", e.toString());
            if (tx != null)
                tx.rollback();
            throw new LIMSRuntimeException("Error in TestAnalyteTestResult updateData()", e);
        }
    }

    /*
     * (non-Javadoc)
     * 
     * @see us.mn.state.health.lims.testanalyte.dao.TestAnalyteTestResultDAO#getAllTestAnalyteTestResultsPerTest(us.mn.state.health.lims.test.valueholder.Test)
     */
    public List getAllTestAnalyteTestResultsPerTest(Test test) throws LIMSRuntimeException {
        Transaction tx = null;
        Session session = null;

        List list = new Vector();
        try {
            session = HibernateUtil.getSession();
            tx = session.beginTransaction();

            String testId = test.getId();
            String sql = "from TestAnalyteTestResult t where t.testId = :param order by t.testAnalyteId, t.testResultId";
            org.hibernate.Query query = session.createQuery(sql);
            query.setParameter("param", testId);

            list = query.list();
            session.flush();
            session.clear();

        } catch (Exception e) {
            //bugzilla 2154
            LogEvent.logError("TestAnalyteTestResultDAOImpl", "getAllTestAnalyteTestResultsPerTest()",
                    e.toString());
            throw new LIMSRuntimeException("Error in TestAnalyteTestResult getAllTestAnalyteTestResultsPerTest()",
                    e);
        }

        return list;
    }

    /*
     * (non-Javadoc)
     * 
     * @see us.mn.state.health.lims.testanalyte.dao.TestAnalyteTestResultDAO#getPageOfTestAnalyteTestResults(int,
     *      us.mn.state.health.lims.test.valueholder.Test)
     */
    public List getPageOfTestAnalyteTestResults(int startingRecNo, Test test) throws LIMSRuntimeException {
        Transaction tx = null;
        Session session = null;

        List testAnalyteTestResults = new ArrayList();

        String testId = "0";

        if (test != null) {
            testId = test.getId();
        }

        try {
            session = HibernateUtil.getSession();
            tx = session.beginTransaction();

            // calculate maxRow to be one more than the page size
            int endingRecNo = startingRecNo + (SystemConfiguration.getInstance().getDefaultPageSize() + 1);

            //String query;
            if (!StringUtil.isNullorNill(testId)) {
                String sql = "from TestAnalyteTestResult t where t.testId = :param";
                org.hibernate.Query query = session.createQuery(sql);
                query.setParameter("param", test.getId());

                query.setFirstResult(startingRecNo - 1);
                query.setMaxResults(endingRecNo - 1);

                testAnalyteTestResults = query.list();
                session.flush();
                session.clear();

            } else {
                String sql = "from TestAnalyteTestResult";
                org.hibernate.Query query = session.createQuery(sql);
                query.setFirstResult(startingRecNo - 1);
                query.setMaxResults(endingRecNo - 1);

                testAnalyteTestResults = query.list();
                session.flush();
            }

        } catch (Exception e) {
            //bugzilla 2154
            LogEvent.logError("TestAnalyteTestResultDAOImpl", "getPageOfTestAnalyteTestResults()", e.toString());
            throw new LIMSRuntimeException("Error in TestAnalyteTestResult getPageOfTestAnalyteTestResults()", e);
        }

        return testAnalyteTestResults;
    }

    /**
     * @param idString
     * @return
     */
    public TestAnalyte readTestAnalyte(String idString) {
        Transaction tx = null;
        Session session = null;

        TestAnalyte ta = null;
        try {
            session = HibernateUtil.getSession();
            tx = session.beginTransaction();

            ta = (TestAnalyte) session.get(TestAnalyte.class, idString);
            session.flush();
            session.clear();

        } catch (Exception e) {
            //bugzilla 2154
            LogEvent.logError("TestAnalyteTestResultDAOImpl", "readTestAnalyte()", e.toString());
            throw new LIMSRuntimeException("Error in TestAnalyte readTestAnalyte()", e);
        }

        return ta;
    }

    /**
     * @param idString
     * @return
     */
    public TestResult readTestResult(String idString) {
        Transaction tx = null;
        Session session = null;

        TestResult tr = null;
        try {
            session = HibernateUtil.getSession();
            tx = session.beginTransaction();

            tr = (TestResult) session.get(TestResult.class, idString);
            session.flush();
            session.clear();

        } catch (Exception e) {
            //bugzilla 2154
            LogEvent.logError("TestAnalyteTestResultDAOImpl", "readTestResult()", e.toString());
            throw new LIMSRuntimeException("Error in TestResult readTestResult()", e);
        }

        return tr;
    }

    // NOT USED CURRENTLY
    /*
     * (non-Javadoc)
     * 
     * @see us.mn.state.health.lims.testanalyte.dao.TestAnalyteTestResultDAO#getNextTestAnalyteTestResultRecord(java.lang.String)
     */
    public List getNextTestAnalyteTestResultRecord(String id) throws LIMSRuntimeException {

        return getNextRecord(id, "Analyte", TestAnalyte.class);

    }

    // NOT USED CURRENTLY
    /*
     * (non-Javadoc)
     * 
     * @see us.mn.state.health.lims.testanalyte.dao.TestAnalyteTestResultDAO#getPreviousTestAnalyteTestResultRecord(java.lang.String)
     */
    public List getPreviousTestAnalyteTestResultRecord(String id) throws LIMSRuntimeException {

        return getPreviousRecord(id, "Analyte", TestAnalyte.class);
    }

    /**
     * @param uow
     * @param test
     * @return
     */
    private long getMaximumResultGroupForTest(Test test) {
        Transaction tx = null;
        Session session = null;

        long maxNumber = 0;
        try {
            session = HibernateUtil.getSession();
            tx = session.beginTransaction();

            String sql = "from TestAnalyte t where t.test = :param order by t.resultGroup desc";
            org.hibernate.Query query = session.createQuery(sql);
            query.setParameter("param", test.getId());

            List list = query.list();
            session.flush();
            session.clear();

            TestAnalyte ta = null;
            if (list.size() > 0) {
                ta = (TestAnalyte) list.get(0);
                if ((ta.getResultGroup() != null) && (ta.getResultGroup().length() > 0))
                    maxNumber = Long.parseLong(ta.getResultGroup());
            }
        } catch (Exception e) {
            //bugzilla 2154
            LogEvent.logError("TestAnalyteTestResultDAOImpl", "getMaximumResultGroupForTest()", e.toString());
            throw new LIMSRuntimeException("Error in long getMaximumResultGroupForTest(test)", e);
        }

        return maxNumber;
    }
}