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.
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.
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
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 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() {...}
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.
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);
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).