java嵌入groovy脚本_Java封装groovy脚本引擎并支持脚本包含(include)功能
上篇文章“
package com.findsrc.common.script;
import java.io.IOException;
import java.io.InputStream;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import javax.annotation.Resource;
import org.springframework.stereotype.Component;
import com.findsrc.common.exception.NestedRuntimeException;
import com.findsrc.common.util.ResourceUtil;
import com.findsrc.common.util.StringUtil;
@Component("scriptEngine")
public class FSScriptEngine implements ScriptEngine {
//包含的正則
public static final Pattern PATTERN = Pattern.compile("^\\s*?#include\\((.+?)\\)\\s*?;?", 8);
//見上篇文章中的介紹
@Resource(name = "groovyScriptEngine")
private ScriptEngine scriptEngine;
@Override
public Object evalFile(String fileName, Map binding) {
InputStream is = ResourceUtil.loadStream(fileName);
String content;
try {
content = StringUtil.readStream(is);
} catch (IOException e) {
throw new NestedRuntimeException("腳本未找到:" + fileName, e);
} finally {
ResourceUtil.close(is);
}
return eval(content, binding);
}
@Override
public Object eval(String script, Map binding) {
return eval(script, script, binding);
}
@Override
public Object eval(String scriptName, String script, Map binding) {
script = prepareScript(script);
return this.scriptEngine.eval(scriptName, script, binding);
}
//清除腳本緩存
@Override
public void clearCache() {
this.scriptEngine.clearCache();
}
public void setScriptEngine(ScriptEngine scriptEngine) {
this.scriptEngine = scriptEngine;
}
//處理include
public String prepareScript(String script) {
Matcher matcher = PATTERN.matcher(script);
StringBuffer preparedScript = new StringBuffer();
while (matcher.find()) {
String includeFile = matcher.group(1).trim();
InputStream is = ResourceUtil.loadStream(includeFile);
String content;
try {
content = StringUtil.readStream(is);
} catch (IOException e) {
throw new NestedRuntimeException("包含的腳本未找到:" + includeFile, e);
} finally {
ResourceUtil.close(is);
}
String valueReplacement = content.replaceAll("\\\\", "\\\\\\\\").replaceAll("\\$", "\\\\\\$");
matcher.appendReplacement(preparedScript, valueReplacement);
}
matcher.appendTail(preparedScript);
return preparedScript.toString();
}
}
使用方式,參考以下groovy代碼:
//functions.sc 內容
import static com.findsrc.bitlight.BitLightUtil.*
def Log = { it ->println it }
def GetTime = {it-> return GetTime(it,600) }
final ROOT='/Users/rainy/Documents'
//functions.sc 內容
//include上級目錄的functions.sc
#include(../functions.sc)
ROOT+'/'+GetYmd(rowdata.datetime)+'/'+rowdata.contractId+'.dat'
總結
以上是生活随笔為你收集整理的java嵌入groovy脚本_Java封装groovy脚本引擎并支持脚本包含(include)功能的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java中对象和引用的理解
- 下一篇: bmon:一个强大的网络带宽监视和调试工