package com.dgrid.plugin; import java.io.File; import java.io.FileFilter; import java.util.Hashtable; import com.dgrid.util.io.FileListener; import com.dgrid.util.io.FileMonitor; public abstract class AbstractDynamicPlugin extends BaseDGridPlugin implements Plugin, FileListener { protected File dir; private FileMonitor monitor; private long lastChange = 0; private Hashtable<File, Plugin> plugins = new Hashtable<File, Plugin>(); public AbstractDynamicPlugin(File dir, long watchInterval) { this.dir = dir; this.monitor = new FileMonitor(watchInterval); } @Override public void init() { log.trace("init()"); monitor.addFile(dir); monitor.addListener(this); lastChange = System.currentTimeMillis(); initPlugins(); } public void start() { log.trace("start()"); } public void stop() { log.trace("stop()"); for (Plugin plugin : plugins.values()) { try { pluginManager.unloadPlugin(plugin.getIdentifier()); } catch (Exception e) { log .warn(String.format( "Exception calling stop() on plugin (%1$s)", plugin), e); } } plugins.clear(); } public void fileChanged(File file) { log.trace("fileChanged()"); if (log.isDebugEnabled()) { log.debug(String.format("File: %1$s has changed", file)); } if (!file.isDirectory()) { if (!file.exists()) { // deleted if (log.isDebugEnabled()) { log.debug(String.format("Removing plugin from file %1$s", file)); } if (plugins.get(file) != null) { Plugin p = plugins.get(file); pluginManager.unloadPlugin(p.getIdentifier()); plugins.remove(file); } } else if (getFileFilter().accept(file)) { try { Plugin p = loadPluginFromFile(file); if (plugins.containsKey(file)) { pluginManager.unloadPlugin(plugins.get(file) .getIdentifier()); plugins.remove(file); } Plugin p2 = pluginManager.loadPlugin(p); plugins.put(file, p2); monitor.addFile(file); } catch (Exception e) { log.warn(String.format( "Could not load plugin from file %1$s", file), e); try { monitor.removeFile(file); } catch (Exception e2) { } } finally { } } } lastChange = System.currentTimeMillis(); } private void initPlugins() { log.trace("initPlugins()"); File[] files = dir.listFiles(getFileFilter()); for (File file : files) { try { Plugin plugin = loadPluginFromFile(file); pluginManager.loadPlugin(plugin); plugins.put(file, plugin); monitor.addFile(file); } catch (Exception e) { log.warn(String.format( "Could not init plugin from file (%1$s)", file), e); } finally { } } } protected abstract Plugin loadPluginFromFile(File file) throws Exception; protected abstract FileFilter getFileFilter(); }