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
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 }