1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 package org.apache.syncope.core.provisioning.api;
20
21 import java.io.Serializable;
22 import java.util.Collection;
23 import java.util.HashMap;
24 import java.util.HashSet;
25 import java.util.Map;
26 import java.util.Set;
27 import java.util.stream.Stream;
28 import org.apache.syncope.common.lib.types.ResourceOperation;
29
30
31
32
33
34
35 public class PropagationByResource<T extends Serializable> implements Serializable {
36
37 private static final long serialVersionUID = -5699740428104336636L;
38
39
40
41
42 private final Set<T> toBeCreated;
43
44
45
46
47 private final Set<T> toBeUpdated;
48
49
50
51
52 private final Set<T> toBeDeleted;
53
54
55
56
57 private final Map<String, String> oldConnObjectKeys;
58
59
60
61
62 public PropagationByResource() {
63 toBeCreated = new HashSet<>();
64 toBeUpdated = new HashSet<>();
65 toBeDeleted = new HashSet<>();
66
67 oldConnObjectKeys = new HashMap<>();
68 }
69
70
71
72
73
74 public final void purge() {
75 toBeCreated.removeAll(toBeDeleted);
76 toBeCreated.removeAll(toBeUpdated);
77
78 toBeUpdated.removeAll(toBeDeleted);
79 }
80
81
82
83
84
85
86
87
88 public final boolean add(final ResourceOperation type, final T key) {
89 Set<T> set;
90 switch (type) {
91 case CREATE:
92 set = toBeCreated;
93 break;
94
95 case UPDATE:
96 set = toBeUpdated;
97 break;
98
99 case DELETE:
100 default:
101 set = toBeDeleted;
102 break;
103 }
104
105 return set.add(key);
106 }
107
108
109
110
111
112
113
114
115 public boolean addAll(final ResourceOperation type, final Collection<T> keys) {
116 Set<T> set;
117 switch (type) {
118 case CREATE:
119 set = toBeCreated;
120 break;
121
122 case UPDATE:
123 set = toBeUpdated;
124 break;
125
126 case DELETE:
127 default:
128 set = toBeDeleted;
129 break;
130 }
131
132 return set.addAll(keys);
133 }
134
135
136
137
138
139
140
141
142 public final boolean remove(final ResourceOperation type, final T key) {
143 boolean result = false;
144
145 switch (type) {
146 case CREATE:
147 result = toBeCreated.remove(key);
148 break;
149
150 case UPDATE:
151 result = toBeUpdated.remove(key);
152 break;
153
154 case DELETE:
155 result = toBeDeleted.remove(key);
156 break;
157
158 default:
159 }
160
161 return result;
162 }
163
164
165
166
167
168
169
170
171 public boolean removeAll(final ResourceOperation type, final Set<T> keys) {
172 Set<T> set;
173 switch (type) {
174 case CREATE:
175 set = toBeCreated;
176 break;
177
178 case UPDATE:
179 set = toBeUpdated;
180 break;
181
182 case DELETE:
183 default:
184 set = toBeDeleted;
185 break;
186 }
187
188 return set.removeAll(keys);
189 }
190
191
192
193
194
195
196
197
198
199 public boolean removeAll(final Collection<T> keys) {
200 return toBeCreated.removeAll(keys)
201 || toBeUpdated.removeAll(keys)
202 || toBeDeleted.removeAll(keys);
203 }
204
205
206
207
208
209
210
211
212
213 public boolean retainAll(final Collection<T> keys) {
214 return toBeCreated.retainAll(keys)
215 || toBeUpdated.retainAll(keys)
216 || toBeDeleted.retainAll(keys);
217 }
218
219 public boolean contains(final ResourceOperation type, final T key) {
220 boolean result = false;
221
222 switch (type) {
223 case CREATE:
224 result = toBeCreated.contains(key);
225 break;
226
227 case UPDATE:
228 result = toBeUpdated.contains(key);
229 break;
230
231 case DELETE:
232 result = toBeDeleted.contains(key);
233 break;
234
235 default:
236 }
237
238 return result;
239 }
240
241 public boolean contains(final T key) {
242 return toBeCreated.contains(key)
243 || toBeUpdated.contains(key)
244 || toBeDeleted.contains(key);
245 }
246
247
248
249
250
251
252
253 public final Set<T> get(final ResourceOperation type) {
254 Set<T> result = Set.of();
255
256 switch (type) {
257 case CREATE:
258 result = toBeCreated;
259 break;
260
261 case UPDATE:
262 result = toBeUpdated;
263 break;
264
265 case DELETE:
266 result = toBeDeleted;
267 break;
268
269 default:
270 }
271
272 return result;
273 }
274
275 public Map<T, ResourceOperation> asMap() {
276 Map<T, ResourceOperation> result = new HashMap<>();
277 Stream.of(ResourceOperation.values()).
278 forEach(operation -> get(operation).forEach(resource -> result.put(resource, operation)));
279
280 return result;
281 }
282
283
284
285
286
287
288
289 public final void set(final ResourceOperation type, final Collection<T> keys) {
290
291 switch (type) {
292 case CREATE:
293 toBeCreated.clear();
294 toBeCreated.addAll(keys);
295 break;
296
297 case UPDATE:
298 toBeUpdated.clear();
299 toBeUpdated.addAll(keys);
300 break;
301
302 case DELETE:
303 toBeDeleted.clear();
304 toBeDeleted.addAll(keys);
305 break;
306
307 default:
308 }
309 }
310
311
312
313
314
315
316 public final void merge(final PropagationByResource<T> propByRes) {
317 if (propByRes != null) {
318 toBeCreated.addAll(propByRes.get(ResourceOperation.CREATE));
319 toBeUpdated.addAll(propByRes.get(ResourceOperation.UPDATE));
320 toBeDeleted.addAll(propByRes.get(ResourceOperation.DELETE));
321 oldConnObjectKeys.putAll(propByRes.getOldConnObjectKeys());
322 }
323 }
324
325
326
327
328 public void clear() {
329 toBeCreated.clear();
330 toBeUpdated.clear();
331 toBeDeleted.clear();
332 }
333
334
335
336
337
338
339 public final boolean isEmpty() {
340 return toBeCreated.isEmpty() && toBeUpdated.isEmpty() && toBeDeleted.isEmpty() && oldConnObjectKeys.isEmpty();
341 }
342
343
344
345
346
347
348 public Map<String, String> getOldConnObjectKeys() {
349 return oldConnObjectKeys;
350 }
351
352
353
354
355
356
357
358 public String getOldConnObjectKey(final String resourceKey) {
359 return oldConnObjectKeys.get(resourceKey);
360 }
361
362
363
364
365
366
367
368 public void addOldConnObjectKey(final String resourceKey, final String oldConnObjectKey) {
369 if (resourceKey != null && oldConnObjectKey != null) {
370 oldConnObjectKeys.put(resourceKey, oldConnObjectKey);
371 }
372 }
373
374 @Override
375 public String toString() {
376 return "To be Created: " + toBeCreated + ";\n"
377 + "To be Updated: " + toBeUpdated + ";\n"
378 + "To be Deleted: " + toBeDeleted + ";\n"
379 + "Old connObjectKeys: " + oldConnObjectKeys;
380 }
381 }