- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
DisplayNames setzen per Serverskript?
Hallo,
ich habe die ehrenvolle Aufgabe, in einem Projekt mehrere Tausend Anzeigenamen von PageFolders umzubenennen. Das Skript steht soweit und ist auch alles wunderbar, aber da das รผber ein VPN lรคuft, dauert die Ausfรผhrung seeeeeehr lange!
Jetzt habe ich mir gedacht, es wรคre eine pfiffige Idee, das ganze leicht umzubauen und in der Auftragsverwaltung als Serverskript laufen zu lassen.
Leider bricht es beim ersten Lock gleich ab und schmeiรt mir die folgende Exception (siehe unten).
Kann man das nur im JavaClient machen? Oder was ist die Ursache? Kann man das umgehen? Vielleicht als Admin ausfรผhren?
Danke und Grรผรe
Matthias
...รผbrigens e = context.userService.getStore(Store.Type.PAGESTORE,true,false);
und hier die Exception:
ERROR 23.11.2013 23:33:45.629 {seID=5659875} (de.espirit.firstspirit.server.scheduler.ScriptTaskExecutor): error during script execution : de.espirit.firstspirit.access.script.ExecutionException: Method Invocation e.setLock at line 33
de.espirit.firstspirit.access.script.ExecutionException: Method Invocation e.setLock at line 33
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:119)
at de.espirit.firstspirit.server.scheduler.ScheduleManagerImpl$TaskCallable.executeLocal(ScheduleManagerImpl.java:2021)
at de.espirit.firstspirit.server.scheduler.ScheduleManagerImpl$TaskCallable.executeLocal(ScheduleManagerImpl.java:2001)
at de.espirit.firstspirit.server.scheduler.ScheduleManagerImpl$TaskCallable.call(ScheduleManagerImpl.java:1929)
at de.espirit.firstspirit.server.ExecutionManagerImpl$ExtendedCallable.call(ExecutionManagerImpl.java:520)
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:419)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:439)
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:895)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:918)
at java.lang.Thread.run(Thread.java:680)
at de.espirit.common.util.SuspendableThread.run(SuspendableThread.java:36)
Caused by: java.lang.SecurityException: changes not allowed for current connection
at de.espirit.firstspirit.server.scheduler.RestrictedTaskSecurityManager.checkAccess(RestrictedTaskSecurityManager.java:28)
at de.espirit.firstspirit.store.access.AbstractStoreElement.checkAccess(AbstractStoreElement.java:1596)
at de.espirit.firstspirit.store.access.DefaultStoreElement.setLock(DefaultStoreElement.java:440)
at de.espirit.firstspirit.store.access.DefaultStoreElement.setLock(DefaultStoreElement.java:432)
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.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.Name.invokeLocalMethod(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.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
- Labels:
-
Developers
Accepted Solutions
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Hallo Matthias,
Scripte in Auftrรคgen nutzen per Default eine read only Connection. Sollen รnderungen durch das Script durchgefรผhrt werden, muss mit dem Button "Eigenschaften" im Scriptdialog des Tasks eine eigene Connection konfiguriert werden. รblicherweise nutzt man hierfรผr einen technischen User, der รผber die entsprechenden Rechte verfรผgt.
Viele Grรผรe
Michael
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Hallo Matthias,
Scripte in Auftrรคgen nutzen per Default eine read only Connection. Sollen รnderungen durch das Script durchgefรผhrt werden, muss mit dem Button "Eigenschaften" im Scriptdialog des Tasks eine eigene Connection konfiguriert werden. รblicherweise nutzt man hierfรผr einen technischen User, der รผber die entsprechenden Rechte verfรผgt.
Viele Grรผรe
Michael
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Alle Achtung!
Ich hรคtte nicht damit gerechnet, dass ich an einem Sonntag eine Antwort darauf bekomme. Nicht schlecht!
Guter Hinweis mit den Verbindungsdaten im Auftrag. Jetzt weiร ich endlich, wozu die Felder gut sind... Leider bringt es aber in diesem Fall keine Verรคnderung. Ich bekomme immer noch dieselbe Exception. Ich habe das auch auf einem eigenen Testsystem ausprobiert, mit dem Admin - der definitiv alle Rechte hat. Leider nix!
Gibt es noch einen anderen Ansatz, sich die richtige Connection zu holen? Ansonsten muss ich das doch als Client-Script laufen lassen, was dann vermutlich Stunden dauern wird.
Grรผรe
Matthias
Edit:
Hier noch ein Extrakt meines Codes. Vielleicht ist da ja ein Denkfehler drin?!
import de.espirit.firstspirit.access.store.StoreElementFolder;
import de.espirit.firstspirit.access.store.Store.Type;
refMap = new HashMap();
writeNames(testMode) {
e = context.userService.getStore(Type.PAGESTORE,true,false);
l = context.project.masterLanguage;
all = e.getChildren(StoreElementFolder.class,true).toList();
for (folder : all) {
uid = folder.uid;
dsp = folder.getDisplayName(l);
rel = folder.releaseStatus;
if(dsp.equals(uid)) {
dsp = refMap.get(uid);
context.logInfo(uid+" --> "+dsp);
if(!testMode && dsp != null) {
folder.setLock(true,false);
folder.getLanguageInfo(l).setDisplayName(dsp);
folder.save();
folder.setLock(false,false);
if(rel != 0) {
folder.release(false);
}
}
}
}
}
// ...befรผllen der HashMap
writeNames(false);
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Die Meldung nachdem der Umstellung des Auftrages muss aber eine andere sein. Die SecurityException
wird durch die vorgschlagene Anpassung behoben.
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Leider nein. Ich bekomme immer noch dieselbe "java.lang.SecurityException: changes not allowed for current connection"
Das einzige, was sich geรคndert hat, sind diese Eintrรคge:
INFO 25.11.2013 14:44:35.815 {seID=843359} (de.espirit.firstspirit.server.sessionmanagement.SessionManagerImpl): new session (ID=3681609862860288097, user=Admin, userID=1, type=DUMMY) created
INFO 25.11.2013 14:44:35.816 {seID=843359} (de.espirit.firstspirit.server.scheduler.ScriptTaskExecutor): skript connection created: 3681609862860288097, user=Admin
INFO 25.11.2013 14:44:35.816 {seID=843359} (de.espirit.firstspirit.server.sessionmanagement.SessionManagerImpl): new session (ID=2062703538509913757, user=Admin, userID=1, type=DUMMY) created
...
INFO 25.11.2013 14:44:36.026 {seID=843359} (de.espirit.firstspirit.server.sessionmanagement.SessionManagerImpl): Session terminated (ID=2062703538509913757, user=Admin(dummy)), number of sessions now 80
INFO 25.11.2013 14:44:36.026 {seID=843359} (de.espirit.firstspirit.server.sessionmanagement.SessionManagerImpl): Invalid session id 2062703538509913757
INFO 25.11.2013 14:44:36.026 {seID=843359} (de.espirit.firstspirit.server.sessionmanagement.SessionManagerImpl): close dummy session (ID=3681609862860288097, user=Admin)
INFO 25.11.2013 14:44:36.026 {seID=843359} (de.espirit.firstspirit.server.sessionmanagement.SessionManagerImpl): Invalid session id 3681609862860288097
Und es sind definitiv die Berechtigungen zum รndern im Pagestore vorhanden. Mein Try/Catch schmeiรt mir aber bei JEDEM Knoten den Fehler. Scheint also doch noch irgendwas zu fehlen?!
Es handelt sich รผbrigens noch um die Server-Version 4.2.468, falls das irgendwie relevant ist.
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Wenn der Typ des Skriptes wirklich korrekt ist, dann ist das wohl ein Fall fรผr den Helpdesk.
Es handelt sich รผbrigens noch um die Server-Version 4.2.468, falls das irgendwie relevant ist.
Der kann dazu dann kompetent Auskunft geben.
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Hallo Matthias,
du muss die connection im code auch benutzen, das sehe ich in dem Beispiel nicht. Machst du das?
UserService und Project mรผssen รผber das connection Objekt und nicht รผber das context Objekt geholt werden.
Viele Grรผรe
Tobias
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Hallo Tobias,
vielen Dank, das klingt allerdings logisch! Ich dachte, es wird direkt die Connection verwendet, aber jetzt wo du's sagst, habe ich das wohl nicht berรผcksichtigt. Ich fรผrchte, ich muss mich aber weiter blamieren, ich weiร nรคmlich nicht, wie man sich die Connection aus den Eigenschaften holt. Mit context.getConnection() offenbar nicht, denn ich habe die zwei Zeilen umgebaut und es hat nichts gebracht:
p = context.connection.getProjectById(pid);
e = p.userService.getStore(Type.PAGESTORE,true,false);
Muss ich die Verbindung irgendwie รผber getProperty holen oder so? Wie mache ich das ganz ohne "context"?
Grรผรe
Matthias
EDIT:
OK, ich ziehe die Frage zurรผck - wer lesen kann, ist klar im Vorteil. Laut Admin-Handbuch, geht es direkt รผber connection...
Das probier ich jetzt nochmal aus.
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Juhu,
danke Euch, jetzt hat es endlich geklappt. Ich habe mir die Verbindung im Skript so geholt:
pid = 12345;
p = connection.getProjectById(pid);
e = p.userService.getStore(Type.PAGESTORE,true,false);
l = p.masterLanguage;
Und so geht es jetzt.
Grรผรe
Matthias
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
genau wenn du bsh nutzt ist das connection objekt nutzbar. Im Executable musste es dir aus der map holen.
Ex-/Import save und kopierbr wir es so: project = connection.getProjectById(context.getProject().getId());
Viele Grรผรe
Tobias

