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