OVal (Framework)
Diese Baustelle befindet sich fälschlicherweise im Artikelnamensraum. Bitte verschiebe die Seite oder entferne den Baustein {{Baustelle}} .
|
OVal
| |
---|---|
![]() | |
Basisdaten
| |
Erscheinungsjahr | 17. August 2005[1] |
Aktuelle Version | 1.32 (10. Mai 2009) |
Betriebssystem | plattformübergreifend |
Programmiersprache | Java |
Lizenz | Eclipse Public License 1.0 |
http://oval.sourceforge.net/ |
OVal ist ein Validierungs-Framework für Java. Es ermöglicht die Validierung von Attributen von beliebigen Java Objekten mittels vordefinierter oder selbst geschriebener Constraints.
Darüberhinaus erlaubt es auch die Prüfung von Invarianten, Pre- und Postkonditionen bei Methoden, sowie die Validierung von Argumenten von Methoden mittels AspectJ Aspekten. Damit ermöglicht OVal neben der Validierung von Java Klassen auch die vollständige Umsetzung des Design by Contract Design Prinzips in Java. Diese Funktionalität und die Tatsache, dass mit OVal beliebige Objekte und nicht nur Beans validiert werden können, hebt OVal von den meisten anderen Java Validierungs Frameworks ab.
Funktionalität
Constraints können mittels Annotations (beispielsweise @NotNull, @MaxLength), POJOs oder XML deklariert werden. Eigene Constraints können als Java Klassen oder mittels Skript-Sprachen wie beispielsweise JavaScript, Groovy, BeanShell, OGNL oder MVEL definiert werden.
Diese Constraints können nicht nur bei Attributen definiert werden, sondern auch als Pre- oder Postkonditionen von Methoden bzw. bei Argumenten von Methoden. Da dies in der Java Syntax derzeit noch nicht vorgesehen ist, verwendet OVal dafür AspectJ basierte Aspekte.
Constraints werden entweder direkt beim Aufruf von Methoden geprüft (Pre- und Postkonditionen, Constraints auf Argumente von Methoden, Invarianten) oder mittels validator.validate(Object)
auf dem gesamten Objekt.
Die Prüfung von Pre- und Postkonditionen, sowie die Prüfung der Invarianten kann (beispielsweise aus Performancegründen) global an- und abgedreht werden. Darüberhinaus können Constraint-Profile verwendet werden um in unterschiedlichen Situationen unterschiedliche Constraints zu prüfen.
Beispiel
- Deklaration
//Parameter der Konstruktoren und Setter Methoden werden mittels AspectJ analog zu den Constraints der Attribute geprüft
@net.sf.oval.guard.Guarded(applyFieldConstraintsToConstructors=true)
@net.sf.oval.guard.Guarded(applyFieldConstraintsToSetters=true)
public class BusinessObject {
//Attribut name darf weder Null, noch leer sein & darf maximal 32 Zeichen haben
@NotNull @NotEmpty @Length(max=32)
private String name;
...
//Attribut mailingAddress muss entweder die deliveryAddress oder die invoiceAddress sein
//wird mittels Script geschrieben in Groovy geprüft
@Assert(expr = "_value ==_this.deliveryAddress || _value == _this.invoiceAddress", lang = "groovy")
private String mailingAddress;
...
//Parameter name wird automatisch analog wie das Attribut name geprüft, da für die ganze Klasse "applyFieldConstraintsToSetters" gesetzt wurde
public void setName(String name) {
this.name = name;
}
...
//Vor Aufruf der Methode wird mittels Groovy Skript sichergestellt, dass this.amount nicht null ist und amount2add größer als this.amount ist
@Pre(expr = "_this.amount!=null && amount2add>_this.amount", lang = "groovy")
public void increase(BigDecimal amount2add) {
amount = amount.add(amount2add);
}
}
- Verwendung
...
BusinessObject bo = new BusinessObject();
bo.setName(""); //wirft eine ConstraintsViolatedException weil der Parameter leer ist
...
bo.increase(null); //wirft eine Exception, wenn this.amount noch nicht gesetzt wurde
...
List<ConstraintViolation> violations = validator.validate(bo); //liefert die Liste aller Verletzungen
Geschichte und Ausblick
Die erste Version von OVal (0.1alpha) wurde am 17. August 2005 veröffentlicht. Diese Version ermöglichte bereits die Validierung von Argumenten und Rückgabewerten mittels AspectJ.
Die Version 1.0 wurde am 22. Juli 2007 veröffentlicht. Sie enthielt unter anderem eine Reihe an weiteren Constraints sowie Unterstützung für das Skripten von eigenen Constraints.
Die aktuelle Version 1.32 wurde am 10. Mai 2009 veröffentlicht.[2].
Für zukünftige Versionen sind unter anderem folgende Features geplant:[3]
- Unterstützung von Constraints für Argumente bereits auf Interface Ebene
- Constraints Vererbung
- Unterstützung für Spring 2.0 XSD Konfiguration
- Implementierung von Java Bean Validation (Java Specification Request 303)
- Engere Integration mit Webframeworks wie JSF Frameworks, Struts, Apache Wicket, etc.
Die folgenden Frameworks verwenden OVal: Struts 2 OVal Plug-in, Play! Framework, Apache Cayenne annotations, jsfatwork, mtn4java, Polyforms, rsser, saetc, ultimate-roundtrip[4]
Alternativen
- Validierungsframeworks
-
- Apache Commons Validator - Apache Commons Projekt zur Bean Validierung
- Spring Modules Validator - Spring Modules (Erweiterung zu Spring) Projekt zur Bean Validierung
- JValidate - Beans Validation
- JValidations - Object Validation
Mit Java 7 wird das sogenannte Bean Validation Framework (JSR 303) eingeführt, damit ist Bean Validierung (nicht Objekt- und auch nicht Parameter-Validierung) ein Bestandteil von Java
- Frameworks zur Umsetzung des Design by Contract Prinzips in Java
- Es gibt eine Reihe von Design by Contract Frameworks für Java, keines davon scheint aber noch aktiv zu sein. Eine Auflistung aller Design by Contract Frameworks für Java findet sich unter en:Design by contract#Languages with third-party support
Literatur
- In pursuit of code quality: Defensive programming with AOP, Artikel von Andrew Glover vom 30. Jänner 2007 auf IBM developerworks
Weblinks
- http://oval.sourceforge.net/ – Projekthomepage