Questions & Answers

SOLVED
00schmidt
I'm new here

GenerationContext und Skript mit Datensatzmodifikation

Jump to solution

Folgender Hintergrund. Eine zentrale Datenquelle soll Dokumente (aus den Mediastores verschiedener Projekte) mit File-Reference und Metadaten enthalten, die dann mittels Integration in den Projekten รผbergreifend zur Verfรผgung gestellt werden. Es mรผsste jeweils ein Link in das Ursprungsprojekt zur verfรผgung gestellt werden. Dieser Link kann weder bei der Erstellung des Datensatzes (kein GenerationContext) noch bei der Filterung mittels Integration erstellt werden (ebenfalls kein GenerationContext). Die Idee ist, im Rahmen einer Generierung per Skript die URLs zu erzeugen und in die Datenquelle zu รผbernehmen. Die รœbergabe des GenerationContext an das eigentliche Skript erfolgt mittels

     $CMS_SET(void, #global.scheduleContext.setProperty("generation_context",#global.generationContext))$   

innerhalb einer Teilgenerierung.

Nun ist aber die Session nicht schreibbar (UnsupportedOperationException auf Operationen wie commit(). ร„hnliches wird ja bereits in https://community.e-spirit.com/message/2241 und https://community.e-spirit.com/message/2250 festgestellt. Grund ist, dass wรคhrend der Generierung auf einen Revisionsstand zugegriffen wird und nichts mehr schreibbar sein soll.

Welche Optionen gibt es?

- kann man sich ohne GenerationContext einen entsprechenden UrlCreator erzeugen?

- kann man einen GenerationContext bekommen und trotzdem eine schreibbare Session erhalten?

- andere?

GrรผรŸe aus Hamburg

Michael

0 Kudos
1 Solution

Accepted Solutions

Michael Schmidt schrieb:

Danke fรผr die Bemรผhungen. Aber es reicht fรผr mich noch nicht, um hier wirklich Fortschritt zu erzielen.

Wie genau habe ich denn das Interface "Connection"?

- connection.getUserService() -> getUserService() not found in class'de.espirit.firstspirit.server.scheduler.ScriptTaskExecutor$ScriptTaskServerConnection'

- context.getConnection().getUserService() -> getUserService() not found in class'de.espirit.firstspirit.server.scheduler.ScheduleManagerImpl$ScheduleRunnable$1'

Und noch zur Klarstellung:

> Vor einem Generierungstask wird keine eigene Verbindung benรถtigt.

Mein Generierungstask braucht doch auch keine eigene Verbindung? Doch erst der nachfolgende, der die Verรคnderungen an der DB machen soll, oder?

Den Userservice gibt es so:

userservice = connection.getProjectById(context.getProject().getId()).getUserService();

Hierbei wird eine Verbindung mit dem Benutzer geรถffnet, dessen Zugangsdaten unter Eigenschaften in der entsprechenden Skript-Aktion des Aufrags hinterkegt wurden.

Ein generieurngstask benรถtigt keine eigene Verbindung, das ist korrekt.

Viele Grรผsse aus Dortmund,

  Holger

View solution in original post

0 Kudos
11 Replies
feddersen
Community Manager

Einen UrlCreator gibt es nur im GenerationContext.

Sie kรถnnen sich aber wรคhrend der Generierung Informationen in den ScheduleContext schreiben und nach der Generierung einen Skripttask ausfรผhren, der diese Informationen dann in die Datenbank schreibt. Alternativ kรถnnte man auch einen Service implementieren, mit dem wรคhrend der Generierung kommuniziert werd. Dieser Service kann dann die Modifikationen an der Datenquelle vornehmen.

0 Kudos

Vielen Dank erstmal fรผr die Antwort. Meinen Sie mit "Service" eine FirstSpirit-Sache oder etwas komplett eigenstรคndiges. Wenn ersteres; gibt es dafรผr irgendwo Dokumentation?

Das mit dem "in den ScheduleContext schreiben" ist mir nicht ganz klar. Wenn mein Task zu Ende ist, besteht doch der ScheduleContext nicht mehr? Wenn ich dann den nรคchsten Task starte, finde ich dort doch die im Vorgรคngertask geschriebenen Informationen nicht mehr, oder?

GrรผรŸe

M

0 Kudos

Mit Service ist eine FirstSpirit-Komponente gemeint, in der Entwicklerdokumentation gibt es nรคhere Informationen dazu.

Der ScheduleContext besteht fรผr den gesamten Auftrag, der aus mehreren Tasks bestehen davon. Ein Task ist die Generierung, die einen GenerationContext hat. Der ScheduleContext ist also der รผbergeordnete Kontext, der fรผr alle Tasks zur Verfรผgung steht.

0 Kudos

Hatte hier die Begriffe durcheinandergebracht, Auftrag war fรผr mich Task, woraus dieser besteht dann Aktionen/Actions. Aber genau hier liegt ja das Problem.

Nachdem mein erster Task/Action den GenerationContext in den ScheduleContext geschrieben hat, damit ich ihn spรคter verwenden kann, ist im nachfolgenden Skript-Task die Session, die ich auf folgendem Wege erlange, nicht mehr schreibbar.

contentStore = context.getUserService().getStore(Store.CONTENT_STORE, false);

contentSource = contentStore.getContent2ByName("i_document");

schemaTable = contentSource.getSchema();

Session updateSession = schemaTable.getSession();

Hier irgendwas falsch?

0 Kudos

Modifikationen aus einem Auftragsskript kรถnnen nur bei aktivierter "eigener Verbindung" (Auftragsplanung / Aktionen / Skript / Eigenschaften) vorgenommen werden. รœbrigens ist "context.getUserService()" in Tasks nach einer Generierung auf den generierten Stand "eingefroren".

Peter
0 Kudos

> Modifikationen aus einem Auftragsskript kรถnnen nur bei aktivierter

> "eigener Verbindung" (Auftragsplanung / Aktionen / Skript / Eigenschaften)

> vorgenommen werden.

Kann ich nicht nachvollziehen, ich verรคndere und release Datensรคtze auch ohne eigene Verbindung aus einem Auftragsskript.

> รœbrigens ist "context.getUserService()" in Tasks nach einer Generierung auf den

> generierten Stand "eingefroren".

Weil das so ist, war doch genau meine Frage: wie bekomme service, source, schema oder letztlich einfach nur eine Session, in der ich Datensรคtze schreiben kann, nachdem eine Generierung durchgefรผhrt wurde?

0 Kudos

Modifikationen aus einem Auftragsskript, nachdem eine Generierungtask ausgefรผhrt wurde, sind nur รผber eine eigene Verbindung mรถglich. Vor einem Generierungstask wird keine eigene Verbindung benรถtigt.

Die Antwort auf die zweite Frage lautet somit: Sie verwenden die "eigene Verbindung" und haben damit das Interface "Connection". Von dort aus haben sie Zugriff auf den UserService und alles andere.

0 Kudos

Danke fรผr die Bemรผhungen. Aber es reicht fรผr mich noch nicht, um hier wirklich Fortschritt zu erzielen.

Wie genau habe ich denn das Interface "Connection"?

- connection.getUserService() -> getUserService() not found in class'de.espirit.firstspirit.server.scheduler.ScriptTaskExecutor$ScriptTaskServerConnection'

- context.getConnection().getUserService() -> getUserService() not found in class'de.espirit.firstspirit.server.scheduler.ScheduleManagerImpl$ScheduleRunnable$1'

Und noch zur Klarstellung:

> Vor einem Generierungstask wird keine eigene Verbindung benรถtigt.

Mein Generierungstask braucht doch auch keine eigene Verbindung? Doch erst der nachfolgende, der die Verรคnderungen an der DB machen soll, oder?

0 Kudos

Michael Schmidt schrieb:

Danke fรผr die Bemรผhungen. Aber es reicht fรผr mich noch nicht, um hier wirklich Fortschritt zu erzielen.

Wie genau habe ich denn das Interface "Connection"?

- connection.getUserService() -> getUserService() not found in class'de.espirit.firstspirit.server.scheduler.ScriptTaskExecutor$ScriptTaskServerConnection'

- context.getConnection().getUserService() -> getUserService() not found in class'de.espirit.firstspirit.server.scheduler.ScheduleManagerImpl$ScheduleRunnable$1'

Und noch zur Klarstellung:

> Vor einem Generierungstask wird keine eigene Verbindung benรถtigt.

Mein Generierungstask braucht doch auch keine eigene Verbindung? Doch erst der nachfolgende, der die Verรคnderungen an der DB machen soll, oder?

Den Userservice gibt es so:

userservice = connection.getProjectById(context.getProject().getId()).getUserService();

Hierbei wird eine Verbindung mit dem Benutzer geรถffnet, dessen Zugangsdaten unter Eigenschaften in der entsprechenden Skript-Aktion des Aufrags hinterkegt wurden.

Ein generieurngstask benรถtigt keine eigene Verbindung, das ist korrekt.

Viele Grรผsse aus Dortmund,

  Holger

0 Kudos

Type a product name