/*******************************************************************************
* 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
* D. Lutz - extended table
*******************************************************************************/
package ch.elexis.icpc;
import java.util.ArrayList;
import java.util.Hashtable;
import java.util.List;
import java.util.Map;
import ch.elexis.core.data.activator.CoreHub;
import ch.elexis.core.constants.StringConstants;
import ch.elexis.core.data.interfaces.IDiagnose;
import ch.elexis.data.Patient;
import ch.elexis.data.PersistentObject;
import ch.elexis.data.Query;
import ch.rgw.tools.JdbcLink;
import ch.rgw.tools.StringTool;
import ch.rgw.tools.VersionInfo;
public class Episode extends PersistentObject implements Comparable<Episode> {
public static final String FLD_PATIENT_ID = "PatientID";
public static final String FLD_STATUS = "Status";
public static final String FLD_NUMBER = "Number";
public static final String FLD_START_DATE = "StartDate";
public static final String FLD_TITLE = "Title";
public static final int INACTIVE = 0;
public static final int ACTIVE = 1;
protected static final String VERSION = "0.4.2";
protected final static String TABLENAME = "CH_ELEXIS_ICPC_EPISODES";
protected static final String INACTIVE_VALUE = "0";
protected static final String ACTIVE_VALUE = "1";
private final static String createDB = "CREATE TABLE " + TABLENAME + " ("
+ "ID VARCHAR(25)," + "lastupdate BIGINT," + "deleted CHAR(1) default '0',"
+ "PatientID VARCHAR(25)," + "Title VARCHAR(256)," + "StartDate VARCHAR(20)," + // date
// of
// first
// occurrence;
// may be simply a year or
// any text
"Number VARCHAR(10)," + // number for individual, possibly hierarchical,
// organization
"Status CHAR(1) DEFAULT '1'," + // status, '1' == active, '0' == inactive
"ExtInfo BLOB" + ");" +
"CREATE INDEX " + TABLENAME + "1 ON " + TABLENAME + " (PatientID);" +
"INSERT INTO " + TABLENAME + " (ID,Title) VALUES ('1'," + JdbcLink.wrap(VERSION) + ");";
private static final String LINKNAME = TABLENAME + "_DIAGNOSES_LINK";
private final static String createLink = "CREATE TABLE " + LINKNAME + " ("
+ "ID VARCHAR(25)," + "lastupdate BIGINT," + "deleted char(1) default '0',"
+ "Episode VARCHAR(25)," + "Diagnosis VARCHAR(80)" + ");";
private static final String upd041 = "ALTER TABLE " + TABLENAME + " add lastupdate BIGINT;"
+ "ALTER TABLE " + LINKNAME + " ADD lastupdate BIGINT;";
private static final String upd042 = "CREATE INDEX " + TABLENAME + "2 ON " + TABLENAME
+ " (Title);";
static {
addMapping(TABLENAME, FLD_PATIENT_ID, FLD_TITLE, FLD_START_DATE, FLD_NUMBER, FLD_STATUS,
FLD_EXTINFO, "DiagLink=JOINT:Diagnosis:Episode:" + LINKNAME);
JdbcLink j = getConnection();
Episode version = load(StringConstants.ONE);
if (!version.exists()) {
createOrModifyTable(createDB);
createOrModifyTable(createLink);
} else {
VersionInfo vi = new VersionInfo(version.get(FLD_TITLE));
if (vi.isOlder(VERSION)) {
if (vi.isOlder("0.2.0")) {
j.exec(j.translateFlavor("ALTER TABLE " + TABLENAME
+ " ADD deleted CHAR(1) default '0';"));
version.set(FLD_TITLE, VERSION);
}
if (vi.isOlder("0.3.0")) {
String sql;
// add column StartDate
sql = "ALTER TABLE " + TABLENAME + " ADD StartDate VARCHAR(20);";
j.exec(j.translateFlavor(sql));
// add column Number
sql = "ALTER TABLE " + TABLENAME + " ADD Number VARCHAR(10);";
j.exec(j.translateFlavor(sql));
// add column Status
sql = "ALTER TABLE " + TABLENAME + " ADD Status CHAR(1) DEFAULT '1';";
j.exec(j.translateFlavor(sql));
version.set(FLD_TITLE, VERSION);
}
if (vi.isOlder("0.3.1")) {
String sql = "ALTER TABLE " + TABLENAME + " ADD ExtInfo BLOB;";
j.exec(j.translateFlavor(sql));
version.set(FLD_TITLE, VERSION);
}
if (vi.isOlder("0.3.2")) {
String sql = "ALTER TABLE " + TABLENAME + " MODIFY Title VARCHAR(256);";
j.exec(j.translateFlavor(sql));
version.set(FLD_TITLE, VERSION);
}
if (vi.isOlder("0.4.0")) {
createOrModifyTable(createLink);
version.set(FLD_TITLE, VERSION);
}
if (vi.isOlder("0.4.1")) {
createOrModifyTable(upd041);
version.set(FLD_TITLE, VERSION);
}
if (vi.isOlder("0.4.2")) {
createOrModifyTable(upd042);
version.set(FLD_TITLE, VERSION);
}
}
}
}
public Episode(final Patient pat, final String title){
create(null);
set(new String[] {
FLD_PATIENT_ID, FLD_TITLE
}, pat.getId(), title);
}
public static Episode findEpisode(Patient pat, String title){
Query<Episode> qbe = new Query<Episode>(Episode.class);
qbe.add(FLD_PATIENT_ID, Query.EQUALS, pat.getId());
qbe.add(FLD_TITLE, Query.EQUALS, title);
List<Episode> result = qbe.execute();
if (result == null || result.size() == 0) {
return null;
}
return result.get(0);
}
@Override
public String getLabel(){
String title = get(FLD_TITLE);
// String startDate = get("StartDate");
String number = get(FLD_NUMBER);
int status = getStatus();
StringBuffer sb = new StringBuffer();
/*
* if (!StringTool.isNothing(startDate)) { sb.append(startDate); sb.append(": "); }
*/
if (!StringTool.isNothing(number)) {
sb.append(number).append(": ");
}
sb.append(title);
/*
* if (!StringTool.isNothing(number)) { sb.append(" (" + number + ")"); }
*/
if (status == INACTIVE) {
sb.append(" [" + getStatusText() + "]");
}
return sb.toString();
}
public List<IDiagnose> getDiagnoses(){
List<String[]> res = getList("DiagLink", null);
List<IDiagnose> ret = new ArrayList<IDiagnose>(res.size());
for (String[] diag : res) {
IDiagnose id = (IDiagnose) CoreHub.poFactory.createFromString(diag[0]);
if (id != null) {
ret.add(id);
}
}
return ret;
}
public void addDiagnosis(final IDiagnose id){
String clazz = id.getClass().getName();
addToList("DiagLink", clazz + "::" + id.getCode(), new String[0]);
}
public void removeDiagnosis(final IDiagnose id){
String clazz = id.getClass().getName();
removeFromList("DiagLink", clazz + "::" + id.getCode());
}
@Override
protected String getTableName(){
return TABLENAME;
}
public static Episode load(final String id){
return new Episode(id);
}
protected Episode(final String id){
super(id);
}
protected Episode(){}
@Override
public boolean isDragOK(){
return true;
}
public Patient getPatient(){
String id = get(FLD_PATIENT_ID);
Patient patient = Patient.load(id);
return patient;
}
/**
* Get the status of an episode
*
* @return Episode.ACTIVE or Episode.INACTIVE
*/
public int getStatus(){
String statusText = get(FLD_STATUS);
if ((statusText != null) && statusText.equals(ACTIVE_VALUE)) {
return ACTIVE;
} else {
return INACTIVE;
}
}
/**
* Get the status localized text
*
* @return the status as localized text
*/
public String getStatusText(){
int status = getStatus();
if (status == ACTIVE) {
return Messages.Active;
} else {
return Messages.Inactive;
}
}
/**
* Set the status of an episode
*
* @param status
* Episode.ACTIVE or Episode.INACTIVE
*/
public void setStatus(final int status){
switch (status) {
case ACTIVE:
set(FLD_STATUS, ACTIVE_VALUE);
break;
case INACTIVE:
set(FLD_STATUS, INACTIVE_VALUE);
break;
default:
set(FLD_STATUS, ACTIVE_VALUE);
break;
}
}
public int compareTo(final Episode e2){
VersionInfo v1 = new VersionInfo(get(FLD_NUMBER));
VersionInfo v2 = new VersionInfo(e2.get(FLD_NUMBER));
if (v1.isNewer(v2)) {
return 1;
} else if (v1.isOlder(v2)) {
return -1;
}
return 0;
}
public String getStartDate(){
return get(FLD_START_DATE);
}
public void setStartDate(final String startDate){
set(FLD_START_DATE, startDate);
}
public String getTitle(){
return get(FLD_TITLE);
}
public void setTitle(final String title){
set(FLD_TITLE, title);
}
public String getNumber(){
return get(FLD_NUMBER);
}
public void setNumber(final String number){
set(FLD_NUMBER, number);
}
@SuppressWarnings("unchecked")
public String getExtField(final String name){
Map extInfo = getMap(FLD_EXTINFO);
return (String) extInfo.get(name);
}
@SuppressWarnings("unchecked")
public void setExtField(final String name, final String text){
Map extInfo = getMap(FLD_EXTINFO);
extInfo.put(name, text);
setMap(FLD_EXTINFO, extInfo);
}
/**
* find an Episode with a given name
*
* @param name
* the name to find
* @return the Episode with that name or null if none or more than one exist
*/
public static Episode findEpisode(final String name){
List<Episode> res = new Query<Episode>(Episode.class, FLD_TITLE, name).execute();
if (res.size() == 1) {
return res.get(0);
}
return null;
}
}