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