View Javadoc

1   package com.atlassian.plugin.loaders;
2   
3   import com.atlassian.plugin.ModuleDescriptorFactory;
4   import com.atlassian.plugin.Plugin;
5   import com.atlassian.plugin.PluginAccessor;
6   import com.atlassian.plugin.PluginException;
7   import com.atlassian.plugin.PluginParseException;
8   import com.atlassian.plugin.impl.UnloadablePlugin;
9   import com.atlassian.plugin.util.ClassLoaderUtils;
10  
11  import org.apache.commons.logging.Log;
12  import org.apache.commons.logging.LogFactory;
13  
14  import java.io.IOException;
15  import java.net.URL;
16  import java.util.ArrayList;
17  import java.util.Collection;
18  import java.util.Enumeration;
19  import java.util.List;
20  
21  /**
22   * Loads plugins from the classpath
23   */
24  public class ClassPathPluginLoader implements PluginLoader
25  {
26      private static Log log = LogFactory.getLog(ClassPathPluginLoader.class);
27  
28      private final String fileNameToLoad;
29      private List<Plugin> plugins;
30  
31      public ClassPathPluginLoader()
32      {
33          this(PluginAccessor.Descriptor.FILENAME);
34      }
35  
36      public ClassPathPluginLoader(final String fileNameToLoad)
37      {
38          this.fileNameToLoad = fileNameToLoad;
39      }
40  
41      private void loadClassPathPlugins(final ModuleDescriptorFactory moduleDescriptorFactory) throws PluginParseException
42      {
43          URL url = null;
44          final Enumeration<URL> pluginDescriptorFiles;
45          plugins = new ArrayList<Plugin>();
46  
47          try
48          {
49              pluginDescriptorFiles = ClassLoaderUtils.getResources(fileNameToLoad, this.getClass());
50          }
51          catch (final IOException e)
52          {
53              log.error("Could not load classpath plugins: " + e, e);
54              return;
55          }
56  
57          while (pluginDescriptorFiles.hasMoreElements())
58          {
59              url = pluginDescriptorFiles.nextElement();
60              try
61              {
62                  plugins.addAll(new SinglePluginLoader(url).loadAllPlugins(moduleDescriptorFactory));
63              }
64              catch (final PluginParseException e)
65              {
66                  log.error("Unable to load plugin at url: " + url + ", " + e.getMessage(), e);
67              }
68          }
69      }
70  
71      public Collection<Plugin> loadAllPlugins(final ModuleDescriptorFactory moduleDescriptorFactory) throws PluginParseException
72      {
73          if (plugins == null)
74          {
75              loadClassPathPlugins(moduleDescriptorFactory);
76          }
77  
78          return plugins;
79      }
80  
81      public boolean supportsRemoval()
82      {
83          return false;
84      }
85  
86      public boolean supportsAddition()
87      {
88          return false;
89      }
90  
91      public Collection<Plugin> addFoundPlugins(final ModuleDescriptorFactory moduleDescriptorFactory)
92      {
93          throw new UnsupportedOperationException("This PluginLoader does not support addition.");
94      }
95  
96      public void removePlugin(final Plugin plugin) throws PluginException
97      {
98          throw new PluginException("This PluginLoader does not support removal.");
99      }
100 }