View Javadoc
1   package com.atlassian.plugin.descriptors;
2   
3   import com.atlassian.plugin.ModuleDescriptor;
4   import com.atlassian.plugin.ModuleDescriptorFactory;
5   import com.atlassian.plugin.Plugin;
6   import com.atlassian.plugin.PluginParseException;
7   import org.dom4j.Element;
8   
9   /**
10   * Utility class to create UnloadableModuleDescriptor instances when there are problems
11   */
12  public final class UnloadableModuleDescriptorFactory {
13      /**
14       * Creates a new UnloadableModuleDescriptor, for when a problem occurs during the construction
15       * of the ModuleDescriptor itself.
16       *
17       * This instance has the same information as the original ModuleDescriptor, but also contains
18       * an error message that reports the error.
19       *
20       * @param plugin                  the Plugin the ModuleDescriptor belongs to
21       * @param element                 the XML Element used to construct the ModuleDescriptor
22       * @param e                       the Throwable
23       * @param moduleDescriptorFactory a ModuleDescriptorFactory used to retrieve ModuleDescriptor instances
24       * @return a new UnloadableModuleDescriptor instance
25       * @throws PluginParseException if there was a problem constructing the UnloadableModuleDescriptor
26       */
27      public static UnloadableModuleDescriptor createUnloadableModuleDescriptor(final Plugin plugin, final Element element, final Throwable e, final ModuleDescriptorFactory moduleDescriptorFactory) throws PluginParseException {
28          final UnloadableModuleDescriptor descriptor = new UnloadableModuleDescriptor();
29          descriptor.init(plugin, element);
30  
31          final String name = element.getName();
32          final Class<? extends ModuleDescriptor> descriptorClass = moduleDescriptorFactory.getModuleDescriptorClass(name);
33          String descriptorClassName;
34  
35          if (descriptorClass == null) {
36              descriptorClassName = descriptor.getKey();
37          } else {
38              descriptorClassName = descriptorClass.getName();
39          }
40  
41          final String errorMsg = constructErrorMessage(plugin, name, descriptorClassName, e);
42  
43          descriptor.setErrorText(errorMsg);
44  
45          return descriptor;
46      }
47  
48      /**
49       * Creates a new UnloadableModuleDescriptor based on an existing ModuleDescriptor, descriptor
50       *
51       * This method uses the information in an existing descriptor to construct a new UnloadableModuleDescriptor.
52       *
53       * @param plugin     the Plugin the ModuleDescriptor belongs to
54       * @param descriptor the ModuleDescriptor that reported an error
55       * @param e          the Throwable
56       * @return a new UnloadableModuleDescriptor instance
57       */
58      public static UnloadableModuleDescriptor createUnloadableModuleDescriptor(final Plugin plugin, final ModuleDescriptor<?> descriptor, final Throwable e) {
59          final UnloadableModuleDescriptor unloadableDescriptor = new UnloadableModuleDescriptor();
60          unloadableDescriptor.setName(descriptor.getName());
61          unloadableDescriptor.setKey(descriptor.getKey());
62          unloadableDescriptor.setPlugin(plugin);
63  
64          final String errorMsg = constructErrorMessage(plugin, descriptor.getDisplayName(),
65                  (descriptor.getModuleClass() == null ? descriptor.getName() : descriptor.getModuleClass().getName()), e);
66  
67          unloadableDescriptor.setErrorText(errorMsg);
68  
69          return unloadableDescriptor;
70      }
71  
72      /**
73       * Constructs an error message from a module and exception
74       *
75       * @param plugin      the Plugin the module belongs to
76       * @param moduleName  the name of the module
77       * @param moduleClass the class of the module
78       * @param e           the Throwable
79       * @return an appropriate String representing the error
80       */
81      private static String constructErrorMessage(final Plugin plugin, final String moduleName, final String moduleClass, final Throwable e) {
82          String errorMsg;
83  
84          if (e instanceof PluginParseException) {
85              errorMsg = "There was a problem loading the descriptor for module '" + moduleName + "' in plugin '" + (plugin == null ? "null" : plugin.getName()) + "'.\n ";
86          } else if (e instanceof InstantiationException) {
87              errorMsg = "Could not instantiate module descriptor: " + moduleClass + ".<br/>";
88          } else if (e instanceof IllegalAccessException) {
89              errorMsg = "Exception instantiating module descriptor: " + moduleClass + ".<br/>";
90          } else if (e instanceof ClassNotFoundException) {
91              errorMsg = "Could not find module descriptor class: " + moduleClass + ".<br/>";
92          } else if (e instanceof NoClassDefFoundError) {
93              errorMsg = "A required class was missing: " + moduleClass + ". Please check that you have all of the required dependencies.<br/>";
94          } else {
95              errorMsg = "There was a problem loading the module descriptor: " + moduleClass + ".<br/>";
96          }
97  
98          return errorMsg + e.getMessage();
99      }
100 }