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.impl.UnloadablePlugin;
9 import com.atlassian.plugin.util.ClassLoaderUtils;
10
11 import org.apache.commons.logging.Log;
12 import org.apache.commons.logging.LogFactory;
13
14 import java.io.IOException;
15 import java.net.URL;
16 import java.util.ArrayList;
17 import java.util.Collection;
18 import java.util.Enumeration;
19 import java.util.List;
20
21
22
23
24 public class ClassPathPluginLoader implements PluginLoader
25 {
26 private static Log log = LogFactory.getLog(ClassPathPluginLoader.class);
27
28 private final String fileNameToLoad;
29 private List<Plugin> plugins;
30
31 public ClassPathPluginLoader()
32 {
33 this(PluginAccessor.Descriptor.FILENAME);
34 }
35
36 public ClassPathPluginLoader(final String fileNameToLoad)
37 {
38 this.fileNameToLoad = fileNameToLoad;
39 }
40
41 private void loadClassPathPlugins(final ModuleDescriptorFactory moduleDescriptorFactory) throws PluginParseException
42 {
43 URL url = null;
44 final Enumeration<URL> pluginDescriptorFiles;
45 plugins = new ArrayList<Plugin>();
46
47 try
48 {
49 pluginDescriptorFiles = ClassLoaderUtils.getResources(fileNameToLoad, this.getClass());
50 }
51 catch (final IOException e)
52 {
53 log.error("Could not load classpath plugins: " + e, e);
54 return;
55 }
56
57 while (pluginDescriptorFiles.hasMoreElements())
58 {
59 url = pluginDescriptorFiles.nextElement();
60 plugins.addAll(new SinglePluginLoader(url).loadAllPlugins(moduleDescriptorFactory));
61 }
62 }
63
64 public Collection<Plugin> loadAllPlugins(final ModuleDescriptorFactory moduleDescriptorFactory) throws PluginParseException
65 {
66 if (plugins == null)
67 {
68 loadClassPathPlugins(moduleDescriptorFactory);
69 }
70
71 return plugins;
72 }
73
74 public boolean supportsRemoval()
75 {
76 return false;
77 }
78
79 public boolean supportsAddition()
80 {
81 return false;
82 }
83
84 public Collection<Plugin> addFoundPlugins(final ModuleDescriptorFactory moduleDescriptorFactory)
85 {
86 throw new UnsupportedOperationException("This PluginLoader does not support addition.");
87 }
88
89 public void removePlugin(final Plugin plugin) throws PluginException
90 {
91 throw new PluginException("This PluginLoader does not support removal.");
92 }
93 }