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
10 import java.io.IOException;
11 import java.net.URL;
12 import java.util.ArrayList;
13 import java.util.Collection;
14 import java.util.Enumeration;
15 import java.util.List;
16
17 import org.slf4j.Logger;
18 import org.slf4j.LoggerFactory;
19
20
21
22
23 public class ClassPathPluginLoader implements PluginLoader
24 {
25 private static Logger log = LoggerFactory.getLogger(ClassPathPluginLoader.class);
26
27 private final String fileNameToLoad;
28 private List<Plugin> plugins;
29
30 public ClassPathPluginLoader()
31 {
32 this(PluginAccessor.Descriptor.FILENAME);
33 }
34
35 public ClassPathPluginLoader(final String fileNameToLoad)
36 {
37 this.fileNameToLoad = fileNameToLoad;
38 }
39
40 private void loadClassPathPlugins(final ModuleDescriptorFactory moduleDescriptorFactory) throws PluginParseException
41 {
42 URL url = null;
43 final Enumeration<URL> pluginDescriptorFiles;
44 plugins = new ArrayList<Plugin>();
45
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 while (pluginDescriptorFiles.hasMoreElements())
57 {
58 url = pluginDescriptorFiles.nextElement();
59 plugins.addAll(new SinglePluginLoader(url).loadAllPlugins(moduleDescriptorFactory));
60 }
61 }
62
63 public Collection<Plugin> loadAllPlugins(final ModuleDescriptorFactory moduleDescriptorFactory) throws PluginParseException
64 {
65 if (plugins == null)
66 {
67 loadClassPathPlugins(moduleDescriptorFactory);
68 }
69
70 return plugins;
71 }
72
73 public boolean supportsRemoval()
74 {
75 return false;
76 }
77
78 public boolean supportsAddition()
79 {
80 return false;
81 }
82
83 public Collection<Plugin> addFoundPlugins(final ModuleDescriptorFactory moduleDescriptorFactory)
84 {
85 throw new UnsupportedOperationException("This PluginLoader does not support addition.");
86 }
87
88 public void removePlugin(final Plugin plugin) throws PluginException
89 {
90 throw new PluginException("This PluginLoader does not support removal.");
91 }
92 }