/***************************************************
*
* cismet GmbH, Saarbruecken, Germany
*
* ... and it just works.
*
****************************************************/
package Sirius.util;
import java.util.prefs.BackingStoreException;
import java.util.prefs.Preferences;
/**
* Setzt preferences in die BackingStore.
*
* @author awindholz
* @version $Revision$, $Date$
*/
public class PreferencesTool {
//~ Static fields/initializers ---------------------------------------------
/** PathSepatrator. */
private static final String PS = "/"; // NOI18N
//~ Instance fields --------------------------------------------------------
private String pathName;
private boolean isSysNode = true;
//~ Constructors -----------------------------------------------------------
/**
* Creates a new instance of PreferencesTool.
*/
public PreferencesTool() {
}
//~ Methods ----------------------------------------------------------------
/**
* DOCUMENT ME!
*
* @param key Schluesselname dessen Wert abgefragt werden soll. Name ohne Pfad.
* @param defaultValue wert der Geliefert werden soll wenn der Schluessel nicht gefunden wird.
*
* @return wert des Schluessels oder defaultValue wenn keiner gefunden.
*
* @throws BackingStoreException DOCUMENT ME!
*/
public String getPreference(final String key, final String defaultValue) throws BackingStoreException {
return getPreference(isSysNode, pathName + PS + key, defaultValue);
}
/**
* Setzt den Knoten der zu verarbeiten ist. Die werte werden gesetzt ungeachtetdessen ob dieser knoter existiert
* oder nicht.
*
* @param isSysNode true: Knoten aus Systembaum, false: Knoten aus Userbaum.
* @param pathName Path zu dem Knoten.
*
* @return false wenn \u00FCbergebener Knoten nicht gefunden wurde.
*
* @throws BackingStoreException DOCUMENT ME!
*/
public boolean setData(final boolean isSysNode, final String pathName) throws BackingStoreException {
this.isSysNode = isSysNode;
this.pathName = pathName;
return getRootNode(isSysNode).nodeExists(pathName);
}
/**
* Setzt den Schluessel und deren wert in die BackingStore.
*
* @param key DOCUMENT ME!
* @param value DOCUMENT ME!
*
* @throws BackingStoreException DOCUMENT ME!
*/
public void setPreference(final String key, final String value) throws BackingStoreException {
setPreference(isSysNode, pathName + PS + key, value);
}
/**
* Setzt belibig viele beliebige Schluessel und deren Werte.
*
* @param keys Schluesselnamen
* @param values Werte der Schluessel.
*
* @throws BackingStoreException wenn lengen der beiden Arrays ungleich
*/
public void setPreferences(final String[] keys, final String[] values) throws BackingStoreException {
setPreferences(isSysNode, pathName, keys, values);
}
/**
* Setzt belibig viele beliebige Schluessel und deren Werte.
*
* @param isSysNode ob es sich bei diesem Knoten um einen System oder User Knoten handelt.
* @param pathName pfad zu dem Knoten in den die Schl\u00FCsel gesetzt werden sollen.
* @param keys Schluesselnamen ohne pfadangaben.
* @param values Werte der Schluessel.
*
* @throws BackingStoreException wenn lengen der beiden Arrays ungleich
*/
public static void setPreferences(final boolean isSysNode,
final String pathName,
final String[] keys,
final String[] values) throws BackingStoreException {
if (keys.length != values.length) {
final String meldung = "Unequal number of keys and values" // NOI18N
+ " was given to set the preferences in the backing store."; // NOI18N
throw new BackingStoreException(meldung);
}
for (int i = 0; i < keys.length; i++) {
setPreference(isSysNode, pathName + PS + keys[i], values[i]);
}
}
/**
* Laedt ein RootKnoten aus dem Backing Store.
*
* @param isSysNode true(System) oder false(User).
*
* @return System-RootKnoten wenn true \u00FCbergeben wurde, User-RootKnoten wenn fasle \u00FCbergeben wurde.
*/
private static Preferences getRootNode(final boolean isSysNode) {
if (isSysNode) {
return Preferences.systemRoot();
} else {
return Preferences.userRoot();
}
}
/**
* Laedt eine Einstellung in das Backing Store.
*
* @param isSysNode key name der Eigenschaft.
* @param qualifiedKey DOCUMENT ME!
* @param value wert der Eigenschaft.
*
* @throws BackingStoreException DOCUMENT ME!
*/
public static void setPreference(final boolean isSysNode, final String qualifiedKey, final String value)
throws BackingStoreException {
final int index = qualifiedKey.lastIndexOf(PS);
Preferences prefs = getRootNode(isSysNode);
String key = qualifiedKey;
if (index > 0) {
final String node = qualifiedKey.substring(0, index);
prefs = getRootNode(isSysNode).node(node);
key = qualifiedKey.substring(index + 1, qualifiedKey.length());
}
// logger.info("Daten in BackingStore geschrieben: (" + key + ", " + value + ")");
prefs.put(key, value);
// Update des Backing Stores erzwingen
prefs.flush();
}
/**
* Laedt eine Einstellung aus dem Backing Store.
*
* @param isSysNode DOCUMENT ME!
* @param qualifiedKey vollqualifizierter name des Schluessels.
* @param defaultValue wert der Geliefert werden soll wenn der Schluessel nicht gefunden wird.
*
* @return wert des Schluessels oder defaultValue wenn keiner gefunden.
*
* @throws BackingStoreException DOCUMENT ME!
*/
public static String getPreference(final boolean isSysNode, final String qualifiedKey, final String defaultValue)
throws BackingStoreException {
final int index = qualifiedKey.lastIndexOf(PS);
Preferences prefs = getRootNode(isSysNode);
String key = qualifiedKey;
if (index > 0) {
final String node = qualifiedKey.substring(0, index);
prefs = getRootNode(isSysNode).node(node);
key = qualifiedKey.substring(index + 1, qualifiedKey.length());
}
// logger.debug("Daten aus BackingStore auslesen: qulifiedKey: " +
// qualifiedKey + " node: " + prefs.name() + " key: " + key);
final String ret = prefs.get(key, defaultValue);
// logger.debug("Auslesen erfolgreich. Wert: " + ret);
return ret;
}
/**
* Anzahl der Parameter muss ungerade sein. Erster parameter ist der Pfad zu dem Knoten in der BackingStore, dieser
* darf am Ende keinen Separator haben. Weiter folgen paarweise Name des Schluessels und dessen Wert. Z.B.
* PreferencesTool {/RootNode/node, key1, wert1, key2, wert2}
*
* @param args DOCUMENT ME!
*/
public static void main(final String[] args) {
try {
if ((args.length % 2) == 0) {
usage();
System.exit(-1);
}
final PreferencesTool pt = new PreferencesTool();
if (!pt.setData(true, args[0])) {
System.out.println("Info: Node " + args[0] + " does not exist, yet."); // NOI18N
}
for (int i = 1; i < args.length; i = i + 2) {
pt.setPreference(args[i], args[i + 1]);
}
System.out.println("Values were successfully written."); // NOI18N
} catch (Throwable e) {
e.printStackTrace();
}
}
/**
* DOCUMENT ME!
*/
private static void usage() {
System.out.println("Usage: "); // NOI18N
System.out.println(" java " + PreferencesTool.class.getName() + " <NODEPATH> " + "(<KEY> <VALUE>)+"); // NOI18N
}
}