package com.sandwich.koan; import java.io.File; import java.io.UTFDataFormatException; import com.sandwich.koan.util.ApplicationUtils; import com.sandwich.util.io.FileMonitor; import com.sandwich.util.io.FileMonitorFactory; import com.sandwich.util.io.classloader.DynamicClassLoader; import com.sandwich.util.io.directories.DirectoryManager; public class KoanClassLoader extends DynamicClassLoader { private static KoanClassLoader instance; private final FileMonitor fileMonitor; private KoanClassLoader(){ this(DirectoryManager.getBinDir(), DirectoryManager.getSourceDir(), buildClassPath(), DynamicClassLoader.class.getClassLoader(), ApplicationSettings.getFileCompilationTimeoutInMs(), getFileMonitor()); } private static FileMonitor getFileMonitor() { try{ return FileMonitorFactory.getInstance(new File(DirectoryManager.getMainDir()), new File(DirectoryManager.getDataFile())); }catch(RuntimeException x){ if(x.getCause() instanceof UTFDataFormatException){ ApplicationUtils.getPresenter().displayError("Issue loading file system hashes, please rerun run.bat or run.sh with the -clear switch to reset."); System.exit(4); } throw x; } } private KoanClassLoader(String binDir, String sourceDir, String[] classPath, ClassLoader parent, long timeout, FileMonitor fileMonitor) { super(binDir, sourceDir, classPath, parent, timeout); this.fileMonitor = fileMonitor; } @Override public boolean isFileModifiedSinceLastPoll(String sourcePath, long lastModified) { return fileMonitor.isFileModifiedSinceLastPoll(sourcePath, lastModified); } @Override public void updateFileSavedTime(File sourceFile) { fileMonitor.updateFileSaveTime(sourceFile); } private static String[] buildClassPath() { File[] jars = new File(DirectoryManager.getProjectLibraryDir()).listFiles(); String[] classPath = new String[jars.length]; for (int i = 0; i < jars.length; i++) { if(jars[i].getAbsolutePath().toLowerCase().endsWith(".jar")){ classPath[i] = jars[i].getAbsolutePath(); } } return classPath; } synchronized public static DynamicClassLoader getInstance(){ if(instance == null){ instance = new KoanClassLoader(); } return instance.clone(); } @Override public KoanClassLoader clone(){ return new KoanClassLoader(getBinDir(), getSourceDir(), getClassPath(), getClass().getClassLoader(), getTimeout(), fileMonitor); } }