/* * 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 us.mn.state.health.lims.common.util.ConfigurationProperties; import us.mn.state.health.lims.common.util.LocaleChangeListener; import us.mn.state.health.lims.common.util.SystemConfiguration; import us.mn.state.health.lims.localization.valueholder.Localization; import us.mn.state.health.lims.panel.daoimpl.PanelDAOImpl; import us.mn.state.health.lims.panel.valueholder.Panel; import us.mn.state.health.lims.panelitem.daoimpl.PanelItemDAOImpl; import us.mn.state.health.lims.panelitem.valueholder.PanelItem; import us.mn.state.health.lims.test.beanItems.TestResultItem; import us.mn.state.health.lims.test.beanItems.TestResultItem.ResultDisplayType; 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.test.valueholder.TestSection; 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.typeofsample.dao.TypeOfSampleDAO; import us.mn.state.health.lims.typeofsample.daoimpl.TypeOfSampleDAOImpl; import us.mn.state.health.lims.typeofsample.daoimpl.TypeOfSampleTestDAOImpl; import us.mn.state.health.lims.typeofsample.valueholder.TypeOfSample; import us.mn.state.health.lims.typeofsample.valueholder.TypeOfSampleTest; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; /** */ public class TestService implements LocaleChangeListener{ public static final String HIV_TYPE = "HIV_TEST_KIT"; public static final String SYPHILIS_TYPE = "SYPHILIS_TEST_KIT"; private static final TestService INSTANCE = new TestService( new Test() ); private static final TypeOfSampleTestDAOImpl TYPE_OF_SAMPLE_TEST_DAO = new TypeOfSampleTestDAOImpl(); private static String VARIABLE_TYPE_OF_SAMPLE_ID; private static String LANGUAGE_LOCALE = ConfigurationProperties.getInstance().getPropertyValue( ConfigurationProperties.Property.DEFAULT_LANG_LOCALE); private static final TestResultDAO TEST_RESULT_DAO = new TestResultDAOImpl(); private static final TestDAO TEST_DAO = new TestDAOImpl(); private static final TypeOfSampleDAO TYPE_OF_SAMPLE_DAO = new TypeOfSampleDAOImpl(); private final Test test; private static Map<Entity, Map<String, String>> entityToMap; public static List<Test> getTestsInTestSectionById(String testSectionId) { return new TestDAOImpl().getTestsByTestSectionId(testSectionId); } public enum Entity{ TEST_NAME, TEST_AUGMENTED_NAME, TEST_REPORTING_NAME } static{ TypeOfSample variableTypeOfSample = new TypeOfSampleDAOImpl().getTypeOfSampleByLocalAbbrevAndDomain( "Variable", "H" ); VARIABLE_TYPE_OF_SAMPLE_ID = variableTypeOfSample == null ? "-1" : variableTypeOfSample.getId(); entityToMap = new HashMap<Entity, Map<String, String>>(); entityToMap.put( Entity.TEST_NAME, createTestIdToNameMap() ); entityToMap.put(Entity.TEST_AUGMENTED_NAME, createTestIdToAugmentedNameMap()); entityToMap.put(Entity.TEST_REPORTING_NAME, createTestIdToReportingNameMap()); SystemConfiguration.getInstance().addLocalChangeListener( INSTANCE ); } @Override public void localeChanged( String locale ){ LANGUAGE_LOCALE = locale; refreshTestNames(); } public static void refreshTestNames(){ entityToMap.put( Entity.TEST_NAME, createTestIdToNameMap() ); entityToMap.put(Entity.TEST_AUGMENTED_NAME, createTestIdToAugmentedNameMap()); entityToMap.put(Entity.TEST_REPORTING_NAME, createTestIdToReportingNameMap()); } public TestService(Test test){ this.test = test; } public TestService(String testId){ this.test = TEST_DAO.getTestById( testId ); } public Test getTest(){ return test; } public String getTestMethodName(){ return (test != null && test.getMethod() != null) ? test.getMethod().getMethodName() : null; } public boolean isActive(){ return test == null ? false : test.isActive(); } @SuppressWarnings("unchecked") public List<TestResult> getPossibleTestResults( ) { return TEST_RESULT_DAO.getAllActiveTestResultsPerTest( test ); } public String getUOM(boolean isCD4Conclusion){ if (!isCD4Conclusion) { if (test != null && test.getUnitOfMeasure() != null) { return test.getUnitOfMeasure().getName(); } } return ""; } public boolean isReportable(){ return test != null && "Y".equals( test.getIsReportable() ); } public String getSortOrder(){ return test == null ? "0" :test.getSortOrder(); } public ResultDisplayType getDisplayTypeForTestMethod() { String methodName = getTestMethodName(); if (HIV_TYPE.equals(methodName)) { return ResultDisplayType.HIV; } else if (SYPHILIS_TYPE.equals(methodName)) { return ResultDisplayType.SYPHILIS; } return TestResultItem.ResultDisplayType.TEXT; } public String getResultType(){ String testResultType = TypeOfTestResultService.ResultType.NUMERIC.getCharacterValue(); List<TestResult> testResults = getPossibleTestResults(); if (testResults != null && !testResults.isEmpty()) { testResultType = testResults.get(0).getTestResultType(); } return testResultType; } public TypeOfSample getTypeOfSample(){ if( test == null){ return null; } TypeOfSampleTest typeOfSampleTest = TYPE_OF_SAMPLE_TEST_DAO.getTypeOfSampleTestForTest(test.getId()); if( typeOfSampleTest == null){ return null; } String typeOfSampleId = typeOfSampleTest.getTypeOfSampleId(); return TYPE_OF_SAMPLE_DAO.getTypeOfSampleById( typeOfSampleId ); } public List<Panel> getPanels(){ List<Panel> panelList = new ArrayList<Panel>(); if( test != null){ List<PanelItem> panelItemList = new PanelItemDAOImpl().getPanelItemByTestId(test.getId()); for( PanelItem panelItem : panelItemList){ panelList.add(panelItem.getPanel()); } } return panelList; } public List<Panel> getAllPanels(){ return new PanelDAOImpl().getAllPanels(); } public TestSection getTestSection(){ return test == null ? null : test.getTestSection(); } public String getTestSectionName(){ return TestSectionService.getUserLocalizedTesSectionName(getTestSection()); } public static List<Test> getAllActiveTests(){ return TEST_DAO.getAllActiveTests(false); } public static Map<String, String> getMap( Entity entiy){ return entityToMap.get(entiy); } public static String getUserLocalizedTestName( Test test ){ if( test == null){ return ""; } return getUserLocalizedTestName( test.getId() ); } public static String getUserLocalizedReportingTestName( String testId ){ String name = entityToMap.get(Entity.TEST_REPORTING_NAME).get( testId ); return name == null ? "" : name; } public static String getUserLocalizedReportingTestName( Test test ){ if( test == null){ return ""; } return getUserLocalizedReportingTestName( test.getId() ); } public static String getUserLocalizedTestName( String testId ){ String name = entityToMap.get(Entity.TEST_NAME).get( testId ); return name == null ? "" : name; } /** * Returns the test name augmented with the sample type IF ConfigurationProperties.Property.TEST_NAME_AUGMENTED * is true. If it is not true just the test name will be returned. The test name will be correct for the current locale * @param test The test for which we want the name * @return The test name or the augmented test name */ public static String getLocalizedTestNameWithType( Test test ){ if( test == null){ return ""; } return getLocalizedTestNameWithType( test.getId() ); } /** * Returns the test name augmented with the sample type IF ConfigurationProperties.Property.TEST_NAME_AUGMENTED * is true. If it is not true just the test name will be returned. The test name will be correct for the current locale * @param testId The test id of the test for which we want the name * @return The test name or the augmented test name */ public static String getLocalizedTestNameWithType( String testId ){ String description = entityToMap.get(Entity.TEST_AUGMENTED_NAME ).get( testId ); return description == null ? "" : description; } private static Map<String, String> createTestIdToNameMap() { Map<String, String> testIdToNameMap = new HashMap<String, String>(); List<Test> tests = new TestDAOImpl().getAllTests(false); for (Test test : tests) { testIdToNameMap.put(test.getId(), buildTestName( test ).replace("\n", " ")); } return testIdToNameMap; } private static String buildTestName( Test test ){ Localization localization = test.getLocalizedTestName(); if( LANGUAGE_LOCALE.equals( ConfigurationProperties.LOCALE.FRENCH.getRepresentation() )){ return localization.getFrench(); }else{ return localization.getEnglish(); } } private static Map<String, String> createTestIdToAugmentedNameMap() { Map<String, String> testIdToNameMap = new HashMap<String, String>(); List<Test> tests = new TestDAOImpl().getAllTests(false); for (Test test : tests) { testIdToNameMap.put(test.getId(), buildAugmentedTestName( test ).replace( "\n", " " )); } return testIdToNameMap; } private static Map<String, String> createTestIdToReportingNameMap(){ Map<String, String> testIdToNameMap = new HashMap<String, String>(); List<Test> tests = new TestDAOImpl().getAllActiveTests(false); for (Test test : tests) { testIdToNameMap.put(test.getId(), buildReportingTestName( test ) ); } return testIdToNameMap; } private static String buildReportingTestName( Test test ){ Localization localization = test.getLocalizedReportingName(); if( LANGUAGE_LOCALE.equals( ConfigurationProperties.LOCALE.FRENCH.getRepresentation() )){ return localization.getFrench(); }else{ return localization.getEnglish(); } } private static String buildAugmentedTestName( Test test ){ Localization localization = test.getLocalizedTestName(); String sampleName = ""; if( ConfigurationProperties.getInstance().isPropertyValueEqual( ConfigurationProperties.Property.TEST_NAME_AUGMENTED, "true" )){ TypeOfSample typeOfSample = new TestService( test ).getTypeOfSample(); if( typeOfSample != null && !typeOfSample.getId().equals( VARIABLE_TYPE_OF_SAMPLE_ID ) ){ sampleName = "(" + typeOfSample.getLocalizedName() + ")"; } } if( LANGUAGE_LOCALE.equals( ConfigurationProperties.LOCALE.FRENCH.getRepresentation() )){ return localization.getFrench() + sampleName; }else{ return localization.getEnglish() + sampleName; } } }