⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 javascriptrunner.java

📁 OBPM是一个开源
💻 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 + -