in scim-tools/src/main/java/org/apache/directory/scim/tools/diff/PatchGenerator.java [124:154]
private Set<PatchOperation> processAttribute(Schema prefixSchema, List<Schema.Attribute> parentAttributes, Schema.Attribute attribute, Object left, Object right) {
Set<PatchOperation> patchOperations = new HashSet<>();
Object leftTemp = left != null ? attribute.getAccessor().get(left) : null;
Object rightTemp = right != null ? attribute.getAccessor().get(right) : null;
if (attribute.getType() == Schema.Attribute.Type.COMPLEX) {
if (attribute.isMultiValued()) {
patchOperations.addAll(processMultiValuedComplexAttribute(prefixSchema, parentAttributes, attribute, leftTemp, rightTemp));
} else {
// Check if the whole object has been removed
if (leftTemp != null && rightTemp == null) {
patchOperations.add(new PatchOperation()
.setOperation(PatchOperation.Type.REMOVE)
.setPath(new PatchOperationPath(attributeExpression(prefixSchema, parentAttributes, attribute))));
} else {
// loop through sub attributes
attribute.getAttributes().forEach(subAttribute -> {
List<Schema.Attribute> subAttributeParents = new ArrayList<>(parentAttributes);
subAttributeParents.add(attribute);
patchOperations.addAll(processAttribute(prefixSchema, subAttributeParents, subAttribute, leftTemp, rightTemp));
});
}
}
} else { // primitive types (and collections of primitive types)
patchOperations.addAll(processPrimitiveAttribute(prefixSchema, parentAttributes, attribute, leftTemp, rightTemp));
}
return patchOperations;
}