Anonymous
Not applicable

rekursive Beanshell Skripte, Übergabe von Werten

Jump to solution

Hallo Community,

ich möchte 2 Skripte schreiben, die erstmal rekursiv die Ordner und Seitenstruktur durchgehen und mir bei best. Inhalt den Seitennamen speichern. Skript 1 soll über das Kontextmenü aufgerufen werden und dann in einer while-Schleife Skript 2 aufrufen.

Mein Problem ist, dass ich nicht weiß wie ich Werte übergeben soll / auf Übergabewerte prüfen kann.

In Skript 1 rufe ich Skript 2 momentan über:

    

Map map = new HashMap();    
ArrayList pageList = new ArrayList();

pageList.add("root");
map.put("pages", pageList);


templateStore = context.getUserService().getTemplateStore();

templateStore.getScripts().getScriptByName("get_page_names").getExecutable(context.getProject().getTemplateSets().get(0)).execute(map);



auf. In Skript 2 möchte ich nun auf die übergebene HashMap zugreifen. Ich könnte die Werte auch über result.setValue(map) übergeben aber da execute()

einen Übergabewert benötigt würde ich dann auch gerne darauf zugreifen.

0 Kudos
1 Solution

Accepted Solutions
Anonymous
Not applicable

Skript 2 wird wirklich aufgerufen. return gibt jedoch keine Ausgabe. Um Fehlermeldungen und Infomeldungen ( context.logInfo() ) zu erhalten muss im ersten Skript folgendes hinzugefügt werden:

contextMap.put("out", out);

contextMap.put("err", err);

View solution in original post

0 Kudos
6 Replies
marro
Crownpeak employee

Hallo Fabian,

Du musst der Map zunächst einmal den context mitgeben. Und dem context kannst Du zuvor noch Deine Liste übergeben. Dann kannst Du aus dem zweiten Skript über den context auf die Liste zugreifen.

Skript 1:

Map map = new HashMap();

ArrayList pageList = new ArrayList();

pageList.add("root");

context.setProperty("pages", pageList);

map.put("context", context);

templateStore = context.getUserService().getTemplateStore();
templateStore.getScripts().getScriptByName("get_page_names").getExecutable(context.getProject().getTemplateSets().get(0)).execute(map);

Skript 2:

pageList = context.getProperty("pages"));

Viele Grüße

Donato

Anonymous
Not applicable

Hat geklappt danke.
Ich habe jetzt weiter am Skript gebaut und jetzt wird Skript2 nicht mehr aufgerufen. Skript 1 bleibt in einer If-Schleife stehen. return("if") wurde eingefügt um zu sehen wo's hängt.

//!BeanShell

import de.espirit.firstspirit.access.store.Store.Type;
import de.espirit.firstspirit.access.store.pagestore.Page;
import de.espirit.firstspirit.access.store.pagestore.PageFolder;
import de.espirit.firstspirit.access.store.pagestore.PageStoreRoot;

userService = context.getUserService();
templateStore = userService.getTemplateStore();
Map contextMap = new HashMap();

if(context.getProperty("pages") == null)
{
ArrayList pageList = new ArrayList();
Map pageMap = new HashMap();

currentPageStore = userService.getStore(Type.PAGESTORE, false);
currentPage = currentPageStore.getUid().toString();

if(!currentPage.isEmpty())
{
  pageList.add(currentPage);
  pageMap.put("0", pageList);
  context.setProperty("pages", pageMap);
  contextMap.put("context", context);
  templateStore.getScripts().getScriptByName("get_page_names").getExecutable(context.getProject().getTemplateSets().get(0)).execute(contextMap);
  return("if");
}
else
{
  return("Error: No entry point found.");
}
}
else
{
templateStore.getScripts().getScriptByName("get_page_names").getExecutable(context.getProject().getTemplateSets().get(0)).execute(contextMap);
}

0 Kudos
marro
Crownpeak employee

