User:Sebastian.Dietrich/OVal (Framework)

OVal ist ein Validierungs- und Design by Contract-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 mit denselben COnstraints wie für die Validierung der 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 allen anderen Java Validierungs- und Design by Contract Frameworks ab.

Funktionalität
Constraints können mittels Annotations (beispielsweise @NotNull, @MaxLength), POJOs oder XML deklariert werden. OVal bietet dafür mehr als 35 eingebaute Constraints an. Eigene Constraints können als Java Klassen oder mittels Skript-Sprachen wie beispielsweise JavaScript, Groovy, Ruby, 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. Alternativ dazu kann auch Spring AOP oder eigene AOP Implementierungen verwendet werden.

Constraints werden entweder direkt beim Aufruf von Methoden geprüft (Pre- und Postkonditionen, Constraints auf Argumente von Methoden, Invarianten) oder mittels  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.

OVal selbst ist nur von der Java Klassenbibliothek (ab Java5) abhängig. Weitere Jars müssen nur bei Bedarf zugelinkt werden (beispielsweise AspectJ für Design by Contract, XStream wenn OVal mittels XML konfiguriert wird oder JRuby wenn Constraints mittels Ruby definiert werden.

Beispiel

 * Deklaration:


 * Verwendung:

Geschichte, Ausblick und Verwendung
OVal wurde von Sebastian Thomschke aus der Motivation heraus gestartet, ein Framework zu haben, welches Java um einfache Techniken zur Validierung und Design by Contract - basierend auf denselben Constraints erweitert. Darüberhinaus um ein Validierungs-Framework zu haben, welches Annotations basierend ist, damit beim Refactoring die Validierungen automatisch mit den Attributen und Methoden mitbewegt werden. Diese Features sind auch heute noch Alleinstellungsmerkmale von OVal.

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. .

Für zukünftige Versionen sind unter anderem folgende Features geplant:
 * 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

Oval wurde seit 2005 allein von der Sourceforge Seite mehrere 1.000 Male heruntergeladen. Oval ist wie die meisten Open Source Java Frameworks auch über Maven Repositories wie IBiblio zu beziehen.

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

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