Search the FirstSpirit Knowledge Base
Hallo zusammen,
ich verwende die netterweise von e-Spirit zur Verfügung gestellte Bibliothek GenericConfig (hier beschrieben: GenericConfig - a utility lib to create <configurable> dialogs ).
Für ein DataAccessPlugin verwende ich die Methode GenericConfigPanel.isInstalled() um herauszufinden, ob die Projektkomponente des Moduls installiert ist oder nicht. Das fühlt bei Projekten, in denen in vielen Objekten das Plugin zum Einsatz kommt zu massenweise Fehlermeldungen, wenn der Search Index neu gebaut wird.
Der Stacktrace ist hier:
INFO 30.06.2020 14:23:51.294 (de.espirit.firstspirit.server.sessionmanagement.SessionManagerImpl): new session (ID=2707063547050055213, user=SYSTEM, userID=0, type=DUMMY) created
INFO 30.06.2020 14:23:51.294 (de.espirit.firstspirit.server.scheduler.ScheduleManagerImpl): starting task 'Rebuild search index' - schedule entry 'Rebuild search index' (id=4013271)
INFO 30.06.2020 14:23:51.294 (de.espirit.firstspirit.impl.access.ScriptContextImpl): rebuilding index of project 'www.XXX.de (T)' (ID=3907378)
WARN 30.06.2020 14:23:55.242 (de.espirit.firstspirit.access.ConnectionManager): Unhandled exception: de.espirit.firstspirit.access.schedule.CancelSchedule: connection is closed
de.espirit.firstspirit.access.schedule.CancelSchedule: connection is closed
at de.espirit.firstspirit.server.scheduler.ScheduleManagerImpl$ScheduleRunnable$1.isConnected(ScheduleManagerImpl.java:2171)
at de.espirit.firstspirit.client.io.ProjectConnection.isConnected(ProjectConnection.java:77)
at de.espirit.firstspirit.server.io.AbstractServerConnection.getManagerProvider(AbstractServerConnection.java:796)
at de.espirit.firstspirit.server.io.AbstractServerConnection.getManager(AbstractServerConnection.java:756)
at de.espirit.firstspirit.agency.ModuleAgentImpl.getComponents(ModuleAgentImpl.java:32)
at com.espirit.ps.psci.genericconfiguration.GenericConfigPanel.isInstalled(GenericConfigPanel.java:195)
at de.pinuts.firstspirit.newsletter.channelconnector.ChannelDataAccessSessionBuilder.<init>(ChannelDataAccessSessionBuilder.java:21)
Der dazugehörige Code ist hier:
public class ChannelDataAccessPlugin implements DataAccessPlugin<Channel> {
DataAccessAspectMap aspects = new DataAccessAspectMap();
private static BaseContext context;
private static ImageAgent imageAgent;
private static I18nMessages i18n;
@Override
public void setUp(BaseContext con) {
context = con;
if (NewsletterConfig.isInstalled(NewsletterApp.class, context)) {
.......
Hat jemand eine Idee, warum das passiert?
Danke und Grüße
Timo
Hallo Timo,
eine Antwort hierauf habe ich leider auch nicht (ich hatte die GenericConfig ja damals gebaut).
Was mir allerdings auffällt: Der Stacktrace passt irgendwie nicht zu deinem Code - im Trace kommt der Aufruf aus dem SessionBuilder, der Code zeigt aber das DataAccessPlugin. Oder fehlen hier nur ein paar Zeile?
Im GenConfig code nutze ich letztlich nur normale FirstSpirit API um zu schauen ob die ProjectApp im Projekt hinzugefügt ist, das ist eine reine Convenience-Methode.
Viele Grüße
Michael
Hi Michael,
ja, sorry, der Code ist aus Versehen von der falschen Stelle, im SessionBuilder mache ich aber dasselbe:
public class ChannelDataAccessSessionBuilder implements DataAccessSessionBuilder<Channel>, GomConfigurable {
private SessionBuilderAspectMap _aspects;
private SemtagGomElement _semtagGomElement;
private SpecialistsBroker _context;
public ChannelDataAccessSessionBuilder(SpecialistsBroker specialistsBroker) {
this._context = specialistsBroker;
if (NewsletterConfig.isInstalled(NewsletterApp.class, specialistsBroker)) {
this._aspects = new SessionBuilderAspectMap();
this._aspects.put(GomConfigurable.TYPE, this);
}
}
Wir haben den Fehler aktuell tatsächlich auch nur bei einem Kunden. Ich frage mich, ob die Abfrage beim Session Builder überhaupt nötig ist oder ob es reicht, wenn ich einfach im DataAccessPlugin prüfe, ob die Projektkomponente installiert ist
Grüße
Timo
Der SessionBuilder wird ja nur aufgerufen, wenn ein konkreter Zugriff auf die Daten durchgeführt wird, also bspw. wenn ich auf eine Eingabekomponente zugreife, die das DAP verwendet, oder? In dem Fall bräuchte ich die Abfrage, ob die Komponente installiert ist, ja nicht.
Aber dann könnte ja einfach jemand das DAP in einer Eingabekomponente in einem Projekt verwenden, das die Projektkomponente nicht installiert hat. Wie würde ich das dann verhindern?
Hallo Timo,
wirklich verhindern dass jemand (also ein Template-Entwickler) das nutzt kannst du eh nicht - höchstens für eine Fehler sorgen wenn das passiert. Der „Startpunkt“ ist ja sowieso die DataAccessPlugin-Klasse. Von daher würde ich den Aufruf nur dort machen wo er wirklich nötig ist bzw. die Infos WENN du sie „weiter unten“ haben willst einfach durchreichen anstatt jedes Mal neu zu ermitteln.
Viele Grüße
Michael