001 package com.khubla.pragmatach.framework.plugin; 002 003 import java.io.InputStream; 004 import java.net.URL; 005 import java.util.HashMap; 006 import java.util.Map; 007 008 import javax.servlet.ServletContext; 009 010 import org.scannotation.ClasspathUrlFinder; 011 import org.scannotation.WarUrlFinder; 012 import org.scannotation.archiveiterator.IteratorFactory; 013 import org.scannotation.archiveiterator.StreamIterator; 014 import org.slf4j.Logger; 015 import org.slf4j.LoggerFactory; 016 017 import com.khubla.pragmatach.framework.api.PragmatachException; 018 019 /** 020 * @author tome 021 */ 022 public class PluginDescriptors { 023 /** 024 * logger 025 */ 026 private static final Logger logger = LoggerFactory.getLogger(PluginDescriptors.class); 027 /** 028 * plugin jars 029 */ 030 private static Map<String, PluginDescriptor> plugins = new HashMap<String, PluginDescriptor>(); 031 032 public static Map<String, PluginDescriptor> getPlugins() { 033 return plugins; 034 } 035 036 /** 037 * do the scan 038 */ 039 public static void scan(ServletContext servletContext) throws PragmatachException { 040 scanURLs(ClasspathUrlFinder.findClassPaths(), servletContext); 041 scanURLs(WarUrlFinder.findWebInfLibClasspaths(servletContext), servletContext); 042 scanURLs(new URL[] { WarUrlFinder.findWebInfClassesPath(servletContext) }, servletContext); 043 } 044 045 private static void scanURLs(URL[] urls, ServletContext servletContext) throws PragmatachException { 046 try { 047 if (null != servletContext) { 048 final PluginFilter pluginFilter = new PluginFilter(); 049 if ((null != urls) && (urls.length > 0)) { 050 for (final URL url : urls) { 051 if (null != url) { 052 final StreamIterator streamIterator = IteratorFactory.create(url, pluginFilter); 053 InputStream inputStream; 054 while (null != (inputStream = streamIterator.next())) { 055 final PluginDescriptor plugin = new PluginDescriptor(url, inputStream, servletContext); 056 logger.info("Found plugin: " + plugin.getName()); 057 plugins.put(plugin.getName(), plugin); 058 inputStream.close(); 059 } 060 } 061 } 062 } 063 } 064 } catch (final Exception e) { 065 throw new PragmatachException("Exception in scanURLs", e); 066 } 067 } 068 }