/** * 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.apache.commons.validator.GenericValidator; 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.hibernate.HibernateUtil; import java.sql.Timestamp; import java.util.ArrayList; import java.util.List; public class CobasC311Reader extends AnalyzerLineInserter { private static final double ROUND_UP_KICKER = 0.000001; private int ORDER_NUMBER = 0; private int ORDER_DATE = 0; private int ALTLIndex = 0; private int ASTLIndex = 0; private int creatininIndex = 0; private int glycemiaIndex = 0; private static final String ALTL_NAME = "ALTL"; private static final String ASTL_NAME = "ASTL"; private static final String CREATININ_NAME = "Creatinin"; private static final String GLYCEMIA_NAME = "Glycemia"; private static final String DELIMITER = ","; private static final String DATE_PATTERN = "yyyy-MM-dd HH:mm:ss"; private static final String VALID_PREFIXES = "LART,LDBS,LRTN,LIND,LSPE"; private AnalyzerReaderUtil readerUtil = new AnalyzerReaderUtil(); private String error; 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), lines.get(3)); if (!columnsFound) { error = "Cobas C311 analyzer: Unable to find correct columns in file"; return false; } for (int i = 4; i < lines.size(); ++i) { createAnalyzerResultFromLine(lines.get(i), results); } if (results.size() > 0) { Transaction tx = HibernateUtil.getSession().beginTransaction(); try { persistResults(results, currentUserId); tx.commit(); } catch (LIMSRuntimeException lre) { tx.rollback(); error = "Cobas Taqman DBS analyzer: Unable to save to database"; successful = false; } } return successful; } private boolean manageColumns(String line_1, String line_3) { String[] fields = line_1.split(DELIMITER); for (int i = 0; i < fields.length; i++) { String header = fields[i].replace("\"", ""); if ("685".equals(header)) { ALTLIndex = i - 1; } else if ("687".equals(header)) { ASTLIndex = i - 1; } else if ("690".equals(header)) { creatininIndex = i - 1; } else if ("767".equals(header)) { glycemiaIndex = i - 1; } } fields = line_3.split(DELIMITER); for (int i = 0; i < fields.length; i++) { String header = fields[i].replace("\"", ""); if ("S_ID".equals(header)) { ORDER_NUMBER = i; } else if ("M_Date".equals(header)) { ORDER_DATE = i; } } return ORDER_DATE != 0 && ORDER_NUMBER != 0 && ALTLIndex != 0 && ASTLIndex != 0 && creatininIndex != 0 && glycemiaIndex != 0; } private void addValueToResults(List<AnalyzerResults> resultList, AnalyzerResults result) { if (result != null) { resultList.add(result); AnalyzerResults resultFromDB = readerUtil.createAnalyzerResultFromDB(result); if (resultFromDB != null) { resultList.add(resultFromDB); } } } private void createAnalyzerResultFromLine(String line, List<AnalyzerResults> resultList) { String[] fields = line.split(DELIMITER); if (fields.length <= ORDER_DATE) { return; } String accessionNumber = fields[ORDER_NUMBER].trim(); Timestamp orderTimeStamp = DateUtil.convertStringDateToTimestampWithPattern(fields[ORDER_DATE].trim(), DATE_PATTERN); addValueToResults(resultList, createAnalyzerResult(ALTL_NAME, fields, ALTLIndex, accessionNumber, orderTimeStamp)); addValueToResults(resultList, createAnalyzerResult(ASTL_NAME, fields, ASTLIndex, accessionNumber, orderTimeStamp)); addValueToResults(resultList, createAnalyzerResult(CREATININ_NAME, fields, creatininIndex, accessionNumber, orderTimeStamp)); addValueToResults(resultList, createAnalyzerResult(GLYCEMIA_NAME, fields, glycemiaIndex, accessionNumber, orderTimeStamp)); } private AnalyzerResults createAnalyzerResult(String analyzerTestName, String[] fields, int index, String accessionNumber, Timestamp orderTimeStamp) { if (fields.length <= index) { return null; } String result = fields[index].trim(); if (GenericValidator.isBlankOrNull(result)) { return null; } AnalyzerResults analyzerResults = new AnalyzerResults(); MappedTestName mappedName = AnalyzerTestNameCache.instance().getMappedTest(AnalyzerTestNameCache.COBAS_C311, analyzerTestName); if (mappedName == null) { mappedName = AnalyzerTestNameCache.instance().getEmptyMappedTestName(AnalyzerTestNameCache.COBAS_C311, analyzerTestName); } analyzerResults.setAnalyzerId(mappedName.getAnalyzerId()); analyzerResults.setResult(adjustResult(analyzerTestName, result)); analyzerResults.setCompleteDate(orderTimeStamp); analyzerResults.setTestId(mappedName.getTestId()); analyzerResults.setIsControl(accessionNumber.length() < 9 || !VALID_PREFIXES.contains(accessionNumber.subSequence(0, 3))); analyzerResults.setTestName(mappedName.getOpenElisTestName()); analyzerResults.setResultType("N"); analyzerResults.setAccessionNumber(accessionNumber); return analyzerResults; } private String adjustResult(String analyzerTestName, String result) { if (ALTL_NAME.equals(analyzerTestName)) { return String.valueOf(Math.rint(Double.parseDouble(result) + ROUND_UP_KICKER ) ).split("\\.")[0]; } if (ASTL_NAME.equals(analyzerTestName)) { return String.valueOf(Math.rint(Double.parseDouble(result) + ROUND_UP_KICKER )).split("\\.")[0]; } if (CREATININ_NAME.equals(analyzerTestName)) { return String.valueOf(Math.rint((Double.parseDouble(result) + ROUND_UP_KICKER ) * 10.0)).split("\\.")[0]; } if (GLYCEMIA_NAME.equals(analyzerTestName)) { return String.valueOf(Math.rint((Double.parseDouble(result) + ROUND_UP_KICKER ) * 100) / 100); } return result; } @Override public String getError() { return error; } }