- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Aufruf von FS Beanshell Scripten aus anderen Beanshell Scripten
Hallo Zusammen,
gibt es in FirstSpirit eigentlich die Mรถglichkeit Beanshell Scripte aus anderen Beanshell Scripten aufzurufen?
Muร ich dafรผr รผber die ScriptEngine gehen um die Executables auszulesen?!?
Falls ja, hรคtte jemand ein Beispiel, wie das Ganze funktioniert?
Vielen Dank schon mal!
Thomas Pannek
- Labels:
-
Developers
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
รber #getExecutable(TemplateSet) kommt man an das Executable und kann dieses auch ausfรผhren.
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Vielen Dank schon mal. Ich hab jetzt folgende Methdoe in ein ServerModul von uns eingebaut.
public Object executeScript(long projectId, String scriptname, Map<String,Object> context) {
TemplateStoreRoot templateStore = getTemplateStore(projectId);
Script script = templateStore.getScripts().getScriptByName(scriptname);
Project project = DAOFactory.getConnection().getProjectById(projectId);
List<TemplateSet> templateSetList = project.getTemplateSets();
TemplateSet selectedTemplateSet = null;
for(TemplateSet templateSet:templateSetList) {
if(templateSet.getPresentationChannelName().equals("XML")) {
selectedTemplateSet = templateSet;
}
}
Executable executable = script.getExecutable(selectedTemplateSet);
return executable.execute(context);
}
Wenn ich auf dem Modul nun die executeScript Methode aufrufe, wird das Script nicht aufgerufen. Firstspirit wirft aber auch keinen Fehler. Mach ich noch irgendwas falsch? Wir haben auch nur ein XML TemplateSet.
Vg
Thomas Pannek
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
if(templateSet.getPresentationChannelName().equals("XML")) {
selectedTemplateSet = templateSet;
}
Ist der "XML" Kanal der 1. Kanal in ihrem Projekt ? Bei Skripten ist der Scriptsource immer im 1. Kanal.
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Hallo,
ich wรผrde mich mal an diesen Thread anhรคngen, da ich mit dem รคhnlichem Vorhgehen beim Auruf der execute Methode folgende Exception erhalte:
de.espirit.firstspirit.access.script.ExecutionException: Error in method invocation: Method execute( de.espirit.firstspirit.impl.access.GuiScriptContextImpl ) not found in class'de.espirit.firstspirit.client.gui.applications.ApplicationTabRegistry$IdentifiableExecutable' at line 16
das script hierbei ist:
bsh % script = scripts.getScriptByName("callme");
<<SCRIPT alwaysActive="1" editor="1" id="5049" name="callme" revision="65">
<LANG displayname="callMe" language="DE"/>
</SCRIPT>
templateSetList:
bsh % templateSetList = context.getProject().getTemplateSets();
<[de.espirit.firstspirit.server.templatemanagement.TemplateSetImpl@1563b4b{id=2622, name=html, presentationChannel=HTML}]>
templateSet:
bsh % templateSet = templateSetList.get(0);
<de.espirit.firstspirit.server.templatemanagement.TemplateSetImpl@1563b4b{id=2622, name=html, presentationChannel=HTML}>
bsh % executable = script.getExecutable(templateSet);
<de.espirit.firstspirit.client.gui.applications.ApplicationTabRegistry$IdentifiableExecutable@db89c2>
// Error: EvalError: Error in method invocation: Method execute( de.espirit.firstspirit.impl.access.GuiScriptContextImpl ) not found in class'de.espirit.firstspirit.client.gui.applications.ApplicationTabRegistry$IdentifiableExecutable' : at Line: 1 : in file: <unknown file> : executable .execute ( context )
Der รผbergebene context ist der GuiScriptContext aus dem aurufendem Script - anscheinend ist das ein Problem fรผr die execute Methode?
Viele Grรผรe,
Jan Bussek
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Ich habe leider dasselbe Problem.
Scheinbar benรถtigt execute eine Map als Parameter. Leider weiร ich nicht wie diese aussehen soll. Wahrscheinlich kรถnnen mehrere Kontexte รผbergeben werden. Allerdings weiร ich nicht, was fรผr ein Key erwartet wird.
m = new Hashmap();
m.put( "0", context );
e.execute( m );
wobei e mein Executable ist. Das fรผhrt das Script zwar aus, aber scheinbar wird der Kontext nicht richtig รผbergeben.
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Hallo,
bitte mal schildern, was Sie รผberhaupt erreichen wollen und warum es notwendig ist ein Skript aus einem anderen Skript heraus aufzurufen.
Gruss
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Der Kontext wird in FirstSpirit immer unter dem Variablennamen "context" รผbergeben, also sollte
map.put("context", context);
das gewรผnschte tun.
Natรผrlich kรถnnen auch weitere Parameter รผbergeben werden, allerdings mรผssen fรผr Beanshell (und wahrscheinlich auch fรผr die meisten anderen Skriptingsprachen) die Variablennamen (=Schlรผssel) gรผltige Java-Bezeichner sein. Und ich meine auch, das bei Beanshell "null" als Wert nicht erlaubt ist (da bin ich mir aber nicht sicher, bei Bedarf bitte ausprobieren).
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Danke, den context in einer HashMap mit dem Key "context" zu รผbergeben lรถst das geschilderte Problem.
Generell geht es darum im aufrufenden Script Input รผber das zum Skript definierte Form entgegenzunehmen und diesen im aufgerufenen Skript รผber den Aufruf einer executable implementierenden Modulklasse innerhalb dieser Klasse weiterverarbeiten zu kรถnnen.
Das Vorgehen basiert auf der Annahme, dass der erste Aufruf im letzteren Skript der Aufruf der entsprechenden executable implementierenden Klasse sein muss.
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Wenn ich Sie richtig verstehe, haben Sie in FirstSpirit einen Skript-Knoten (in meinem Fall: "Example") der ein Executable-Aufruf enthรคlt:
An dieses Executable (in meinem Fall: "de.espirit.MyExecutable") wollen Sie gerne Benutzereingaben รผbergeben. Aus meiner Sicht, sollte es problemlos mรถglich sein, in genau diesem Skript-knoten ("Example") ein Formular zu definieren und dieses dann innerhalb des Excecutables aufzurufen.
Der Code im Excecutable sollte dann ungefรคhr so aussehen:
import de.espirit.firstspirit.access.GuiScriptContext;
public class MyExecutable implements Executable {
....
public Object execute(final Map<String, Object> params, final Writer _out, final Writer _err) throws ExecutionException {
final Object contextArg = params.get("context");
if (contextArg instanceof GuiScriptContext) {
final GuiScriptContext context = (GuiScriptContext) contextArg;
final Data data = context.showGui();
if (data != null) {
data.get("st_text");
// todo
} else {
// user clicked cancel
}
}
}
Falls ich den Anwendungsfall nicht richtig verstanden habe, dann bitte noch mal genauer erlรคutern.

