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
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
31 final ModuleDescriptor<?> moduleDescriptor = newModuleDescriptor(plugin, module, moduleDescriptorFactory);
32
33
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
45 try {
46 moduleDescriptor = moduleDescriptorFactory.getModuleDescriptor(name);
47 }
48
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 }