package com.javaxyq.core; import java.io.File; import java.io.IOException; import java.net.MalformedURLException; import java.net.URL; import java.net.URLClassLoader; import java.util.Arrays; import java.util.EventListener; import java.util.List; import javax.tools.Diagnostic; import javax.tools.DiagnosticCollector; import javax.tools.JavaCompiler; import javax.tools.StandardJavaFileManager; import javax.tools.ToolProvider; import com.javaxyq.event.PanelListener; import com.javaxyq.event.SceneListener; /** * Ĭ�Ͻű��������棨java�� * @author gongdewei * @date 2010-6-27 create */ public class DefaultScript implements ScriptEngine{ private static DefaultScript instance = new DefaultScript(); public static DefaultScript getInstance() { return instance; } /** * @param args */ // public static void main(String[] args) { // DefaultScript.getInstance().compileAndLoadClass("ui.mainwin"); // } private String classesDir = "tmp/script_classes"; private boolean debug; private String sourceDir = "scripts/"; private DefaultScript() { } private String classToJava(String classname) { return sourceDir +classname.replace('.', '/')+".java"; } public boolean compile(String filename) { File dir = new File(classesDir); if(!dir.exists()) { dir.mkdirs(); } System.out.println("����" + filename + " .."); JavaCompiler compiler = ToolProvider.getSystemJavaCompiler(); DiagnosticCollector diagnostics = new DiagnosticCollector(); StandardJavaFileManager fileManager = compiler.getStandardFileManager( diagnostics, null, null); Iterable compilationUnits = fileManager .getJavaFileObjectsFromStrings(Arrays.asList(filename)); String[] options = new String[] {"-d",classesDir}; JavaCompiler.CompilationTask task = compiler.getTask(null, fileManager, diagnostics, Arrays.asList(options) , null, compilationUnits); boolean success = task.call(); try { fileManager.close(); } catch (IOException e) { e.printStackTrace(); } System.out.println((success) ? "����ɹ�." : "����ʧ��!"); if (!success) { List<Diagnostic> list = diagnostics.getDiagnostics(); for (Diagnostic dia : list) { System.out.println(dia); } } return success; } // public Object compileAndLoadClass(String classname) { // compile(classToJava(classname)); // return loadClass(classname); // } public String getClassesDir() { return classesDir; } public String getSourceDir() { return sourceDir; } @Override public boolean isDebug() { return debug; } public Object loadClass(String classname) { try { URLClassLoader classLoader = new URLClassLoader(new URL[] { new File( classesDir).toURI().toURL() }); return classLoader.loadClass(classname).newInstance(); } catch (MalformedURLException e) { e.printStackTrace(); } catch (InstantiationException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (ClassNotFoundException e) { System.err.println("ClassNotFound: "+e.getMessage()); //e.printStackTrace(); } return null; } @Override public <T> T loadClass(String classname, Class<T> clazz) { try { Object classobj = loadClass(classname); return (T) classobj; } catch (ClassCastException e) { System.err.println("���ؽű�ʧ�ܣ�����ת������"+e.getMessage()); } catch (Exception e) { e.printStackTrace(); } return null; } public EventListener loadNPCScript(String npcId) { try { EventListener obj = (EventListener) loadClass("npc.n"+npcId); if(isDebug() || obj==null) { compile("scripts/npc/n"+npcId+".java"); } return (EventListener) loadClass("npc.n"+npcId); } catch (Exception e) { e.printStackTrace(); } return null; } @Override public SceneListener loadSceneScript(String sceneId) { try { SceneListener obj = (SceneListener) loadClass("scene.s"+sceneId); if(isDebug() || obj==null) { compile("scripts/scene/s"+sceneId+".java"); } return (SceneListener) loadClass("scene.s"+sceneId); } catch (Exception e) { e.printStackTrace(); } return null; } @Override public PanelListener loadUIScript(String id) { try { PanelListener obj = (PanelListener) loadClass("ui."+id); if(isDebug() || obj==null) { compile("scripts/ui/"+id+".java"); } return (PanelListener) loadClass("ui."+id); } catch (Exception e) { e.printStackTrace(); } return null; } public void setClassesDir(String classesDir) { this.classesDir = classesDir; } @Override public void setDebug(boolean debug) { this.debug = debug; } public void setSourceDir(String sourceDir) { this.sourceDir = sourceDir; } @Override public void clearCache() { File dir = new File(classesDir); if(dir.exists()) { deleteAll(dir); } } private void deleteAll(File target) { if(target.isDirectory()) { File[] files = target.listFiles(); for (File file : files) { deleteAll(file); } } target.delete(); } }