/** * */ package jframe.core.unit; import java.io.File; import java.io.FilenameFilter; import java.util.HashMap; import java.util.LinkedList; import java.util.List; import java.util.Map; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import jframe.core.Frame; import jframe.core.conf.Config; import jframe.core.plugin.DefPluginContext; import jframe.core.plugin.Plugin; import jframe.core.plugin.PluginContext; import jframe.core.plugin.loader.PluginCase; import jframe.core.plugin.loader.PluginClassLoader; import jframe.core.plugin.loader.PluginClassLoaderContext; import jframe.core.plugin.loader.PluginCreator; import jframe.core.plugin.loader.ext.DefPluginLoaderContext; import jframe.core.plugin.loader.ext.PluginServiceClassLoader; import jframe.core.plugin.loader.ext.PluginServiceCreator; import jframe.core.signal.Signal; import jframe.core.util.FileUtil; /** * <p> * Feature: * <li>load plug-in</li> * </p> * * @author dzh * @date Sep 23, 2013 2:47:41 PM * @since 1.0 */ public class PluginUnit extends AbstractUnit { private static final Logger LOG = LoggerFactory.getLogger(PluginUnit.class); private PluginContext _context; private PluginClassLoaderContext _plc; public PluginUnit() { setName(PluginUnit.class.getSimpleName()); } @Override public void init(Frame frame) throws UnitException { super.init(frame); _context = new DefPluginContext(); _context.initContext(frame.getConfig()); _plc = new DefPluginLoaderContext(); } public PluginClassLoaderContext getLoaderContext() { return _plc; } /* * (non-Javadoc) * * @see jframe.core.unit.Unit#start() */ public void start() throws UnitException { // clean cache cleanCache(); // load then register plug-in _context.regPlugins(loadPlugin(), null); } /** * */ private void cleanCache() { Config config = getFrame().getConfig(); if ("true".equalsIgnoreCase(config.getConfig(Config.ARG_CLEAN))) { LOG.info("Start cleaning cache directory"); File file = new File(config.getConfig(Config.APP_CACHE)); FileUtil.deleteAll(file); file.mkdirs(); LOG.info("Finish cleaning!"); } } /** * * @param path_plugin */ private List<Plugin> loadPlugin() { // create plugin PluginCreator _creator = PluginCreator.newCreator(_context.getConfig(), _plc); List<Plugin> pluginList = new LinkedList<Plugin>(); try { String path_plugin = getFrame().getConfig().getConfig(Config.APP_PLUGIN); File dir_plugin = new File(path_plugin);// plug-in root directory if (!dir_plugin.exists()) { LOG.warn("Not exist plugin path {}", path_plugin); return pluginList; } File[] plugins = dir_plugin.listFiles(new FilenameFilter() { public boolean accept(File dir, String name) { return name.endsWith(".jar"); } }); // Plugin p = null; Map<PluginCase, PluginClassLoader> pcMap = new HashMap<PluginCase, PluginClassLoader>(); for (File f : plugins) { PluginCase pc = _creator.loadPlugin(f); if (pc != null) { pcMap.put(pc, _creator.createPluginClassLoader(pc)); } } // load service if (_creator instanceof PluginServiceCreator) { for (PluginCase pc : pcMap.keySet()) { ((PluginServiceClassLoader) pcMap.get(pc)).loadService(pc); } } // create plugin for (PluginCase pc : pcMap.keySet()) { Plugin p = _creator.createPlugin(pcMap.get(pc), pc); if (p != null) pluginList.add(p); } } finally { _creator.close(); } return pluginList; } /* * (non-Javadoc) * * @see jframe.core.unit.Unit#stop() */ public void stop() throws UnitException { if (_context != null) { // stop plugins _context.dispose(); } if (_plc != null) { _plc.close(); } } /* * (non-Javadoc) * * @see jframe.core.unit.Unit#recvSig(jframe.core.signal.Signal) */ public void recvSig(Signal sig) { // TODO } }