Typed Configuration

Typisierte Konfiguration

Die typisierte Konfiguration stellt eine Abbildung von annotierten Java-Interfaces (Konfigurationsinterfaces) auf XML-Konfigurationsdateien zur Verfügung. Beim Parsen werden aus der XML-Konfiguration automatisch Instanzen der Java-Interfaces erzeugt, ohne dass der Anwendungsprogrammierer einen Parser programmieren, oder Implementierungen der Interfaces vornehmen müsste. Umgekehrt können die Konfigurationsinstanzen automatisch zurück nach XML serialisiert werden, ohne einen Serialisierungsalgorithmus zu schreiben.

Konfigurationsinterface

Das Konfigurationsinterface muss von ​ConfigurationItem ableiten und folgt der Java-Beans-Konvention. Jede Get-Methode im Konfigurationsinterface definiert eine konfigurierbare Eigenschaft.

public interface Config extends ConfigurationItem {
   int getOption();
   String getOtherOption();
}

Entsprechende Set-Methoden müssen im Konfigurationsinterface nicht aufgeführt werden, um Konfigurationswerte aus XML einlesen zu können. Instanzen der Konfiguration werden vom Framework über Reflection erzeugt. Aus dem Namen der Get-Methode leitet sich der Name der konfigurierbaren Eigenschaft am. Der Rückgabetyp der Get-Methode definert den Typ des Konfigurationswertes, mit der diese Eigenschaft konfiguriert werden kann.

Bei Verwendung des XML-Bindings könnte eine Konfiguration passend zu obigem Konfigurationsinterface über folgendes XML-Document konfiguriert werden:

<config
   option="42"
   other-option="Hello World!"
/>

Konfigurationswerte

Konfigurationseigenschaften können Werte enthalten, die selbst nicht wiederum konfigurierte Komponenten sind, sondern Instanzen einfacher Java-Klassen. Diese Blätter des Konfigurationsbaums können entweder aus einem Satz vordefinierter Typen stammen, oder durch Annotation eines Formats oder Bindings an die Konfigurationseigenschaft definiert werden.

Wertannotationen

Jede Property darf nur eine lokale (also nicht-geerbte) Wertannotation haben. Ausnahme: Die Property darf gleichzeitig eine Defaultwert-Annotation und eine Derived-Annotation haben. In diesem Fall wird der Default-Wert genommen, wenn der Derived-Ausdruck null ergibt. Nur diese beiden Annotationen können gleichzeitig gesetzt sein. Verstößt eine Property gegen diese Regeln, führt die Verwendung des betroffenen ConfigurationItems zu einer Exception. Genauer: Das Erstellen oder Einlesen eines solchen Config-Items schlägt fehl. Auch das Bauen des ConfigurationDescriptor für diesen Typ schlägt fehl.

Eine Property darf beliebig viele Wertannotationen erben. Wenn eine Property sowohl ein oder mehrere Wertannotationen erbt und zusätzlich eine lokal (also nicht-geerbt) Wertannotation hat, gewinnt die lokale Wertannotation. Hierbei kann eine lokale Defaultwert-Annotation aber durch eine geerbte Derived-Annotation ergänzt werden und umgekehrt.

Erbt eine Property mehrere Annotationen, wird folgende Priorisierung verwendet:

  1. Defaultwert
  2. Container
  3. Derived
  4. Mandatory
  5. Abstract

Auch hierbei kann sich eine Defaultwert-Annotation mit einer Derived-Annotation ergänzen.