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