Hallo liebe Community,
wie führen gerade eine IT-Infrastruktur Wechsel durch. Der neue FS-Server läuft nun im isolated-Modus.
Bisher läuft die Umstellung der Module auf isolated ganz gut. Nur bei einer Sache haben wir gerade noch Problem.
Wir bekommen in unseren Executable-Klassen keinen Zugriff auf die AccessControlDb bzw. auf das Objekt selbst. Leider gibt es bisher unseres Wissens nach keinen "offiziellen" Weg, wie man in einer Executable-Klasse die AC-DB aufruft.
Bisher haben wir es per Reflektion gelöst:
import java.io.IOException;
import java.lang.reflect.Method;
import de.espirit.firstspirit.access.schedule.*;
import de.espirit.firstspirit.acl.db.AccessControlDb;
Method method = context.getClass().getDeclaredMethod("getAccessControlDb");
method.setAccessible(true);
AccessControlDb accessControlDb = (AccessControlDb) method.invoke(context);
Wenn wir diesen Code in einem Task-Script aufrufen, dann funktioniert alles prima.
Rufen wir allerdings den gleichen Code in einer Executable-Klasse auf, bekommen wir folgenden Fehler:
Caused by: java.lang.ClassCastException: class de.espirit.firstspirit.acl.db.AccessControlDb cannot be cast to class de.espirit.firstspirit.acl.db.AccessControlDb (de.espirit.firstspirit.acl.db.AccessControlDb is in unnamed module of loader de.espirit.common.FactoryRegistry$LibrariesLoader @397fbdb; de.espirit.firstspirit.acl.db.AccessControlDb is in unnamed module of loader de.espirit.firstspirit.server.module.SafeFindUrlClassLoader @8a2f74b)
Damit er die Klasse überhaupt findet, liefern wir zu unserem Modul die crc7.jar (aus fs-security.fsm) mit. Ohne diese Jar bekommen wir die Meldung, dass er AccessControlD nicht findet/kennt.
Im Legacy-Modus hatten wir die jar immer nur als "provided" in unserem Code.
Folgendes haben wir erfolglos ausprobiert:
- Den Scope von crc7.jar in der module-isolated.xml auf global gestellt.
- Das AccessControlDb-Objekt in einem extra Script-Taks als Property hinzugefügt:
context.setProperty("accessControlDb", accessControlDb);
Das hatte funktioniert, jedoch beim Casten im Modul wieder das gleiche Problem:
final AccessControlDb accessControlDb = (AccessControlDb) context.getProperty("accessControlDb"); --> Gleicher Fehler
Habt ihr Ideen wie ich das Objekt bekomme? Was machen wir hier falsch? Müssen wir vielleicht eine andere Jar mitliefern?
Und außerdem ganz wichtig:
Gibt es vielleicht bereits einen "richtigen" Weg um auf die AccessControlDb zuzugreifen?
Die einzige Aussage dazu habe ich in einem Thread gefunden, wo sich zuletzt 2011 ein Entwicklern hierzu geäußert hat:
https://community.e-spirit.com/message/5010#5010
Zu dem vorgeschlagenen „LegacyAccessControlDbProvider“ finde ich in der Doku nichts.
Ich weiß auch nicht aus welcher FS-Bibliothek dieser Provider kommt.
Liebe Grüße
Marcel