eginger
Returning Observer

Deploymentskript zum Löschen von mehreren Zeilen innerhalb einer Datenquelle

Jump to solution

Hallo,

ich habe hier ein Skript gebaut das während dem Deployment läuft und eine Anzahl von Datensätzen aus einer Datenquelle löschen soll.

import de.espirit.or.Session;
import de.espirit.or.web.SessionManager;
import de.espirit.or.schema.Entity;
import de.espirit.or.schema.KeyValue;
import java.util.*;
import de.espirit.firstspirit.common.gui.CMSDialog;
import de.espirit.firstspirit.access.*;
import de.espirit.firstspirit.access.store.contentstore.*;
import de.espirit.firstspirit.access.store.mediastore.Media;
import de.espirit.firstspirit.access.store.*;
import de.espirit.firstspirit.access.AccessUtil.*;
import de.espirit.or.query.*;
import de.espirit.or.*;


// ...

String schemaName = "Products";
int objectId = 3459;

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

contentSource = cs.getContent2ByName("jobs");
schemaTable = contentSource.getSchema();
Session orSession = schemaTable.getSession();
Select select = orSession.createSelect("Jobs");

equal = new Equal("fs_id", objectId);
cons = new Or();
cons.add(equal);
select.setConstraint(cons);
keys = orSession.fetchKeys(select);

if(keys.size() > 0) {
    row = keys.get(0);
    Entity entity = orSession.find(row);
    context.logError( "Delete DB Entity: " + entity);
    orSession.delete(entity);
    orSession.commit();       
}

// ...

Meine Frage wäre nun, ob das nicht etwas kompakter funktioniert. Ist die fs_id innerhalb des DB-Schemata nicht eindeutig? Muss man umbedingt die Bezeichnung der Tabelle wissen ("Jobs", "jobs") um auf dieser ID etwas ausführen zu können?

Infos:

- FS 4.2.219

- Getestet im Mithras Beispielprojekt

Mit freundlichen Grüßen

Stephan Eginger

Labels (1)
1 Solution

Accepted Solutions
Peter_Jodeleit
Crownpeak employee
Crownpeak employee

Re: Deploymentskript zum Löschen von mehreren Zeilen innerhalb einer Datenquelle

Jump to solution

Ah, Beanshell kann keine var-args, so sollte es gehen: session.find("job", new Object[] { 43 } );

Peter

View solution in original post

0 Kudos
10 Replies
Peter_Jodeleit
Crownpeak employee
Crownpeak employee

Re: Deploymentskript zum Löschen von mehreren Zeilen innerhalb einer Datenquelle

Jump to solution

Ohne Tabellen-Namen geht es nicht, kürzer allerdings schon:

Entity entity = session.find("job", 4711);
if (entity != null) {
     session.delete(entity);
     session.commit();
}
Peter
eginger
Returning Observer

Re: Deploymentskript zum Löschen von mehreren Zeilen innerhalb einer Datenquelle

Jump to solution

Danke für ihre Antwort. Aber was ist das für ein session Objekt? Als de.espirit.or.Session wird mir nur folgender Fehler geworfen:

error during script execution : de.espirit.firstspirit.access.script.ExecutionException: Typed variable declaration : Error in method invocation: Method find( java.lang.String, int ) not found in class'de.espirit.or.impl.SessionImpl' at line 23

0 Kudos
Peter_Jodeleit
Crownpeak employee
Crownpeak employee

Re: Deploymentskript zum Löschen von mehreren Zeilen innerhalb einer Datenquelle

Jump to solution

Ah, Beanshell kann keine var-args, so sollte es gehen: session.find("job", new Object[] { 43 } );

Peter
0 Kudos
eginger
Returning Observer

Re: Deploymentskript zum Löschen von mehreren Zeilen innerhalb einer Datenquelle

Jump to solution

Funktioniert! Das macht es schon ein Stück übersichtlicher, danke!

0 Kudos
eginger
Returning Observer

Re: Deploymentskript zum Löschen von mehreren Zeilen innerhalb einer Datenquelle

Jump to solution

Es gibt momentan mit dem Skript ein Problem, wenn es innhalb eines Auftrags nach einer Generierung (Voll- und Teilgenerierung) gestartet wird.

ERROR 07.12.2010 10:50:30.339 {seID=8083} (de.espirit.firstspirit.server.scheduler.ScriptTaskExecutor): error during script execution : de.espirit.firstspirit.access.script.ExecutionException: Method Invocation orSession.commit at line 38

Sobald der Generierungsschritt deaktiviert wird funktioniert der Auftrag wieder. Der FS Server hat die Version 4.2.419

Ist das ein bekannter Fehler? Gibt es irgendwelche Workarounds?

0 Kudos
gockel
Crownpeak employee
Crownpeak employee

Re: Deploymentskript zum Löschen von mehreren Zeilen innerhalb einer Datenquelle

Jump to solution
ERROR 07.12.2010 10:50:30.339 {seID=8083}  (de.espirit.firstspirit.server.scheduler.ScriptTaskExecutor): error  during script execution :  de.espirit.firstspirit.access.script.ExecutionException: Method  Invocation orSession.commit at line 38

Können Sie bitte mal den kompletten Stack der Fehlermeldung posten.

