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