/**
* Դ�������ƣ�ScriptUtils.java
* �������Ȩ���������ӹɷ�����˾ ��Ȩ����
* ϵͳ���ƣ�JRES Studio
* ģ�����ƣ�com.hundsun.ares.studio.jres.core
* ����˵����JRES Studio�Ļ����ܹ���ģ�淶
* ����ĵ���
* ���ߣ�
*/
package com.hundsun.ares.studio.jres.script.engin;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.util.HashMap;
import java.util.Map;
import javax.script.Bindings;
import javax.script.Invocable;
import javax.script.ScriptContext;
import javax.script.ScriptEngine;
import javax.script.ScriptException;
import javax.script.SimpleBindings;
import org.apache.commons.io.IOUtils;
import org.apache.log4j.Logger;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.core.runtime.jobs.Job;
import org.eclipse.jface.window.Window;
import com.hundsun.ares.studio.core.ARESCore;
import com.hundsun.ares.studio.core.ConsoleHelper;
import com.hundsun.ares.studio.core.IARESResource;
import com.hundsun.ares.studio.core.model.JRESResourceInfo;
import com.hundsun.ares.studio.core.scripting.AresScriptEngineManager;
import com.hundsun.ares.studio.jres.script.util.impl.ARESProjectScriptWrapImpl;
import com.hundsun.ares.studio.jres.script.util.impl.ScriptCalendarUtilImpl;
import com.hundsun.ares.studio.jres.script.util.impl.ScriptFileUtilImpl;
import com.hundsun.ares.studio.jres.script.util.impl.ScriptInUtilImpl;
import com.hundsun.ares.studio.jres.script.util.impl.ScriptOutUtilImpl;
import com.hundsun.ares.studio.jres.script.util.impl.ScriptReferenceUtilImpl;
import com.hundsun.ares.studio.jres.script.util.impl.ScriptStringUtilImpl;
import com.hundsun.ares.studio.jres.script.util.impl.ScriptSysUtilImpl;
import com.hundsun.ares.studio.jres.script.util.impl.ScriptXMLUtilImpl;
/**
* �ű������ࡣ
*
* @author mawb
* @author sundl
*
*/
public class ScriptUtils {
private static Logger logger = Logger.getLogger(ScriptUtils.class);
public static final String MAIN = "main";
public static final String MODE = "mode";
public static final int MODE_CONTEXT_MENU = 1;
public static final int MODE_EDITOR_BUTTON = 2;
public static final int MODE_BUILDER = 3;
public static final int MODE_CMD_BUILDER = 4;//�������
private static final ScriptUtils INSTANCE = new ScriptUtils();
static final Logger console = ConsoleHelper.getLogger();
/**
* ִ��js�ű��е�main����
* @param mode ģʽ 1�����Ҽ�ִ�У�2����༭���еİ�ť������3����builder
* @param jsResource �ű���Դ
* @param res ��Դ��������null�����ض���ģʽ�����ض��Ľű��вŻ���
* @param info ��Դ��������null�����ض���ģʽ�����ض��Ľű��вŻ���
* @param loader classloader
* @param extContext �����context����,���û�п���Ϊnull; Ҳ�������ڸ���Ĭ�ϵ�context�е�ֵ�����á�
* @throws IOException
* @throws CoreException
* @throws ScriptException
* @throws NoSuchMethodException
* @see MODE_CONTEXT_MENU
* @see MODE_EDITOR_BUTTON
* @see MODE_BUILDER
*/
public static void excuteJS( int mode,
IARESResource jsResource,
IARESResource res,
JRESResourceInfo info,
ClassLoader loader,
Map<String, Object> extContext)
throws IOException, CoreException, ScriptException, NoSuchMethodException {
final ScriptEngine engine = AresScriptEngineManager.getScriptEngineManager().getEngineByName(ARESCore.SCRIPT_ENGINE_NAME);
InputStream stream = null;
if(jsResource == null || !jsResource.exists()){
throw new FileNotFoundException("js�ű��ļ������ڣ�");
}
try {
stream = jsResource.openStream();
String script = null;
final IResource jsRes = jsResource.getResource();
if (jsRes instanceof IFile) {
script = IOUtils.toString(stream, ((IFile) jsRes).getCharset());
} else {
script = IOUtils.toString(stream, "UTF-8");
}
// ����Ĭ�Ͻű�������
final Map<String, Object> defaultContext = ScriptUtils.createDefaultScriptContext(mode,jsResource, res,info, loader);
ScriptInUtilImpl input = (ScriptInUtilImpl) defaultContext.get("input");
if (extContext != null)
defaultContext.putAll(extContext);
defaultContext.put(ScriptUtils.MODE, mode);
engine.setBindings(ScriptUtils.toScriptBindings(defaultContext), ScriptContext.ENGINE_SCOPE);
engine.eval(script);
if(input.getInput()==Window.CANCEL){
return;
}
Job job = new Job("") {
@Override
protected IStatus run(IProgressMonitor monitor) {
try {
monitor.beginTask(jsRes.getName() +" ����ִ��...", IProgressMonitor.UNKNOWN);
((Invocable) engine).invokeFunction(MAIN, defaultContext);
monitor.done();
} catch (ScriptException e) {
logger.error("�ű�ִ�г���...", e);
ConsoleHelper.getLogger().error("ִ�нű�����...", e);
} catch (NoSuchMethodException e) {
logger.error("�ű�ִ�г���...", e);
ConsoleHelper.getLogger().error("ִ�нű�����...", e);
}
return Status.OK_STATUS;
}
};
job.setUser(true);
job.schedule();
} finally {
IOUtils.closeQuietly(stream);
}
}
/**
* ����һ��Ĭ�ϵĽű�������
* @return
*/
public static Map<String, Object> createDefaultScriptContext(int mode,IARESResource jsResource,IARESResource res, JRESResourceInfo info, ClassLoader loader) {
Map<String, Object> context = new HashMap<String, Object>();
if (jsResource != null){
context.put("project",new ARESProjectScriptWrapImpl( jsResource.getARESProject()));
}
// model = 3;
context.put("stringutil", ScriptStringUtilImpl.instance);
context.put("input", new ScriptInUtilImpl(mode, jsResource,context));
context.put("output",new ScriptOutUtilImpl(mode));
context.put("file", ScriptFileUtilImpl.instance);
context.put("xml", ScriptXMLUtilImpl.instance);
context.put("sys", ScriptSysUtilImpl.instance);
context.put("calendar", ScriptCalendarUtilImpl.instance);
context.put("reference", ScriptReferenceUtilImpl.instance);//�������ù�����
context.put("logger", logger);
return context;
}
/**
* ת��Ϊ�ű�����ʹ�õ�������
* @param context
* @return
*/
public static Bindings toScriptBindings(Map<String, Object> context) {
return new SimpleBindings(context);
}
}