/*******************************************************************************
* Copyright (c) 2010, Oliver Egger, visionary ag
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
*******************************************************************************/
package ch.docbox.cdach;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.StringWriter;
import java.util.HashMap;
import java.util.Map;
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.TransformerConfigurationException;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import javax.xml.xpath.XPath;
import javax.xml.xpath.XPathConstants;
import javax.xml.xpath.XPathExpression;
import javax.xml.xpath.XPathExpressionException;
import javax.xml.xpath.XPathFactory;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;
public class CdaChXPath {
static final public String oid_loinc = "2.16.840.1.113883.6.1";
static final public String oid_ean = "1.3.88";
static final private String oid_docbox_old = "2.25.327919736312109525688528068157180855579";
static final private String oid_docbox = "2.16.756.5.30.1.105";
static final public String oid_ahv13 = "2.16.756.5.32";
public enum DOCBOXCDATYPE {
Eingang_Anmeldung, Datum_Aufgebot, Eintritt, Austritt, Dossier_Freigabe,
Dossier_Freigabe_Beendet, Docbox_Spital_Anmeldung, Docbox_Spital_Arzt,
Docbox_Arzt_Arzt, Docbox_Nachricht, Docbox_Terminvereinbarung
};
public enum Options {
JA, NEIN, UNBEKANNT
};
public static String getOidUserDocboxId(){
return oid_docbox + ".1.1";
}
public static String getOidPraxisSoftwareId(){
return oid_docbox + ".1.3";
}
private String getOidOrganizationId(){
return oid_docbox + ".1.2";
}
private String getOidDepartmentId(){
return oid_docbox + ".1.2.1";
}
private String getOidDocboxLeistungId(){
return oid_docbox + ".2.1";
}
public static String getOidDocboxSectionId(){
return oid_docbox + ".2.2";
}
public static String getOidUserDocboxIdOld(){
return oid_docbox_old + ".1.1";
}
private String getOidDepartmentIdOld(){
return oid_docbox_old + ".1.2.1";
}
private String getOidOrganizationIdOld(){
return oid_docbox_old + ".1.2";
}
private String getOidDocboxLeistungIdOld(){
return oid_docbox_old + ".2.1";
}
private String getOidDocboxSectionIdOld(){
return oid_docbox_old + ".2.2";
}
private static XPathFactory factory;
private static XPath xpath;
private Document doc;
private String xml;
static private Map<String, XPathExpression> expressionCache =
new HashMap<String, XPathExpression>();
public CdaChXPath(){
if (factory == null) {
factory = XPathFactory.newInstance();
xpath = factory.newXPath();
xpath.setNamespaceContext(new CdaNamespaceContext());
}
}
public Options getOptions(String value){
if (value != null) {
if ("ja".equals(value)) {
return Options.JA;
}
if ("nein".equals(value)) {
return Options.NEIN;
}
if ("unbekannt".equals(value)) {
return Options.UNBEKANNT;
}
}
return null;
}
public Options getFieldValueOptions(String expression){
return getOptions(getFieldValue(expression));
}
public String getFieldValue(String expression){
return getFieldValue(expression, false);
}
public String getFieldValue(final String expression, final boolean convertCdaBrToBr){
Object result = null;
try {
XPathExpression xpathCheckTypeId = expressionCache.get(expression);
if (xpathCheckTypeId == null) {
xpathCheckTypeId = xpath.compile(expression);
try {
expressionCache.put(expression, xpathCheckTypeId);
} catch (final Exception e) {}
}
result = xpathCheckTypeId.evaluate(doc, XPathConstants.NODESET);
} catch (final XPathExpressionException e) {
System.out.println(e.getMessage());
return null;
}
if (result == null) {
return null;
} else {
final NodeList nodes = (NodeList) result;
if (nodes.getLength() > 0) {
String text = "";
Node node = nodes.item(0).getFirstChild();
do {
if (node != null) {
if (node.getNodeType() == Node.TEXT_NODE) {
text += node.getNodeValue().trim();
}
if ((node.getNodeType() == Node.ELEMENT_NODE)
&& node.getLocalName().equals("br") && convertCdaBrToBr) {
text += "<br />";
}
node = node.getNextSibling();
}
} while (node != null);
return text;
}
return null;
}
}
public String[] getFieldValues(final String expression){
Object result = null;
try {
XPathExpression xpathCheckTypeId = expressionCache.get(expression);
if (xpathCheckTypeId == null) {
xpathCheckTypeId = xpath.compile(expression);
expressionCache.put(expression, xpathCheckTypeId);
}
result = xpathCheckTypeId.evaluate(doc, XPathConstants.NODESET);
} catch (final XPathExpressionException e) {
System.out.println(e.getMessage());
return null;
}
if (result == null) {
return null;
} else {
final NodeList nodes = (NodeList) result;
if (nodes.getLength() > 0) {
final String results[] = new String[nodes.getLength()];
for (int i = 0; i < nodes.getLength(); ++i) {
final Node node = nodes.item(i);
results[i] = node.getFirstChild().getNodeValue();
}
return results;
}
return null;
}
}
public String setPatientDocument(String document){
DocumentBuilderFactory docBuilderFactory = DocumentBuilderFactory.newInstance();
docBuilderFactory.setNamespaceAware(true);
DocumentBuilder docBuilder = null;
try {
docBuilder = docBuilderFactory.newDocumentBuilder();
doc = docBuilder.parse(new ByteArrayInputStream(document.getBytes("UTF-8")));
} catch (SAXException e) {
System.out.println(e.getMessage());
return e.toString();
} catch (ParserConfigurationException e) {
System.out.println(e.getMessage());
return e.toString();
} catch (IOException e) {
System.out.println(e.getMessage());
return e.toString();
}
xml = document;
return null;
}
public String getTitle(){
String str = "//cda:ClinicalDocument/cda:title";
return (getFieldValue(str));
}
public String getPatientHospitalPid(){
String str =
"//cda:ClinicalDocument/cda:recordTarget/cda:patientRole/cda:id[@root = '"
+ DocboxCDA.getOidPidHospital() + "']/@extension";
return (getFieldValue(str));
}
public String getPatientHospitalFid(){
String str =
"//cda:ClinicalDocument/cda:recordTarget/cda:patientRole/cda:id[@root = '"
+ DocboxCDA.getOidFidHospital() + "']/@extension";
return (getFieldValue(str));
}
public String getCodeCode(){
String str = "//cda:ClinicalDocument/cda:code/@code";
// If Null, get code attribute of translation subelement.
if (getFieldValue(str) == null)
str = "//cda:ClinicalDocument/cda:code/cda:translation/@code";
return (getFieldValue(str));
}
public String getCodeCodeSystem(){
String str = "//cda:ClinicalDocument/cda:code/@codeSystem";
// If Null, get code attribute of translation subelement.
if (getFieldValue(str) == null)
str = "//cda:ClinicalDocument/cda:code/cda:translation/@codeSystem";
return (getFieldValue(str));
}
public String getCodeDisplayName(){
String str = "//cda:ClinicalDocument/cda:code/@displayName";
return (getFieldValue(str));
}
public String getDossierId(){
String str =
"//cda:ClinicalDocument/cda:component/cda:structuredBody/cda:component/cda:section[cda:code[@nullFlavor=\"NA\"]/cda:translation[@code=\"DOSSIERID\" and (@codeSystem=\""
+ getOidDocboxSectionIdOld()
+ "\" or @codeSystem=\""
+ getOidDocboxSectionId()
+ "\")]]/cda:text";
return (getFieldValue(str));
}
public String getDossierUrl(){
String str =
"//cda:ClinicalDocument/cda:component/cda:structuredBody/cda:component/cda:section[cda:code[@nullFlavor=\"NA\"]/cda:translation[@code=\"DOSSIERURL\" and (@codeSystem=\""
+ getOidDocboxSectionIdOld()
+ "\" or @codeSystem=\""
+ getOidDocboxSectionId()
+ "\")]]/cda:text/cda:linkHtml";
return (getFieldValue(str));
}
private String getSubStringBefore(String str, String niddle){
if ((str == null) || (str.trim().length() == 0)) {
return "";
}
if (str.lastIndexOf(niddle) > -1) {
String result = str.substring(0, str.lastIndexOf(niddle));
return result;
}
if ((str.equals("ja")) || (str.equals("nein")) || (str.equals("unbekannt"))) {
return str;
}
return "";
}
private String getSubStringAfter(String str, String niddle){
if ((str == null) || (str.trim().length() == 0)) {
return "";
}
if (str.lastIndexOf(niddle) > -1) {
String result = str.substring(str.lastIndexOf(niddle) + 1);
return result;
}
if ((str.equals("ja")) || (str.equals("nein")) || (str.equals("unbekannt"))) {
return "";
}
return str;
}
private String formatString(String str){
if (str == null || "".equals(str)) {
return "";
}
StringBuffer str1 = new StringBuffer();
String[] stringArray = explodeString(str);
int len = stringArray.length;
if (len < 2) {
return str;
}
for (int i = 0; i < len; i++) {
str1.append(stringArray[i]);
if (i != (len - 1)) {
str1.append("\n");
}
}
return str1.toString();
}
private String[] explodeString(String str){
str = str.replaceAll("\\n|\\r", "");
String exp1 = "(<|<)(?i)br[\\s]*/?(>|>)";
String exp2 = "^" + exp1;
while (str.split(exp1)[0].length() == 0 && !"".equals(str)) {
str = str.replaceAll(exp2, "");
}
return str.split(exp1);
}
public String getDocumentIdDocbox(){
return getFieldValue("//cda:ClinicalDocument/cda:id[@root='" + oid_docbox + "'or @root='"
+ oid_docbox_old + "']/@extension");
}
public boolean isDocboxReferral(){
return "28616-1".equals(getCodeCode()) && getDocumentIdDocbox() != null;
}
public String getReferralHospitalName(){
return getFieldValue("//cda:ClinicalDocument/cda:informationRecipient[@typeCode='PRCP' or string-length(normalize-space(@typeCode)) = 0]/cda:intendedRecipient/cda:receivedOrganization/cda:name[1]");
}
public String getReferralHospitalId(){
return getFieldValue("//cda:ClinicalDocument/cda:informationRecipient[@typeCode='PRCP' or string-length(normalize-space(@typeCode)) = 0]/cda:intendedRecipient/cda:receivedOrganization/cda:id[@root='"
+ getOidOrganizationId() + "' or @root='" + getOidOrganizationIdOld() + "']/@extension");
}
public String getReferralDepartmentName(){
return getFieldValue("//cda:ClinicalDocument/cda:informationRecipient[@typeCode='PRCP' or string-length(normalize-space(@typeCode)) = 0]/cda:intendedRecipient/cda:receivedOrganization/cda:name[2]");
}
public String getReferralDepartmentId(){
return getFieldValue("//cda:ClinicalDocument/cda:informationRecipient[@typeCode='PRCP' or string-length(normalize-space(@typeCode)) = 0]/cda:intendedRecipient/cda:receivedOrganization/cda:id[@root='"
+ getOidDepartmentId() + "' or @root='" + getOidDepartmentIdOld() + "']/@extension");
}
public String getAuthorDocboxId(){
return getFieldValue("//cda:ClinicalDocument/cda:author/cda:assignedAuthor/cda:id[@root='"
+ getOidUserDocboxId() + "' or @root='" + getOidUserDocboxIdOld() + "']/@extension");
}
public String getAuthorEancodeId(){
return getFieldValue("//cda:ClinicalDocument/cda:author/cda:assignedAuthor/cda:id[@root='"
+ oid_ean + "']/@extension");
}
public String getAuthorHospitalId(){
return getFieldValue("//cda:ClinicalDocument/cda:author/cda:assignedAuthor/cda:id[@root='"
+ DocboxCDA.getOidDoctorHospitalId() + "']/@extension");
}
public String getAuthorLastName(){
return getFieldValue("//cda:ClinicalDocument/cda:author/cda:assignedAuthor/cda:assignedPerson/cda:name/cda:family");
}
public String getAuthorFirstName(){
return getFieldValue("//cda:ClinicalDocument/cda:author/cda:assignedAuthor/cda:assignedPerson/cda:name/cda:given");
}
public String getAuthorName(){
if (getAuthorLastName() == null) {
return getFieldValue("//cda:ClinicalDocument/cda:author/cda:assignedAuthor/cda:assignedPerson/cda:name");
}
if (this.getAuthorFirstName() == null) {
return getAuthorLastName();
}
return this.getAuthorFirstName() + " " + getAuthorLastName();
}
public int getReceivers(){
String receivers[] = getFieldValues("//cda:ClinicalDocument/cda:informationRecipient");
return receivers != null ? receivers.length : 0;
}
public String getReceiverDocboxId(int i){
return getFieldValue("//cda:ClinicalDocument/cda:informationRecipient[position() = "
+ (i + 1) + "]/cda:intendedRecipient/cda:id[@root='" + getOidUserDocboxId()
+ "' or @root='" + getOidUserDocboxIdOld() + "']/@extension");
}
public String getReceiverEanCodeId(int i){
return getFieldValue("//cda:ClinicalDocument/cda:informationRecipient[position() = "
+ (i + 1) + "]/cda:intendedRecipient/cda:id[@root='" + oid_ean + "']/@extension");
}
public String getReceiverLastName(int i){
return getFieldValue("//cda:ClinicalDocument/cda:informationRecipient[position() = "
+ (i + 1) + "]/cda:intendedRecipient/cda:informationRecipient/cda:name/cda:family");
}
public String getReceiverFirstName(int i){
return getFieldValue("//cda:ClinicalDocument/cda:informationRecipient[position() = "
+ (i + 1) + "]/cda:intendedRecipient/cda:informationRecipient/cda:name/cda:given");
}
public String getCustodianHospitalName(){
return getFieldValue("//cda:ClinicalDocument/cda:custodian/cda:assignedCustodian/cda:representedCustodianOrganization/cda:name[1]");
}
public String getCustodianHospitalId(){
return getFieldValue("//cda:ClinicalDocument/cda:custodian/cda:assignedCustodian/cda:representedCustodianOrganization/cda:id[@root='"
+ getOidOrganizationId() + "' or @root='" + getOidOrganizationIdOld() + "']/@extension");
}
public String getCustodianDocboxId(){
return getFieldValue("//cda:ClinicalDocument/cda:custodian/cda:assignedCustodian/cda:representedCustodianOrganization/cda:id[@root='"
+ getOidUserDocboxId() + "' or @root='" + getOidUserDocboxIdOld() + "']/@extension");
}
public String getCustodianEanCode(){
return getFieldValue("//cda:ClinicalDocument/cda:custodian/cda:assignedCustodian/cda:representedCustodianOrganization/cda:id[@root='"
+ oid_ean + "']/@extension");
}
public String getCustodianDepartmentName(){
return getFieldValue("//cda:ClinicalDocument/cda:custodian/cda:assignedCustodian/cda:representedCustodianOrganization/cda:name[2]");
}
public String getCustodianDepartmentId(){
return getFieldValue("//cda:ClinicalDocument/cda:custodian/cda:assignedCustodian/cda:representedCustodianOrganization/cda:id[@root='"
+ getOidDepartmentId() + "' or @root='" + getOidDepartmentIdOld() + "']/@extension");
}
public String getDocboxReferralInfo(){
StringBuffer strBuf = new StringBuffer();
strBuf.append("Docbox Dokument ID:\t" + getDocumentIdDocbox() + "\n");
strBuf.append("Auftrags ID docbox:\t" + getAuftragsnummmer() + "\n");
strBuf.append("Spital:\t" + getReferralHospitalName() + "\n");
strBuf.append("SpitalId:\t" + getReferralHospitalId() + "\n");
strBuf.append("Fachbereich:\t" + getReferralDepartmentName() + "\n");
strBuf.append("FachbereichId:\t" + getReferralDepartmentId() + "\n");
strBuf.append("Sender Arzt ID docbox:\t" + getAuthorDocboxId() + "\n");
strBuf.append("Sender Arzt Nachname:\t" + getAuthorLastName() + "\n");
strBuf.append("Sender Arzt Vorname:\t" + getAuthorFirstName() + "\n");
strBuf.append("Empfänger ID docbox:\t" + getReceiverDocboxId(0) + "\n");
strBuf.append("Empfänger Nachname:\t" + getReceiverLastName(0) + "\n");
strBuf.append("Empfänger Vorname:\t" + getReceiverFirstName(0) + "\n");
strBuf.append("PID-Hausarzt docbox:\t" + getPatientNumber() + "\n");
strBuf.append("Patient Nachname:\t" + getPatientLastName() + "\n");
strBuf.append("Patient Vorname:\t" + getPatientFirstName() + "\n");
strBuf.append("Patient Geburtstag:\t" + getPatientDateOfBirth() + "\n");
return strBuf.toString();
}
@Override
public String toString(){
if (doc == null) {
return "no document set";
}
StringBuffer strBuf = new StringBuffer();
if (oid_loinc.equals(getCodeCodeSystem())) {
if (isDocboxReferral()) {
strBuf.append("Docbox Spitalüberweisung\n");
strBuf.append(getDocboxReferralInfo());
return strBuf.toString();
}
} else if ("NA".equals(getCodeCode())) {
strBuf.append("TOBEDONE");
} else {
strBuf.append("WARNING: code not identified for document");
}
strBuf.append(xml);
return strBuf.toString();
}
/**
* Patientendaten Name - cda Header
*
* @return String
*/
public String getPatientLastName(){
String str =
"//cda:ClinicalDocument/cda:recordTarget/cda:patientRole/cda:patient/cda:name/cda:family";
return (getFieldValue(str));
}
/**
* Patientendaten Vorname - cda Header
*
* @return String
*/
public String getPatientFirstName(){
String str =
"//cda:ClinicalDocument/cda:recordTarget/cda:patientRole/cda:patient/cda:name/cda:given";
return (getFieldValue(str));
}
/**
* Patientendaten Strasse/Nr. - cda Header
*
* @return String
*/
public String getPatientStreet(){
String str =
"//cda:ClinicalDocument/cda:recordTarget/cda:patientRole/cda:addr/cda:streetAddressLine";
return (getFieldValue(str));
}
/**
* Patientendaten PLZ - cda Header
*
* @return String
*/
public String getPatientPlz(){
String str =
"//cda:ClinicalDocument/cda:recordTarget/cda:patientRole/cda:addr/cda:postalCode";
return (getFieldValue(str));
}
/**
* Patientendaten Ort - cda Header
*
* @return String
*/
public String getPatientCity(){
String str = "//cda:ClinicalDocument/cda:recordTarget/cda:patientRole/cda:addr/cda:city";
return (getFieldValue(str));
}
/**
* Patientendaten Ort - cda Header
*
* @return String
*/
public String getPatientAhv13(){
String str =
"//cda:ClinicalDocument/cda:recordTarget/cda:patientRole/cda:id[@root = '" + oid_ahv13
+ "']/@extension";
return (getFieldValue(str));
}
/**
* Patientendaten Geburtsdatum - cda Header
*
* @return [M|F|UN]
*/
public String getPatientDateOfBirth(){
String str =
"//cda:ClinicalDocument/cda:recordTarget/cda:patientRole/cda:patient/cda:birthTime/@value";
return (getFieldValue(str));
}
/**
* Patientendaten Geschlecht - cda Header
*
* @return [M|F|UN]
*/
public String getPatientGender(){
String str =
"//cda:ClinicalDocument/cda:recordTarget/cda:patientRole/cda:patient/cda:administrativeGenderCode[@codeSystem = '2.16.840.1.113883.5.1']/@code";
return (getFieldValue(str));
}
/**
* Patientendaten Patientennummer - cda Header
*
* @return String
*/
public String getPatientNumber(){
String str =
"//cda:ClinicalDocument/cda:recordTarget/cda:patientRole/cda:id[@root = '"
+ DocboxCDA.getOidPraxisSoftwareId() + "' or @root = '"
+ DocboxCDA.getOidPraxisSoftwareIdOld()
+ "' or string-length(normalize-space(@root)) = 0]/@extension";
return (getFieldValue(str));
}
/**
* Patientendaten Telefonnummer - cda Header
*
* @return String
*/
public String getPatientHomePhone(){
String str =
"//cda:ClinicalDocument/cda:recordTarget/cda:patientRole/cda:telecom[substring(@value, 1, 3) = 'tel' and @use='HP']/@value";
return getSubStringAfter(getFieldValue(str), ":");
}
/**
* Patientendaten Telefonnummer Geschäft - cda Header
*
* @return String
*/
public String getPatientOfficePhone(){
String str =
"//cda:ClinicalDocument/cda:recordTarget/cda:patientRole/cda:telecom[substring(@value, 1, 3) = 'tel' and @use='WP']/@value";
return getSubStringAfter(getFieldValue(str), ":");
}
/**
* Patientendaten Mobilnummer - cda Header
*
* @return String
*/
public String getPatientMobile(){
String str =
"//cda:ClinicalDocument/cda:recordTarget/cda:patientRole/cda:telecom[substring(@value, 1, 3) = 'tel' and string-length(normalize-space(@use)) = 0]/@value";
return getSubStringAfter(getFieldValue(str), ":");
}
/**
* Patientendaten E-Mail- cda Header
*
* @return String
*/
public String getPatientEmail(){
String str =
"//cda:ClinicalDocument/cda:recordTarget/cda:patientRole/cda:telecom[substring(@value, 1, 4) = 'mail']/@value";
return getSubStringAfter(getFieldValue(str), ":");
}
// FIXME needs to be done
private String getSectionTextPath(String code, String title, String codeSystem,
String oldCodeSystem){
if (title == null && code == null && codeSystem != null) {
return "//cda:ClinicalDocument/cda:component/cda:structuredBody/cda:component/cda:section[cda:code[@nullFlavor='NA']/cda:translation[@codeSystem='"
+ codeSystem + "' or @codeSystem='" + oldCodeSystem + "']]/cda:text";
}
if (title == null) {
return "//cda:ClinicalDocument/cda:component/cda:structuredBody/cda:component/cda:section[cda:code[@nullFlavor='NA']/cda:translation[@code='"
+ code
+ "' and (@codeSystem='"
+ codeSystem
+ "' or @codeSystem='"
+ oldCodeSystem
+ "')]]/cda:text";
}
return "//cda:ClinicalDocument/cda:component/cda:structuredBody/cda:component/cda:section[cda:title='"
+ title
+ "' or cda:code[@nullFlavor='NA']/cda:translation[@code='"
+ code
+ "' and (@codeSystem='"
+ codeSystem
+ "' or @codeSystem='"
+ oldCodeSystem
+ "')]]/cda:text";
}
private String getSectionTextPath(String code){
return this.getSectionTextPath(code, null, getOidDocboxSectionId(),
getOidDocboxSectionIdOld());
}
/**
* Administrative Angaben AuftragsID docbox - AOK
*
* @return String
*/
public String getAuftragsnummmer(){
return getFieldValue(getSectionTextPath("AOK"));
}
/**
* Administrative Angaben Versicherungsklasse - AVK
*
* @return [Allgemein|Halbprivat|Privat|Allgemein CH|Selbstzahler]
*/
public String getVersicherungsklasse(){
return (getFieldValue(getSectionTextPath("AVK")));
}
/**
* Administrative Angaben Krankenkasse - AKK
*
* @return String
*/
public String getKrankenkasse(){
return (getFieldValue(getSectionTextPath("AKK")));
}
/**
* Administrative Angaben Policennummer Krankenkasse AKP String
*
* @return String
*/
public String getKrankenkassePolicenummer(){
return (getFieldValue(getSectionTextPath("AKP")));
}
/**
* Administrative Angaben Zusatzversicherung KK AZK
*
* @return String
*/
public String getKrankenkasseZusatzversicherung(){
return (getFieldValue(getSectionTextPath("AZK")));
}
/**
* Administrative Angaben Policennummer Zusatzversicherung KK AZP
*
* @return String
*/
public String getKrankenkasseZusatzversicherungPolicenummer(){
return (getFieldValue(getSectionTextPath("AZP")));
}
/**
* Administrative Angaben Unfallversicherung AUV String
*
* @return String
*/
public String getUnfallversicherung(){
return (getFieldValue(getSectionTextPath("AUV")));
}
/**
* Administrative Angaben Policennummer Unfallversicherung AUP String
*
* @return String
*/
public String getUnfallversicherungPolicenummer(){
return (getFieldValue(getSectionTextPath("AUP")));
}
/**
* Administrative Angaben Zusatzversicherung Unfall AZU
*
* @return String
*/
public String getUnfallZusatzversicherung(){
return (getFieldValue(getSectionTextPath("AZU")));
}
/**
* Administrative Angaben Policennummer Zusatzversicherung Unfall AZPU String
*
* @return String
*/
public String getUnfallZusatzversicherungPolicenummer(){
return (getFieldValue(getSectionTextPath("AZPU")));
}
/**
* Administrative Angaben Arbeitgeber AAG String
*
* @return String
*/
public String getArbeitgeber(){
return (getFieldValue(getSectionTextPath("AAG")));
}
/**
* Administrative Angaben Einweisungsgrund AEG [Krankheit|Unfall|Geburt|Mutterschaft|Anderer]
*
* @return String
*/
public String getEinweisungsgrund(){
return (getFieldValue(getSectionTextPath("AEG")));
}
/**
* Administrative Angaben Aufenthaltsart AAA [ambulant|stationär|kurzstationär]
*
* @return String
*/
public String getAufenthaltsart(){
return (getFieldValue(getSectionTextPath("AAA")));
}
/**
* Administrative Angaben Eintritt Datum AED String
*
* @return String
*/
public String getEintrittDatum(){
return (getFieldValue(getSectionTextPath("AED")));
}
/**
* Administrative Angaben Eintritt Zeit AEZ String
*
* @return String
*/
public String getEintrittZeit(){
return (getFieldValue(getSectionTextPath("AEZ")));
}
/**
* Administrative Angaben Eintritt Vortag AEV
*
* @return [ja|nein|unbekannt]
*/
public Options getEintrittVortag(){
return (getFieldValueOptions(getSectionTextPath("AEV")));
}
/**
* Administrative Angaben Eintritt Nüchtern AEN
*
* @return [ja|nein|unbekannt]
*/
public Options getEintrittNuechtern(){
return (getFieldValueOptions(getSectionTextPath("AEN")));
}
/**
* Administrative Angaben Operation Datum AOPD String
*
* @return String
*/
public String getOperationDatum(){
return (getFieldValue(getSectionTextPath("AOPD")));
}
/**
* Administrative Angaben Operation Zeit AOPZ String
*
* @return String
*/
public String getOperationZeit(){
return (getFieldValue(getSectionTextPath("AOPZ")));
}
/**
* Administrative Angaben Fix-Zeit Operation AOPFZ String
*
* @return String
*/
public String getOperationFixZeit(){
return (getFieldValue(getSectionTextPath("AOPFZ")));
}
/**
* Administrative Angaben Dringlichkeit ADRINDGLICHKEIT Selekion aus Liste: Verfügbare
* Dringlichkeiten abhängig von Leistung
*
* @return String
*/
public String getDringlichkeit(){
return (getFieldValue(getSectionTextPath("ADRINDGLICHKEIT")));
}
/**
* Administrative Angaben Frühere Aufenthalte im Spital bei der die Anmeldung gemacht wird
* (Klinik/Datum):
*
* @return String
*/
public String getFruehereAufenthalte(){
return (getFieldValue(getSectionTextPath("AFAS")));
}
/**
* Administrative Angaben Name Hausarzt ANH String
*
* @return String
*/
public String getHauszart(){
return (getFieldValue(getSectionTextPath("ANH")));
}
/**
* Administrative Angaben Patient muss präoperativ zum Hausarzt APH
*
* @return [ja|nein|unbekannt]
*/
public Options getPraeoperativHausarzt(){
return (getFieldValueOptions(getSectionTextPath("APH")));
}
/**
* Administrative Angaben Bemerkungen/Beilagen ABB Text
*
* @return String
*/
public String getBemerkungenBeilagen(){
return (getFieldValue(getSectionTextPath("ABB")));
}
/**
* Leistung/Fragestellung Gewünschte Leistungen
*
* @return String Array
*/
public String[] getGewuenschteLeistungen(){
return getFieldValues(getSectionTextPath(null, null, getOidDocboxLeistungId(),
getOidDocboxLeistungIdOld()));
}
/**
* Leistung/Fragestellung Ergänzungen zur Leistung LE Text
*
* @return String
*/
public String getErgaenzungenLeistung(){
return (getFieldValue(getSectionTextPath("LE")));
}
/**
* Leistung/Fragestellung Klinische Angaben/Fragestellung LKA Text
*
* @return String
*/
public String getKlinischeAngabeFragestellung(){
return (getFieldValue(getSectionTextPath("LKA")));
}
/**
* Leistung/Fragestellung Diagnose LD String
*
* @return String
*/
public String getDiagnose(){
return (getFieldValue(getSectionTextPath("LD")));
}
/**
* Leistung/Fragestellung Diagnose Verlauf LDV String
*
* @return String
*/
public String getDiagnoseVerlauf(){
return (getFieldValue(getSectionTextPath("LDV")));
}
/**
* Notiz
*
* @return String
*/
public String getNotiz(){
return (getFieldValue(getSectionTextPath("NOTIZ")));
}
/**
* Leistung/Fragestellung Anamnese LA String
*
* @return String
*/
public String getAnamnese(){
return (getFieldValue(getSectionTextPath("LA")));
}
/**
* Leistung/Fragestellung Gewünschte Körperregion LK
*
* @return String
*/
public String getGewuenschteKoerperregion(){
return (getFieldValue(getSectionTextPath("LK")));
}
/**
* Klinische Angaben Medikamente KMED Text mit <cda:br/> (oder in alter Version br Elementen)
* Elementen getrennt für Einzeleinträge von Medikamenten
*
* @return String
*/
public String getMedikamente(){
return formatString((getFieldValue(
getSectionTextPath("KMED", "Medikamente", getOidDocboxSectionId(),
getOidDocboxSectionIdOld()), true)));
}
/**
* Klinische Angaben Schwangerschaft/Stillzeit KSCH [ja:|nein:]Bemerkung
*/
public String getSchwangerschaft(){
return getFieldValue(getSectionTextPath("KSCH", "Schwangerschaft/Stillzeit",
getOidDocboxSectionId(), getOidDocboxSectionIdOld()));
}
public Options getHasSchwangerschaft(){
return getOptions(getSubStringBefore(getSchwangerschaft(), ":"));
}
public String getSchwangerschaftBemerkung(){
return getSubStringAfter(getSchwangerschaft(), ":");
}
/**
* Klinische Angaben Allergien KALL [ja:|nein:|unbekannt:]Text mit <cda:br/> (oder in alter
* Version br Elementen) getrennt für Einzeleinträge von Allergien
*/
public String getAllergie(){
return formatString(getFieldValue(
getSectionTextPath("KALL", "Allergien", getOidDocboxSectionId(),
getOidDocboxSectionIdOld()), true));
}
public Options getHasAllergie(){
return getOptions(getSubStringBefore(getAllergie(), ":"));
}
public String getAllergieBemerkung(){
return getSubStringAfter(getAllergie(), ":");
}
/**
* Klinische Angaben Kreatininwert KKRET String
*/
public String getKreatininwert(){
return getFieldValue(getSectionTextPath("KKRET", "Kreatininwert", getOidDocboxSectionId(),
getOidDocboxSectionIdOld()));
}
/**
* Klinische Angaben INR KINR String
*/
public String getInr(){
return getFieldValue(getSectionTextPath("KINR", "INR", getOidDocboxSectionId(),
getOidDocboxSectionIdOld()));
}
/**
* Klinische Angaben Thrombozyten KTHROMBO String
*/
public String getThrombozyten(){
return getFieldValue(getSectionTextPath("KTHROMBO", "Thrombozyten",
getOidDocboxSectionId(), getOidDocboxSectionIdOld()));
}
/**
* Klinische Angaben Schilddrüsen-Überfunktion KSCHILD [ja|nein|unbekannt]
*/
public Options getSchilddruesenUeberfunktion(){
return getFieldValueOptions(getSectionTextPath("KSCHILD", "Schilddrüsen-Überfunktion",
getOidDocboxSectionId(), getOidDocboxSectionIdOld()));
}
/**
* Klinische Angaben Biguanid Medikation KBIUGANID [ja|nein|unbekannt]
*/
public Options getBiguanidMedication(){
return getFieldValueOptions(getSectionTextPath("KBIUGANID", "Biguanid Medikation",
getOidDocboxSectionId(), getOidDocboxSectionIdOld()));
}
/**
* Klinische Angaben Herzschrittmacher KHERZSCHRITT [ja|nein|unbekannt]
*/
public Options getHerzschrittmacher(){
return getFieldValueOptions(getSectionTextPath("KHERZSCHRITT", "Herzschrittmacher",
getOidDocboxSectionId(), getOidDocboxSectionIdOld()));
}
/**
* Klinische Angaben Metallimplantate KMETALL [ja|nein|unbekannt]
*/
public Options getMetallImplantate(){
return getFieldValueOptions(getSectionTextPath("KMETALL", "Metallimplantate",
getOidDocboxSectionId(), getOidDocboxSectionIdOld()));
}
/**
* Klinische Angaben Clips/Metallsplitter KCLIPS [ja|nein|unbekannt]
*/
public Options getClipsMetallSplitter(){
return getFieldValueOptions(getSectionTextPath("KCLIPS", "Clips/Metallsplitter",
getOidDocboxSectionId(), getOidDocboxSectionIdOld()));
}
/**
* Klinische Angaben Gehörimplantat KGEHÖRIMPL [ja|nein|unbekannt]
*/
public Options getGehoerImplantat(){
return getFieldValueOptions(getSectionTextPath("KGEHÖRIMPL", "Gehörimplantat",
getOidDocboxSectionId(), getOidDocboxSectionIdOld()));
}
/**
* Klinische Angaben Platzangst KPLATZANGST [ja|nein|unbekannt]
*/
public Options getPlatzangst(){
return getFieldValueOptions(getSectionTextPath("KPLATZANGST", "Platzangst",
getOidDocboxSectionId(), getOidDocboxSectionIdOld()));
}
/**
* Klinische Angaben Kind zur Sedation KKINDSEDATION [ja|nein|unbekannt]
*/
public Options getKindZurSedation(){
return getFieldValueOptions(getSectionTextPath("KKINDSEDATION"));
}
/**
* Leistung/Fragestellung OP-Dauer (Std/Min) KOPD String
*
* @return String
*/
public String getOpDauer(){
return (getFieldValue(getSectionTextPath("KOPD")));
}
/**
* Leistung/Fragestellung Aufenthaltsdauer (in Tagen) KOPAUF String
*
* @return String
*/
public String getAufenthaltsdauer(){
return (getFieldValue(getSectionTextPath("KOPAUF")));
}
/**
* Leistung/Fragestellung Operateur KOPERATEUR String
*
* @return String
*/
public String getOperateur(){
return (getFieldValue(getSectionTextPath("KOPERATEUR")));
}
/**
* Leistung/Fragestellung OP-Assistent KOPASSISTANT String
*
* @return String
*/
public String getOpAssitent(){
return (getFieldValue(getSectionTextPath("KOPASSISTANT")));
}
/**
* Leistung/Fragestellung Instrumente KINSTRUMENT Selekion aus Liste: Verfügbare Instrumente
* abhängig von Leistung
*
* @return String
*/
public String getInstrumente(){
return formatString(getFieldValue(getSectionTextPath("KINSTRUMENT"), true));
}
/**
* Leistung/Fragestellung Lagerung KLAGERUNG Selekion aus Liste: Verfügbare Lagerungen abhängig
* von Leistung
*
* @return String
*/
public String getLagerung(){
return formatString(getFieldValue(getSectionTextPath("KLAGERUNG"), true));
}
/**
* Leistung/Fragestellung Anästhesie KANÄSTHESIE Selekion aus Liste: Verfügbare Anästhesie
* abhängig von Leistung
*
* @return String
*/
public String getAnaesthesie(){
return formatString(getFieldValue(getSectionTextPath("KANÄSTHESIE"), true));
}
/**
* Leistung/Fragestellung Bitte zur Anästhesieprechstunde aufbieten KANÄSTHESIEAUFBIETEN
* [ja|nein|unbekannt]
*
* @return String
*/
public Options getAnaesthesieSprechstunde(){
return (getFieldValueOptions(getSectionTextPath("KANÄSTHESIEAUFBIETEN")));
}
/**
* docbox Generell Beilagen ATT String
*/
public String[] getAttachments(){
return getFieldValues("//cda:ClinicalDocument/cda:component/cda:structuredBody/cda:component/cda:section[cda:code[@nullFlavor='NA']/cda:translation[@code='ATT' and (@codeSystem='"
+ getOidDocboxSectionId()
+ "' or @codeSystem='"
+ getOidDocboxSectionIdOld()
+ "')]]/cda:text/cda:linkHtml");
}
/**
* docbox Spitalkommunikation DocumentID DOCID String
*
* @return String
*/
public String getDocumentIdInSection(){
return getFieldValue(getSectionTextPath("DOCID"));
}
/**
* docbox Spitalkommunikation Datum Aufgebot MDATUMAUFGEBOT [JJJJMMTThhmmss]
*
* @return String
*/
public String getDatumAufgebot(){
return getFieldValue(getSectionTextPath("MDATUMAUFGEBOT"));
}
/**
* docbox Spitalkommunikation Änderung Datum Aufgebot MDATUMAUFGEBOTÄNDERUNG [JJJJMMTThhmmss]
*
* @return String
*/
public String getDatumAufgebotAenderung(){
return getFieldValue(getSectionTextPath("MDATUMAUFGEBOTÄNDERUNG"));
}
/**
* docbox Spitalkommunikation Datum Eintritt MDATUMEINTRITT [JJJJMMTThhmmss]
*
* @return String
*/
public String getDatumEintritt(){
return getFieldValue(getSectionTextPath("MDATUMEINTRITT"));
}
/**
* docbox Spitalkommunikation Datum Storno Eintritt MDATUMSTORNOEINTRITT [JJJJMMTThhmmss]
*
* @return String
*/
public String getDatumStornoEintritt(){
return getFieldValue(getSectionTextPath("MDATUMSTORNOEINTRITT"));
}
/**
* docbox Spitalkommunikation Datum Austritt MDATUMAUSRITT [JJJJMMTThhmmss]
*
* @return String
*/
public String getDatumAustritt(){
return getFieldValue(getSectionTextPath("MDATUMAUSRITT"));
}
/**
* docbox Spitalkommunikation Datum Storno Austritt MDATUMSTORNOAUSTRITT [JJJJMMTThhmmss]
*
* @return String
*/
public String getDatumStornoAustritt(){
return getFieldValue(getSectionTextPath("MDATUMSTORNOAUSTRITT"));
}
private Element getId(String root, String extension, String prefix){
Element id = getElement("id", prefix);
id.setAttribute("root", root);
id.setAttribute("extension", extension);
return id;
}
private Element getElement(String name, String prefix){
Element element = doc.createElementNS("urn:hl7-org:v3", name);
element.setPrefix(prefix);
return element;
}
/**
* <cda:author> <cda:time/> <cda:assignedAuthor> <cda:id extension='docboxid'
* root='2.25.327919736312109525688528068157180855579.1.1'/> <cda:id extension='eancode'
* root='1.3.88'/> <cda:assignedPerson> <cda:name> <cda:given>Carsten</cda:given>
* <cda:family>Flöter</cda:family> </cda:name> </cda:assignedPerson> </cda:assignedAuthor>
* </cda:author>
*/
private Node getId(NodeList nodeList, String root){
for (int i = 0; i < nodeList.getLength(); ++i) {
Node node = nodeList.item(i);
Node attribute = node.getAttributes().getNamedItem("root");
if (attribute == null) {
return null;
}
String value = attribute.getNodeValue();
if (root.equals(value)) {
return node;
}
}
return null;
}
/**
* adds the author information to the current dom object
*
* @param docboxId
* @param eanCode
* @param firstName
* @param lastName
* @return true if successfull, false if there was a mismatch, attention: part of dom
* modifications before are still done, so document needs to be reloaded with
* setPatientDocument if wanted
*
*/
public boolean addAuthorToDocument(String docboxId, String eanCode, String firstName,
String lastName){
// create author tag
NodeList nodeList = doc.getElementsByTagNameNS("urn:hl7-org:v3", "author");
String prefix = "";
Element author = null;
if (nodeList.getLength() == 0) {
// we do not have an author tag yet, we have to create on
NodeList listRecordTargets =
doc.getElementsByTagNameNS("urn:hl7-org:v3", "recordTarget");
if (listRecordTargets.getLength() == 0) {
return false;
}
Node recordTarget = listRecordTargets.item(listRecordTargets.getLength() - 1);
prefix = recordTarget.getPrefix();
author = getElement("author", prefix);
if (recordTarget.getNextSibling() == null) {
recordTarget.getParentNode().appendChild(author);
} else {
recordTarget.getParentNode().insertBefore(author, recordTarget.getNextSibling());
}
} else {
author = (Element) nodeList.item(0);
prefix = author.getPrefix();
}
getOrCreateChild(author, "time", prefix, true);
Element assignedAuthor = getOrCreateChild(author, "assignedAuthor", prefix, false);
nodeList = assignedAuthor.getElementsByTagNameNS("urn:hl7-org:v3", "id");
if (docboxId != null) {
Node node = getId(nodeList, getOidUserDocboxId());
if (node == null) {
Element idDocbox = getId(getOidUserDocboxId(), docboxId, prefix);
if (assignedAuthor.getFirstChild() == null) {
assignedAuthor.appendChild(idDocbox);
} else {
assignedAuthor.insertBefore(idDocbox, assignedAuthor.getFirstChild());
}
} else {
if (!docboxId.equals(node.getAttributes().getNamedItem("extension").getNodeValue())) {
return false;
}
}
}
if (eanCode != null) {
Node node = getId(nodeList, oid_ean);
if (node == null) {
Element idEanCode = getId(oid_ean, eanCode, prefix);
if (assignedAuthor.getFirstChild() == null) {
assignedAuthor.appendChild(idEanCode);
} else {
assignedAuthor.insertBefore(idEanCode, assignedAuthor.getFirstChild());
}
} else {
if (!eanCode.equals(node.getAttributes().getNamedItem("extension").getNodeValue())) {
return false;
}
}
}
Element assignedPerson = getOrCreateChild(assignedAuthor, "assignedPerson", prefix, false);
Element name = getOrCreateChild(assignedPerson, "name", prefix, false);
Element given = getOrCreateChild(name, "given", prefix, false);
if (given.getLastChild() != null && firstName != null) {
if (!firstName.equals(given.getLastChild().getNodeValue())) {
// maybe just a warning?
// return false;
}
} else {
if (firstName != null) {
given.appendChild(doc.createTextNode(firstName));
}
}
Element family = getOrCreateChild(name, "family", prefix, false);
if (family.getLastChild() != null && lastName != null) {
if (!lastName.equals(family.getLastChild().getNodeValue())) {
// maybe just a warning?
// return false;
}
} else {
if (lastName != null) {
family.appendChild(doc.createTextNode(lastName));
}
}
return true;
}
/**
* adds the custodian information to the current dom object
*
* @param docboxId
* @param organizationId
* @param name
* @return true if successfull, false if there was a mismatch, attention: part of dom
* modifications before are still done, so document needs to be reloaded with
* setPatientDocument if wanted
*
*/
public boolean addCustodianToDocument(String docboxId, String organizationId, String name){
NodeList nodeList = doc.getElementsByTagNameNS("urn:hl7-org:v3", "custodian");
String prefix = "";
Element custodian = null;
if (nodeList.getLength() == 0) {
// we do not have an author tag yet, we have to create on
NodeList listAuthors = doc.getElementsByTagNameNS("urn:hl7-org:v3", "author");
if (listAuthors.getLength() == 0) {
return false;
}
Node author = listAuthors.item(listAuthors.getLength() - 1);
prefix = author.getPrefix();
custodian = getElement("custodian", prefix);
if (author.getNextSibling() == null) {
author.getParentNode().appendChild(custodian);
} else {
author.getParentNode().insertBefore(custodian, author.getNextSibling());
}
} else {
custodian = (Element) nodeList.item(0);
prefix = custodian.getPrefix();
}
Element assignedCustodian = getOrCreateChild(custodian, "assignedCustodian", prefix, false);
Element representedCustodian =
getOrCreateChild(assignedCustodian, "representedCustodianOrganization", prefix, false);
nodeList = representedCustodian.getElementsByTagNameNS("urn:hl7-org:v3", "id");
if (docboxId != null) {
Node node = getId(nodeList, getOidUserDocboxId());
if (node == null) {
Element idDocbox = getId(getOidUserDocboxId(), docboxId, prefix);
if (representedCustodian.getFirstChild() == null) {
representedCustodian.appendChild(idDocbox);
} else {
representedCustodian.insertBefore(idDocbox,
representedCustodian.getFirstChild());
}
} else {
if (!docboxId.equals(node.getAttributes().getNamedItem("extension").getNodeValue())) {
return false;
}
}
}
if (organizationId != null) {
Node node = getId(nodeList, getOidOrganizationId());
if (node == null) {
Element idEanCode = getId(getOidOrganizationId(), organizationId, prefix);
if (representedCustodian.getFirstChild() == null) {
representedCustodian.appendChild(idEanCode);
} else {
representedCustodian.insertBefore(idEanCode,
representedCustodian.getFirstChild());
}
} else {
if (!organizationId.equals(node.getAttributes().getNamedItem("extension")
.getNodeValue())) {
return false;
}
}
}
NodeList listNames = representedCustodian.getElementsByTagNameNS("urn:hl7-org:v3", "name");
if (listNames.getLength() == 0) {
Element nameElement = getOrCreateChild(representedCustodian, "name", prefix, false);
if (name != null) {
nameElement.appendChild(doc.createTextNode(name));
}
}
return true;
}
private Element getOrCreateChild(Element parent, String childName, String prefix, boolean first){
NodeList nodeList = parent.getElementsByTagNameNS("urn:hl7-org:v3", childName);
Element child = null;
if (nodeList.getLength() > 0) {
child = (Element) nodeList.item(0);
} else {
child = getElement(childName, prefix);
if (!first || parent.getFirstChild() == null) {
parent.appendChild(child);
} else {
parent.insertBefore(child, parent.getFirstChild());
}
}
return child;
}
public String getDocumentSerialized(){
// Serialisation through Tranform.
StringWriter stringWriter = new StringWriter();
DOMSource domSource = new DOMSource(doc);
StreamResult streamResult = new StreamResult(stringWriter);
TransformerFactory tf = TransformerFactory.newInstance();
Transformer serializer;
try {
serializer = tf.newTransformer();
} catch (TransformerConfigurationException e) {
e.printStackTrace();
return null;
}
serializer.setOutputProperty(OutputKeys.ENCODING, "UTF8");
try {
serializer.transform(domSource, streamResult);
} catch (TransformerException e) {
e.printStackTrace();
return null;
}
return stringWriter.toString();
}
public boolean isCdaDocboxType(final DOCBOXCDATYPE docboxCdaType){
return docboxCdaType.name().equals(
getFieldValue("//cda:ClinicalDocument/cda:templateId[@root='" + oid_docbox
+ "' or @root='" + oid_docbox_old + "']/@extension"));
}
public boolean isCdaDocboxSpitalArzt(){
return isCdaDocboxType(DOCBOXCDATYPE.Docbox_Spital_Arzt);
}
public boolean isCdaDocboxSpitalAnmeldung(){
return isCdaDocboxType(DOCBOXCDATYPE.Docbox_Spital_Anmeldung);
}
public boolean isCdaDocboxTeminvereinbarung(){
return isCdaDocboxType(DOCBOXCDATYPE.Docbox_Terminvereinbarung);
}
public boolean isCdaDocboxArztArzt(){
return isCdaDocboxType(DOCBOXCDATYPE.Docbox_Arzt_Arzt);
}
}