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