1 | |
|
2 | |
|
3 | |
|
4 | |
|
5 | |
|
6 | |
|
7 | |
|
8 | |
|
9 | |
|
10 | |
package org.openpermis.basic; |
11 | |
|
12 | |
import java.net.URI; |
13 | |
import java.util.HashMap; |
14 | |
import java.util.HashSet; |
15 | |
import java.util.Map; |
16 | |
import java.util.Set; |
17 | |
|
18 | |
import org.openpermis.Subject; |
19 | |
import org.openpermis.policy.Role; |
20 | |
import org.openpermis.policy.TimeStamp; |
21 | |
import org.openpermis.policy.bean.basic.BasicPart; |
22 | |
|
23 | |
|
24 | |
|
25 | |
|
26 | |
|
27 | |
|
28 | |
public class InternalSubject |
29 | |
extends BasicPart |
30 | |
implements Subject |
31 | |
{ |
32 | |
|
33 | |
|
34 | |
|
35 | |
|
36 | |
|
37 | |
|
38 | |
private static final long serialVersionUID = -5706090972924620861L; |
39 | |
|
40 | |
|
41 | |
|
42 | |
|
43 | |
private class RoleKey { |
44 | |
|
45 | |
private final String name; |
46 | |
private final URI hierarchy; |
47 | |
|
48 | |
|
49 | 86 | public RoleKey (String name, URI hierarchy) { |
50 | 86 | this.name = name; |
51 | 86 | this.hierarchy = hierarchy; |
52 | 86 | } |
53 | |
|
54 | |
@Override |
55 | |
public String toString () { |
56 | 0 | return this.name + "@" + this.hierarchy; |
57 | |
} |
58 | |
|
59 | |
@Override |
60 | |
public boolean equals (Object obj) { |
61 | 61 | final RoleKey that = (RoleKey) obj; |
62 | 61 | return this.name.equals(that.name) && this.hierarchy.equals(that.hierarchy); |
63 | |
} |
64 | |
|
65 | |
@Override |
66 | |
public int hashCode () { |
67 | 133 | final int factor = 29; |
68 | 133 | return this.name.hashCode() + factor * this.hierarchy.hashCode(); |
69 | |
} |
70 | |
|
71 | |
} |
72 | |
|
73 | |
|
74 | |
|
75 | |
|
76 | |
private class RoleSubjectKey { |
77 | |
|
78 | |
private final RoleKey role; |
79 | |
private final Subject subject; |
80 | |
|
81 | |
|
82 | 25 | public RoleSubjectKey (RoleKey role, Subject subject) { |
83 | 25 | this.role = role; |
84 | 25 | this.subject = subject; |
85 | 25 | } |
86 | |
|
87 | |
@Override |
88 | |
public boolean equals (Object obj) { |
89 | 8 | final RoleSubjectKey that = (RoleSubjectKey) obj; |
90 | 8 | return this.role.equals(that.role) && this.subject.equals(that.subject); |
91 | |
} |
92 | |
|
93 | |
@Override |
94 | |
public int hashCode () { |
95 | 25 | final int factor = 29; |
96 | 25 | return this.role.hashCode() + factor * this.subject.hashCode(); |
97 | |
} |
98 | |
|
99 | |
} |
100 | |
|
101 | |
|
102 | |
|
103 | |
|
104 | |
|
105 | |
|
106 | |
private final Map<RoleKey, Set<Subject>> roleIssuerMap; |
107 | |
|
108 | |
|
109 | |
|
110 | |
|
111 | |
private final Map<RoleSubjectKey, TimePeriod> roleSubjectPeriodMap; |
112 | |
|
113 | |
|
114 | |
|
115 | |
|
116 | |
|
117 | |
|
118 | |
|
119 | |
|
120 | 34 | public InternalSubject (URI identity) { |
121 | 34 | setIdentity(identity); |
122 | 34 | this.roleIssuerMap = new HashMap<RoleKey, Set<Subject>>(); |
123 | 34 | this.roleSubjectPeriodMap = new HashMap<RoleSubjectKey, TimePeriod>(); |
124 | 34 | } |
125 | |
|
126 | |
|
127 | |
|
128 | |
|
129 | |
|
130 | |
|
131 | |
|
132 | |
|
133 | |
|
134 | |
|
135 | |
|
136 | |
|
137 | |
|
138 | |
public void assignRole ( |
139 | |
Subject issuer, String roleName, URI hierarchyUri, TimePeriod validity |
140 | |
) { |
141 | 17 | final RoleKey key = new RoleKey(roleName, hierarchyUri); |
142 | 17 | Set<Subject> issuerSet = this.roleIssuerMap.get(key); |
143 | 17 | if (issuerSet == null) { |
144 | 15 | issuerSet = new HashSet<Subject>(1); |
145 | 15 | this.roleIssuerMap.put(key, issuerSet); |
146 | |
} |
147 | 17 | issuerSet.add(issuer); |
148 | |
|
149 | 17 | this.roleSubjectPeriodMap.put(new RoleSubjectKey(key, issuer), validity); |
150 | 17 | } |
151 | |
|
152 | |
|
153 | |
|
154 | |
|
155 | |
private RoleKey getRoleKey (Role role) { |
156 | 69 | return new RoleKey(role.getName(), role.getRoleHierarchy().getIdentity()); |
157 | |
} |
158 | |
|
159 | |
|
160 | |
|
161 | |
|
162 | |
|
163 | |
|
164 | |
@Override |
165 | |
protected boolean comparablePart (BasicPart part) { |
166 | 1 | return part instanceof Subject; |
167 | |
} |
168 | |
|
169 | |
|
170 | |
|
171 | |
|
172 | |
|
173 | |
|
174 | |
public Set<Role> getAssignedRoles (TimeStamp timeStamp, Set<Role> roles) { |
175 | 25 | final Set<Role> assignedRoles = new HashSet<Role>(); |
176 | 25 | for (final Role role : roles) { |
177 | 45 | if (this.roleIssuerMap.containsKey(getRoleKey(role))) { |
178 | 21 | assignedRoles.add(role); |
179 | |
} |
180 | |
} |
181 | 25 | return assignedRoles; |
182 | |
} |
183 | |
|
184 | |
|
185 | |
|
186 | |
|
187 | |
public Set<Subject> getIssuersOf (Role role) { |
188 | 16 | final Set<Subject> issuerSet = new HashSet<Subject>(); |
189 | 16 | final RoleKey key = getRoleKey(role); |
190 | 16 | if (this.roleIssuerMap.containsKey(key)) { |
191 | 15 | issuerSet.addAll(this.roleIssuerMap.get(key)); |
192 | |
} |
193 | 16 | return issuerSet; |
194 | |
} |
195 | |
|
196 | |
|
197 | |
|
198 | |
|
199 | |
public TimePeriod getValidityOf (Role role, Subject issuer) { |
200 | 8 | final RoleKey roleKey = getRoleKey(role); |
201 | 8 | final RoleSubjectKey key = new RoleSubjectKey(roleKey, issuer); |
202 | 8 | final TimePeriod validity = this.roleSubjectPeriodMap.get(key); |
203 | 8 | if (validity != null) { |
204 | 8 | return validity; |
205 | |
} |
206 | 0 | return TimePeriod.EMPTY; |
207 | |
} |
208 | |
|
209 | |
} |