📄 javascriptrunner.java
字号:
package cn.myapps.core.macro.runner;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import javax.script.Bindings;
import javax.script.Compilable;
import javax.script.CompiledScript;
import javax.script.ScriptContext;
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;
import javax.script.SimpleBindings;
import cn.myapps.base.action.ParamsTable;
import cn.myapps.core.dynaform.activity.ejb.Activity;
import cn.myapps.core.dynaform.document.ejb.Document;
import cn.myapps.core.dynaform.macro.CurrDocJsUtil;
import cn.myapps.core.dynaform.macro.FactoryJsUtil;
import cn.myapps.core.dynaform.macro.HTMLJsUtil;
import cn.myapps.core.dynaform.macro.PrintJsUtil;
import cn.myapps.core.dynaform.macro.Tools;
import cn.myapps.core.dynaform.macro.WebJsUtil;
import cn.myapps.core.macro.repository.ejb.RepositoryProcess;
import cn.myapps.core.macro.repository.ejb.RepositoryVO;
import cn.myapps.core.user.action.WebUser;
import cn.myapps.core.user.ejb.UserVO;
import cn.myapps.util.ProcessFactory;
import cn.myapps.util.ftp.FTPUpload;
import cn.myapps.util.mail.EmailUtil;
import cn.myapps.util.sequence.Sequence;
import cn.myapps.util.sequence.SequenceException;
public class JavaScriptRunner {
private static final String LANG = "JavaScript";
private static final ThreadLocal _threadBSFManager = new ThreadLocal();
HTMLJsUtil _htmlJsUtil;
private ScriptEngine engine;
// private ScriptContext context;
private String label;
private HashSet libs = new HashSet();
private String applicationid;
/**
* @param args
*/
public static void main(String[] args) {
JavaScriptRunner runner = JavaScriptRunner.getInstance();
try {
runner.initBSFManager(new Document(), new ParamsTable(),
new WebUser(new UserVO()), new ArrayList(), null);
// Object result = runner.run("$PRINTER.println(1+1)");
// System.out.println("result->"+result);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public static void clear() {
JavaScriptRunner runner = (JavaScriptRunner) _threadBSFManager.get();
if (runner != null) {
runner.libs.clear();
}
}
private JavaScriptRunner() {
ScriptEngineManager manager = new ScriptEngineManager();
engine = manager.getEngineByName(LANG);
// context = engine.getContext();
// context = new javax.script.SimpleScriptContext();
// engine.setContext(context);
try {
label = "RunnerInstance:" + Sequence.getSequence();
} catch (SequenceException e) {
e.printStackTrace();
}
}
// -- Internals only below this point
private void createScriptEngine() {
ScriptEngineManager manager = new ScriptEngineManager();
ScriptEngine engine = manager.getEngineByName(LANG);
if (engine == null) {
throw new RuntimeException("cannot load " + LANG + " engine");
}
engine.setBindings(createBindings(), ScriptContext.ENGINE_SCOPE);
}
private Bindings createBindings() {
// Bindings binds = null;
Map map = Collections.synchronizedMap(new HashMap());
return new SimpleBindings(map);
}
public static JavaScriptRunner getInstance() {
if (_threadBSFManager.get() == null) {
_threadBSFManager.set(new JavaScriptRunner());
}
JavaScriptRunner application = (JavaScriptRunner) _threadBSFManager.get();
if (application._htmlJsUtil != null) {
application._htmlJsUtil.clear();
}
return application;
}
private CompiledScript compile(String src) throws ScriptException {
if (engine instanceof Compilable) {
Compilable compEngine = (Compilable) engine;
CompiledScript script = compEngine.compile(src);
return script;
}
return null;
}
public Object run(String js) throws Exception {
long start = System.currentTimeMillis();
Object result = null;
if (js != null) {
if (js.indexOf("#include") != -1) {
String Content = js;
while (Content.indexOf("#include") != -1) {
String libname = null;
int k = 0, t = 0, e = 0;
k = Content.indexOf("#include");
t = Content.indexOf("\"", k + 8);
e = Content.indexOf("\"", t + 1);
libname = Content.substring(t + 1, e);
if (!libs.contains(libname)) {
RepositoryProcess rp = (RepositoryProcess) ProcessFactory
.createProcess(RepositoryProcess.class);
RepositoryVO rpvo = rp.getRepositoryByName(libname,
this.applicationid);
if (rpvo != null && rpvo.getContent() != null
&& rpvo.getContent().trim().length() > 0) {
CompiledScript script = compile(rpvo.getContent());
if (script == null) {
engine.eval(rpvo.getContent());
} else {
script.eval();
}
// System.out.println("context-->"+);
// script.exec(engine, scope);
// context.eval("javascript", "macrolib:["
// + rpvo.getName() + "] " + label, 0, 0, rpvo
// .getContent());
}
// if (rpvo != null)
// Content += rpvo.getContent();
libs.add(libname);
}
String st = Content.substring(0, k);
String ed = Content.substring(e + 1, Content.length());
Content = st + ed;
}
js = Content;
}
// result = context.evaluateString("javascript", label, 0, 0, js);
result = engine.eval(js);
}
System.out.println("Run JS times->"
+ (System.currentTimeMillis() - start) + "(ms)");
if (System.currentTimeMillis() - start>300) {
System.out.println();
System.out.println("#################################");
System.out.println(js);
System.out.println("#################################");
}
return result;
}
public String getHtmlText() {
if (_htmlJsUtil != null) {
String text = _htmlJsUtil.toString();
if (text != null) {
return text;
}
}
return "";
}
public void declareBean(String registName, Object bean, Class clazz)
throws Exception {
engine.put(registName, bean);
}
// 注册ACTIVITY
public void registerActivity(Activity activity) throws Exception {
declareBean("$ACTIVITY", activity, Activity.class);
}
public void initBSFManager(Document currdoc, ParamsTable params,
WebUser user, Collection errors, String application) throws Exception {
if (application != null) {
this.applicationid = application;
}
// 定以自动发送服务
declareBean("$EMAIL", new EmailUtil(applicationid), EmailUtil.class);
declareBean("$FTP", new FTPUpload(), FTPUpload.class);
// 设置页面参数
if (currdoc != null) {
currdoc.set_params(params);
}
if (currdoc != null)
declareBean("$CURRDOC", new CurrDocJsUtil(currdoc),
CurrDocJsUtil.class);
// 申明打印工具类
declareBean("$PRINTER", new PrintJsUtil(), PrintJsUtil.class);
// 申明WEB工具类
if (currdoc != null && params != null && user != null)
declareBean("$WEB", new WebJsUtil(currdoc, params, user, errors),
WebJsUtil.class);
// 申明工具类
declareBean("$TOOLS", new Tools(), Tools.class);
// JSFactory类,可调用任一proxy
declareBean("$BEANFACTORY", new FactoryJsUtil(), FactoryJsUtil.class);
// PROCESSFactory类,可调用任一proxy
declareBean("$PROCESSFACTORY", ProcessFactory.getInstance(),
ProcessFactory.class);
/*
* // 函数库 BSF_MANAGER.declareBean("$REPOSITORY", new RepositoryVO(),
* RepositoryVO.class);
*/
// HTML类
if (_htmlJsUtil == null)
_htmlJsUtil = new HTMLJsUtil();
declareBean("$HTML", _htmlJsUtil, HTMLJsUtil.class);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -