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