OVal (Framework)

Java-Bibliothek
Dies ist eine alte Version dieser Seite, zuletzt bearbeitet am 18. September 2009 um 20:50 Uhr durch Sebastian.Dietrich (Diskussion | Beiträge). Sie kann sich erheblich von der aktuellen Version unterscheiden.
Diese Baustelle befindet sich fälschlicherweise im Artikelnamensraum. Bitte verschiebe die Seite oder entferne den Baustein {{Baustelle}}.

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.

OVal

Basisdaten

Erscheinungsjahr 17. August 2005[1]
Aktuelle Version 1.32
(10. Mai 2009)
Betriebssystem plattformübergreifend
Programmier­sprache Java
Lizenz Eclipse Public License 1.0
http://oval.sourceforge.net/

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

Einzelnachweise

  1. sourceforge.net.
  2. OVal New and Noteworthy
  3. OVal Roadmap
  4. OVal References