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
21
22
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 }