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.util.ClassLoaderUtils;
9   import com.google.common.base.Function;
10  import org.slf4j.Logger;
11  import org.slf4j.LoggerFactory;
12  
13  import javax.annotation.Nullable;
14  import java.io.IOException;
15  import java.net.URL;
16  import java.util.Enumeration;
17  
18  import static com.google.common.collect.ImmutableList.copyOf;
19  import static com.google.common.collect.Iterables.concat;
20  import static com.google.common.collect.Iterators.forEnumeration;
21  import static com.google.common.collect.Iterators.transform;
22  
23  /**
24   * Loads plugins from the classpath
25   */
26  public class ClassPathPluginLoader implements PluginLoader
27  {
28      private static Logger log = LoggerFactory.getLogger(ClassPathPluginLoader.class);
29  
30      private final String fileNameToLoad;
31      private Iterable<Plugin> plugins;
32  
33      public ClassPathPluginLoader()
34      {
35          this(PluginAccessor.Descriptor.FILENAME);
36      }
37  
38      public ClassPathPluginLoader(final String fileNameToLoad)
39      {
40          this.fileNameToLoad = fileNameToLoad;
41      }
42  
43      private void loadClassPathPlugins(final ModuleDescriptorFactory moduleDescriptorFactory) throws PluginParseException
44      {
45          final Enumeration<URL> pluginDescriptorFiles;
46          try
47          {
48              pluginDescriptorFiles = ClassLoaderUtils.getResources(fileNameToLoad, this.getClass());
49          }
50          catch (final IOException e)
51          {
52              log.error("Could not load classpath plugins: " + e, e);
53              return;
54          }
55  
56          plugins = concat(copyOf(transform(forEnumeration(pluginDescriptorFiles), new Function<URL, Iterable<Plugin>>()
57          {
58              @Override
59              public Iterable<Plugin> apply(@Nullable URL url)
60              {
61                  return new SinglePluginLoader(url).loadAllPlugins(moduleDescriptorFactory);
62              }
63          })));
64      }
65  
66      public Iterable<Plugin> loadAllPlugins(final ModuleDescriptorFactory moduleDescriptorFactory) throws PluginParseException
67      {
68          if (plugins == null)
69          {
70              loadClassPathPlugins(moduleDescriptorFactory);
71          }
72          return copyOf(plugins);
73      }
74  
75      public boolean supportsRemoval()
76      {
77          return false;
78      }
79  
80      public boolean supportsAddition()
81      {
82          return false;
83      }
84  
85      @Override
86      public boolean isDynamicPluginLoader()
87      {
88          return false;
89      }
90  
91      public Iterable<Plugin> loadFoundPlugins(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 }