Search the FirstSpirit Knowledge Base
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:
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
Hallo Stefan,
wir haben bereits die Anpassungen in den Projekten durchgeführt. In einem Projekt fehlt uns noch eine Sache und zwar die Größe der Datei.
de.espirit.firstspirit.acl.File hatte die Methode getLength().
Die neue Klasse "de.espirit.firstspirit.scheduling.agency.FileEntry" bietet diese Methode nicht an. Wie komme ich nun an die richtige Größe ran?
Liebe Grüße
Marcel
Hallo Marcel,
das ist unschön. Leider scheint es aktuell keinen API-Weg zu dieser Information zu geben. Könnte aber leicht einzubauen sein.
Da müsstest du wohl einen Feature-Request hier in der Community einstellen und dich potentiell vorerst über "den alten Weg" bedienen. Ich glaube, der wurde noch nicht ausgebaut.
Beste Grüße
Stefan