/**
* 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.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import us.mn.state.health.lims.common.formfields.FormFields;
import us.mn.state.health.lims.common.formfields.FormFields.Field;
import us.mn.state.health.lims.common.services.StatusService.SampleStatus;
import us.mn.state.health.lims.common.util.DateUtil;
import us.mn.state.health.lims.observationhistory.valueholder.ObservationHistory;
import us.mn.state.health.lims.observationhistorytype.dao.ObservationHistoryTypeDAO;
import us.mn.state.health.lims.observationhistorytype.daoImpl.ObservationHistoryTypeDAOImpl;
import us.mn.state.health.lims.observationhistorytype.valueholder.ObservationHistoryType;
import us.mn.state.health.lims.panel.dao.PanelDAO;
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.dao.PanelItemDAO;
import us.mn.state.health.lims.panelitem.daoimpl.PanelItemDAOImpl;
import us.mn.state.health.lims.panelitem.valueholder.PanelItem;
import us.mn.state.health.lims.sample.valueholder.Sample;
import us.mn.state.health.lims.sampleitem.valueholder.SampleItem;
import us.mn.state.health.lims.test.valueholder.Test;
import us.mn.state.health.lims.typeofsample.dao.TypeOfSampleDAO;
import us.mn.state.health.lims.typeofsample.daoimpl.TypeOfSampleDAOImpl;
import java.util.*;
public class SampleAddService {
private final String xml;
private final String currentUserId;
private final Sample sample;
private final List<SampleTestCollection> sampleItemsTests = new ArrayList<SampleTestCollection>();
private final String receivedDate;
private final Map<String, Panel> panelIdPanelMap = new HashMap<String, Panel>();
private boolean xmlProcessed = false;
private int sampleItemIdIndex = 0;
private static final boolean USE_INITIAL_SAMPLE_CONDITION = FormFields.getInstance().useField(Field.InitialSampleCondition);
private static final boolean USE_RECEIVE_DATE_FOR_COLLECTION_DATE = !FormFields.getInstance().useField(Field.CollectionDate);
private static final String INITIAL_CONDITION_OBSERVATION_ID;
private static final TypeOfSampleDAO typeOfSampleDAO = new TypeOfSampleDAOImpl();
private static final PanelDAO panelDAO = new PanelDAOImpl();
private static final PanelItemDAO panelItemDAO = new PanelItemDAOImpl();
static{
ObservationHistoryTypeDAO ohtDAO = new ObservationHistoryTypeDAOImpl();
INITIAL_CONDITION_OBSERVATION_ID = getObservationHistoryTypeId(ohtDAO, "initialSampleCondition");
}
private static String getObservationHistoryTypeId(ObservationHistoryTypeDAO ohtDAO, String name) {
ObservationHistoryType oht;
oht = ohtDAO.getByName(name);
if (oht != null) {
return oht.getId();
}
return null;
}
public SampleAddService(String xml, String currentUserId, Sample sample, String receiveDate) {
this.xml = xml;
this.currentUserId = currentUserId;
this.sample = sample;
this.receivedDate = receiveDate;
}
public List<SampleTestCollection> createSampleTestCollection() {
xmlProcessed = true;
String collectionDateFromRecieveDate = null;
if (USE_RECEIVE_DATE_FOR_COLLECTION_DATE) {
collectionDateFromRecieveDate = receivedDate + " 00:00:00";
}
try {
Document sampleDom = DocumentHelper.parseText(xml);
for (@SuppressWarnings("rawtypes")
Iterator i = sampleDom.getRootElement().elementIterator("sample"); i.hasNext();) {
sampleItemIdIndex++;
Element sampleItem = (Element) i.next();
String testIDs = sampleItem.attributeValue("tests");
String panelIDs = sampleItem.attributeValue("panels");
Map<String, String> testIdToUserSectionMap = getTestIdToSelectionMap(sampleItem.attributeValue("testSectionMap"));
Map<String, String> testIdToSampleTypeMap = getTestIdToSelectionMap( sampleItem.attributeValue( "testSampleTypeMap" ) );
String collectionDate = sampleItem.attributeValue("date").trim();
String collectionTime = sampleItem.attributeValue("time").trim();
String collectionDateTime = null;
if (!GenericValidator.isBlankOrNull(collectionDate) && !GenericValidator.isBlankOrNull(collectionTime))
collectionDateTime = collectionDate + " " + collectionTime;
else if (!GenericValidator.isBlankOrNull(collectionDate) && GenericValidator.isBlankOrNull(collectionTime))
collectionDateTime = collectionDate + " 00:00";
augmentPanelIdToPanelMap(panelIDs);
List<ObservationHistory> initialConditionList = null;
if (USE_INITIAL_SAMPLE_CONDITION) {
initialConditionList = addInitialSampleConditions(sampleItem, initialConditionList);
}
SampleItem item = new SampleItem();
item.setSysUserId(currentUserId);
item.setSample(sample);
item.setTypeOfSample(typeOfSampleDAO.getTypeOfSampleById(sampleItem.attributeValue("sampleID")));
item.setSortOrder(Integer.toString(sampleItemIdIndex));
item.setStatusId(StatusService.getInstance().getStatusID(SampleStatus.Entered));
item.setCollector(sampleItem.attributeValue("collector"));
if (!GenericValidator.isBlankOrNull(collectionDateTime))
item.setCollectionDate(DateUtil.convertStringDateToTimestamp(collectionDateTime));
List<Test> tests = new ArrayList<Test>();
addTests(testIDs, tests);
sampleItemsTests.add(new SampleTestCollection(item, tests,
USE_RECEIVE_DATE_FOR_COLLECTION_DATE ? collectionDateFromRecieveDate : collectionDateTime,
initialConditionList, testIdToUserSectionMap, testIdToSampleTypeMap));
}
} catch (DocumentException e) {
e.printStackTrace();
}
return sampleItemsTests;
}
public Panel getPanelForTest(Test test) throws IllegalThreadStateException{
if( !xmlProcessed){
throw new IllegalThreadStateException("createSampleTestCollection must be called first");
}
List<PanelItem> panelItems = panelItemDAO.getPanelItemByTestId( test.getId());
for( PanelItem panelItem : panelItems){
Panel panel = panelIdPanelMap.get(panelItem.getPanel().getId());
if( panel != null){
return panel;
}
}
return null;
}
public void setInitialSampleItemOrderValue(int initialValue ){
sampleItemIdIndex = initialValue;
}
private Map<String, String> getTestIdToSelectionMap(String mapPairs) {
Map<String, String> sectionMap = new HashMap<String, String>();
String[] maps = mapPairs.split(",");
for (String map : maps) {
String[] mapping = map.split(":");
if (mapping.length == 2) {
sectionMap.put(mapping[0].trim(), mapping[1].trim());
}
}
return sectionMap;
}
private void augmentPanelIdToPanelMap(String panelIDs) {
if(panelIDs != null){
String[] ids = panelIDs.split(",");
for( String id : ids){
if( !GenericValidator.isBlankOrNull(id)){
panelIdPanelMap.put(id, panelDAO.getPanelById(id));
}
}
}
}
private List<ObservationHistory> addInitialSampleConditions(Element sampleItem, List<ObservationHistory> initialConditionList) {
String initialSampleConditionIdString = sampleItem.attributeValue("initialConditionIds");
if (!GenericValidator.isBlankOrNull(initialSampleConditionIdString)) {
String[] initialSampleConditionIds = initialSampleConditionIdString.split(",");
initialConditionList = new ArrayList<ObservationHistory>();
for (int j = 0; j < initialSampleConditionIds.length; ++j) {
ObservationHistory initialSampleConditions = new ObservationHistory();
initialSampleConditions.setValue(initialSampleConditionIds[j]);
initialSampleConditions.setValueType(ObservationHistory.ValueType.DICTIONARY);
initialSampleConditions.setObservationHistoryTypeId(INITIAL_CONDITION_OBSERVATION_ID);
initialConditionList.add(initialSampleConditions);
}
}
return initialConditionList;
}
private void addTests(String testIDs, List<Test> tests) {
StringTokenizer tokenizer = new StringTokenizer(testIDs, ",");
while (tokenizer.hasMoreTokens()) {
Test test = new Test();
test.setId(tokenizer.nextToken().trim());
tests.add(test);
}
}
public final class SampleTestCollection {
public SampleItem item;
public List<Test> tests;
public String collectionDate;
public List<ObservationHistory> initialSampleConditionIdList;
public Map<String,String> testIdToUserSectionMap;
public Map<String,String> testIdToUserSampleTypeMap;
public SampleTestCollection(SampleItem item, List<Test> tests, String collectionDate, List<ObservationHistory> initialConditionList, Map<String,String> testIdToUserSectionMap, Map<String,String> testIdToUserSampleTypeMap) {
this.item = item;
this.tests = tests;
this.collectionDate = collectionDate;
this.testIdToUserSectionMap = testIdToUserSectionMap;
this.testIdToUserSampleTypeMap = testIdToUserSampleTypeMap;
initialSampleConditionIdList = initialConditionList;
}
}
}