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 try
61 {
62 plugins.addAll(new SinglePluginLoader(url).loadAllPlugins(moduleDescriptorFactory));
63 }
64 catch (final PluginParseException e)
65 {
66 log.error("Unable to load plugin at url: " + url + ", " + e.getMessage(), e);
67 }
68 }
69 }
70
71 public Collection<Plugin> loadAllPlugins(final ModuleDescriptorFactory moduleDescriptorFactory) throws PluginParseException
72 {
73 if (plugins == null)
74 {
75 loadClassPathPlugins(moduleDescriptorFactory);
76 }
77
78 return plugins;
79 }
80
81 public boolean supportsRemoval()
82 {
83 return false;
84 }
85
86 public boolean supportsAddition()
87 {
88 return false;
89 }
90
91 public Collection<Plugin> addFoundPlugins(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 }