/**
* <p>Copyright: Copyright (c) 2009</p>
* <p>Company: �������ӹɷ�����˾</p>
*/
package com.hundsun.ares.studio.core.scripting;
import java.io.UnsupportedEncodingException;
import java.util.Map;
import javax.script.Invocable;
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.runtime.CoreException;
import com.hundsun.ares.studio.core.ARESCore;
import com.hundsun.ares.studio.core.ConsoleHelper;
import com.hundsun.ares.studio.core.IARESProject;
import com.hundsun.ares.studio.core.registry.ARESContextRegistry;
import com.hundsun.ares.studio.core.util.StringUtil;
import com.hundsun.ares.studio.core.validate.IAresContext;
/**
* �ű����������
* @author sundl
*/
public class AresScriptEngineManager {
public static AresScriptEngineManager instance;
private ScriptEngineManager scriptEngineManager;
private AresScriptEngineManager() {
this.scriptEngineManager = new ScriptEngineManager();
}
/**
* ��ȡ��������ʵ��
* @return �ű����������
*/
public static AresScriptEngineManager getInstance() {
if (instance == null)
instance = new AresScriptEngineManager();
return instance;
}
public static ScriptEngineManager getScriptEngineManager() {
return getInstance().scriptEngineManager;
}
/**
* ��ȡ�ű�����
* @param ext ��չ��������js
* @return �ű�����
*/
public ScriptEngine getEngineByExtension(String ext, IARESProject project) {
Map<String, IAresContext> contexts = ARESContextRegistry.getInstance().createContexts(project);
ScriptEngine engine = scriptEngineManager.getEngineByExtension(ext);
if (engine != null) {
engine.put("contexts", contexts);
engine.put("project", project);
engine.put("logger", ConsoleHelper.getLogger());
}
return engine;
}
public void runScript(String script, String ext, IARESProject project) throws ScriptException {
ScriptEngine engine = getEngineByExtension(ext, project);
if (engine != null) {
engine.eval(script);
}
}
public void runScript(String script, String ext, IARESProject project,Map<String, Object> para) throws ScriptException {
ScriptEngine engine = getEngineByExtension(ext, project);
if (engine != null) {
for(String name : para.keySet()){
engine.put(name, para.get(name));
}
engine.eval(script);
}
}
public void runScript(IFile file) throws ScriptException, UnsupportedEncodingException, CoreException {
runScript(new String(StringUtil.getString(file.getContents()).getBytes(), "UTF-8"),file.getFileExtension(),ARESCore.create(file.getProject()));
}
public void runJsScript(String script, IARESProject project,Map<String, Object> para) throws ScriptException {
runScript(script, "js", project,para);
}
public void runJsScript(String script, IARESProject project) throws ScriptException {
runScript(script, "js", project);
}
public boolean invokeScirptMethod(IFile file, String methodName, Object... args) throws ScriptException, NoSuchMethodException, UnsupportedEncodingException, CoreException {
return invokeScirptMethod(new String(StringUtil.getString(file.getContents()).getBytes(), "UTF-8"),file.getFileExtension(),ARESCore.create(file.getProject()),methodName,args);
}
public boolean invokeScirptMethod(String script, String ext, IARESProject project,String methodName, Object... args) throws ScriptException, NoSuchMethodException, UnsupportedEncodingException, CoreException {
ScriptEngine engine = getEngineByExtension(ext, project);
if (engine == null)
return false;
engine.eval(script);
Invocable invocable = (Invocable) engine;
invocable.invokeFunction(methodName, args);
return true;
}
}