@SuppressWarnings("unchecked") private void merge(Data originalValue, Data newValue, MergeResult mergeResult, Function<String,Boolean> permissionChecker) { this.visitAttributesTripleFlat(originalValue, newValue, (attributeName, currentAttribute, originalAttribute, newAttribute) -> { if (!currentAttribute.internal_ignoreForMerging()){ if (currentAttribute.internal_hasMergeConflict(originalAttribute, newAttribute)) { mergeResult.addConflictInfo(new AttributeDiffInfo(Data.this.getId(), attributeName)); } else { if (currentAttribute.internal_isMergeable(originalAttribute, newAttribute)) { final AttributeDiffInfo attributeDiffInfo = new AttributeDiffInfo(attributeName,Data.this.getId()); if (currentAttribute.internal_hasWritePermission(permissionChecker)){ mergeResult.addMergeInfo(attributeDiffInfo); mergeResult.addMergeExecutions(() -> currentAttribute.internal_merge(newAttribute)); } else { mergeResult.addPermissionViolationInfo(attributeDiffInfo); } } } } }); }