/******************************************************************************* * Copyright (c) 2007-2011, 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 occurrence *******************************************************************************/ package ch.elexis.base.befunde; import java.util.ArrayList; import java.util.Hashtable; import java.util.List; import java.util.Map; import ch.elexis.befunde.Messwert; import ch.elexis.core.data.interfaces.IDataAccess; import ch.elexis.data.Patient; import ch.elexis.data.PersistentObject; import ch.elexis.data.Query; import ch.rgw.tools.Result; import ch.rgw.tools.StringTool; import ch.rgw.tools.TimeTool; /** * Access data stored in Befunde Access syntax is: Befunde-Data:Patient:all:BD * * @see ch.elexis.util.IDataAccess * @author gerry * */ public class DataAccessor implements IDataAccess { private static final String FIRST = "first";//$NON-NLS-1$ private static final String LAST = "last";//$NON-NLS-1$ private static final String ALL = "all"; //$NON-NLS-1$ private static final String PREFIX_DATE = "[Befunde-Data:Patient:-:"; private static final String PREFIX_FIRST = "[Befunde-Data:Patient:first:"; private static final String PREFIX_LAST = "[Befunde-Data:Patient:last:"; private static final String PREFIX_ALL = "[Befunde-Data:Patient:all:"; private static final String SUFFIX = "]"; Map<String, String> hash; Hashtable<String, String[]> columns; ArrayList<String> parameters; private TimeTool today; @SuppressWarnings("unchecked") public DataAccessor(){ Messwert setup = Messwert.getSetup(); columns = new Hashtable<String, String[]>(); parameters = new ArrayList<String>(); hash = setup.getMap(Messwert.FLD_BEFUNDE); String names = hash.get(Messwert.HASH_NAMES); if (!StringTool.isNothing(names)) { for (String n : names.split(Messwert.SETUP_SEPARATOR)) { String vals = hash.get(n + Messwert._FIELDS); if (vals != null) { vals = Messwert.FLD_DATE + Messwert.SETUP_SEPARATOR + vals; String[] flds = vals.split(Messwert.SETUP_SEPARATOR); parameters.add(n); columns.put(n, flds); } } } today = new TimeTool(); } public String getDescription(){ return Messages.getString("DataAccessor.dataInBefundePlugin"); //$NON-NLS-1$ } public String getName(){ return Messages.getString("DataAccessor.data"); //$NON-NLS-1$ } /** * A list of the available placeholders. <br> * For each available type of {@link Messwert} the following placeholders will be delivered * <p> * [Befunde-Data:Patient:-:TypeName:20150408] <br> * [Befunde-Data:Patient:first:TypeName]<br> * [Befunde-Data:Patient:last:TypeName]<br> * [Befunde-Data:Patient:all:TypeName] * </p> * * @return list of placeholders to be integrated */ public List<Element> getList(){ List<Element> ret = new ArrayList<Element>(parameters.size()); for (String n : parameters) { // placeholder for finding of specific date String placeholder = PREFIX_DATE + n + ":" + today.toString(TimeTool.DATE_COMPACT) + SUFFIX; String readableName = n + " - " + Messages.getString("DataAccessor.date"); ret.add(createElement(readableName, placeholder)); // placeholder for first finding placeholder = PREFIX_FIRST + n + SUFFIX; readableName = n + " - " + Messages.getString("DataAccessor.first"); ret.add(createElement(readableName, placeholder)); // placeholder for last finding placeholder = PREFIX_LAST + n + SUFFIX; readableName = n + " - " + Messages.getString("DataAccessor.last"); ret.add(createElement(readableName, placeholder)); // placeholder for all findings placeholder = PREFIX_ALL + n + SUFFIX; readableName = n + " - " + Messages.getString("DataAccessor.all"); ret.add(createElement(readableName, placeholder)); } return ret; } private IDataAccess.Element createElement(String readableName, String placeholder){ return new IDataAccess.Element(IDataAccess.TYPE.STRING, readableName, placeholder, Patient.class, 1); } /** * return the Object denoted by the given description * * @param descriptor * description of the data: dataname.row if row is omitted: all rows * @param dependentObject * ad this time, only Patient is supported * @param dates * one off all,first, last,date * @param params * not used */ public Result<Object> getObject(final String descriptor, final PersistentObject dependentObject, final String dates, final String[] params){ Result<Object> ret = null; if (!(dependentObject instanceof Patient)) { ret = new Result<Object>(Result.SEVERITY.ERROR, IDataAccess.INVALID_PARAMETERS, Messages.getString("DataAccessor.invalidParameter"), //$NON-NLS-1$ dependentObject, true); } else { Patient pat = (Patient) dependentObject; String[] data = descriptor.split("\\."); //$NON-NLS-1$ Query<Messwert> qbe = new Query<Messwert>(Messwert.class); qbe.add(Messwert.FLD_PATIENT_ID, Query.EQUALS, pat.getId()); qbe.add(Messwert.FLD_NAME, Query.EQUALS, data[0]); //$NON-NLS-1$ //$NON-NLS-2$ List<Messwert> list = qbe.execute(); String[][] values; String[] cols = columns.get(data[0]); String[] keys = new String[cols.length]; if (dates.equals(ALL)) { values = new String[list.size() + 1][cols.length]; } else { values = new String[2][cols.length]; } for (int i = 0; i < cols.length; i++) { // Spaltenüberschriften keys[i] = cols[i].split(Messwert.SETUP_CHECKSEPARATOR)[0]; values[0][i] = keys[i].split("=")[0]; //$NON-NLS-1$ } int i = 1; Messwert mwrt = null; if (dates.equals(ALL)) { for (Messwert m : list) { String date = m.get(Messwert.FLD_DATE); values[i][0] = new TimeTool(date).toString(TimeTool.DATE_GER); Map befs = m.getMap(Messages.getString("DataAccessor.0")); //$NON-NLS-1$ for (int j = 1; j < cols.length; j++) { String vv = (String) befs.get(keys[j]); values[i][j] = vv; if (values[i][j] == null) { values[i][j] = ""; //$NON-NLS-1$ } } i++; if (i > values.length) { break; } } ret = new Result<Object>(values); } else if (dates.equals(LAST)) { //$NON-NLS-1$ TimeTool today = new TimeTool(TimeTool.BEGINNING_OF_UNIX_EPOCH); for (Messwert m : list) { TimeTool vgl = new TimeTool(m.get(Messwert.FLD_DATE)); if (vgl.isAfter(today)) { today = vgl; mwrt = m; } } if (mwrt == null) { ret = new Result<Object>(Result.SEVERITY.ERROR, IDataAccess.OBJECT_NOT_FOUND, Messages.getString("DataAccessor.notFound"), //$NON-NLS-1$ params, true); } } else if (dates.equals(FIRST)) { //$NON-NLS-1$ TimeTool firstdate = null; if (list.size() > 0) { mwrt = list.get(0); firstdate = new TimeTool(mwrt.get(Messwert.FLD_DATE)); for (Messwert m : list) { TimeTool vgl = new TimeTool(m.get(Messwert.FLD_DATE)); if (vgl.isBefore(firstdate)) { mwrt = m; firstdate = vgl; break; } } } if (mwrt == null) { ret = new Result<Object>(Result.SEVERITY.ERROR, IDataAccess.OBJECT_NOT_FOUND, Messages.getString("DataAccessor.notFound"), //$NON-NLS-1$ params, true); } } else { // bestimmtes Datum TimeTool find = new TimeTool(); if (find.set(params[0]) == false) { ret = new Result<Object>(Result.SEVERITY.ERROR, IDataAccess.INVALID_PARAMETERS, Messages.getString("DataAccessor.dateExpected"), //$NON-NLS-1$ params, true); } else { for (Messwert m : list) { TimeTool vgl = new TimeTool(m.get(Messwert.FLD_DATE)); if (vgl.isEqual(find)) { mwrt = m; break; } } // no entry for this date found - display error with date and descriptor if (mwrt == null) { ret = new Result<Object>(Result.SEVERITY.ERROR, IDataAccess.OBJECT_NOT_FOUND, descriptor + " [" + find.toString(TimeTool.DATE_GER) + "] " + Messages.getString("DataAccessor.notFound"), //$NON-NLS-1$ params, true); } } } if (mwrt != null) { values[1][0] = mwrt.get(Messwert.FLD_DATE); Map befs = mwrt.getMap(Messwert.FLD_BEFUNDE); for (int j = 1; j < keys.length; j++) { values[1][j] = (String) befs.get(keys[j]); } // Nachsehen ob Feldnamen angegeben wurden, wenn ja geben wir // nur das gewuenschte Feld zurueck. if (data.length > 1) { String fname = data[1]; String num = fname.substring(1); // Bei Feldnamen in der Form Fn benutzen wir n als Index // sonst wird einfach die Spaltenueberschrift benutzt. // F0 entspricht dabei dem Datum if (fname.matches("F[0-9]*")) { //$NON-NLS-1$ int index = Integer.parseInt(num); if (index < values[1].length) { ret = new Result<Object>(values[1][index]); } else { ret = new Result<Object>( Result.SEVERITY.ERROR, IDataAccess.INVALID_PARAMETERS, Messages.getString("DataAccessor.invalidFieldIndex"), fname, true); //$NON-NLS-1$ } } else { for (int j = 0; (j < keys.length) && (ret == null); j++) { if (values[0][j].compareTo(fname) == 0) { ret = new Result<Object>(values[1][j]); } } if (ret == null) { ret = new Result<Object>( Result.SEVERITY.ERROR, IDataAccess.INVALID_PARAMETERS, Messages.getString("DataAccessor.invalidFieldName"), fname, true); //$NON-NLS-1$ } } } else { ret = new Result<Object>(values); } } } return ret; } }