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
23
24
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 }