# OVal (Framework)

OVal ist ein Validierungs- und Design-by-Contract-Framework für die Programmiersprache Java. Es ermöglicht die Validierung von Attributen beliebiger Java-Objekte mittels vordefinierter oder selbst geschriebener Constraints. Darüber hinaus erlaubt es auch die Prüfung von Invarianten, Vor- und Nachbedingungen bei Methoden sowie die Validierung von Argumenten von Methoden mittels AspectJ-Aspekten.
Diese Funktionalität und die Tatsache, dass mit OVal beliebige Objekte und nicht nur JavaBeans validiert werden können, hebt OVal von anderen Validierungs- und Design-by-Contract-Frameworks für Java 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 Vor- oder Nachbedingungen 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 können auch Spring-AOP- oder eigene AOP-Implementierungen verwendet werden.
Constraints werden entweder direkt beim Aufruf von Methoden geprüft (Vor- und Nachbedingungen, Constraints auf Argumente von Methoden, Invarianten) oder mittels validator.validate(Object) auf dem gesamten Objekt. Die Prüfung von Vor- und Nachbedingungen sowie die Prüfung der Invarianten kann (beispielsweise aus Performancegründen) global an- und abgestellt werden. Darüber hinaus können Constraint-Profile verwendet werden, um in unterschiedlichen Situationen unterschiedliche Constraints zu prüfen.
OVal selbst ist nur von der Java-Klassenbibliothek 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

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über hinaus wollte er ein Validierungs-Framework haben, welches auf Annotations basiert, damit bei der Refaktorisierung 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. Ab Version 1.50 kann OVal die Standard JSR303 Constraints interpretieren und entsprechend validieren. Ab Version 1.60 können Constraints für Methodenargumente bereits auf Interface-Ebene deklariert werden. Ab Version 1.70 kann OVal über das Spring Framework konfiguriert werden. Ab der Version 1.82 wird JSR223 scripting unterstützt. Ab der Version 1.90 Bean Validation 2.0 Constraints.
Verschiedene Frameworks wie Struts 2 OVal Plug-in, Play! Framework oder Apache Cayenne annotations verwenden OVal.
OVal 1 wurde seit 2005 allein von der Sourceforge-Seite mehr als 18.000 Mal heruntergeladen. Üblicherweise werden Open-Source-Java-Frameworks aber über Maven-Repositories bezogen. Oval ist ab Version 2.1.X im JFrog Bintray Repository zu finden.
Mit der Version 1.86 wechselte OVal 2016 von sourceforge auf github. Ab der Version 2.0.0 vom Mai 2019 benötigt OVal mindestens Java 8. Für OVal 1 ist mindestens Java 5 nötig. Die letzte Version von OVal 1 ist 1.90 vom 29. Oktober 2017.

## Alternativen

Validierungsframeworks:
   * Apache Commons Validator – Apache-Commons-Projekt zur Bean-Validierung
   * Hibernate Validator
   * Spring Modules Validator – Spring Modules (Erweiterung zu Spring) Projekt zur Bean-Validierung
   * JValidate – Beans Validation
   * JValidations – Object Validation
    Mit Java 7 wurde das sogenannte Bean Validation Framework (JSR 303) eingeführt, damit ist Bean-Validierung (nicht Objekt- und auch nicht Parameter-Validierung) ein Bestandteil von Java. Die Validierung selbst muss aber an geeigneter Stelle angestoßen werden – beispielsweise beim Speichern von Beans in der Datenbank mittels Hibernate.

### Frameworks zur Umsetzung des Design-by-Contract-Prinzips in Java

    Es gibt eine Reihe von Design-by-Contract-Frameworks für Java, wenige davon, wie z. B. Contracts for Java (Cofoja), scheinen aber noch aktiv zu sein. Eine Auflistung aller Design-by-Contract-Frameworks für Java findet sich unter Design by contract#Languages with third-party support in der englischsprachigen Wikipedia.