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

Java tutorial

Introduction

Here is the source code for us.mn.state.health.lims.common.services.SampleAddService.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.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;

        }
    }
}