/*
* PatientView
*
* Copyright (c) Worth Solutions Limited 2004-2013
*
* This file is part of PatientView.
*
* PatientView is free software: you can redistribute it and/or modify it under the terms of the
* GNU General Public License as published by the Free Software Foundation, either version 3 of the License,
* or (at your option) any later version.
* PatientView is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even
* the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
* You should have received a copy of the GNU General Public License along with PatientView in a file
* titled COPYING. If not, see <http://www.gnu.org/licenses/>.
*
* @package PatientView
* @link http://www.patientview.org
* @author PatientView <info@patientview.org>
* @copyright Copyright (c) 2004-2013, Worth Solutions Limited
* @license http://www.gnu.org/licenses/gpl-3.0.html The GNU General Public License V3.0
*/
package org.patientview.patientview.dataout;
import org.patientview.model.Patient;
import org.patientview.patientview.model.Comment;
import org.patientview.patientview.model.TestResult;
import org.patientview.model.Unit;
import org.patientview.patientview.unit.UnitUtils;
import org.patientview.util.CommonUtils;
import org.patientview.utils.LegacySpringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import javax.servlet.ServletContext;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import java.io.File;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.List;
public class DataOutThread implements Runnable {
private static final Logger LOGGER = LoggerFactory.getLogger(DataOutThread.class);
private String prebit;
private String directory;
private String archiveDirectory;
private int minutesBetweenWait;
private SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
private ServletContext servletContext;
private static final int SECONDS_IN_MINUTE = 60;
private static final int MILLISECONDS = 1000;
public DataOutThread() {
}
public DataOutThread(ServletContext context, String dataoutDir,
String dataOutArchiveDirectory, int minutesBetweenWait) {
this.directory = dataoutDir;
this.archiveDirectory = dataOutArchiveDirectory;
this.minutesBetweenWait = minutesBetweenWait;
this.servletContext = context;
}
public void run() {
try {
while (true) {
try {
List<Unit> units = returnAllTheUnits();
for (Unit unit : units) {
List<Patient> patients = patientsInUnit(unit.getUnitcode());
for (Patient patient : patients) {
Document patientDataOutXmlDoc = makePatientDataOutXml(patient);
if (!(null == patientDataOutXmlDoc)) {
writeDataOutFile(patientDataOutXmlDoc, patient, unit);
}
}
}
} catch (Exception e) {
LOGGER.error(e.getMessage());
LOGGER.debug(e.getMessage(), e);
}
Thread.sleep(MILLISECONDS * SECONDS_IN_MINUTE * minutesBetweenWait);
Date now = new Date(System.currentTimeMillis());
System.out.println("DataOutThread " + dateFormat.format(now));
}
} catch (InterruptedException e) {
LOGGER.error(e.getMessage());
LOGGER.debug(e.getMessage(), e);
}
}
private Document makePatientDataOutXml(Patient patient) {
Document doc = null;
List<TestResult> testResults = fetchTestResultsForPatient(patient);
List<Comment> comments = fetchCommentsForPatient(patient);
if (testResults.isEmpty() && comments.isEmpty()) {
return doc;
}
try {
DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder docBuilder = docFactory.newDocumentBuilder();
doc = docBuilder.newDocument();
Element rootElement = doc.createElement("patientview");
doc.appendChild(rootElement);
Element dateOfReport = addChildElement(doc, rootElement, "dateofreport", getTimeStampNow());
Element centreDetails = addChildElement(doc, rootElement, "centredetails");
Element centreCode = addChildElement(doc, centreDetails, "centrecode", patient.getUnitcode());
Element patientTag = addChildElement(doc, rootElement, "patient");
Element personalDetails = addChildElement(doc, patientTag, "personaldetails");
Element nhsno = addChildElement(doc, personalDetails, "nhsno", patient.getNhsno());
Element surname = addChildElement(doc, personalDetails, "surname", patient.getSurname());
Element forename = addChildElement(doc, personalDetails, "forename", patient.getForename());
Element dateofbirth = addChildElement(doc, personalDetails, "dateofbirth", CommonUtils.formatDate(
patient.getDateofbirth()));
Element testDetails = addChildElement(doc, rootElement, "testDetails");
String testCodeTrack = "";
Element currentTest = null;
Element currentDateRange = null;
String currentDateRangeStop = null;
for (TestResult testResult : testResults) {
if (!testCodeTrack.equals(testResult.getTestcode())) {
currentTest = addChildElement(doc, testDetails, "test");
if (!(null == currentDateRange)) {
currentDateRange.setAttribute("stop", currentDateRangeStop);
}
Element dateRange = addChildElement(doc, currentTest, "daterange");
currentDateRange = dateRange;
dateRange.setAttribute("start", testResult.getIsoDayDatestamp());
testCodeTrack = testResult.getTestcode();
Element testCode = addChildElement(doc, currentTest, "testcode", testResult.getTestcode());
}
Element result = addChildElement(doc, currentTest, "result");
Element dateStamp = addChildElement(doc, result, "datestamp", testResult.getIsoDatestamp());
Element source = addChildElement(doc, result, "source", testResult.getUnitcode());
currentDateRangeStop = testResult.getIsoDayDatestamp();
Element prePost = addChildElement(doc, result, "prepost", testResult.getPrepost());
Element value = addChildElement(doc, result, "value", testResult.getValue());
}
if (!(null == currentDateRange) && !(null == currentDateRangeStop)) {
currentDateRange.setAttribute("stop", currentDateRangeStop);
}
Element commentsTag = addChildElement(doc, rootElement, "comments");
for (Comment comment : comments) {
Element commentTag = addChildElement(doc, commentsTag, "comment");
Element commentDate = addChildElement(doc, commentsTag, "commentdate",
comment.getIsoFormattedDatestamp());
Element commentContent = addChildElement(doc, commentsTag, "commentbody", comment.getBody());
}
} catch (ParserConfigurationException e) {
LOGGER.error(e.getMessage());
LOGGER.debug(e.getMessage(), e);
}
return doc;
}
private List<Comment> fetchCommentsForPatient(Patient patient) {
List<Comment> comments = null;
try {
comments = LegacySpringUtils.getCommentManager().get(patient.getNhsno());
} catch (Exception e) {
LOGGER.error(e.getMessage());
LOGGER.debug(e.getMessage(), e);
}
return comments;
}
private String getTimeStampNow() {
Calendar nowCal = GregorianCalendar.getInstance();
SimpleDateFormat dateTimeFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
return dateTimeFormat.format(nowCal.getTime());
}
private List<TestResult> fetchTestResultsForPatient(Patient patient) {
return LegacySpringUtils.getTestResultManager().get(patient.getNhsno(), UnitUtils.PATIENT_ENTERS_UNITCODE);
}
private Element addChildElement(Document doc, Element parentElement, String elementName) {
Element childElement = doc.createElement(elementName);
parentElement.appendChild(childElement);
return childElement;
}
private Element addChildElement(Document doc, Element parentElement, String elementName, String data) {
Element childElement = addChildElement(doc, parentElement, elementName);
childElement.appendChild(doc.createTextNode(data));
return childElement;
}
private List<Patient> patientsInUnit(String unitCode) {
List<Patient> patients = null;
try {
patients = LegacySpringUtils.getPatientManager().get(unitCode);
} catch (Exception e) {
LOGGER.error(e.getMessage());
LOGGER.debug(e.getMessage(), e);
}
return patients;
}
private List<Unit> returnAllTheUnits() {
List<Unit> units = null;
try {
units = LegacySpringUtils.getUnitManager().getUnitsWithUser();
} catch (Exception e) {
LOGGER.error(e.getMessage());
LOGGER.debug(e.getMessage(), e);
}
return units;
}
private void writeDataOutFile(Document doc, Patient patient, Unit unit)
throws ParserConfigurationException, TransformerException {
String directory1stPart = directory;
String directory2ndPart = unit.getUnituser();
String directory3rdPart = LegacySpringUtils.getContextProperties().getProperty(prebit + ".directory.thirdpart");
String filePath = directory1stPart + "/" + directory2ndPart + "/" + directory3rdPart;
File uktDir = new File(filePath);
File uktExportFile = new File(uktDir, "data_out_" + unit.getUnitcode() + "_" + patient.getNhsno() + ".xml");
//write the content into xml file
TransformerFactory transformerFactory = TransformerFactory.newInstance();
Transformer transformer = transformerFactory.newTransformer();
transformer.setOutputProperty(OutputKeys.INDENT, "yes");
DOMSource source = new DOMSource(doc);
StreamResult result = new StreamResult(uktExportFile);
transformer.transform(source, result);
}
public String getPrebit() {
return prebit;
}
public void setPrebit(String prebit) {
this.prebit = prebit;
}
public String getDirectory() {
return directory;
}
public void setDirectory(String directory) {
this.directory = directory;
}
public String getArchiveDirectory() {
return archiveDirectory;
}
public void setArchiveDirectory(String archiveDirectory) {
this.archiveDirectory = archiveDirectory;
}
public int getMinutesBetweenWait() {
return minutesBetweenWait;
}
public void setMinutesBetweenWait(int minutesBetweenWait) {
this.minutesBetweenWait = minutesBetweenWait;
}
public ServletContext getServletContext() {
return servletContext;
}
public void setServletContext(ServletContext servletContext) {
this.servletContext = servletContext;
}
}