ModelValidator

Aus iDempiere de
Zur Navigation springen Zur Suche springen

Diese Seite stellt im Moment nur höchst unvollständige Notizen zum Thema dar. Also bitte Anregungen und Verbesserungen einpflegen!


Dieser Artikel ist von Thomas Bayen. Meine Artikel sind grundsätzlich nie "fertig", sondern immer eine Einladung, sie zu verbessern. Ich lade jeden gerne jederzeit ein, Verbesserungen hier direkt einzupflegen. Wer möchte, kann mich auch gerne kontaktieren.

Was macht ein ModelValidator?

Ein ModelValidator erlaubt es, in ein bestehendes Modell (d.h. in eine Klasse von Objekten, die in iDempiere eine Tabelle darstellen) einzugreifen. Bei bestehenden Klassen ist die eigentliche Funktionalität oftmals bereits fertig in einer Modellklasse programmiert. Modellklassen erkennt man daran, das Sie mit "M" und ohne "_" und ohne Tabellensuffix anfangen. Das Modell zur Tabelle C_Product heisst also MProduct.java.

Oftmals will man ein solches Modell nicht ganz neu programmieren oder ableiten, sondern nur in dem bestehenden Modell eine Kleinigkeit nachrüsten, z.B. Werte korrigieren oder berechnen. Hier greift der ModelValidator ein, der dann z.B. beim Speichern eines Objektes aufgerufen wird.


selber Programmieren

Unter en:Developing Plug-Ins - ModelValidator ist eine Anleitung, wie man ein Plugin mit einem ModelValidator schreibt. Leider ging das bei mir nicht so.

Nun ist es in der OSGi-Schnittstelle von iDempiere oft so, das es zuerst eine Extension-Schnittstelle gab, die dann aber inzwischen von einer Factory-Schnittstelle abgelöst wurde, die nun der empfohlene Weg ist, Plugins einzubinden. Also habe ich mich an en:Developing Plug-Ins - IModelFactory orientiert und entsprechend eine IModelValidatorFactory implementiert. Hier musste ich wie im Artikel angegeben auch den Wert für "service.ranking" eintragen (hätte man sonst unmöglich drauf kommen können).

Wer wissen will, wie es funktioniert: Die Klasse org.compiere.model.ModelValidationEngine ruft in Ihrem Konstruktor zwei Mal die Methode loadValidatorClass() auf. Das erste Mal geht sie dabei die Einträge durch, die im Application Dictionary in der Tabelle AD_ModelVAlidator eingetragen sind. Das zweite Mal geht sie alle Mandanten des Systems durch und nimmt den Eintrag "ModelValidationClasses" der Tabelle AD_Client.

Wer also eigene ModelValidators einsetzen will, schreibt den Namen der ModelValidator-Klasse am besten in die Tabelle AD_ModelValidator. Danach kann die eigene, als OSGi-Component aufgerufene IModelValidatorFactory diesen Namen erkennen und die entsprechende Klasse zurückgeben.

Bei der Erzeugung der Component hatte ich das Gefühl, das man anstatt einer Factory auch einen ModelValidator direkt als Component erzeugen kann. Das habe ich aber nicht weiter verfolgt.