1 package com.atlassian.plugin;
2
3 import com.atlassian.plugin.loaders.SinglePluginLoader;
4 import com.atlassian.plugin.util.ClassLoaderUtils;
5 import org.apache.commons.logging.Log;
6 import org.apache.commons.logging.LogFactory;
7
8 import java.util.*;
9
10 public class DefaultModuleDescriptorFactory implements ModuleDescriptorFactory
11 {
12 private static Log log = LogFactory.getLog(DefaultModuleDescriptorFactory.class);
13
14 private Map moduleDescriptorClasses;
15 private List permittedModuleKeys = Collections.EMPTY_LIST;
16
17 public DefaultModuleDescriptorFactory()
18 {
19 this.moduleDescriptorClasses = new HashMap();
20 }
21
22 public Class getModuleDescriptorClass(String type)
23 {
24 return (Class) moduleDescriptorClasses.get(type);
25 }
26
27 public ModuleDescriptor getModuleDescriptor(String type) throws PluginParseException, IllegalAccessException, InstantiationException, ClassNotFoundException
28 {
29 if (shouldSkipModuleOfType(type))
30 return null;
31
32 Class moduleDescriptorClazz = getModuleDescriptorClass(type);
33
34 if (moduleDescriptorClazz == null)
35 throw new PluginParseException("Cannot find ModuleDescriptor class for plugin of type '" + type + "'.");
36
37 return (ModuleDescriptor) ClassLoaderUtils.loadClass(moduleDescriptorClazz.getName(), SinglePluginLoader.class).newInstance();
38 }
39
40 protected boolean shouldSkipModuleOfType(String type)
41 {
42 return permittedModuleKeys != null && !permittedModuleKeys.isEmpty() && !permittedModuleKeys.contains(type);
43 }
44
45 public void setModuleDescriptors(Map moduleDescriptorClassNames)
46 {
47 for (Iterator it = moduleDescriptorClassNames.entrySet().iterator(); it.hasNext();)
48 {
49 Map.Entry entry = (Map.Entry) it.next();
50 Class descriptorClass = getClassFromEntry(entry);
51 if (descriptorClass != null)
52 addModuleDescriptor((String) entry.getKey(), descriptorClass);
53 }
54 }
55
56 private Class getClassFromEntry(Map.Entry entry)
57 {
58 if (shouldSkipModuleOfType((String) entry.getKey()))
59 return null;
60
61 Class descriptorClass = null;
62 try
63 {
64 descriptorClass = ClassLoaderUtils.loadClass((String) entry.getValue(), getClass());
65
66 if (!ModuleDescriptor.class.isAssignableFrom(descriptorClass))
67 {
68 log.error("Configured plugin module descriptor class " + entry.getValue() + " does not inherit from ModuleDescriptor");
69 descriptorClass = null;
70 }
71 }
72 catch (ClassNotFoundException e)
73 {
74 log.error("Unable to add configured plugin module descriptor " + entry.getKey() + ". Class not found: " + entry.getValue());
75 }
76
77 return descriptorClass;
78 }
79
80 public boolean hasModuleDescriptor(String type)
81 {
82 return moduleDescriptorClasses.containsKey(type);
83 }
84
85 public void addModuleDescriptor(String type, Class moduleDescriptorClass)
86 {
87 moduleDescriptorClasses.put(type, moduleDescriptorClass);
88 }
89
90 public void removeModuleDescriptorForType(String type)
91 {
92 moduleDescriptorClasses.remove(type);
93 }
94
95 protected Map getDescriptorClassesMap()
96 {
97 return moduleDescriptorClasses;
98 }
99
100
101
102
103
104
105
106 public void setPermittedModuleKeys(List permittedModuleKeys)
107 {
108 if (permittedModuleKeys == null)
109 permittedModuleKeys = Collections.EMPTY_LIST;
110
111 this.permittedModuleKeys = permittedModuleKeys;
112 }
113 }