/*******************************************************************************
* Copyright (c) 2007-2009, 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
* A. Kaufmann - Allow extraction of single fields and of first occurance
* A. Kaufmann - copied from befunde-Plugin and adapted to new data structure
* P. Chaubert - adapted to Messwerte V2
* medshare GmbH - adapted to Messwerte V2.1 in February 2012
*
*******************************************************************************/
package com.hilotec.elexis.messwerte.v2.data;
import java.util.ArrayList;
import java.util.List;
import ch.elexis.core.data.interfaces.IDataAccess;
import ch.elexis.data.Patient;
import ch.elexis.data.PersistentObject;
import ch.rgw.tools.Result;
import ch.rgw.tools.TimeTool;
import com.hilotec.elexis.messwerte.v2.data.typen.IMesswertTyp;
import com.hilotec.elexis.messwerte.v2.data.typen.MesswertTypData;
public class DataAccessor implements IDataAccess {
MessungKonfiguration config;
public DataAccessor(){
config = MessungKonfiguration.getInstance();
}
/**
* Retourniert Platzhalter für die Integration im Textsystem.
*
* @return
*/
private String getPlatzhalter(final MessungTyp typ){
return typ.getName();
}
/**
* Liste mit den verfuegbaren Messungstypen holen
*/
public List<Element> getList(){
ArrayList<Element> ret = new ArrayList<Element>();
for (MessungTyp typ : config.getTypes()) {
ret.add(new IDataAccess.Element(IDataAccess.TYPE.STRING, typ.getName(),
getPlatzhalter(typ), Patient.class, 1));
}
return ret;
}
/**
* Spaltentitel fuer Tabelle mit bestimmten Messtyp in Array eintragen
*/
private void spaltentitelEintragen(MessungTyp typ, String[] ziel){
List<IMesswertTyp> feldtypen = typ.getMesswertTypen();
int i = 0;
for (IMesswertTyp dft : feldtypen) {
ziel[i++] = dft.getTitle();
}
}
/**
* Aus Liste von Messungen Result-Objekt(Tabelle) erstellen
*/
private Result<Object> erstelleResultTabelle(MessungTyp typ, List<Messung> messungen){
String values[][] = new String[messungen.size() + 1][typ.getMesswertTypen().size() + 1];
// Spaltenueberschriften in erste Zeile eintragen
spaltentitelEintragen(typ, values[0]);
// Messwerte in Array einfuellen
int i = 1;
for (Messung messung : messungen) {
int j = 0;
values[i][j++] = messung.getDatum();
for (Messwert wert : messung.getMesswerte()) {
values[i][j++] = wert.getDarstellungswert();
}
i++;
}
return new Result<Object>(values);
}
/**
* Bestimmte Messung in Liste finden
*
* @param suchbegriff
* Entweder ein Datum, "first" fuer die aelteste Messung oder "last" fuer die Neuste.
*/
private Messung sucheMessung(List<Messung> messungen, String suchbegriff){
Messung messung = null;
if (messungen.size() == 0) {
return null;
}
if (suchbegriff.matches(Messages.DataAccessor_FilterLast)
|| suchbegriff.matches(Messages.DataAccessor_FilterFirst)) {
TimeTool lowerbound = new TimeTool(TimeTool.BEGINNING_OF_UNIX_EPOCH);
TimeTool upperbound = new TimeTool(TimeTool.END_OF_UNIX_EPOCH);
int factor = 1;
if (suchbegriff.matches(Messages.DataAccessor_FilterLast)) {
if (suchbegriff.matches(Messages.DataAccessor_FilterLastBefore)) {
upperbound = new TimeTool(suchbegriff.substring(11));
upperbound.addSeconds(-1);
}
} else {
factor = -1;
if (suchbegriff.matches(Messages.DataAccessor_FilterFirstSince)) {
lowerbound = new TimeTool(suchbegriff.substring(11));
}
}
TimeTool cur = null;
for (Messung m : messungen) {
TimeTool vgl = new TimeTool(m.getDatum());
if ((vgl.compareTo(lowerbound) >= 0) && (vgl.compareTo(upperbound) <= 0)
&& ((cur == null) || (cur.compareTo(vgl) * factor <= 0))) {
messung = m;
cur = vgl;
}
}
} else {
// Bestimmte Messung suchen
TimeTool find = new TimeTool();
if (find.set(suchbegriff) == false) {
return null;
}
for (Messung m : messungen) {
TimeTool vgl = new TimeTool(m.getDatum());
if (vgl.isEqual(find)) {
messung = m;
break;
}
}
}
return messung;
}
/**
* Bestimmten Messwert, oder eine ganze Messung holen
*/
public Result<Object> getObject(final String descriptor,
final PersistentObject dependentObject, final String dates, final String[] params){
if (!(dependentObject instanceof Patient)) {
return new Result<Object>(Result.SEVERITY.ERROR, IDataAccess.INVALID_PARAMETERS,
Messages.DataAccessor_InvalidParameter, dependentObject, true);
}
Patient patient = (Patient) dependentObject;
String[] parts = descriptor.split("\\."); //$NON-NLS-1$
String messungsname = parts[0];
String[] feldnamen = null;
if (parts.length > 1) {
feldnamen = new String[parts.length - 1];
for (int i = 0; i < feldnamen.length; i++) {
feldnamen[i] = parts[i + 1];
}
}
MessungTyp typ = config.getTypeByName(messungsname);
if (typ == null) {
return new Result<Object>(Result.SEVERITY.ERROR, IDataAccess.OBJECT_NOT_FOUND,
Messages.DataAccessor_InvalidMeasureType + messungsname, messungsname, true);
}
// Spaltenueberschriften fuer Tabelle holen
// Alle Messungen dieses Patienten und Typs holen
List<Messung> messungen = Messung.getPatientMessungen(patient, typ);
Messung messung = null;
if (dates.equals(Messages.DataAccessor_FilterAll)) {
// Tabelle mit allen Messungen zurueckgeben
return erstelleResultTabelle(typ, messungen);
} else {
messung = sucheMessung(messungen, dates);
}
// Schade, war wohl nichts...
if (messung == null) {
return new Result<Object>(Result.SEVERITY.ERROR, IDataAccess.OBJECT_NOT_FOUND,
Messages.DataAccessor_NotFound + descriptor + "." + dates, params, true); //$NON-NLS-2$ //$NON-NLS-1$
}
// Wir haben eine passende Messung gefunden. Jetzt gibt es zwei
// verschiedene Moeglichkeiten, entweder ein bestimmtes Feld wird
// erwartet, oder wir geben den Kram als Tabelle zurueck.
// TODO: Im Moment kommen nur "einstellige" Feldnamen in Frage, sobald
// aber Referenzen eingefuehrt werden, wird sowas durchaus
// notwendig sein.
if (feldnamen == null) {
// Tablelle mit allen Messwerten
ArrayList<Messung> liste = new ArrayList<Messung>();
liste.add(messung);
return erstelleResultTabelle(typ, liste);
} else if ("record_date".equals(feldnamen[0])) {
return new Result<Object>(messung.getDatum());
}
Messwert messwert = messung.getMesswert(feldnamen[0]);
for (int i = 1; (i < feldnamen.length) && (messwert != null); i++) {
if (!(messwert.getTyp() instanceof MesswertTypData)) {
return new Result<Object>(Result.SEVERITY.ERROR, IDataAccess.OBJECT_NOT_FOUND,
Messages.DataAccessor_NoDataField, params, true);
}
MesswertTypData t = (MesswertTypData) messwert.getTyp();
Messung m = t.getMessung(messwert);
messwert = m.getMesswert(feldnamen[i]);
}
if (messwert == null) {
return new Result<Object>(Result.SEVERITY.ERROR, IDataAccess.OBJECT_NOT_FOUND,
Messages.DataAccessor_InvalidFieldName, params, true);
}
return new Result<Object>(messwert.getDarstellungswert());
}
public String getDescription(){
return Messages.DataAccessor_DataDescription;
}
public String getName(){
return Messages.DataAccessor_Title;
}
}