Search the FirstSpirit Knowledge Base
Hallo zusammen,
ist es in FirstSpirit möglich ein Skript zuschreiben, das alle Medienname und Metadaten von einem Projekt anzeigt, die in einem bestimmten Ordner im Mediastore liegen?
Viele Grüße,
Aissam
Hallo Aissam,
in diesem Fall hast Du einen anderen Context:
import de.espirit.firstspirit.access.Language;
import de.espirit.firstspirit.access.schedule.ScheduleContext;
import de.espirit.firstspirit.access.store.Store;
import de.espirit.firstspirit.access.store.mediastore.Media;
import de.espirit.firstspirit.agency.LanguageAgent;
import de.espirit.firstspirit.agency.StoreAgent;
final StoreAgent pSpecialist = context.requestSpecialist(StoreAgent.TYPE);
final LanguageAgent pLanguageAgent = context.requestSpecialist(LanguageAgent.TYPE);
final Store pMediaStore = pSpecialist.getStore(Store.Type.MEDIASTORE, true);
final Language pMasterLanguage = pLanguageAgent.getMasterLanguage();
for (Media _media : pMediaStore.getChildren(Media.class, true))
{
context.logInfo(_media.getLanguageInfo(pMasterLanguage).getDisplayName() + " - " + _media.getUid());
// Meda Form Data
if (!_media.hasMeta())
continue;
context.logInfo(_media.getMetaFormData().get(pMasterLanguage, "md_groups").get().toString());
}
Dies solltest Du ausführen können als Auftrag nach einem Generierungsschritt.
Den Pfad musst Du speziell holen, da kann ich aber nicht genau sagen, wie, falls es nicht die Standard URLs sind.
Viele Grüße,
Phillip.
Hallo Phillip,
ich habe das Skript so angepasst:
import de.espirit.firstspirit.access.Language;
import de.espirit.firstspirit.access.schedule.ScheduleContext;
import de.espirit.firstspirit.access.store.Store;
import de.espirit.firstspirit.access.store.mediastore.Media;
import de.espirit.firstspirit.agency.LanguageAgent;
import de.espirit.firstspirit.agency.StoreAgent;
final StoreAgent pSpecialist = context.requestSpecialist(StoreAgent.TYPE);
final LanguageAgent pLanguageAgent = context.requestSpecialist(LanguageAgent.TYPE);
final Store pMediaStore = pSpecialist.getStore(Store.Type.MEDIASTORE, true);
final Language pMasterLanguage = pLanguageAgent.getMasterLanguage();
for (Media _media : pMediaStore.getChildren(Media.class, true)){
context.logInfo(_media.getFilename() + " : " + _media.getUid());
// Meda Form Data
if (!_media.getParent().hasMeta())
continue;
if(_media.getParent().isFolder()){
context.logInfo("Berechtigung: " +_media.getParent().getMetaFormData().get(pMasterLanguage, "md_groups").get().getAllowed("access").toString(";"));
context.logInfo("URL : " +_media.getParent().getStoredUrl(pMasterLanguage ));
}
}
Bekomme aber auf der fett markierten Zeile folgende Fehlermeldung
Vorher kommt das und kann man das irgendwie abfangen?
Die Metadaten sind Bereichtigungen in denen steht welche Gruppen diese Datei lesen kann.
Der Datei selbst hat aber keine Metadaten sondern der Ordner in der die Datei drin steckt.
Habe ich da ein Denkfehler?
INFO 23.01.2018 13:30:50.578 (de.espirit.firstspirit.store.access.AccessStoreBuilder): TEMPLATESTORE(false) loaded in 0ms
ERROR 23.01.2018 13:30:50.594{dNR=} (de.espirit.firstspirit.server.scheduler.ScriptTaskExecutor): error during script execution : de.espirit.firstspirit.access.script.ExecutionException: Error in method invocation: Method toString(java.lang.String) not found in class'java.util.TreeSet' : at Line: 20 : in file: inline evaluation of: ``__execute() { import de.espirit.firstspirit.access.Language; import de.espirit.f . . . '' : .toString ( ";" )
at line 20
de.espirit.firstspirit.access.script.ExecutionException: Error in method invocation: Method toString(java.lang.String) not found in class'java.util.TreeSet' : at Line: 20 : in file: inline evaluation of: ``__execute() { import de.espirit.firstspirit.access.Language; import de.espirit.f . . . '' : .toString ( ";" )
at line 20
at de.espirit.firstspirit.server.script.BeanshellScriptEngine$BeanshellExecutable.execute(BeanshellScriptEngine.java:111)
at de.espirit.firstspirit.common.ScriptUtil.execute(ScriptUtil.java:106)
at de.espirit.firstspirit.server.scheduler.ScriptTaskExecutor.run(ScriptTaskExecutor.java:134)
at de.espirit.firstspirit.server.scheduler.ScheduleManagerImpl$TaskCallable.executeLocal(ScheduleManagerImpl.java:2475)
at de.espirit.firstspirit.server.scheduler.ScheduleManagerImpl$TaskCallable.executeLocal(ScheduleManagerImpl.java:2458)
at de.espirit.firstspirit.server.scheduler.ScheduleManagerImpl$TaskCallable.call(ScheduleManagerImpl.java:2390)
at de.espirit.firstspirit.server.ExecutionManagerImpl$ExtendedCallable.call(ExecutionManagerImpl.java:590)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at de.espirit.common.util.BoundedExecutorService$RunnableWrapper.run(BoundedExecutorService.java:436)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)
at de.espirit.common.util.SuspendableThread.run(SuspendableThread.java:56)
Caused by: bsh.EvalError: Error in method invocation: Method toString(java.lang.String) not found in class'java.util.TreeSet' : at Line: 20 : in file: inline evaluation of: ``__execute() { import de.espirit.firstspirit.access.Language; import de.espirit.f . . . '' : .toString ( ";" )
at bsh.BSHPrimarySuffix.doName(BSHPrimarySuffix.java:179)
at bsh.BSHPrimarySuffix.doSuffix(BSHPrimarySuffix.java:120)
at bsh.BSHPrimaryExpression.eval(BSHPrimaryExpression.java:80)
at bsh.BSHPrimaryExpression.eval(BSHPrimaryExpression.java:47)
at bsh.BSHBinaryExpression.eval(BSHBinaryExpression.java:123)
at bsh.BSHArguments.getArguments(BSHArguments.java:65)
at bsh.BSHMethodInvocation.eval(BSHMethodInvocation.java:69)
at bsh.BSHPrimaryExpression.eval(BSHPrimaryExpression.java:102)
at bsh.BSHPrimaryExpression.eval(BSHPrimaryExpression.java:47)
at bsh.BSHBlock.evalBlock(BSHBlock.java:130)
at bsh.BSHBlock.eval(BSHBlock.java:80)
at bsh.BSHBlock.eval(BSHBlock.java:46)
at bsh.BSHIfStatement.eval(BSHIfStatement.java:48)
at bsh.BSHBlock.evalBlock(BSHBlock.java:130)
at bsh.BSHBlock.eval(BSHBlock.java:80)
at bsh.BSHBlock.eval(BSHBlock.java:46)
at bsh.BSHEnhancedForStatement.eval(BSHEnhancedForStatement.java:80)
at bsh.BSHBlock.evalBlock(BSHBlock.java:130)
at bsh.BSHBlock.eval(BSHBlock.java:80)
at bsh.BshMethod.invokeImpl(BshMethod.java:371)
at bsh.BshMethod.invoke(BshMethod.java:267)
at bsh.BshMethod.invoke(BshMethod.java:170)
at bsh.PreparsedScript.invoke(PreparsedScript.java:66)
at de.espirit.firstspirit.server.script.BeanshellScriptEngine$BeanshellExecutable.execute(BeanshellScriptEngine.java:100)
... 14 more
Caused by: bsh.ReflectError: Method toString(java.lang.String) not found in class'java.util.TreeSet'
at bsh.Reflect.resolveExpectedJavaMethod(Reflect.java:395)
at bsh.Reflect.invokeObjectMethod(Reflect.java:97)
at bsh.BSHPrimarySuffix.doName(BSHPrimarySuffix.java:176)
... 37 more
Hallo Aissam,
Du checkst die Datei, nicht den Ordner.
Und Dein Script geht auch davon aus, dass es immer gesetzte Meta Daten gibt und diese auch immer Permissions hat. Dein Script ignoriert Fälle, in denen das nicht zutrifft und daher kommt es zu Fehlern.
Zudem musst Du dir den Ordner holen und diesen prüfen. Es wäre aus Scripting Sicht sinnvoll sich zu merken, welche Ordner Du dann schon geprüft hast: Stelle Dir 1.000 Medien in einem Ordner vor. Dann würdest Du 999x überprüfen, was Du eigentlich schon beim 1. mal geprüft hast.
Viele Grüße,
Phillip.
Hallo Phillip,
ich verstehe nicht warum die Fehlermeldung:
rror during script execution : de.espirit.firstspirit.access.script.ExecutionException: Error in method invocation: Method toString(java.lang.String) not found in class'java.util.TreeSet' : at Line: 20 : in file: inline evaluation of: ``__execute() { import de.espirit.firstspirit.access.Language; import de.espirit.f . . . '' : .toString ( ";" )
angezeigt wird obwohl get() die Permission klasse ist.
Hier die angepasste Version:
import de.espirit.firstspirit.access.Language;
import de.espirit.firstspirit.access.schedule.ScheduleContext;
import de.espirit.firstspirit.access.store.Store;
import de.espirit.firstspirit.access.store.mediastore.Media;
import de.espirit.firstspirit.agency.LanguageAgent;
import de.espirit.firstspirit.agency.StoreAgent;
final StoreAgent pSpecialist = context.requestSpecialist(StoreAgent.TYPE);
final LanguageAgent pLanguageAgent = context.requestSpecialist(LanguageAgent.TYPE);
final Store pMediaStore = pSpecialist.getStore(Store.Type.MEDIASTORE, true);
final Language pMasterLanguage = pLanguageAgent.getMasterLanguage();
String tempUid = "";
for (Media _media : pMediaStore.getChildren(Media.class, true)){
context.logInfo(_media.getFilename() + " : " + _media.getUid());
// Meda Form Data
if (!_media.getParent().hasMeta())
continue;
if(_media.getParent().getUid().equals(tempUid))
continue;
tempUid = _media.getParent().getUid();
if(_media.getParent().isFolder()){
context.logInfo("TEMP UID: " +tempUid);
context.logInfo("TOSTRING: " +_media.getParent().getMetaFormData().get(pMasterLanguage, "md_groups").get().toString());
if(_media.getParent().getMetaFormData().get(pMasterLanguage, "md_groups").get().getAllowed("access") != null){
context.logInfo("Berechtigung: " +_media.getParent().getMetaFormData().get(pMasterLanguage, "md_groups").get().getAllowed("access").toString(";"));
context.logInfo("URL : " +_media.getParent().getStoredUrl(pMasterLanguage ));
}
}
}
Hallo Aissam,
der Fehler ist eindeutig:
Die Zeile
context.logInfo("Berechtigung: " +_media.getParent().getMetaFormData().get(pMasterLanguage, "md_groups").get().getAllowed("access").toString(";"));
verursacht
Error during script execution : de.espirit.firstspirit.access.script.ExecutionException: Error in method invocation: Method toString(java.lang.String) not found in class'java.util.TreeSet' : at Line: 20 : in file: inline evaluation of: ``__execute() { import de.espirit.firstspirit.access.Language; import de.espirit.f . . . '' : .toString ( ";" )
weil die Funktion
toString( String )
nicht existiert, siehe https://docs.oracle.com/javase/7/docs/api/java/util/AbstractCollection.html#toString()
Versuch stattdessen einfach nur
.toString()
Gruß,
Phillip.
Hallo Phillip,
danke hat funktioniert
Jetzt habe ich noch 3 Fragen.
Wie kann man den Pfad der Datei auslesen? Muss man das einzeln aufbauen mit der parent funktion oder gibt es was einfacheres?
Wie kann man die Endung der Datei ausleben, wie z.B. das es pdf oder xls ist.
getFilname gibt mir nur den Dateinamen ohne Endung zurück.
Und die letzte Frage wäre, kann man alles was man alle Daten in einer csv Datei über das Skript speicher?
Danke für deine Unterstützung!
Viele Grüße,
Aissam