1 package com.atlassian.plugin.parsers;
2
3 import com.atlassian.plugin.Application;
4 import com.atlassian.plugin.InstallationMode;
5 import com.atlassian.plugin.Plugin;
6 import com.atlassian.plugin.Resources;
7 import com.atlassian.plugin.util.PluginUtils;
8 import com.google.common.collect.ImmutableList;
9 import org.dom4j.Document;
10 import org.dom4j.Element;
11 import org.slf4j.Logger;
12 import org.slf4j.LoggerFactory;
13
14 import java.util.List;
15 import java.util.Objects;
16 import java.util.Optional;
17 import java.util.Set;
18 import java.util.stream.Collectors;
19
20 import static com.atlassian.plugin.parsers.PluginInformationReader.PLUGIN_INFO;
21 import static com.atlassian.plugin.parsers.XmlDescriptorParserUtils.removeAllNamespaces;
22 import static com.google.common.base.Preconditions.checkNotNull;
23 import static com.google.common.collect.ImmutableSet.copyOf;
24 import static com.google.common.collect.Iterables.transform;
25 import static java.util.Optional.ofNullable;
26
27
28
29
30
31
32 public final class PluginDescriptorReader {
33 private static final Logger log = LoggerFactory.getLogger(PluginDescriptorReader.class);
34
35 static final String RESOURCE = "resource";
36
37 private final Document descriptor;
38 private final Set<Application> applications;
39
40 public PluginDescriptorReader(Document descriptor, Set<Application> applications) {
41 this.descriptor = removeAllNamespaces(checkNotNull(descriptor));
42 this.applications = copyOf(checkNotNull(applications));
43 }
44
45 public Document getDescriptor() {
46 return descriptor;
47 }
48
49 private Element getPluginElement() {
50 return descriptor.getRootElement();
51 }
52
53 public String getPluginKey() {
54 return getPluginElement().attributeValue("key");
55 }
56
57 public String getPluginName() {
58 return getPluginElement().attributeValue("name");
59 }
60
61 public boolean isSystemPlugin() {
62 return Boolean.valueOf(getPluginElement().attributeValue("system"));
63 }
64
65 public Optional<String> getI18nPluginNameKey() {
66 return ofNullable(getPluginElement().attributeValue("i18n-name-key"));
67 }
68
69 public boolean isEnabledByDefault() {
70 return !"disabled".equalsIgnoreCase(getPluginElement().attributeValue("state"));
71 }
72
73 public Optional<Element> getPluginInformation() {
74 return elements(getPluginElement()).stream()
75 .filter(Objects::nonNull)
76 .filter(element -> PLUGIN_INFO.equalsIgnoreCase(element.getName()))
77 .findFirst();
78 }
79
80 public PluginInformationReader getPluginInformationReader() {
81 return new PluginInformationReader(getPluginInformation().orElse(null), applications, getPluginsVersion());
82 }
83
84 public Iterable<Element> getModules(final InstallationMode installationMode) {
85 return elements(getPluginElement()).stream()
86 .filter(element -> {
87 String name = element.getName();
88 return !(PLUGIN_INFO.equalsIgnoreCase(name) || RESOURCE.equalsIgnoreCase(name));
89 })
90 .filter(module -> {
91 if (!PluginUtils.doesModuleElementApplyToApplication(module, applications, installationMode)) {
92 log.debug("Ignoring module descriptor for this application: {}", module.attributeValue("key"));
93 return false;
94 }
95 return true;
96 })
97 .collect(Collectors.toList());
98 }
99
100 public Iterable<ModuleReader> getModuleReaders(InstallationMode installationMode) {
101 return transform(getModules(installationMode), ModuleReader::new);
102 }
103
104 public Resources getResources() {
105 return Resources.fromXml(getPluginElement());
106 }
107
108 public int getPluginsVersion() {
109 String val = getPluginElement().attributeValue("pluginsVersion");
110 if (val == null) {
111 val = getPluginElement().attributeValue("plugins-version");
112 }
113 if (val != null) {
114 try {
115 return Integer.parseInt(val);
116 } catch (final NumberFormatException e) {
117 throw new RuntimeException("Could not parse pluginsVersion: " + e.getMessage(), e);
118 }
119 } else {
120 return Plugin.VERSION_1;
121 }
122 }
123
124 @SuppressWarnings("unchecked")
125 static List<Element> elements(Element e) {
126 return e.elements();
127 }
128
129 @SuppressWarnings("unchecked")
130 static List<Element> elements(Element e, String name) {
131 return e != null ? e.elements(name) : ImmutableList.of();
132 }
133 }