View Javadoc

1   package org.ocltf.common;
2   
3   import java.net.URL;
4   import java.util.Iterator;
5   
6   import org.apache.commons.lang.StringUtils;
7   import org.apache.commons.logging.Log;
8   import org.apache.commons.logging.LogFactory;
9   import org.ocltf.utils.ClassUtils;
10  
11  /***
12   * Discovers and loads all available Plugin objects
13   * from the current classpath.
14   * 
15   * @author Chad Brandon
16   */
17  public class PluginDiscoverer {
18  	
19  	private static final Log logger = 
20  		LogFactory.getLog(PluginDiscoverer.class);
21  
22  	private static final Configuration config = 
23  		Configuration.getInstance(PluginDiscoverer.class);
24  	
25  	/***
26  	 * The prefix to those configuration properties that are plugins
27  	 */
28  	private static final String PLUGIN_PREFIX = "plugin.";
29  	
30  	/***
31  	 * The shared instance.
32  	 */
33  	private static final PluginDiscoverer instance = new PluginDiscoverer();
34  	
35  	/***
36  	 * Gets the default static instance of the PluginDicoverer.
37  	 * @return PluginDiscoverer the static instance.
38  	 */
39  	public static PluginDiscoverer instance() {
40  		return instance;
41  	}
42  
43  	/***
44  	 * Finds and initializes all Plugin objects on the current classpath.
45  	 */
46  	public void discoverPlugins() {
47  		String methodName = "discoverPlugins";
48  		if (logger.isDebugEnabled()) {
49  			logger.debug("performing " + methodName);
50  		}
51  			
52  		try {
53  			
54  			Iterator pluginNameIt = config.getKeys(PLUGIN_PREFIX);
55  			
56  			while (pluginNameIt.hasNext()) {
57  				String pluginName = StringUtils.trimToEmpty((String)pluginNameIt.next());
58  				String pluginClassName = config.getRequiredString(pluginName);
59  				Class pluginClass = ClassUtils.loadClass(pluginClassName);
60  				if (!Plugin.class.isAssignableFrom(pluginClass)) {
61  					throw new PluginDiscovererException(methodName
62  						+ " plugin class '" + pluginClassName + "' must implement --> '" 
63  						+ Plugin.class + "'");
64  				}
65  				Plugin plugin = (Plugin)pluginClass.newInstance();
66  				String resourceName = plugin.getResourceName();
67  				
68  				URL[] pluginResources = ResourceFinder.findResources(resourceName);
69  		
70  				if (pluginResources != null && pluginResources.length > 0) {
71  					for (int ctr = 0; ctr < pluginResources.length; ctr++) {
72  					
73  						URL pluginUri = pluginResources[ctr];
74  						plugin = (Plugin)XmlObjectFactory.getInstance(pluginClass, pluginUri);					
75  					
76  						if (logger.isInfoEnabled()) {
77  							logger.info(
78  								"found " + 
79  									pluginName.replaceAll(PLUGIN_PREFIX, "") 
80  									+ " --> '" + plugin.getName() + "'");								
81  						}				
82  		                       
83  						ComponentContainer.instance().registerComponent(plugin.getName(), plugin);
84  					}
85  				}	
86  				
87  			}	
88  
89  		} catch (Exception ex) {
90  			String errMsg = "Error performing " + methodName;
91  			logger.error(errMsg, ex);
92  			throw new PluginDiscovererException(errMsg, ex);
93  		}
94  	}
95  }