Vermutung:

Es wird die Read-Only-Connection verwendet.


us = context.getUserService();

Vergleiche hierzu:
Kapitel: 7.5.9.4.1 der Admin-Doku
eginger
Returning Observer

Re: Deploymentskript zum Löschen von mehreren Zeilen innerhalb einer Datenquelle

Jump to solution

Hier die komplette Fehlermeldung:

ERROR 07.12.2010 14:32:44.294 {seID=15364} (de.espirit.firstspirit.server.scheduler.ScriptTaskExecutor): error during script execution : de.espirit.firstspirit.access.script.ExecutionException: Method Invocation orSession.commit at line 37

de.espirit.firstspirit.access.script.ExecutionException: Method Invocation orSession.commit at line 37

    at de.espirit.firstspirit.server.script.BeanshellScriptEngine$BeanshellExecutable.execute(BeanshellScriptEngine.java:120)

    at de.espirit.firstspirit.common.ScriptUtil.execute(ScriptUtil.java:88)

    at de.espirit.firstspirit.server.scheduler.ScriptTaskExecutor.run(ScriptTaskExecutor.java:92)

    at de.espirit.firstspirit.server.scheduler.ScheduleManagerImpl$TaskCallable.executeLocal(ScheduleManagerImpl.java:1955)

    at de.espirit.firstspirit.server.scheduler.ScheduleManagerImpl$TaskCallable.executeLocal(ScheduleManagerImpl.java:1935)

    at de.espirit.firstspirit.server.scheduler.ScheduleManagerImpl$TaskCallable.call(ScheduleManagerImpl.java:1863)

    at de.espirit.firstspirit.server.ExecutionManagerImpl$ExtendedCallable.call(ExecutionManagerImpl.java:505)

    at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)

    at java.util.concurrent.FutureTask.run(FutureTask.java:138)

    at de.espirit.common.util.BoundedExecutorService$RunnableWrapper.run(BoundedExecutorService.java:414)

    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:441)

    at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)

    at java.util.concurrent.FutureTask.run(FutureTask.java:138)

    at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)

    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)

    at java.lang.Thread.run(Thread.java:662)

    at de.espirit.common.util.SuspendableThread.run(SuspendableThread.java:36)

Caused by: java.lang.UnsupportedOperationException

    at de.espirit.or.impl.TemporalSession.doCommit(TemporalSession.java:62)

    at de.espirit.or.impl.AbstractSession.commit(AbstractSession.java:518)

    at de.espirit.or.impl.AbstractSession.commit(AbstractSession.java:505)

    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)

    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)

    at java.lang.reflect.Method.invoke(Method.java:597)

    at bsh.Reflect.invokeMethod(Unknown Source)

    at bsh.Reflect.invokeObjectMethod(Unknown Source)

    at bsh.Name.invokeMethod(Unknown Source)

    at bsh.BSHMethodInvocation.eval(Unknown Source)

    at bsh.BSHPrimaryExpression.eval(Unknown Source)

    at bsh.BSHPrimaryExpression.eval(Unknown Source)

    at bsh.BSHBlock.evalBlock(Unknown Source)

    at bsh.BSHBlock.eval(Unknown Source)

    at bsh.BSHBlock.eval(Unknown Source)

    at bsh.BSHIfStatement.eval(Unknown Source)

    at bsh.BSHBlock.evalBlock(Unknown Source)

    at bsh.BSHBlock.eval(Unknown Source)

    at bsh.BshMethod.invokeImpl(Unknown Source)

    at bsh.BshMethod.invoke(Unknown Source)

    at bsh.BshMethod.invoke(Unknown Source)

    at bsh.This.invokeMethod(Unknown Source)

    at bsh.This.invokeMethod(Unknown Source)

    at de.espirit.firstspirit.server.script.BeanshellScriptEngine$BeanshellExecutable.execute(BeanshellScriptEngine.java:111)

    ... 16 more

0 Kudos
gockel
Crownpeak employee
Crownpeak employee

Re: Deploymentskript zum Löschen von mehreren Zeilen innerhalb einer Datenquelle

Jump to solution

Das bestätigt meine Vermutung. Das Problem ist, dass sie die Standard Connection des Skripttasks verwenden und diese ist Read-Only. Für die OR-Session wird in diesem Fall auch eine Temporale Session erzeugt und diese erlaubt keine Änderungen.

Sie müssen wie in Kapitel: 7.5.9.4.1 der Admin-Doku beschrieben eine eigene Verbindung konfigurieren und diese in Ihrem Skript nutzen.

Damit sich die Änderungen des Skripttasks in der nachfolgenden Generierung auch auswirken müssen am Ende des Skripttask noch die startTime setzen.

Vergl. hierzu: Adventskalender und automatisches Umschalten

0 Kudos
eginger
Returning Observer

Re: Deploymentskript zum Löschen von mehreren Zeilen innerhalb einer Datenquelle

Jump to solution

Danke, es scheint zu funktionieren mit connection.getProjectById(context.getProject().getId()).getUserService();

Warum es jedoch nur in kombination mit dem Generieren zu diesem Fehler kommt, wird mir über die Dokumentation nicht ersichtlich.

0 Kudos