View Javadoc
1   package com.atlassian.plugin.loaders;
2   
3   import com.atlassian.plugin.ModuleDescriptor;
4   import com.atlassian.plugin.ModuleDescriptorFactory;
5   import com.atlassian.plugin.Plugin;
6   import com.atlassian.plugin.PluginAccessor;
7   import com.atlassian.plugin.PluginException;
8   import com.atlassian.plugin.PluginParseException;
9   import com.atlassian.plugin.util.ClassLoaderUtils;
10  import org.dom4j.Element;
11  import org.slf4j.Logger;
12  import org.slf4j.LoggerFactory;
13  
14  import java.io.IOException;
15  import java.net.URL;
16  import java.util.Enumeration;
17  import java.util.LinkedHashMap;
18  import java.util.Map;
19  
20  import static com.google.common.collect.ImmutableList.copyOf;
21  
22  /**
23   * Loads plugins from the classpath
24   */
25  public class ClassPathPluginLoader implements PluginLoader {
26      private static Logger log = LoggerFactory.getLogger(ClassPathPluginLoader.class);
27  
28      private final String fileNameToLoad;
29  
30      private Map<Plugin, SinglePluginLoader> pluginLoaderMap;
31  
32      public ClassPathPluginLoader() {
33          this(PluginAccessor.Descriptor.FILENAME);
34      }
35  
36      public ClassPathPluginLoader(final String fileNameToLoad) {
37          this.fileNameToLoad = fileNameToLoad;
38      }
39  
40      private void loadClassPathPlugins(final ModuleDescriptorFactory moduleDescriptorFactory) throws PluginParseException {
41          final Enumeration<URL> pluginDescriptorFiles;
42          try {
43              pluginDescriptorFiles = ClassLoaderUtils.getResources(fileNameToLoad, this.getClass());
44          } catch (final IOException e) {
45              log.error("Could not load classpath plugins: " + e, e);
46              return;
47          }
48  
49          pluginLoaderMap = new LinkedHashMap<>();
50          while (pluginDescriptorFiles.hasMoreElements()) {
51              final URL url = pluginDescriptorFiles.nextElement();
52              final SinglePluginLoader singlePluginLoader = new SinglePluginLoader(url);
53              for (final Plugin plugin : singlePluginLoader.loadAllPlugins(moduleDescriptorFactory)) {
54                  pluginLoaderMap.put(plugin, singlePluginLoader);
55              }
56          }
57      }
58  
59      public Iterable<Plugin> loadAllPlugins(final ModuleDescriptorFactory moduleDescriptorFactory) throws PluginParseException {
60          if (pluginLoaderMap == null) {
61              loadClassPathPlugins(moduleDescriptorFactory);
62          }
63          return copyOf(pluginLoaderMap.keySet());
64      }
65  
66      public boolean supportsRemoval() {
67          return false;
68      }
69  
70      public boolean supportsAddition() {
71          return false;
72      }
73  
74      @Override
75      public boolean isDynamicPluginLoader() {
76          return false;
77      }
78  
79      @Override
80      public ModuleDescriptor<?> createModule(final Plugin plugin, final Element module, final ModuleDescriptorFactory moduleDescriptorFactory) {
81          if (pluginLoaderMap.containsKey(plugin)) {
82              return pluginLoaderMap.get(plugin).createModule(plugin, module, moduleDescriptorFactory);
83          } else {
84              return null;
85          }
86      }
87  
88      public Iterable<Plugin> loadFoundPlugins(final ModuleDescriptorFactory moduleDescriptorFactory) {
89          throw new UnsupportedOperationException("This PluginLoader does not support addition.");
90      }
91  
92      public void removePlugin(final Plugin plugin) throws PluginException {
93          throw new PluginException("This PluginLoader does not support removal.");
94      }
95  }