View Javadoc
1   package com.atlassian.plugin.parsers;
2   
3   import com.atlassian.plugin.ModuleDescriptor;
4   import com.atlassian.plugin.ModuleDescriptorFactory;
5   import com.atlassian.plugin.Plugin;
6   import com.atlassian.plugin.descriptors.UnrecognisedModuleDescriptor;
7   import org.dom4j.Attribute;
8   import org.dom4j.Document;
9   import org.dom4j.Element;
10  import org.dom4j.Namespace;
11  import org.dom4j.VisitorSupport;
12  import org.dom4j.tree.DefaultElement;
13  import org.slf4j.Logger;
14  import org.slf4j.LoggerFactory;
15  
16  import static com.atlassian.plugin.descriptors.UnrecognisedModuleDescriptorFactory.createUnrecognisedModuleDescriptor;
17  
18  /**
19   * @since 3.0.0
20   */
21  public final class XmlDescriptorParserUtils {
22      private static final Logger log = LoggerFactory.getLogger(XmlDescriptorParserUtils.class);
23  
24      public static Document removeAllNamespaces(Document doc) {
25          doc.accept(new NamespaceCleaner());
26          return doc;
27      }
28  
29      public static ModuleDescriptor<?> addModule(final ModuleDescriptorFactory moduleDescriptorFactory, final Plugin plugin, final Element module) {
30          // create a new module descriptor
31          final ModuleDescriptor<?> moduleDescriptor = newModuleDescriptor(plugin, module, moduleDescriptorFactory);
32  
33          // load it and add to the plugin
34          moduleDescriptor.init(plugin, module);
35  
36          return moduleDescriptor;
37      }
38  
39      static ModuleDescriptor<?> newModuleDescriptor(final Plugin plugin, final Element element, final ModuleDescriptorFactory moduleDescriptorFactory) {
40          final String name = element.getName();
41  
42          final ModuleDescriptor<?> moduleDescriptor;
43  
44          // Try to retrieve the module descriptor
45          try {
46              moduleDescriptor = moduleDescriptorFactory.getModuleDescriptor(name);
47          }
48          // When there's a problem loading a module, return an UnrecognisedModuleDescriptor with error
49          catch (final Throwable e) {
50              final UnrecognisedModuleDescriptor unrecognisedModuleDescriptor = createUnrecognisedModuleDescriptor(plugin, element, e, moduleDescriptorFactory);
51  
52              log.error("There were problems loading the module '{}' in plugin '{}'. The module has been disabled.", name, plugin.getName());
53              log.error(unrecognisedModuleDescriptor.getErrorText(), e);
54  
55              return unrecognisedModuleDescriptor;
56          }
57  
58          return moduleDescriptor;
59      }
60  
61      private static final class NamespaceCleaner extends VisitorSupport {
62          public void visit(Document document) {
63              ((DefaultElement) document.getRootElement()).setNamespace(Namespace.NO_NAMESPACE);
64              document.getRootElement().additionalNamespaces().clear();
65          }
66  
67          public void visit(Namespace namespace) {
68              namespace.detach();
69          }
70  
71          public void visit(Attribute node) {
72              if (node.toString().contains("xmlns") || node.toString().contains("xsi:")) {
73                  node.detach();
74              }
75          }
76  
77          public void visit(Element node) {
78              if (node instanceof DefaultElement) {
79                  ((DefaultElement) node).setNamespace(Namespace.NO_NAMESPACE);
80              }
81          }
82      }
83  }