/*******************************************************************************
* Copyright (c) 2008-2013, 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
* MEDEVIT <office@medevit.at> - major changes in 3.0
*******************************************************************************/
package ch.elexis.data;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import ch.elexis.core.model.ISticker;
import ch.rgw.tools.ExHandler;
import ch.rgw.tools.JdbcLink;
import ch.rgw.tools.JdbcLink.Stm;
/**
* Eine Markierung für im Prinzip beliebige Objekte. Ein Objekt, das eine Etikette hat, kann diese
* Etikette zur Darstellung verwenden
*
* @since 3.0.0 - division between core and Ui, see UiSticker class
*/
public class Sticker extends PersistentObject implements ISticker {
public static final String NAME = "Name";
public static final String TABLENAME = "ETIKETTEN";
public static final String FLD_LINKTABLE = "ETIKETTEN_OBJECT_LINK";
public static final String FLD_CLASSLINK = "ETIKETTEN_OBJCLASS_LINK";
public static final String FLD_BACKGROUND = "bg";
public static final String FLD_FOREGROUND = "vg";
public static final String FLD_IMAGE_ID = "BildID";
public static final String FLD_VALUE = "wert";
private static final String RGB_BLACK = "000000";
private static final String RGB_WHITE = "FFFFFF";
static final HashMap<Class<?>, List<Sticker>> cache = new HashMap<Class<?>, List<Sticker>>();
static {
addMapping(TABLENAME, DATE_COMPOUND, FLD_IMAGE_ID + "=Image",
FLD_FOREGROUND + "=foreground", FLD_BACKGROUND + "=background", NAME,
FLD_VALUE + "=importance");
}
public Sticker(String name, String fg, String bg){
create(null);
if (fg == null) {
fg = RGB_BLACK;
}
if (bg == null) {
bg = RGB_WHITE;
}
set(new String[] {
NAME, FLD_FOREGROUND, FLD_BACKGROUND
}, new String[] {
name, fg, bg
});
}
public static Sticker load(String id){
Sticker ret = new Sticker(id);
return ret;
}
protected Sticker(String id){
super(id);
}
protected Sticker(){}
@Override
public String getLabel(){
return get(NAME);
}
public int getWert(){
return checkZero(get(FLD_VALUE));
}
public void setWert(int w){
set(FLD_VALUE, Integer.toString(w));
}
@Override
protected String getTableName(){
return TABLENAME;
}
@Override
public boolean delete(){
StringBuilder sb = new StringBuilder();
sb.append("DELETE FROM ").append(Sticker.FLD_LINKTABLE).append(" WHERE ")
.append("etikette = '").append(getId()).append("'");
Stm stm = getDBConnection().getStatement();
try {
stm.exec(sb.toString());
} finally {
getDBConnection().releaseStatement(stm);
}
return super.delete();
}
public void setClassForSticker(Class<?> clazz){
StringBuilder sb = new StringBuilder();
sb.append("INSERT INTO " + FLD_CLASSLINK + " (objclass,sticker) VALUES (")
.append(JdbcLink.wrap(clazz.getName())).append(",").append(getWrappedId()).append(");");
Stm stm = getDBConnection().getStatement();
try {
stm.exec(sb.toString());
} finally {
getDBConnection().releaseStatement(stm);
}
}
public void removeClassForSticker(Class<?> clazz){
StringBuilder sb = new StringBuilder();
sb.append("DELETE FROM " + FLD_CLASSLINK + " WHERE objclass=")
.append(JdbcLink.wrap(clazz.getName())).append(" AND sticker=").append(getWrappedId());
Stm stm = getDBConnection().getStatement();
try {
stm.exec(sb.toString());
} finally {
getDBConnection().releaseStatement(stm);
}
}
private static String queryClassStickerString =
"SELECT objclass FROM " + Sticker.FLD_CLASSLINK + " WHERE sticker=?";
public List<String> getClassesForSticker(){
ArrayList<String> ret = new ArrayList<String>();
PreparedStatement queryClasses = null;
try {
queryClasses = getDBConnection().getPreparedStatement(queryClassStickerString);
queryClasses.setString(1, getId());
ResultSet res = queryClasses.executeQuery();
while (res.next()) {
ret.add(res.getString(1));
}
res.close();
} catch (Exception ex) {
ExHandler.handle(ex);
} finally {
getDBConnection().releasePreparedStatement(queryClasses);
}
return ret;
}
private static String queryStickerClassString =
"SELECT sticker FROM " + Sticker.FLD_CLASSLINK + " WHERE objclass=?";
/**
* Find all Stickers applicable for a given class
*
* @param clazz
* @return
*/
public static List<Sticker> getStickersForClass(Class<?> clazz){
List<Sticker> ret = cache.get(clazz);
if (ret != null) {
return ret;
}
HashSet<Sticker> uniqueRet = new HashSet<Sticker>();
PreparedStatement queryStickers = null;
try {
queryStickers = getDefaultConnection().getPreparedStatement(queryStickerClassString);
queryStickers.setString(1, clazz.getName());
ResultSet res = queryStickers.executeQuery();
while (res.next()) {
Sticker et = Sticker.load(res.getString(1));
if (et != null && et.exists()) {
uniqueRet.add(et);
}
}
res.close();
} catch (Exception ex) {
ExHandler.handle(ex);
return ret;
} finally {
getDefaultConnection().releasePreparedStatement(queryStickers);
}
cache.put(clazz, new ArrayList<Sticker>(uniqueRet));
return new ArrayList<Sticker>(uniqueRet);
}
public int compareTo(ISticker o){
if (o != null) {
return o.getWert() - getWert();
}
return 1;
}
public void setBackground(String bg){
set(FLD_BACKGROUND, bg);
}
public void setForeground(String fg){
set(FLD_FOREGROUND, fg);
}
@Override
public String getBackground(){
return get(FLD_BACKGROUND);
}
@Override
public String getForeground(){
return get(FLD_FOREGROUND);
}
@Override
public boolean isVisible(){
if (getWert() >= 0)
return true;
else
return false;
}
@Override
public void setVisible(boolean value){
// TODO Auto-generated method stub
}
}