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