us.mn.state.health.lims.common.services.ResultSaveService.java Source code

Java tutorial

Introduction

Here is the source code for us.mn.state.health.lims.common.services.ResultSaveService.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) ITECH, University of Washington, Seattle WA.  All Rights Reserved.
 */

package us.mn.state.health.lims.common.services;

import org.apache.commons.validator.GenericValidator;
import org.json.simple.JSONObject;
import org.json.simple.parser.JSONParser;
import org.json.simple.parser.ParseException;
import us.mn.state.health.lims.analysis.valueholder.Analysis;
import us.mn.state.health.lims.common.services.serviceBeans.ResultSaveBean;
import us.mn.state.health.lims.common.util.StringUtil;
import us.mn.state.health.lims.referral.dao.ReferralResultDAO;
import us.mn.state.health.lims.referral.daoimpl.ReferralResultDAOImpl;
import us.mn.state.health.lims.referral.valueholder.ReferralResult;
import us.mn.state.health.lims.result.action.util.ResultUtil;
import us.mn.state.health.lims.result.dao.ResultDAO;
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.ResultSignatureDAOImpl;
import us.mn.state.health.lims.result.valueholder.Result;
import us.mn.state.health.lims.result.valueholder.ResultSignature;
import us.mn.state.health.lims.testanalyte.valueholder.TestAnalyte;
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;
import us.mn.state.health.lims.typeoftestresult.valueholder.TypeOfTestResult.ResultType;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

public class ResultSaveService {
    private static final ResultDAO resultDAO = new ResultDAOImpl();
    private static final TestResultDAO testResultDAO = new TestResultDAOImpl();
    private static final ResultSignatureDAO resultSigDAO = new ResultSignatureDAOImpl();
    private static final ReferralResultDAO referralResultDAO = new ReferralResultDAOImpl();

    private final Analysis analysis;
    private final String currentUserId;
    private boolean updatedResult = false;

    public ResultSaveService(Analysis analysis, String currentUserId) {
        this.analysis = analysis;
        this.currentUserId = currentUserId;
    }

    public List<Result> createResultsFromTestResultItem(ResultSaveBean serviceBean, List<Result> deletableResults) {
        List<Result> results = new ArrayList<Result>();
        boolean isQualifiedResult = serviceBean.isHasQualifiedResult();

        if (ResultType.MULTISELECT.matches(serviceBean.getResultType())
                || ResultType.CASCADING_MULTISELECT.matches(serviceBean.getResultType())) {

            if (!GenericValidator.isBlankOrNull(serviceBean.getMultiSelectResultValues())) {
                JSONParser parser = new JSONParser();
                try {
                    JSONObject jsonResult = (JSONObject) parser.parse(serviceBean.getMultiSelectResultValues());

                    List<Result> existingResults = resultDAO.getResultsByAnalysis(analysis);
                    for (Object key : jsonResult.keySet()) {
                        getResultsForMultiSelect(results, existingResults, serviceBean, (String) key,
                                (String) jsonResult.get(key), isQualifiedResult);
                    }
                    deletableResults.addAll(existingResults);
                } catch (ParseException e) {
                    e.printStackTrace();
                }
            }

        } else {
            Result result = new Result();
            Result qualifiedResult = null;

            boolean newResult = GenericValidator.isBlankOrNull(serviceBean.getResultId());

            if (!newResult) {
                result.setId(serviceBean.getResultId());
                resultDAO.getData(result);

                if (!GenericValidator.isBlankOrNull(serviceBean.getQualifiedResultId())) {
                    qualifiedResult = new Result();
                    qualifiedResult.setId(serviceBean.getQualifiedResultId());
                    resultDAO.getData(qualifiedResult);
                } else if (isQualifiedResult) {
                    qualifiedResult = getQuantifiedResult(serviceBean, result);
                }
            }

            if (ResultType.DICTIONARY.matches(serviceBean.getResultType()) || isQualifiedResult) {
                setTestResultsForDictionaryResult(serviceBean.getTestId(), serviceBean.getResultValue(), result); //support qualified result
            } else {
                List<TestResult> testResultList = testResultDAO.getActiveTestResultsByTest(serviceBean.getTestId());
                // we are assuming there is only one testResult for a numeric
                // type result
                if (!testResultList.isEmpty()) {
                    result.setTestResult(testResultList.get(0));
                }
            }

            if (newResult) {
                setNewResultValues(serviceBean, result);
                if (isQualifiedResult) {
                    qualifiedResult = getQuantifiedResult(serviceBean, result);
                }
            }

            setAnalyteForResult(result);
            setStandardResultValues(serviceBean.getResultValue(), result);
            results.add(result);

            if (isQualifiedResult) {
                setStandardResultValues(serviceBean.getQualifiedResultValue(), qualifiedResult);
                results.add(qualifiedResult);
            } else if (qualifiedResult != null) { // covers the case where user
                // made change from qualified to
                // non-qualified
                setStandardResultValues("", qualifiedResult);
                results.add(qualifiedResult);
            }
        }

        Collections.sort(deletableResults, new Comparator<Result>() {
            @Override
            public int compare(Result o1, Result o2) {
                return (o1.getParentResult() != null && o2.getId().equals(o1.getParentResult().getId())) ? -1 : 0;
            }
        });

        if (!deletableResults.isEmpty()) {
            updatedResult = true;
        }
        return results;
    }

