View Javadoc

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