1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 package org.opencastproject.security.api;
23
24 import java.util.AbstractMap.SimpleEntry;
25 import java.util.ArrayList;
26 import java.util.Arrays;
27 import java.util.HashMap;
28 import java.util.HashSet;
29 import java.util.List;
30 import java.util.Objects;
31
32 import javax.xml.bind.annotation.XmlAccessType;
33 import javax.xml.bind.annotation.XmlAccessorType;
34 import javax.xml.bind.annotation.XmlElement;
35 import javax.xml.bind.annotation.XmlRootElement;
36 import javax.xml.bind.annotation.XmlType;
37
38
39
40
41 @XmlAccessorType(XmlAccessType.FIELD)
42 @XmlType(name = "acl", namespace = "http://org.opencastproject.security", propOrder = { "entries" })
43 @XmlRootElement(name = "acl", namespace = "http://org.opencastproject.security")
44 public final class AccessControlList {
45
46
47 @XmlElement(name = "ace")
48 private List<AccessControlEntry> entries;
49
50
51
52
53 public AccessControlList() {
54 this.entries = new ArrayList<>();
55 }
56
57 public AccessControlList(AccessControlEntry... entries) {
58 this.entries = new ArrayList<>(Arrays.asList(entries));
59 }
60
61 public AccessControlList(List<AccessControlEntry> entries) {
62 this.entries = new ArrayList<>(entries);
63 }
64
65
66
67
68 public List<AccessControlEntry> getEntries() {
69 return entries;
70 }
71
72 public boolean isValid() {
73 return entries.stream().allMatch(AccessControlEntry::isValid);
74 }
75
76
77
78
79
80
81 @Override
82 public String toString() {
83 return entries.toString();
84 }
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104 public AccessControlList merge(AccessControlList acl) {
105 HashSet<String> roles = new HashSet<>();
106 ArrayList<AccessControlEntry> newEntries = new ArrayList<>(acl.getEntries());
107
108 for (AccessControlEntry entry : newEntries) {
109 roles.add(entry.getRole());
110 }
111
112 for (AccessControlEntry entry : this.entries) {
113 if (!roles.contains(entry.getRole())) {
114 newEntries.add(entry);
115 }
116 }
117 this.entries = newEntries;
118 return this;
119 }
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139 public AccessControlList mergeActions(AccessControlList acl) {
140 HashMap<SimpleEntry<String, String>, AccessControlEntry> rules = new HashMap<>();
141 SimpleEntry<String, String> key;
142 for (AccessControlEntry entry : this.entries) {
143 key = new SimpleEntry<>(entry.getRole(), entry.getAction());
144 rules.put(key, entry);
145 }
146 for (AccessControlEntry entry : acl.getEntries()) {
147 key = new SimpleEntry<>(entry.getRole(), entry.getAction());
148 rules.put(key, entry);
149 }
150 this.entries = new ArrayList<>(rules.values());
151 return this;
152 }
153
154 @Override
155 public boolean equals(Object o) {
156 if (o instanceof AccessControlList) {
157 return entries.equals(((AccessControlList) o).entries);
158 }
159 return false;
160 }
161
162 @Override
163 public int hashCode() {
164 return Objects.hash(entries);
165 }
166
167 }