Proxy und IMendixObject Klassen
Möchte man Objekte in Mendix innerhalb einer Java Action verarbeiten, so hat man es mit zwei Arten von Objekten zu tun. Erwartet die Java Action ein Objekt einer bestimmten Entity, so kann man auf einer von Mendix generierten Proxy Klasse arbeiten. Erwartet die Java Action jedoch ein Objekt einer nicht genau definierten Entity, so bekommt man ein IMendixObject (mit diesem kann man auch im ersten Fall arbeiten).
Auch wenn man Retrieves innerhalb einer Java Action macht bekommt man grundsätzlich IMendixObject Objekte zurück.
Was ist der Unterschied zwischen Proxy und IMendixObject? Wie arbeitet man mit beiden? Und kann man sie zu dem jeweils anderen casten?
Fangen wir hinten an. Es kann kein echtes Casten stattfinden da es keine Vererbung zwischen Proxy und IMendixObject gibt. Trotzdem kann man sich von dem Proxy das IMendixObject zurückgeben lassen und man kann basierend auf dem IMendixObject einen Proxy erstellen.
Das liegt daran, dass das IMendixObject des verwendeten Objektes selbst ein Attribut des Proxy Objektes ist. Das Proxy Objekt selbst hat keine weiteren Daten. Es ist lediglich ein Wrapper Objekt welches Methoden zur Verfügung stellt die es erleichtern mit dem IMendixObject zu interagieren. Insbesondere die Set und Get Methoden liefern und erwarten schon die richtigen Datentypen.
Für meine DataTypeTestEntity sieht das wie folgt aus:
Arbeitet man mit dem Proxy, so arbeitet man eigentlich auch mit dem IMendixObject. Get und Set Methoden des Proxy Objektes sehen demnach so aus:
Wie man sieht ist das einzige was der Proxy tut, auf die Methoden des IMendixObject zurückzugreifen.
Wie kann ich nun das eine in das andere umwandeln?
Die Proxy Klasse hat eine Methode die das IMendixObject zurückliefert. Diese kann also benutzt werden wenn man das Proxy Objekt hat und das IMendixObject haben möchte. Im Falle meines Beispielobjektes würde dieser Aufruf so aussehen:
dataTypeTest.getMendixObject();
Der umgekehrte Fall, ein Proxy Objekt erzeugen wenn man das IMendixObject hat, ist ebenso möglich. Hierbei gibt es zwei Dinge zu beachten. Erstens, man muss wissen um welche Entity es sich handelt, was ja bei Casts ohnehin der Fall ist. Zweitens, man kann eben nicht einfach ein Typecast machen. Die Proxy Klasse selbst besitzt eine statische Methode mit der die Proxy Klasse initialisiert werden kann. Der Aufruf sieht dann folgendermaßen aus:
DataTypeTestEntity.initialize(context, mendixObject);
Wobei DataTypeTestEntity die Proxy Klasse und mendixObject das IMendixObject ist. Dieser Aufruf liefert ein Objekt vom Typ DataTypeTestEntity zurück.