14.4.3 | Einstellungen im Betriebssystem |
Der Zugriff auf die Einstellungen erfolgt über eine abstrakte Schnittstelle, aber wo werden sie eigentlich gespeichert? Sun versucht auch bei dieser Schnittstelle die Plattformunabhängigkeit zu wahren und den Preference-Mechanismus auf plattformspezifische Konstrukte abzubilden.
Unter Windows werden die Einstellungen somit in der Windows-Registry abgelegt. Alle Einstellungen im Benutzerbereich findet man im KnotenHKEY_CURRENT_USER/Software/JavaSoft/PrefsUnter diesem Pfad befindet sich der Wurzelknoten des Benutzerbereichs. Systemeinstellungen befinden sich entsprechend in der Windows-Registry unter:HKEY_LOCAL_MACHINE/Software/JavaSoft/PrefsAlle untergeordneten Knoten stellen bereits Java-Einstellungen dar. In der Windows-Registry kann man an den Datentypen sehen, dass Java wirklich alle Einstellungen in Zeichenketten ablegt. Obwohl in der Windows-Registry zwischen verschiedenen Datentypen unterschieden wird, sind auch Java-Einstellungen im alphanumerischen Typ abgelegt, die über setInt() gespeichert wurden.
Auf Linux/Solaris werden die Einstellungen in Textdateien gespeichert im Dateisystem gespeichert. Dabei wird jeder Knoten auf ein Verzeichnis abgebildet, die Einstellungen innerhalb eines Knotens werden in einer XML-Datei abgelegt. Die Wurzelverzeichnisse für die Benutzereinstellungen liegen in <user_home>/.java/.userPrefs. In welchem Verzeichnis die Systemeinstellungen abgelegt werden, hängt davon ab, welche Rechte der Anwender hat, der zum ersten Mal darauf zugreift. In Frage kommen /etc/.java/.systemPrefs bzw. <java_home>/jre/.systemPrefs: Hat der Nutzer Schreibzugriff auf /etc, werden die Einstellungen dort abgelegt, falls nicht, versucht die Laufzeitumgebung, dies unter <java_home>/jre zu tun. Erst wenn der Anwender auch dort keinen Schreibzugriff im Dateisystem hat, wird eine BackingStoreException ausgelöst.
Die grundlegende Speicherungsstruktur wird für die Benutzereinstellungen im Folgenden nochmals an einem Beispiel veranschaulicht. node1 stellt dabei das Verzeichnis für einen Knoten auf oberster Ebene dar. subnode repräsentiert einen Kindknoten:<user_home>/.java/.userPrefs/node1/prefs.xml <user_home>/.java/.userPrefs/node1/subnode/prefs.xml ...Bei den System-Einstellungen/etc/.java/.systemPrefs/node1/prefs.xml /etc/.java/.systemPrefs/node1/subnode/prefs.xmlbzw.<java_home>/jre/.java/.systemPrefs/node1/prefs.xml <java_home>/jre/.java/.systemPrefs/node1/subnode/prefs.xmlJedes Verzeichnis, das einen Knoten repräsentiert, enthält eine Datei mit dem Namen prefs.xml, in der die einzelnen Einstellungen des Knotens abgelegt sind. Diese XML-Datei ist entsprechend der Export-DTD aufgebaut, enthält jedoch lediglich ein Map-Element, in dem die Schlüssel-Wert-Paare abgelegt werden:<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE map SYSTEM 'http://java.sun.com/dtd/preferences.dtd'> <map MAP_XML_VERSION="1.0"> <entry key="font-size" value="12" /> <entry key="font-name" value="Arial" /> </map>
Wenn man nicht die vordefinierten Persistenz-Mechanismen nutzen will, sondern Einstellungen z. B. in einer SQL-Datenbank oder einem LDAP-Server speichern möchte, dann kann man dies durch die Implementierung einer benutzerdefinierten PreferencesFactory realisieren. Hierzu ist Folgendes erforderlich:Das Interface PreferencesFactory hat zwei Methoden, die Zugriff auf die beiden Wurzelknoten bieten (systemRoot() und userRoot()). Sie liefern jeweils Preferences-Exemplare der spezifischen Preferences-Implementierung zurück. Ausgehend von diesen Knoten kann man über das API in der Hierarchie der Einstellungen navigieren (z. B. auf Kindknoten oder Elternknoten zugreifen).
- Implementierung eines Klasse mit parameterlosem Konstruktor, die das Interface PreferencesFactory implementiert.
- Implementierung einer Klasse, die von AbstractPreferences abgeleitet ist und einen einzelnen Einstellungsknoten repräsentiert.
Mit der Property java.util.prefs.PreferencesFactory kann man anschließend beim Start einer Java-Anwendung definieren, dass die eigene PreferencesFactory zur Speicherung der Einstellungen benutzt werden soll:java -Djava.util.prefs.PreferencesFactory=mypkg.myPrefFactory PrefTest