简体   繁体   English

Groovy沙箱和Java:执行Groovy脚本

[英]Groovy sandbox and Java: execute Groovy script

Task: execute groovy script with Groovy sandbox: 任务:使用Groovy沙箱执行groovy脚本:

Groovy Script to execute: 要执行的Groovy脚本:

query.reverse(); // QUERY is a some string that should be reversed

File "GroovyScriptSandbox.groovy" should get two parameters(script and values for this script): 文件“ GroovyScriptSandbox.groovy”应获取两个参数(脚本和此脚本的值):

package test.my.groovy.sandbox

import org.codehaus.groovy.control.CompilerConfiguration
import org.codehaus.groovy.control.customizers.ImportCustomizer
import org.codehaus.groovy.control.customizers.SecureASTCustomizer
import org.springframework.stereotype.Component


@Component
class GroovyScriptSandbox {

def config
def shell


    public String runScript(final String script, final String query) {
        final ImportCustomizer imports = new ImportCustomizer()
                                                .addStarImports('groovyx.net.http')
                                                .addStaticStars('groovyx.net.http.ContentType', 'groovyx.net.http.Method')
        config = new CompilerConfiguration()
        config.addCompilationCustomizers(imports)
        def newScript = "{ query -> " + script + "}"

        shell = new GroovyShell(config)
        def clos = shell.evaluate(newScript)
        return clos.call(query)
    }
}

Java method that executes "GroovyScriptSandbox.groovy": 执行“ GroovyScriptSandbox.groovy”的Java方法:

@Resource
private GroovyScriptSandbox groovyScriptSandbox;

@RequestMapping(value = "/run", method = RequestMethod.POST)
@ResponseBody
public String runScript(@RequestParam("script") final String script, 
                       @RequestParam("query") final String query) {
    return groovyScriptSandbox.runScript(script, query);
}

In that case all works fine: 在这种情况下,一切正常:

  • Java controller getting script parameter equal "query.reverse()" and query parameter equals "0123" Java控制器获取脚本参数等于“ query.reverse()”并且查询参数等于“ 0123”
  • Groovy file executes script "query.reverse()" in sandbox where query equals "0123" Groovy文件在沙盒中执行脚本“ query.reverse()”,其中查询等于“ 0123”
  • Result equals "3210" 结果等于“ 3210”

Question: I'm trying to replace "GroovyScriptSandbox.groovy" file with "GroovyScriptSandbox.java" and I don't know how to write the same groovy code in Java. 问题:我正在尝试将“ GroovyScriptSandbox.groovy”文件替换为“ GroovyScriptSandbox.java”,但我不知道如何在Java中编写相同的groovy代码。

Finally found solution: 终于找到解决方法:

public String scriptRunner(final String script, final String query) {
    final ImportCustomizer imports = new ImportCustomizer();
    imports.addStaticStars("java.lang.Math");
    imports.addStarImports("groovyx.net.http");
    imports.addStaticStars("groovyx.net.http.ContentType", "groovyx.net.http.Method");

    final SecureASTCustomizer secure = new SecureASTCustomizer();
    secure.setClosuresAllowed(true);

    final CompilerConfiguration config = new CompilerConfiguration();
    config.addCompilationCustomizers(imports, secure); 

    final Binding intBinding = new Binding(); // alow parameters in the script
    intBinding.setVariable("query", query);

    final GroovyShell shell = new GroovyShell(intBinding, config); // create shall

    // code execution
    final Object clos = shell.evaluate(script);  

    if (clos == null) {
        return "No result avalible!";
    }
    return clos.toString();
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM