运行 通过 IDE 菜单的 salix webApp

Running a salix webApp through an IDE menu

我有一些代码可以创建一个 salix 网络应用程序,并通过使用 util::Webserver 从 IDE 弹出菜单中 运行s 它。为了允许多次使用该命令,我尝试先关闭该地址的任何现有网络服务器,但它似乎不起作用。不管怎样,它总是出现非法参数错误,指出“关闭”不可能。

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 抛出一个错误,该错误因不存在网络服务器而被抑制,然后 serve 启动网络服务器。如果用户再次尝试 运行 函数,则 shutdown 成功 运行s,清除地址绑定并且 serve 成功绑定到地址。

第二次实际发生的情况是,shutdown 仍然出错,错误消失,然后 serve 抱怨地址已被使用。

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

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

registerContributions(PS_NAME, PS_contributions);

对;我们 运行 遇到了类似的问题,并决定对 运行 网络应用程序进行特殊处理。所以我们添加了这个:

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 和 return 中,给定当前选择和当前树。

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