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 UnrecognisedModuleDescriptorFactory
14  {
15      /**
16       * Creates a new UnrecognisedModuleDescriptor, for when a problem occurs during the retrieval
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 com.atlassian.plugin.PluginParseException if there was a problem constructing the UnloadableModuleDescriptor
28       */
29      public static UnrecognisedModuleDescriptor createUnrecognisedModuleDescriptor(final Plugin plugin, final Element element, final Throwable e, final ModuleDescriptorFactory moduleDescriptorFactory) throws PluginParseException
30      {
31          final UnrecognisedModuleDescriptor descriptor = new UnrecognisedModuleDescriptor();
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 = UnrecognisedModuleDescriptorFactory.constructErrorMessage(plugin, name, descriptorClassName, e);
48  
49          descriptor.setErrorText(errorMsg);
50  
51          return descriptor;
52      }
53  
54      /**
55       * Constructs an error message from a module and exception
56       *
57       * @param plugin the Plugin the module belongs to
58       * @param moduleName the name of the module
59       * @param moduleClass the class of the module
60       * @param e the Throwable
61       * @return an appropriate String representing the error
62       */
63      private static String constructErrorMessage(final Plugin plugin, final String moduleName, final String moduleClass, final Throwable e)
64      {
65          String errorMsg;
66  
67          if ((e.getMessage() == null) || "".equals(e.getMessage()))
68          {
69              if (e instanceof PluginParseException)
70              {
71                  errorMsg = "There was a problem loading the descriptor for module '" + moduleName + "' in plugin '" + (plugin == null ? "null" : plugin.getName()) + "'.\n ";
72              }
73              else if (e instanceof InstantiationException)
74              {
75                  errorMsg = "Could not instantiate module descriptor: " + moduleClass + ".<br/>";
76              }
77              else if (e instanceof IllegalAccessException)
78              {
79                  errorMsg = "Exception instantiating module descriptor: " + moduleClass + ".<br/>";
80              }
81              else if (e instanceof ClassNotFoundException)
82              {
83                  errorMsg = "Could not find module descriptor class: " + moduleClass + ".<br/>";
84              }
85              else if (e instanceof NoClassDefFoundError)
86              {
87                  errorMsg = "A required class was missing: " + moduleClass + ". Please check that you have all of the required dependencies.<br/>";
88              }
89              else
90              {
91                  errorMsg = "There was a problem loading the module descriptor: " + moduleClass + ".<br/>";
92              }
93          }
94          else
95          {
96              errorMsg = e.getMessage();
97          }
98          return errorMsg;
99      }
100 }