3.5.4. Validation Result

Ein Validation Result bündelt das Ergebnis einer Validierung und besteht aus 0 bis n Validation Messages, welche alle einen unterschiedlichen Message Type haben können. Ein ValidationResult ist imutable, wodurch sichergestellt ist, dass sich ein einmal ausgewertetes Ergebnis nicht mehr ändern kann.

Zugriff auf die Validation Messages

Für den Zugriff auf die einzelnen Messages bietet die Schnittstelle IValidationResult die folgenden Methoden:

    List<IValidationMessage> getAll();

    List<IValidationMessage> getErrors();

    List<IValidationMessage> getInfoErrors();

    List<IValidationMessage> getWarnings();

    List<IValidationMessage> getInfos();

Die Methode getAll() liefert alle Messages, die anderen Methoden liefern die Messages des entsprechenden Typs. Die Messages sind in der Reihenfolge angeordnet, wie sie hinzugefügt wurden. Die Ergebnisliste ist nicht modifizierbar (unmodifieable). Die Default Implementierung erzeugt die Listen lazy bei der ersten Anfrage. (Das gilt auch für die All Liste.) Falls man mit der First Worst Message auskommt, kann das Rechenleistung und Speicher sparen.

First Worst Message

In einigen Anwendungsfällen kann es ausreichen, nur die erste aufgetretenen Message mit höchstem Schweregrad zu kennen. Dazu kann die folgende Methode auf einem IValidationResult verwendet werden:

    IValidationMessage getWorstFirst();

Diese Methode liefert immer eine Message zurück. Gibt es keine echten Messages, wird eine Message vom Typ OK zurückgegeben. Diese hat per Konvention keinen Message Text und Message Context. Ansonsten wird die Message zurückgegeben, welche den höchsten Schweregrad hat. Existieren mehrere Messages mit diesem Schweregrad, wird die herangezogen, welche als erstes aufgetreten ist, bzw. dem Ergebnis hinzugefügt wurde.

Die Default Implementierung aktualisiert den Wert immer direkt beim Hinzufügen neuer Messages (Bei der Message Verkettung oder mit Hilfe des Validation Result Builder), so dass dieser nicht explizit berechnet werden muss.

Die Abfrage der First Worst Message ist also effizienter als die Verwendung der Message Listen

Gesamtergebnis

In bestimmten Fällen sind die eigentlichen Messages gar nicht relevant, sondern nur, ob das Ergebnis valide ist oder nicht. Dafür kann die folgende Methode verwendet werden:

    boolean isValid();

Diese gibt false zurück, falls es mindestens eine Messages gibt, welche nicht valid ist und ansonsten true.

Die Methode:

    boolean isOk();

liefert false zurück, falls es mindestens eine Message mit Schweregrad INFO oder höher gibt, und sonst true

Die Validation Result Accessor Klasse

Die Accessor Klasse ValidationResult liefert folgende statische Methoden zur Erzeugung eines IValidationResult mit genau einer Validation Message:

    public static IValidationResult create() {...}

    public static IValidationResult ok() {...}

    public static IValidationResult create(final IValidationMessage message) {...}

    public static IValidationResult warning(final String text) {...}

    public static IValidationResult infoError(final String text) {...}

    public static IValidationResult error(final String text){...}

    public static IValidationResult warning(final String context, final String text) {...}

    public static IValidationResult infoError(final String context, final String text) {...}

    public static IValidationResult error(final String context, final String text){...}

Mit Hilfe der folgenden Methode kann ein IValidationResultBuilder erzeugt werden:

    public static IValidationResultBuilder builder() {...}
Message Verkettung

Ein Validation Result ist immutable. Daher können zu einem Ergebnis nachträglich auch keine Messages hinzugefügt werden. Es ist jedoch möglich, zu einem Validation Result eine Message hinzuzufügen, indem man das Ergebnis kopiert und dabei die neue Nachricht hinzufügt. Dazu können die folgenden Methoden verwendet werden:

    IValidationResult withMessage(final IValidationMessage message);

    IValidationResult withError(final String text);

    IValidationResult withInfoError(final String text);

    IValidationResult withWarning(final String text);

    IValidationResult withInfo(final String text);

    IValidationResult withError(final String context, final String text);

    IValidationResult withInfoError(final String context, final String text);

    IValidationResult withWarning(final String context, final String text);

    IValidationResult withInfo(final String context, final String text);

Das resultierende Validation Result ist eine Kopie des aktuellen Validation Results, welchem die übergebene Message hinzugefügt wurde. Die Methode withMessage() verlangt eine IValidationMessage, die anderen Methoden sind Convenience Methoden, welche die Validation Message mit Hilfe des Parameter text (und optional context) erzeugen.

Das folgende Beispiel soll das verdeutlichen:

  1      IValidationResult result = ValidationResult.create();
  2      result = result.withInfo("Info message");
  3      result = result.withError("Error message");
  4      result = result.withWarning("Warn message");

Es werden dem initialen Validation Result (Zeile 1) drei weitere Messages hinzugefügt. Bei dieser Methode ist darauf zu achten, dass das result immer wieder neue zugewiesen werden muss. Um diese potentielle Fehlerquelle zu vermeiden, kann auch ein IValidationResultBuilder verwendet werden.

Ändern des Context

Mit Hilfe der folgenden Methode kann der Context für alle Validation Messages eines IValidationResult geändert werden, indem eine Kopie erzeugt wird und auf dieser der Context geändert wird:

    IValidationResult withContext(final String context);
Validation Result Builder

Die Schnittstelle IValidationResultBuilder hat die folgenden Methoden:

    IValidationResultBuilder addMessage(final IValidationMessage message);

    IValidationResultBuilder addInfo(final String text);

    IValidationResultBuilder addWarning(final String text);

    IValidationResultBuilder addInfoError(final String text);

    IValidationResultBuilder addError(final String text);

    IValidationResultBuilder addInfo(final String context, final String text);

    IValidationResultBuilder addWarning(final String context, final String text);

    IValidationResultBuilder addInfoError(final String context, final String text);

    IValidationResultBuilder addError(final String context, final String text);

    IValidationResultBuilder addResult(final IValidationResult result);

    IValidationResult build();

Der Builder liefert Methoden zum Hinzufügen von Validation Messages. Mit Hilfe der Methode addResult() kann man alle Messages eines anderen IValidationResult hinzufügen. Mit Hilfe der Methode build() wird das erzeugte IValidationResult zurückgegeben.

Das folgende Beispiel verwendet den IValidationResultBuilder für die Erzeugung eines Validation Result:

  1      final IValidationResultBuilder builder = ValidationResult.builder();
  2      builder
  3          .addInfo("Info message")
  4          .addError("Error message")
  5          .addWarning("Warn message");
  6          
  7      final IValidationResult result = builder.build();

Das resultierende Validation Result ist identisch mit dem obigen Beispiel bei der Message Verkettung. Der Vorteil beim Builder Ansatz ist, dass die Neuzuweisung entfällt (welche bei der Message Verkettung versehentlich vergessen werden könnte).


Siehe auch PDF Version dieses Dokuments, Jowidgets API Spezifikation