Questions & Answers

tjuice
I'm new here

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

14 Replies
gockel
Crownpeak employee

รœber #getExecutable(TemplateSet) kommt man an das Executable und kann dieses auch ausfรผhren.

0 Kudos

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

0 Kudos
gockel
Crownpeak employee

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.

0 Kudos

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

0 Kudos

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.

0 Kudos

Hallo,

bitte mal schildern, was Sie รผberhaupt erreichen wollen und warum es notwendig ist ein Skript aus einem anderen Skript heraus aufzurufen.

Gruss

0 Kudos

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).

Peter
0 Kudos

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.

0 Kudos
gockel
Crownpeak employee

Wenn ich Sie richtig verstehe, haben Sie in FirstSpirit einen Skript-Knoten (in meinem Fall: "Example") der ein Executable-Aufruf enthรคlt:

executable.png

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.

form.png

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.

0 Kudos

Type a product name