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