    private void getResultsForMultiSelect(List<Result> results, List<Result> existingResults,
            ResultSaveBean serviceBean, String key, String value, boolean isQualifiedResult) {
        int groupingKey = Integer.parseInt(key);
        String[] multiResults = value.split(",");

        /*
        We will go through all of selections made by the user and compare them to the selections
        already in the DB.  If a match is found then it will be removed from the DB list and
        we will go on to the next selection made by the user.  If
        a match is not found then a new result will be created.
         */
        for (String resultAsString : multiResults) {
            Result existingResultFromDB = null;
            for (Result existingResult : existingResults) {
                if (resultAsString.equals(existingResult.getValue())
                        && existingResult.getGrouping() == groupingKey) {
                    existingResultFromDB = existingResult;
                    break;
                }
            }

            if (existingResultFromDB != null) {
                existingResults.remove(existingResultFromDB);
                continue;
            }

            Result result = new Result();

            setTestResultsForDictionaryResult(serviceBean.getTestId(), resultAsString, result);
            setNewResultValues(serviceBean, result);
            setAnalyteForResult(result);
            setStandardResultValues(resultAsString, result);
            result.setSortOrder(getResultSortOrder(result.getValue()));
            result.setGrouping(groupingKey);

            results.add(result);
        }

        /*
        A quantifiable result may or may not be in the DB
         */
        if (isQualifiedResult) {
            //cases that it is in DB
            if (!existingResults.isEmpty() && serviceBean.getQualifiedResultId() != null) {
                List<Result> removableResults = new ArrayList<Result>();
                for (Result existingResult : existingResults) {
                    if (serviceBean.getQualifiedResultId().equals(existingResult.getId())) {
                        removableResults.add(existingResult);
                        setStandardResultValues(serviceBean.getQualifiedResultValue(), existingResult);
                        results.add(existingResult);
                    }
                }
                existingResults.removeAll(removableResults);
                //case this is a new quantified result
            } else {
                String[] quantifiableResults = serviceBean.getQualifiedDictionaryId()
                        .substring(1, serviceBean.getQualifiedDictionaryId().length() - 1).split(",");
                for (String quantifiableResultId : quantifiableResults) {
                    for (Result selectedResult : results) {
                        if (selectedResult.getValue().equals(quantifiableResultId)) {
                            Result quantifiedResult = getQuantifiedResult(serviceBean, selectedResult);
                            setStandardResultValues(serviceBean.getQualifiedResultValue(), quantifiedResult);
                            results.add(quantifiedResult);
                            break;
                        }
                    }
                }

            }
        }

        for (Result result : existingResults) {
            result.setSysUserId(currentUserId);
        }
    }

    private TestResult setTestResultsForDictionaryResult(String testId, String dictValue, Result result) {
        TestResult testResult;
        testResult = testResultDAO.getTestResultsByTestAndDictonaryResult(testId, dictValue);

        if (testResult != null) {
            result.setTestResult(testResult);
        }

        return testResult;
    }

    private void setNewResultValues(ResultSaveBean serviceBean, Result result) {
        result.setAnalysis(analysis);
        result.setAnalysisId(analysis.getId());
        result.setIsReportable(serviceBean.getReportable());
        result.setResultType(serviceBean.getResultType());
        result.setMinNormal(serviceBean.getLowerNormalRange());
        result.setMaxNormal(serviceBean.getUpperNormalRange());
        result.setSignificantDigits(serviceBean.getSignificantDigits());
    }

    private void setAnalyteForResult(Result result) {
        TestAnalyte testAnalyte = ResultUtil.getTestAnalyteForResult(result);

        if (testAnalyte != null) {
            result.setAnalyte(testAnalyte.getAnalyte());
        }
    }

    private void setStandardResultValues(String value, Result result) {
        if (!(GenericValidator.isBlankOrNull(value) || GenericValidator.isBlankOrNull(result.getValue()))
                && !StringUtil.blankIfNull(value).equals(result.getValue())) {
            updatedResult = true;
        }
        result.setValue(value);
        result.setSysUserId(currentUserId);
        result.setSortOrder("0");
    }

    private String getResultSortOrder(String resultValue) {
        TestResult testResult = testResultDAO.getTestResultsByTestAndDictonaryResult(analysis.getTest().getId(),
                resultValue);
        return testResult == null ? "0" : testResult.getSortOrder();
    }

    private Result getQuantifiedResult(ResultSaveBean serviceBean, Result parentResult) {
        Result qualifiedResult = new Result();
        setNewResultValues(serviceBean, qualifiedResult);
        setAnalyteForResult(parentResult);
        qualifiedResult.setResultType("A");
        qualifiedResult.setParentResult(parentResult);
        return qualifiedResult;
    }

    public boolean isUpdatedResult() {
        return updatedResult;
    }

    public static void removeDeletedResultsInTransaction(List<Result> deletableResults, String currentUserId) {
        for (Result result : deletableResults) {
            List<ResultSignature> signatures = resultSigDAO.getResultSignaturesByResult(result);
            List<ReferralResult> referrals = referralResultDAO.getReferralsByResultId(result.getId());

            for (ResultSignature signature : signatures) {
                signature.setSysUserId(currentUserId);
            }

            resultSigDAO.deleteData(signatures);

            for (ReferralResult referral : referrals) {
                referral.setSysUserId(currentUserId);
                referralResultDAO.deleteData(referral);
            }

            result.setSysUserId(currentUserId);
            resultDAO.deleteData(result);
        }

    }
}