Kannst Du denn sagen, wo genau es hängen bleibt? Ich habe Dein Skript 1:1 in mein Projekt kopiert und es ruft das zweite Skript wie erwartet auf. Nur scheint die Abfrage "if (context.getProperty("pages") == null)" nichts zu bringen, weil die Property beim Start des Skripts immer fehlt und somit der if-Block immer ausgeführt wird.

0 Kudos
Anonymous
Not applicable

Ich vermute, dass es bei mir in dem markierten if-Block nicht weiter geht ( if(!currentPage.isEmpty() ). Wenn ich hier das return("if") entferne erhalte ich keine Ausgabe / Fehler.

Wenn Skript 2 aufgerufen wird müsste ich über ein return eine Ausgabe erhalten.

Da ich Skript 1 mehrmals aufrufen will prüfe ich zuerst auf context.getProperty("pages") == null.

0 Kudos
Anonymous
Not applicable

Skript 1

//!BeanShell

import de.espirit.firstspirit.access.UserService;
import de.espirit.firstspirit.access.project.Project;
import de.espirit.firstspirit.access.store.Store;
import de.espirit.firstspirit.access.store.Store.Type;
import de.espirit.firstspirit.access.store.pagestore.Page;
import de.espirit.firstspirit.access.store.pagestore.PageFolder;
import de.espirit.firstspirit.access.store.pagestore.PageStoreRoot;

import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;

userService = context.getUserService();
templateStore = userService.getTemplateStore();
Map contextMap = new HashMap();
contextMap.put("context", context);

if(context.getProperty("pages") == null){
ArrayList pageList = new ArrayList();
Map pageMap = new HashMap();

currentPageStore = userService.getStore(Type.PAGESTORE, false);
currentPage = currentPageStore.getUid().toString();
 
if(!currentPage.isEmpty()){
  pageList.add(currentPage);
  pageMap.put("0", pageList);
  context.setProperty("pages", pageMap);
  templateStore.getScripts().getScriptByName("get_page_names").getExecutable(context.getProject().getTemplateSets().get(0)).execute(contextMap);
}
else{
  return("Error: No entry point found.");
}
}
else{
templateStore.getScripts().getScriptByName("get_page_names").getExecutable(context.getProject().getTemplateSets().get(0)).execute(contextMap);
}

Skript 2

//!Beanshell

import de.espirit.firstspirit.access.UserService;
import de.espirit.firstspirit.access.project.Project;
import de.espirit.firstspirit.access.store.Store;
import de.espirit.firstspirit.access.store.Store.Type;
import de.espirit.firstspirit.access.store.pagestore.Page;
import de.espirit.firstspirit.access.store.pagestore.PageFolder;
import de.espirit.firstspirit.access.store.pagestore.PageStoreRoot;

import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;

HashMap pageMap = context.getProperty("pages");

if(pageMap != null){
userService = context.getUserService();
currentPageStore = userService.getStore(Type.PAGESTORE, false);

pageList = currentPageStore.getChildren().toList();
String[] pageNames;

/*for(int i=get0; i<currentPageStore.getChildCount(); i++)
{
  pageNames[i] = pageList.get(i).getName();
}*/

return("skript2");
}
else{
return("Error: pageMap was empty. No pages submitted by previous script.");
}

Beide Skripte laufen ohne Fehlermeldung. Wenn ich Skript 2 direkt aufrufe erhalte ich auch die erwartete Ausgabe. Wenn ich Skript 2 über Skript 1 aufrufe erhalte ich keine Ausgabe. Script 1 geht bei meinem Aufruf in den 1. und anschließend in den 2. if-Block.

Hat jemand eine Idee was falsch ist?
Wie debuggt ihr? Ich binde mein Skript momentan in eine Seite mit CMS_RENDER ein und schaue an welchen Stellen ich mit return noch eine Ausgabe erhalte.

0 Kudos
Anonymous
Not applicable

Skript 2 wird wirklich aufgerufen. return gibt jedoch keine Ausgabe. Um Fehlermeldungen und Infomeldungen ( context.logInfo() ) zu erhalten muss im ersten Skript folgendes hinzugefügt werden:

contextMap.put("out", out);

contextMap.put("err", err);

0 Kudos