/**
* 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) CIRG, University of Washington, Seattle WA. All Rights Reserved.
*
*/
package us.mn.state.health.lims.analyzerimport.analyzerreaders;
import org.hibernate.Transaction;
import us.mn.state.health.lims.analyzerimport.util.AnalyzerTestNameCache;
import us.mn.state.health.lims.analyzerimport.util.MappedTestName;
import us.mn.state.health.lims.analyzerresults.valueholder.AnalyzerResults;
import us.mn.state.health.lims.common.exception.LIMSRuntimeException;
import us.mn.state.health.lims.common.util.DateUtil;
import us.mn.state.health.lims.common.util.HibernateProxy;
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.test.daoimpl.TestDAOImpl;
import us.mn.state.health.lims.test.valueholder.Test;
import us.mn.state.health.lims.testresult.daoimpl.TestResultDAOImpl;
import us.mn.state.health.lims.testresult.valueholder.TestResult;
import java.util.ArrayList;
import java.util.List;
public class CobasTaqmanDBSReader extends AnalyzerLineInserter {
private int ORDER_NUMBER = 0;
private int ORDER_DATE = 0;
private int RESULT = 0;
private int SAMPLE_TYPE = 0;
private static final String TEST_NAME = "HIQCAP48";
private static final String DELIMITER = "\\t";
private static final String DATE_PATTERN = "yyyy/MM/dd HH:mm:ss";
private static final String VALID_PREFIXES = "LART,LDBS,LRTN,LIND,LSPE";
private static String NEGATIVE_ID;
private static String POSITIVE_ID;
private AnalyzerReaderUtil readerUtil = new AnalyzerReaderUtil();
private String error;
static{
DictionaryDAO dictionaryDAO = new DictionaryDAOImpl();
Test test = new TestDAOImpl().getActiveTestByName("DNA PCR").get(0);
List<TestResult> testResults = new TestResultDAOImpl().getActiveTestResultsByTest( test.getId() );
for(TestResult testResult : testResults){
Dictionary dictionary = dictionaryDAO.getDataForId(testResult.getValue());
if( "Positive".equals(dictionary.getDictEntry())){
POSITIVE_ID = dictionary.getId();
}else if( "Negative".equals(dictionary.getDictEntry())){
NEGATIVE_ID = dictionary.getId();
}
}
}
public boolean insert(List<String> lines, String currentUserId) {
error = null;
boolean successful = true;
List<AnalyzerResults> results = new ArrayList<AnalyzerResults>();
boolean columnsFound = manageColumns(lines.get(0));
if (!columnsFound) {
error = "Cobas Taqman DBS analyzer: Unable to find correct columns in file";
return false;
}
MappedTestName mappedName = AnalyzerTestNameCache.instance().getMappedTest(AnalyzerTestNameCache.COBAS_DBS, TEST_NAME);
if (mappedName == null) {
mappedName = AnalyzerTestNameCache.instance().getEmptyMappedTestName(AnalyzerTestNameCache.COBAS_DBS, TEST_NAME);
}
for (int i = 1; i < lines.size(); ++i) {
createAnalyzerResultFromLine(lines.get(i), results, mappedName);
}
if (results.size() > 0) {
Transaction tx = HibernateProxy.beginTransaction();
try {
persistResults(results, currentUserId);
tx.commit();
} catch (LIMSRuntimeException lre) {
tx.rollback();
error = "Cobas Taqman DBS analyzer: Unable to save to database";
successful = false;
} finally {
HibernateProxy.closeSession();
}
}
return successful;
}
private boolean manageColumns(String line) {
String[] fields = line.split(DELIMITER);
for (int i = 0; i < fields.length; i++) {
String header = fields[i].replace("\"", "");
if ("Order Number".equals(header)) {
ORDER_NUMBER = i;
} else if ("Order Date/Time".equals(header)) {
ORDER_DATE = i;
} else if ("Result".equals(header)) {
RESULT = i;
}else if ("Sample Type".equals(header)) {
SAMPLE_TYPE = i;
}
}
return ORDER_DATE != 0 && ORDER_NUMBER != 0 && RESULT != 0 && SAMPLE_TYPE != 0;
}
private void addValueToResults(List<AnalyzerResults> resultList, AnalyzerResults result) {
resultList.add(result);
AnalyzerResults resultFromDB = readerUtil.createAnalyzerResultFromDB(result);
if (resultFromDB != null) {
resultList.add(resultFromDB);
}
}
private void createAnalyzerResultFromLine(String line, List<AnalyzerResults> resultList, MappedTestName mappedName) {
String[] fields = line.split(DELIMITER);
AnalyzerResults analyzerResults = new AnalyzerResults();
String result = getAppropriateResults(fields[RESULT]);
String accessionNumber = fields[ORDER_NUMBER].replace("\"", "").trim();
analyzerResults.setAnalyzerId(mappedName.getAnalyzerId());
analyzerResults.setResult( result );
analyzerResults.setCompleteDate(DateUtil.convertStringDateToTimestampWithPattern(fields[ORDER_DATE].replace("\"", "").trim(), DATE_PATTERN));
analyzerResults.setTestId(mappedName.getTestId());
analyzerResults.setIsControl(!VALID_PREFIXES.contains(accessionNumber.subSequence(0,3)));
analyzerResults.setTestName(mappedName.getOpenElisTestName());
analyzerResults.setResultType("D");
if( analyzerResults.getIsControl()){
if( !"S".equals(fields[SAMPLE_TYPE].replace("\"", "").trim())){
accessionNumber += ":" + fields[SAMPLE_TYPE].replace("\"", "").trim();
}
}else{
accessionNumber = accessionNumber.substring(0, 9);
}
analyzerResults.setAccessionNumber(accessionNumber);
addValueToResults(resultList, analyzerResults);
}
private String getAppropriateResults(String result) {
result = result.replace("\"", "").trim();
if ("Target Not Detected".equals(result)) {
result = NEGATIVE_ID;
} else {
result = POSITIVE_ID;
// save this until we finish w/ requirements
// String workingResult = result.split("\\(")[0].replace("<", "").replace("E", "");
// String[] splitResult = workingResult.split("\\+");
//
// if (Double.parseDouble(splitResult[0]) * Math.pow(10, Double.parseDouble(splitResult[1])) < THREASHOLD) {
// result = UNDER_THREASHOLD;
// }
}
return result;
}
@Override
public String getError() {
return error;
}
}