View Javadoc
1   package com.atlassian.plugin.validation;
2   
3   import com.google.common.collect.ImmutableMap;
4   import org.dom4j.Document;
5   import org.dom4j.Element;
6   import org.dom4j.Node;
7   
8   import java.util.Collections;
9   import java.util.List;
10  import java.util.Map;
11  import java.util.Set;
12  import java.util.stream.Collectors;
13  
14  import static com.atlassian.plugin.parsers.XmlDescriptorParserUtils.removeAllNamespaces;
15  import static com.google.common.base.Preconditions.checkNotNull;
16  import static java.util.stream.Collectors.collectingAndThen;
17  import static java.util.stream.Collectors.toSet;
18  
19  /**
20   * Reads information from the schema of plugin descriptors (dynamic per instance)
21   *
22   * @since 3.0.0
23   */
24  public final class SchemaReader {
25      private Document schema;
26  
27      public SchemaReader(Document schema) {
28          this.schema = removeAllNamespaces(checkNotNull(schema));
29      }
30  
31      public Set<String> getAllowedPermissions() {
32          return Collections.unmodifiableSet(getPermissionElements().stream()
33                  .map(permission -> permission.attributeValue("value"))
34                  .collect(Collectors.toSet()));
35      }
36  
37      public Map<String, Set<String>> getModulesRequiredPermissions() {
38          final List<Element> modulesDefinitions = selectNodes("//complexType[@name='AtlassianPluginType']/sequence/choice/element");
39          ImmutableMap.Builder<String, Set<String>> permissions = ImmutableMap.builder();
40          for (Element modulesDefinition : modulesDefinitions) {
41              permissions.put(modulesDefinition.attributeValue("name"), getModuleRequiredPermissions(modulesDefinition));
42          }
43          return permissions.build();
44      }
45  
46      private Set<String> getModuleRequiredPermissions(Element modulesDefinition) {
47          return selectNodes(modulesDefinition, "annotation//required-permissions/permission").stream()
48                  .map(Element::getTextTrim)
49                  .collect(collectingAndThen(toSet(), Collections::unmodifiableSet));
50      }
51  
52      private List<Element> getPermissionElements() {
53          return selectNodes("//simpleType[@name='PermissionValueType']//enumeration");
54      }
55  
56      private List<Element> selectNodes(String xpathExpression) {
57          return selectNodes(schema, xpathExpression);
58      }
59  
60      @SuppressWarnings("unchecked")
61      private static List<Element> selectNodes(Node node, String xpathExpression) {
62          return node.selectNodes(xpathExpression);
63      }
64  }