package org.freeplane.plugin.script; import groovy.lang.GroovyClassLoader; import java.io.File; import java.util.ArrayList; import java.util.Collection; import org.apache.commons.io.FileUtils; import org.codehaus.groovy.control.CompilationUnit; import org.codehaus.groovy.control.CompilerConfiguration; import org.codehaus.groovy.tools.FileSystemCompiler; import org.freeplane.core.util.LogUtils; public class ScriptCompiler { public static void compileScriptsOnPath(ArrayList<String> pathElements) { for (String pathElement : pathElements) { final File dir = new File(pathElement); if (dir.isDirectory()) compileScriptsInDirectory(dir); } } private static void compileScriptsInDirectory(File dir) { final Collection<File> files = FileUtils.listFiles(dir, new String[] { ".groovy" }, true); if (!files.isEmpty()) compile(dir, files); } private static void compile(File dir, Collection<File> files) { compile(dir, toArray(files)); } private static void compile(File dir, File[] files) { try { final CompilerConfiguration compilerConfiguration = ScriptingEngine.createCompilerConfiguration(); compilerConfiguration.setTargetDirectory(dir); final CompilationUnit unit = new CompilationUnit(compilerConfiguration, null, new GroovyClassLoader( ScriptingEngine.class.getClassLoader())); new FileSystemCompiler(compilerConfiguration, unit).compile(files); LogUtils.info("compiled in " + dir + ": " + createNameList(files)); } catch (Exception e) { LogUtils.severe("error compiling in " + dir + createNameList(files), e); } } private static File[] toArray(Collection<File> groovyFiles) { return groovyFiles.toArray(new File[groovyFiles.size()]); } private static ArrayList<String> createNameList(File[] files) { final ArrayList<String> names = new ArrayList<String>(files.length); for (File file : files) { names.add(file.getName()); } return names; } }