View Javadoc
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   * A simple class to read the basic elements of a plugin descriptor.
29   *
30   * @since 3.0.0
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 }