/*******************************************************************************
* Copyright (c) 2015, Daniel Ludin
* 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:
* Daniel Ludin (ludin@hispeed.ch) - initial implementation
*******************************************************************************/
package ch.gpb.elexis.cst.data;
import java.util.ArrayList;
import java.util.List;
import ch.elexis.data.Patient;
/*
*
* DB Object for cstgroup_labitem_joint
*/
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;
/**
* @author daniel ludin ludin@swissonline.ch
* 27.06.2015
*
*/
public class CstProfile extends PersistentObject implements Comparable<CstProfile> {
private static final String TABLENAME = "cstprofiles";
public static final String VERSIONID = "VERSION";
public static final String VERSION = "3.0.0";
public static final String GROUP_ITEM_TABLENAME = "cstgroup_profile_joint";
public static final String ITEMRANKING = "itemsRanking";
public static final String ANZEIGETYP_RASTER = "Zeitraster";
public static final String ANZEIGETYP_MINIMAX = "Minimal/Maximal";
public static final String ANZEIGETYP_EFFEKTIV = "Effektiv";
public static final String KEY_AUSWAHLBEFUNDE = "Auswahlbefunde";
private JdbcLink j = getConnection();
final static String create = "CREATE TABLE " + TABLENAME + " ("
+ "`ID` VARCHAR(25) NOT NULL, "
+ "`lastupdate` BIGINT(20) NULL DEFAULT NULL, "
+ "`deleted` CHAR(1) NULL DEFAULT '0', "
+ "`KontaktID` VARCHAR(25) NULL DEFAULT NULL, "
+ "`MandantID` VARCHAR(25) NULL DEFAULT NULL, "
+ "`Name` VARCHAR(256) NULL DEFAULT NULL, "
+ "`Description` VARCHAR(256) NULL DEFAULT NULL, "
+ "`Icon` VARCHAR(25) NULL DEFAULT NULL, "
+ "`ValidFrom` CHAR(8) NULL DEFAULT NULL, "
+ "`ValidTo` CHAR(8) NULL DEFAULT NULL, "
+ "`Active` CHAR(1) NULL DEFAULT '1', "
+ "`Template` CHAR(1) NULL DEFAULT '0', "
+ "`OutputHeader` VARCHAR(256) NULL DEFAULT NULL, "
+ "`AusgabeRichtung` CHAR(1) NULL DEFAULT '0', "
+ "`Auswahlbefunde` BLOB NULL, "
+ "`itemsRanking` BLOB NULL, "
+ "`PlausibilityCheck` char(1) DEFAULT '0', "
+ "`AnzeigeTyp` VARCHAR(50) NULL DEFAULT NULL, "
+ "`CrawlBack` SMALLINT(6) NULL DEFAULT '180', "
+ "`DaySpan1` SMALLINT(6) NULL DEFAULT '720', "
+ "`DaySpan2` SMALLINT(6) NULL DEFAULT '360', "
+ "`DaySpan3` SMALLINT(6) NULL DEFAULT '0', "
+ "`Therapievorschlag` TEXT NULL, "
+ "`Period1DateStart` CHAR(8) NULL DEFAULT NULL, "
+ "`Period1DateEnd` CHAR(8) NULL DEFAULT NULL, "
+ "`Period2DateStart` CHAR(8) NULL DEFAULT NULL, "
+ "`Period2DateEnd` CHAR(8) NULL DEFAULT NULL, "
+ "`Period3DateStart` CHAR(8) NULL DEFAULT NULL, "
+ "`Period3DateEnd` CHAR(8) NULL DEFAULT NULL, "
+ "PRIMARY KEY (`ID`)) COLLATe='utf8_general_ci' ENGINE=InnoDB; "
+ "CREATE TABLE `cstgroup_profile_joint` ( "
+ "`ID` VARCHAR(25) NULL DEFAULT NULL, "
+ "`deleted` CHAR(1) NULL DEFAULT '0', "
+ "`lastupdate` BIGINT(20) NULL DEFAULT NULL, "
+ "`CstgroupID` VARCHAR(25) NULL DEFAULT NULL, "
+ "`ProfileID` VARCHAR(25) NULL DEFAULT NULL, "
+ "`Comment` TEXT NULL, "
+ "UNIQUE INDEX `CstgroupID` (`CstgroupID`, `ProfileID`)) "
+ "COLLAte='utf8_general_ci' ENGINE=InnoDB; "
+ "INSERT INTO "
+ TABLENAME +
" (ID, name) VALUES (" + JdbcLink.wrap(VERSIONID)
+ "," + JdbcLink.wrap(VERSION) + ");";
static {
addMapping(TABLENAME,
"name=Name",
"description=Description",
"icon=Icon",
"kontaktId=KontaktID",
"mandantId=MandantID",
"validFrom=ValidFrom",
"validTo=ValidTo",
"active=Active",
"template=Template",
"outputHeader=OutputHeader",
"ausgabeRichtung=AusgabeRichtung",
"itemsRanking=ItemsRanking",
"therapievorschlag=Therapievorschlag",
"diagnose=Diagnose",
"anzeigeTyp=AnzeigeTyp",
"plausibilityCheck=PlausibilityCheck",
"crawlBack=CrawlBack",
"daySpan1=DaySpan1",
"daySpan2=DaySpan2",
"daySpan3=DaySpan3",
"period1DateStart=Period1DateStart",
"period1DateEnd=Period1DateEnd",
"period2DateStart=Period2DateStart",
"period2DateEnd=Period2DateEnd",
"period3DateStart=Period3DateStart",
"period3DateEnd=Period3DateEnd",
"CstGroups=JOINT:CstgroupID:ProfileID:cstgroup_profile_joint");
if (!tableExists(TABLENAME)) {
createOrModifyTable(create);
log.debug("Creating table:\r\n" + create);
} else {
// load a Record whose ID is 'VERSION' there we set ItemID as Value
CstProfile version = load(VERSIONID);
VersionInfo vi = new VersionInfo(version.get("name"));
if (vi.isOlder(VERSION)) {
// we should update eg. with createOrModifyTable(update.sql);
// And then set the new version
/**/
/* TODO: this create seems to be unnecessary in other
* examples of PersistenObject implementations, check this
* */
// there is no version record yet, create it
if (version.getName() == null) {
version.create(VERSIONID);
}
version.set("name", VERSION);
}
}
}
public CstProfile() {
// TODO Auto-generated constructor stub
}
public CstProfile(final String id) {
super(id);
}
public static CstProfile load(final String id) {
return new CstProfile(id);
}
public CstProfile(String name, String description, String icon, String kontaktID, String mandantID,
String validFrom, String validTo, String active) {
CstProfile existing = getByNameAndPatientAndMandant(name, kontaktID, mandantID);
if (existing != null) {
throw new IllegalArgumentException(
String
.format("Mapping for origin id [%s] - [%s] already exists can not create multiple instances.", //$NON-NLS-1$
name, description));
}
create(null);
set("name", name);
set("description", description);
set("icon", icon);
set("kontaktId", kontaktID);
set("mandantId", mandantID);
set("validFrom", validFrom);
set("validTo", validTo);
set("active", active);
}
public CstProfile(String name, String description, String icon, String mandantID) {
//CstGroup existing = getByNameAndPatientAndMandant(name, kontaktID, mandantID);
CstProfile existing = getByNameAndMandant(name, mandantID);
if (existing != null) {
throw new IllegalArgumentException(
String
.format("Mapping for origin id [%s] - [%s] already exists can not create multiple instances.", //$NON-NLS-1$
name, description));
}
create(null);
set("name", name);
set("description", description);
set("icon", icon);
set("mandantId", mandantID);
}
public static CstProfile getByNameAndPatientAndMandant(String name, String kontaktId, String mandantId) {
Query<CstProfile> qbe = new Query<CstProfile>(CstProfile.class);
qbe.add("ID", Query.NOT_EQUAL, VERSIONID); //$NON-NLS-1$
qbe.add("name", Query.EQUALS, name);
qbe.add("kontaktId", Query.EQUALS, kontaktId);
qbe.add("mandantId", Query.EQUALS, mandantId);
List<CstProfile> res = qbe.execute();
if (res.isEmpty()) {
return null;
} else {
if (res.size() > 1) {
throw new IllegalArgumentException(String.format(
"There is already a category of name [%s] - [%s]", name));
}
return res.get(0);
}
}
public static CstProfile getByNameAndMandant(String name, String mandantId) {
Query<CstProfile> qbe = new Query<CstProfile>(CstProfile.class);
qbe.add("ID", Query.NOT_EQUAL, VERSIONID); //$NON-NLS-1$
qbe.add("name", Query.EQUALS, name);
qbe.add("mandantId", Query.EQUALS, mandantId);
List<CstProfile> res = qbe.execute();
if (res.isEmpty()) {
return null;
} else {
if (res.size() > 1) {
throw new IllegalArgumentException(String.format(
"There is already a category of name [%s] - [%s]", name));
}
return res.get(0);
}
}
/*
public static CstProfile getByNameAndPatient(String name, String kontaktId) {
Query<CstProfile> qbe = new Query<CstProfile>(CstProfile.class);
qbe.add("ID", Query.NOT_EQUAL, VERSIONID); //$NON-NLS-1$
qbe.add("name", Query.EQUALS, name);
qbe.add("profileId", Query.EQUALS, profileId);
List<CstProfile> res = qbe.execute();
if (res.isEmpty()) {
return null;
} else {
if (res.size() > 1) {
throw new IllegalArgumentException(String.format(
"There is already a category of name [%s] - [%s]", name));
}
return res.get(0);
}
}*/
/*
public static List<CstProfile> getByLabItemId(String labItemId) {
Query<CstProfile> qbe = new Query<CstProfile>(CstProfile.class);
qbe.add("ID", Query.NOT_EQUAL, VERSIONID);
qbe.add("itemId", Query.EQUALS, labItemId);
return qbe.execute();
}*/
/*
public static List<CstProfile> getCstGroups(Patient patient) {
Query<CstProfile> qbe = new Query<CstProfile>(CstProfile.class);
qbe.add("ID", Query.NOT_EQUAL, VERSIONID);
qbe.add("kontaktId", Query.EQUALS, patient.getId());
return qbe.execute();
}*/
public static List<CstProfile> getCstGroups(Patient patient, String mandantId) {
Query<CstProfile> qbe = new Query<CstProfile>(CstProfile.class);
qbe.add("ID", Query.NOT_EQUAL, VERSIONID);
qbe.add("mandantId", Query.EQUALS, mandantId);
qbe.add("kontaktId", Query.EQUALS, patient.getId());
return qbe.execute();
}
public static List<CstProfile> getAllProfiles(String mandantId) {
Query<CstProfile> qbe = new Query<CstProfile>(CstProfile.class);
qbe.add("ID", Query.NOT_EQUAL, VERSIONID);
qbe.add("mandantId", Query.EQUALS, mandantId);
qbe.orderBy(false, new String[] { "name" });
return qbe.execute();
}
/*
public static List<CstProfile> getCstGroups() {
Query<CstProfile> qbe = new Query<CstProfile>(CstProfile.class);
qbe.add("ID", Query.NOT_EQUAL, VERSIONID);
return qbe.execute();
}*/
/*
* TODO: this should be renamed, on this level, the objects are CstGroup instances
* so getCstGroups would be adequate
*/
public List<CstGroup> getCstGroups() {
List<String[]> lResp = getList("CstGroups", new String[0]);
ArrayList<CstGroup> ret = new ArrayList<CstGroup>(lResp.size());
for (String[] r : lResp) {
ret.add(CstGroup.load(r[0]));
}
return ret;
}
/*
* TODO: this should be renamed, on this level, the objects are CstGroup instances
* so removeCstGroup would be adequate
*/
public void removeCstGroup(final CstGroup a) {
for (CstGroup labitem : getCstGroups()) {
if (labitem.getId().equalsIgnoreCase(a.getId()))
removeFromList("CstGroups", a.getId());
}
}
public void addItem(CstGroup item) {
if (item != null && (item.state() == EXISTS)) {
// add item if it doesn't yet exists
String exists =
j.queryString("SELECT CstgroupID FROM " + GROUP_ITEM_TABLENAME + " WHERE ProfileID = "
+ getWrappedId() + " AND CstgroupID = " + item.getWrappedId());
if (StringTool.isNothing(exists)) {
StringBuffer sql = new StringBuffer();
sql.append("INSERT INTO " + GROUP_ITEM_TABLENAME + " (ProfileID, CstgroupID) VALUES (")
.append(getWrappedId()).append(",").append(item.getWrappedId()).append(")");
j.exec(sql.toString());
}
else {
log.error("CSTGroup " + item.getName() + " already exists in CSTProfile :" + this.getName());
throw new IllegalArgumentException(String.format(
"CSTGroup of name [%s] - [%s] already exists", item.getName()));
}
}
}
public void addItems(List<CstGroup> items) {
if (items != null) {
for (CstGroup item : items) {
addItem(item);
}
}
}
@Override
public boolean delete() {
getConnection().exec(
"DELETE FROM " + GROUP_ITEM_TABLENAME + " WHERE ProfileID =" + getWrappedId());
return super.delete();
}
public void setTherapievorschlag(String therapieVorschlag) {
set("therapievorschlag", therapieVorschlag);
}
public String getTherapievorschlag() {
return get("therapievorschlag");
}
public void setDiagnose(String diagnose) {
set("diagnose", diagnose);
}
public String getDiagnose() {
return get("diagnose");
}
public void setPlausibilityCheck(String plausibilitycheck) {
set("plausibilityCheck", plausibilitycheck);
}
public String getPlausibilityCheck() {
return get("plausibilityCheck");
}
public void setName(String name) {
set("name", name);
}
public String getName() {
return get("name");
}
public void setAnzeigeTyp(String anzeigeTyp) {
set("anzeigeTyp", anzeigeTyp);
}
public String getAnzeigeTyp() {
return get("anzeigeTyp");
}
public void setOutputHeader(String outputHeader) {
set("outputHeader", outputHeader);
}
public String getOutputHeader() {
return get("outputHeader");
}
// true = a4quer, false = a4hoch
public void setAusgabeRichtung(boolean ausgabeRichtung) {
if (ausgabeRichtung) {
set("ausgabeRichtung", "1");
} else {
set("ausgabeRichtung", "0");
}
}
/**
*
* @return true if A4 Quer, false if A4 Hoch
*/
public boolean getAusgabeRichtung() {
//return get("ausgabeRichtung");
if (get("ausgabeRichtung").equals("0")) {
return false;
}
else {
return true;
}
}
public void setDescription(String description) {
set("description", description);
}
public String getDescription() {
return get("description");
}
public void setKontaktId(String kontaktId) {
set("kontaktId", kontaktId);
}
public String getKontaktId() {
return get("kontaktId");
}
public void setMandantId(String mandantId) {
set("mandantId", mandantId);
}
public String getMandantId() {
return get("mandantId");
}
public void setCrawlBack(int crawlBack) {
setInt("crawlBack", crawlBack);
}
public int getCrawlBack() {
return getInt("crawlBack");
}
public void setDaySpan1(int daySpan1) {
setInt("daySpan1", daySpan1);
}
public int getDaySpan1() {
return getInt("daySpan1");
}
public void setDaySpan2(int daySpan2) {
setInt("daySpan2", daySpan2);
}
public int getDaySpan2() {
return getInt("daySpan2");
}
public void setDaySpan3(int daySpan3) {
setInt("daySpan3", daySpan3);
}
public int getDaySpan3() {
return getInt("daySpan3");
}
public void setPeriod1DateStart(String period1DateStart) {
set("period1DateStart", period1DateStart);
}
public String getPeriod1DateStart() {
return get("period1DateStart");
}
public void setPeriod1DateEnd(String period1DateEnd) {
set("period1DateEnd", period1DateEnd);
}
public String getPeriod1DateEnd() {
return get("period1DateEnd");
}
public void setPeriod2DateStart(String period2DateStart) {
set("period2DateStart", period2DateStart);
}
public String getPeriod2DateStart() {
return get("period2DateStart");
}
public void setPeriod2DateEnd(String period2DateEnd) {
set("period2DateEnd", period2DateEnd);
}
public String getPeriod2DateEnd() {
return get("period2DateEnd");
}
public void setPeriod3DateStart(String period3DateStart) {
set("period3DateStart", period3DateStart);
}
public String getPeriod3DateStart() {
return get("period3DateStart");
}
public void setPeriod3DateEnd(String period3DateEnd) {
set("period3DateEnd", period3DateEnd);
}
public String getPeriod3DateEnd() {
return get("period3DateEnd");
}
public void setIcon(byte[] icon) {
setBinary("icon", icon);
}
public byte[] getIcon() {
return getBinary("icon");
}
public void setValidFrom(String validFrom) {
set("validFrom", validFrom);
}
public void setValidTo(String validTo) {
set("validTo", validTo);
}
public void setActive(String active) {
set("active", active);
}
public void setTemplate(String template) {
set("template", template);
}
public String getValidFrom() {
return get("validFrom");
}
public String getValidTo() {
return get("validTo");
}
public String getActive() {
return get("active");
}
public String getTemplate() {
return get("template");
}
@Override
public String getLabel() {
// TODO Auto-generated method stub
return null;
}
@Override
protected String getTableName() {
return TABLENAME;
}
// for the View content provider
public Object getParent() {
return new Object();
}
@Override
public int compareTo(CstProfile profile) {
//return profile.getName().compareTo(this.getName());
return this.getName().compareTo(profile.getName());
}
}