/******************************************************************************* * Copyright (c) 2006-2010, G. Weirich and Elexis * 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 * * Contributors: * G. Weirich - initial implementation * *******************************************************************************/ package ch.elexis.core.ui.exchange.elements; import java.util.LinkedList; import java.util.List; import ch.elexis.core.model.prescription.EntryType; import ch.elexis.core.ui.exchange.XChangeContainer; import ch.elexis.core.ui.exchange.XChangeExporter; import ch.elexis.data.Brief; import ch.elexis.data.Fall; import ch.elexis.data.Konsultation; import ch.elexis.data.LabResult; import ch.elexis.data.Patient; import ch.elexis.data.PersistentObject; import ch.elexis.data.Prescription; import ch.elexis.data.Query; import ch.rgw.tools.StringTool; /** * THis represents the medical History of a given patient * * @author gerry * */ public class MedicalElement extends XChangeElement { public static final String XMLNAME = "medical"; private DocumentsElement eDocuments; private RisksElement eRisks; private AnamnesisElement elAnamnesis; private MedicationsElement eMedications; private RecordsElement eRecords; private AnalysesElement eAnalyses; public String getXMLName(){ return XMLNAME; } public MedicalElement asExporter(XChangeExporter parent, Patient p){ asExporter(parent); parent.getContainer().addMapping(this, p); add(new AnamnesisElement(parent)); Fall[] faelle = p.getFaelle(); for (Fall fall : faelle) { Konsultation[] kons = fall.getBehandlungen(false); for (Konsultation k : kons) { RecordElement record = new RecordElement().asExporter(parent, k); getAnamnesis().link(k, record); addRecord(record); } } Query<LabResult> qbe = new Query<LabResult>(LabResult.class); qbe.add(LabResult.PATIENT_ID, Query.EQUALS, p.getId()); List<LabResult> labs = qbe.execute(); if (labs != null) { for (LabResult lr : labs) { ResultElement.addResult(this, lr); } } Query<Brief> qb = new Query<Brief>(Brief.class); qb.add(LabResult.PATIENT_ID, Query.EQUALS, p.getId()); List<Brief> lBriefe = qb.execute(); if ((lBriefe != null) && (lBriefe.size()) > 0) { for (Brief b : lBriefe) { addDocument(new DocumentElement().asExporter(sender, b)); } } List<Prescription> medis = p.getMedication(EntryType.FIXED_MEDICATION); for (Prescription medi : medis) { add(new MedicationElement().asExporter(parent, medi)); } String risks = p.get(Patient.FLD_RISKS); //$NON-NLS-1$ if (!StringTool.isNothing(risks)) { for (String r : risks.split("[\\n\\r]+")) { add(new RiskElement().asExporter(sender, r)); } } risks = p.get(Patient.FLD_ALLERGIES); //$NON-NLS-1$ if (!StringTool.isNothing(risks)) { for (String r : risks.split("[\\n\\r]+")) { add(new RiskElement().asExporter(sender, r)); } } return this; } public void add(AnamnesisElement ae){ elAnamnesis = ae; super.add(ae); } public void add(RiskElement re){ if (eRisks == null) { eRisks = new RisksElement(); add(eRisks); getContainer().addChoice(eRisks, "Risiken"); } eRisks.add(re); } public void add(MedicationElement med){ if (eMedications == null) { eMedications = new MedicationsElement(); getContainer().addChoice(eMedications, Messages.MedicalElement_Medcaments); //$NON-NLS-1$ add(eMedications); } eMedications.add(med); } /** * Return or create the anamnesis-Element * * @return the newly created or existing anamnesis element */ public AnamnesisElement getAnamnesis(){ if (elAnamnesis == null) { elAnamnesis = (AnamnesisElement) getChild(AnamnesisElement.XMLNAME, AnamnesisElement.class); if (elAnamnesis == null) { elAnamnesis = new AnamnesisElement(getSender()); elAnamnesis.setReader(getReader()); } } return elAnamnesis; } /** * Add a medical record. This will create the records-parent element if neccessary * * @param rc * the RecordElement to add */ public void addRecord(RecordElement rc){ if (eRecords == null) { eRecords = (RecordsElement) getChild(XChangeContainer.ENCLOSE_RECORDS, RecordsElement.class); } if (eRecords == null) { eRecords = new RecordsElement(); eRecords.setReader(getReader()); eRecords.setWriter(getSender()); add(eRecords); getContainer().addChoice(eRecords, Messages.MedicalElement_EMREntries, eRecords); //$NON-NLS-1$ } eRecords.add(rc); } /** * Add a result * * @param le */ public void addAnalyse(ResultElement le){ if (eAnalyses == null) { eAnalyses = (AnalysesElement) getChild(FindingElement.ENCLOSING, AnalysesElement.class); } if (eAnalyses == null) { eAnalyses = new AnalysesElement(); add(eAnalyses); getContainer().addChoice(eAnalyses, Messages.MedicalElement_Findings, eAnalyses); //$NON-NLS-1$ } eAnalyses.add(le); } public void addFindingItem(FindingElement fe){ if (eAnalyses == null) { eAnalyses = (AnalysesElement) getChild(FindingElement.ENCLOSING, AnalysesElement.class); } if (eAnalyses == null) { eAnalyses = new AnalysesElement(); add(eAnalyses); getContainer().addChoice(eAnalyses, Messages.MedicalElement_Findings, eAnalyses); //$NON-NLS-1$ } eAnalyses.add(fe); } @SuppressWarnings("unchecked") public void addDocument(DocumentElement de){ if (eDocuments == null) { getContainer(); eDocuments = (DocumentsElement) getChild(XChangeContainer.ENCLOSE_DOCUMENTS, DocumentsElement.class); } if (eDocuments == null) { eDocuments = new DocumentsElement(); add(eDocuments); getContainer().addChoice(eDocuments, Messages.MedicalElement_Documents, eDocuments); //$NON-NLS-1$ } List<DocumentElement> lEx = (List<DocumentElement>) eDocuments.getChildren(DocumentElement.XMLNAME, DocumentElement.class); if (!lEx.contains(de)) { eDocuments.add(de); } } /************************* Load methods *******************************************/ @SuppressWarnings("unchecked") public List<RecordElement> getRecords(){ if (eRecords == null) { eRecords = (RecordsElement) getChild(XChangeContainer.ENCLOSE_RECORDS, RecordsElement.class); } if (eRecords != null) { List<RecordElement> records = (List<RecordElement>) eRecords.getChildren(RecordElement.XMLNAME, RecordElement.class); return records; } return null; } @SuppressWarnings("unchecked") public List<FindingElement> getAnalyses(){ if (eAnalyses == null) { eAnalyses = (AnalysesElement) getChild(XChangeContainer.ENCLOSE_FINDINGS, AnalysesElement.class); } if (eAnalyses != null) { List<FindingElement> analyses = (List<FindingElement>) eAnalyses.getChildren(FindingElement.XMLNAME, FindingElement.class); return analyses; } return new LinkedList<FindingElement>(); } @SuppressWarnings("unchecked") public List<DocumentElement> getDocuments(){ if (eDocuments == null) { eDocuments = (DocumentsElement) getChild(XChangeContainer.ENCLOSE_DOCUMENTS, DocumentsElement.class); } if (eDocuments != null) { List<DocumentElement> documents = (List<DocumentElement>) eDocuments.getChildren(DocumentElement.XMLNAME, DocumentElement.class); return documents; } return new LinkedList<DocumentElement>(); } public String toString(){ StringBuilder ret = new StringBuilder(); ret.append(getAnamnesis().toString()); List<RecordElement> records = getRecords(); for (RecordElement record : records) { ret.append("\n......\n").append(record.toString()); } return ret.toString(); } /** * Load medical data from xchange-file into patient * * @param context * the Patient * @return the patient */ public PersistentObject doImport(PersistentObject context){ Patient pat = Patient.load(context.getId()); AnamnesisElement elAnamnesis = getAnamnesis(); List<RecordElement> records = getRecords(); return pat; } }