in src/main/java/org/apache/sling/jcr/jackrabbit/accessmanager/LocalPrivilege.java [82:116]
protected Set<LocalRestriction> mergeRestrictions(Set<LocalRestriction> currentRestrictions, Set<LocalRestriction> newRestrictions) {
Set<LocalRestriction> mergedRestrictons;
if (newRestrictions == null) {
mergedRestrictons = null;
} else {
mergedRestrictons = new HashSet<>(currentRestrictions);
for (LocalRestriction lr : newRestrictions) {
if (lr.isMultiValue()) {
String expectedName = lr.getName();
Optional<LocalRestriction> existing = currentRestrictions.stream()
.filter(r -> r.getName().equals(expectedName))
.findFirst();
if (existing.isPresent()) {
//remove the old one that we are replacing
mergedRestrictons.removeIf(k -> expectedName.equals(k.getName()));
Set<Value> mergedValues = new LinkedHashSet<>();
// add the current values
LocalRestriction existingLr = existing.get();
Stream.of(existingLr.getValues())
.forEach(mergedValues::add);
// merge the new values
Stream.of(lr.getValues())
.forEach(mergedValues::add);
Value[] newValues = mergedValues.toArray(new Value[mergedValues.size()]);
// construct the replacement object
lr = LocalRestriction.cloneWithNewValues(lr, newValues);
}
}
// add to the set
mergedRestrictons.add(lr);
}
}
return mergedRestrictons;
}