package multimonster.systemadministration; import java.util.HashMap; import org.apache.log4j.Logger; import multimonster.common.BiHashMap; import multimonster.common.setting.Setting; import multimonster.common.setting.SettingID; import multimonster.common.setting.SettingValue; import multimonster.exceptions.MultiMonsterException; /** * Dient als lokaler Proxy f�r Einstellungen die von der Systemadministration * zentral verwaltet werden. * * @author Marc Iseler */ public class SettingProxy { /** * Enth�lt ein Prefix, das jedes Setting von dieser Komponente * als Anfang seiner SettingIDs erh�lt * somit k�nnen Settings aus der DB einer Komponente zugeordnet werden */ private short localprefix = 0; /** * lokaler Puffer f�r alle SettingValues * die �ber diesen Proxy eingef�gt wurden * Key: SettingName * Wert: SettingValue */ private HashMap localValueBuffer = null; /** * lokaler Puffer f�r die SettingIDs * Key: SettingID * Wert: SettingName */ private BiHashMap localKeyBuffer = null; private Logger log; /** * h�lt alle existierenden SettingProxy-Instanzen */ private static HashMap allproxies = new HashMap(); /** * erzeugt einen Setting Proxy * es muss die Klasse mitgegeben werden f�r die der Proxy erzeugt wird */ private SettingProxy(Class classname) throws MultiMonsterException{ super(); log = Logger.getLogger(this.getClass()); localValueBuffer = new HashMap(); localKeyBuffer = new BiHashMap(); this.setUp(classname); } /** * Muss anstatt des Konstruktors verwendet werden. * F�r jeden Klassennamen wird eine Instanz des SettingProxy vorgehalten. * * @param classname * @throws MultiMonsterException */ public static SettingProxy getInstance(Class type) throws MultiMonsterException { SettingProxy retProxy = (SettingProxy) allproxies.get(type); if (retProxy == null) { // Proxy-Instanz f�r diese Klasse existiert noch nicht retProxy = new SettingProxy(type); } return retProxy; } /** * �bernimmt das Setup f�r die Instanz des Proxies * Er holt aus der DB f�r einen Klassennamen ein Prefix * welches f�r die Komponente eindeutig ist. * Desweiteren werden alle in der Datenbank sich befindlichen * Settings f�r diesen Prefix wieder geholt * * @param classname */ public void setUp(Class klasse) throws MultiMonsterException { if (klasse == null) { //TODO Change Exception Type throw new MultiMonsterException("Proxy set up failed for class = null!"); } //log.debug("Klasse heisst: " + klasse.getName()); //checken ob schon mal setUp durchgef�hrt wurde if (localprefix != 0) { return; } //f�r den Klassennamen den short-Wert aus der DB holen SettingAdministration setAdmin = new SettingAdministration(); short tmpPrefix = setAdmin.getPrefix(klasse.getName()); if (tmpPrefix != -1) { this.localprefix = tmpPrefix; } else { log.error("Proxy set up failed for classname: " + klasse.getName()); throw new MultiMonsterException("Proxy set up failed!"); } // den SettingProxy bei der SettingAdministration registrieren setAdmin.registerSettingProxy(this.localprefix, this); // alle schon existierenden Settings holen Setting[] allSettings = setAdmin.getAllSettings(this.localprefix); for(int i = 0; i < allSettings.length; i++) { String name = allSettings[i].getName(); int setID = allSettings[i].getId().getId(); SettingValue setValue = allSettings[i].getValue(); this.localValueBuffer.put(name, setValue); this.localKeyBuffer.put(new Integer(setID), name); } } /** * Meldet den Proxy von der SystemAdministration ab, ohne die SettingValues aus * der DB zu l�schen. * TODO * Beim n�chsten anmelden erh�lt das Proxyobjekt die persistenten Werte aus der * DB zugewiesen. * */ public void releaseProxy() { } /** * Meldet den Proxy von der SystemAdministration ab und l�scht alle Werte * aus der DB * */ public void removeProxy() { } /** * Registriert �bergebenes Setting in der DB. * * SettingID kann gef�llt sein wird aber ignoriert. * Setting-Name, Setting-Value, Setting-Domain, Setting-Description m�ssen gef�llt sein. * Setting-Name muss zudem innerhalb der Komponente eindeutig sein. * * @param setting */ public void registerSetting(Setting setting){ SettingID setID = null; // pr�fen ob Setting mit diesem Namen schon existiert String setName = setting.getName(); if (localValueBuffer.containsKey(setName)) { log.debug("Setting mit diesem Namen existiert bereits!"); return; } //TODO Inhalt von Setting pr�fen SettingAdministration setAdmin = new SettingAdministration(); // localPrefix in SettingID einf�gen setID = new SettingID(this.localprefix, 0); setting.setId(setID); // in die DB einbringen setID = setAdmin.registerSetting(setting); // in lokale Datenverwaltung einf�gen localValueBuffer.put(setting.getName(), setting.getValue()); localKeyBuffer.put(new Integer(setID.getId()), setting.getName()); } /** * entfernt ein Setting aus dem Proxy und aus der Datenbank * * @param name */ public void removeSetting(String name) { // aus der Datenbank entfernen SettingAdministration setAdmin = new SettingAdministration(); SettingID setID = (SettingID) localKeyBuffer.getByName(name); setAdmin.removeSetting(setID); // aus den lokalen Puffern l�schen localValueBuffer.remove(name); localKeyBuffer.remove(setID); } /** * Liefert aktuellen Wert dieses Settings. * * Name referenziert Eindeutig ein Setting. * * @param name * @return */ public SettingValue getValue(String name) { SettingValue value = null; // aus lokalem Puffer holen value = (SettingValue) localValueBuffer.get(name); return value; } /** * Aktualisiert den Wert eines Settings * wird nur vom SettingChangeController aufgerufen * @param setID * @param value */ public void updateValue(SettingID setID, SettingValue value) { log.debug("updateValue called."); String name = null; // Pr�fen ob SettingID wirklich zu diesem SettingProxy geh�rt if (setID.getPrefix() != this.localprefix) { log.error("Prefix passt nicht zu diesem Proxy!"); } // Aus bidirektionaler Hashmap �ber // die SettingID den SettingName ermitteln name = (String) localKeyBuffer.getByKey(new Integer(setID.getId())); // den Wert updaten localValueBuffer.put(name, value); log.debug("New Value for Variable " + name + " received: " + value.getValueCont()); } }