/*
* 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.testconfiguration.action;
import org.apache.commons.beanutils.PropertyUtils;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.validator.DynaValidatorForm;
import us.mn.state.health.lims.common.action.BaseAction;
import us.mn.state.health.lims.common.services.DisplayListService;
import us.mn.state.health.lims.common.services.DisplayListService.ListType;
import us.mn.state.health.lims.common.services.ResultLimitService;
import us.mn.state.health.lims.common.services.TypeOfTestResultService;
import us.mn.state.health.lims.common.util.IdValuePair;
import us.mn.state.health.lims.common.util.validator.GenericValidator;
import us.mn.state.health.lims.dictionary.dao.DictionaryDAO;
import us.mn.state.health.lims.dictionary.daoimpl.DictionaryDAOImpl;
import us.mn.state.health.lims.dictionary.valueholder.Dictionary;
import us.mn.state.health.lims.testresult.daoimpl.TestResultDAOImpl;
import us.mn.state.health.lims.testresult.valueholder.TestResult;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.*;
public class TestAddAction extends BaseAction {
@Override
protected ActionForward performAction(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
((DynaValidatorForm)form).initialize(mapping);
List<IdValuePair> allSampleTypesList = new ArrayList<IdValuePair>();
allSampleTypesList.addAll(DisplayListService.getList(ListType.SAMPLE_TYPE_ACTIVE));
allSampleTypesList.addAll(DisplayListService.getList(ListType.SAMPLE_TYPE_INACTIVE));
PropertyUtils.setProperty(form, "sampleTypeList", allSampleTypesList);
PropertyUtils.setProperty(form, "panelList", DisplayListService.getList(ListType.PANELS));
PropertyUtils.setProperty(form, "resultTypeList", DisplayListService.getList(ListType.RESULT_TYPE_LOCALIZED));
PropertyUtils.setProperty(form, "uomList", DisplayListService.getList(ListType.UNIT_OF_MEASURE));
PropertyUtils.setProperty(form, "labUnitList", DisplayListService.getList(ListType.TEST_SECTION));
PropertyUtils.setProperty(form, "ageRangeList", ResultLimitService.getPredefinedAgeRanges());
PropertyUtils.setProperty(form, "dictionaryList", DisplayListService.getList(ListType.DICTIONARY_TEST_RESULTS));
PropertyUtils.setProperty(form, "groupedDictionaryList", createGroupedDictionaryList());
return mapping.findForward(FWD_SUCCESS);
}
private List<List<IdValuePair>> createGroupedDictionaryList() {
List<TestResult> testResults = getSortedTestResults();
HashSet<String> dictionaryIdGroups = getDictionaryIdGroups(testResults);
return getGroupedDictionaryPairs(dictionaryIdGroups);
}
@SuppressWarnings("unchecked")
private List<TestResult> getSortedTestResults() {
List<TestResult> testResults = new TestResultDAOImpl().getAllTestResults();
Collections.sort(testResults, new Comparator<TestResult>() {
@Override
public int compare(TestResult o1, TestResult o2) {
int result = o1.getTest().getId().compareTo(o2.getTest().getId());
if (result != 0) {
return result;
}
return GenericValidator.isBlankOrNull(o1.getSortOrder()) ? 0 :Integer.parseInt(o1.getSortOrder()) - Integer.parseInt(o2.getSortOrder());
}
});
return testResults;
}
private HashSet<String> getDictionaryIdGroups(List<TestResult> testResults) {
HashSet< String > dictionaryIdGroups = new HashSet<String>();
String currentTestId = null;
String dictionaryIdGroup = null;
for( TestResult testResult : testResults){
if(TypeOfTestResultService.ResultType.isDictionaryVariant(testResult.getTestResultType()) ){
if( testResult.getTest().getId().equals(currentTestId) ){
dictionaryIdGroup += "," + testResult.getValue();
}else{
currentTestId = testResult.getTest().getId();
if( dictionaryIdGroup != null){
dictionaryIdGroups.add(dictionaryIdGroup);
}
dictionaryIdGroup = testResult.getValue();
}
}
}
if( dictionaryIdGroup != null){
dictionaryIdGroups.add(dictionaryIdGroup);
}
return dictionaryIdGroups;
}
private List<List<IdValuePair>> getGroupedDictionaryPairs( HashSet<String> dictionaryIdGroups) {
List<List<IdValuePair>> groups = new ArrayList<List<IdValuePair>>();
DictionaryDAO dictionaryDAO = new DictionaryDAOImpl();
for( String group : dictionaryIdGroups){
List<IdValuePair> dictionaryPairs = new ArrayList<IdValuePair>();
for( String id : group.split(",")){
Dictionary dictionary = dictionaryDAO.getDictionaryById(id);
if( dictionary != null){
dictionaryPairs.add(new IdValuePair(id, dictionary.getLocalizedName()));
}
}
groups.add(dictionaryPairs);
}
Collections.sort(groups, new Comparator<List<IdValuePair>>() {
@Override
public int compare(List<IdValuePair> o1, List<IdValuePair> o2) {
return o1.size() - o2.size();
}
});
return groups;
}
@Override
protected String getPageTitleKey() {
return null;
}
@Override
protected String getPageSubtitleKey() {
return null;
}
}