package com.sandwich.util.io; import java.io.File; import java.io.IOException; import java.util.Collections; import java.util.Map; import com.sandwich.koan.ApplicationSettings; import com.sandwich.koan.cmdline.CommandLineArgument; import com.sandwich.koan.cmdline.CommandLineArgumentRunner; import com.sandwich.koan.constant.ArgumentType; import com.sandwich.koan.constant.KoanConstants; import com.sandwich.koan.util.ApplicationUtils; import com.sandwich.util.io.classloader.DynamicClassLoader; import com.sandwich.util.io.directories.DirectoryManager; import com.sandwich.util.io.filecompiler.CompilerConfig; import com.sandwich.util.io.filecompiler.FileCompiler; public class KoanFileCompileAndRunListener implements FileListener { private Map<ArgumentType, CommandLineArgument> args = Collections.emptyMap(); private KoanSuiteCompilationListener listener = new KoanSuiteCompilationListener(); public KoanFileCompileAndRunListener(Map<ArgumentType, CommandLineArgument> args) throws IOException{ this.args = args; } public void fileSaved(File file) { String absolutePath = file.getAbsolutePath(); if(CompilerConfig.isSourceFile(absolutePath)){ ApplicationUtils.getPresenter().displayMessage(KoanConstants.EOL+"loading: "+absolutePath); File[] jars = new File(DirectoryManager.getProjectLibraryDir()).listFiles(); String[] classPath = new String[jars.length]; for (int i = 0; i < jars.length; i++) { String jarPath = jars[i].getAbsolutePath(); String jarPathLowerCase = jarPath.toLowerCase(); if(jarPathLowerCase.endsWith(".jar") || jarPathLowerCase.endsWith(".war")){ classPath[i] = jarPath; } } try { FileCompiler.compile(file, new File(DirectoryManager.getBinDir()), listener, ApplicationSettings.getFileCompilationTimeoutInMs(), classPath); DynamicClassLoader.remove(FileCompiler.sourceToClass( DirectoryManager.getSourceDir(), DirectoryManager.getBinDir(), file).toURI().toURL()); if(!listener.isLastCompilationAttemptFailure()){ ApplicationUtils.getPresenter().clearMessages(); new CommandLineArgumentRunner(args).run(); } } catch (Exception e) { throw new RuntimeException(e); } } } public void newFile(File file) { } public void fileDeleted(File file) { } }