通过IDE菜单运行salix webApp



我有一点代码,创建一个salix web应用程序,并通过使用util::Webserver从IDE弹出式菜单运行它。为了允许命令多次使用,我尝试先关闭该地址的任何现有web服务器,但它似乎不工作。无论如何,它总是会出现一个非法参数错误,声明"shutdown"不可能的。

void run_game(Tree t, loc s){
t = annotate(t);
PSGAME g = ps_implode(t);
Checker c = check_game(g);
Engine engine = compile(c);

loc host = |http://localhost:9050/|;

try { util::Webserver::shutdown(host);} catch: ;
util::Webserver::serve(host, load_app(engine)().callback, asDaemon = true);
println("Serving content at <host>");
}

我期望发生的是,这个函数第一次运行时,shutdown抛出一个错误,因为没有web服务器存在,然后serve启动web服务器。如果用户再次尝试运行该功能,则shutdown成功运行,清除地址绑定并且serve成功绑定到该地址。

实际上第二次发生的是,shutdown仍然错误,错误被沉默,然后serve抱怨地址已经被使用了。

我正在寻找任何解决方案,让我通过IDE的弹出式菜单(以前注册)在同一地址启动一个salix应用程序。

PS_contributions =
{
PS_style,
popup(
menu(
"PuzzleScript",
[
action("Run Game", run_game)
]
)
)
};
registerContributions(PS_NAME, PS_contributions);

右;我们遇到了类似的问题,并决定在运行web应用程序时采取特殊的行动。所以我们添加了这个:

data Menu = interaction(str label, Content ((&T <: Tree) tree, loc selection) server)

看到https://github.com/usethesource/rascal-eclipse/blob/bb70b0f6e8fa6f8c227e117f9d3567a0c2599a54/rascal-eclipse/src/org/rascalmpl/eclipse/library/util/IDE.rsc L119

Content来自Content模块,它基本上包装了任何Response(Request)servlet。

所以你可以包装你的salix webApp在一个Content和返回它给定当前选择和当前树。

IDE将负责启动和关闭服务器。每次创建与相同标签的交互时,或者在给定的HTTP端口上静默30分钟后,它都会执行此操作。

最新更新