From 278228db6a8bca94e9b5fbf7514c0dea5ea1086f Mon Sep 17 00:00:00 2001 From: Quentin Desrame Date: Wed, 18 Jul 2018 14:54:30 +0200 Subject: [PATCH] Extension: find changes when nothing changed Fix issue #51 --- .../openapi/diff/compare/ExtensionDiff.java | 4 +--- .../openapi/diff/compare/ExtensionsDiff.java | 14 ++++++++------ .../java/com/qdesrame/openapi/diff/utils/Copy.java | 14 ++++++++++++++ 3 files changed, 23 insertions(+), 9 deletions(-) create mode 100644 src/main/java/com/qdesrame/openapi/diff/utils/Copy.java diff --git a/src/main/java/com/qdesrame/openapi/diff/compare/ExtensionDiff.java b/src/main/java/com/qdesrame/openapi/diff/compare/ExtensionDiff.java index 615e1d263..3164d5326 100644 --- a/src/main/java/com/qdesrame/openapi/diff/compare/ExtensionDiff.java +++ b/src/main/java/com/qdesrame/openapi/diff/compare/ExtensionDiff.java @@ -4,15 +4,13 @@ import com.qdesrame.openapi.diff.model.Changed; import com.qdesrame.openapi.diff.model.DiffContext; -import java.util.Optional; - public interface ExtensionDiff { ExtensionDiff setOpenApiDiff(OpenApiDiff openApiDiff); String getName(); - Optional diff(Change extension, DiffContext context); + Changed diff(Change extension, DiffContext context); default boolean isParentApplicable(Change.Type type, Object object, Object extension, DiffContext context) { return true; diff --git a/src/main/java/com/qdesrame/openapi/diff/compare/ExtensionsDiff.java b/src/main/java/com/qdesrame/openapi/diff/compare/ExtensionsDiff.java index b3ef468a8..dc8f9bbab 100644 --- a/src/main/java/com/qdesrame/openapi/diff/compare/ExtensionsDiff.java +++ b/src/main/java/com/qdesrame/openapi/diff/compare/ExtensionsDiff.java @@ -2,7 +2,6 @@ import com.qdesrame.openapi.diff.model.Change; import com.qdesrame.openapi.diff.model.Changed; -import com.qdesrame.openapi.diff.model.CompatibleChanged; import com.qdesrame.openapi.diff.model.DiffContext; import com.qdesrame.openapi.diff.model.schema.ChangedExtensions; @@ -10,6 +9,7 @@ import java.util.function.Function; import static com.qdesrame.openapi.diff.utils.ChangedUtils.isChanged; +import static com.qdesrame.openapi.diff.utils.Copy.copyMap; public class ExtensionsDiff { private final OpenApiDiff openApiDiff; @@ -51,27 +51,29 @@ public Optional diff(Map left, Map diff(Map left, Map right, DiffContext context) { - if (null == left) left = new LinkedHashMap<>(); - if (null == right) right = new LinkedHashMap<>(); - ChangedExtensions changedExtensions = new ChangedExtensions(left, new LinkedHashMap<>(right), context); + left = copyMap(left); + right = copyMap(right); + ChangedExtensions changedExtensions = new ChangedExtensions(left, copyMap(right), context); for (String key : left.keySet()) { Object leftValue = left.get(key); if (right.containsKey(key)) { Object rightValue = right.remove(key); executeExtensionDiff(key, Change.changed(leftValue, rightValue), context) + .filter(Changed::isDifferent) .ifPresent(changed -> changedExtensions.getChanged().put(key, changed)); } else { executeExtensionDiff(key, Change.removed(leftValue), context) + .filter(Changed::isDifferent) .ifPresent(changed -> changedExtensions.getMissing().put(key, changed)); } } right.forEach((key, value) -> executeExtensionDiff(key, Change.added(value), context) + .filter(Changed::isDifferent) .ifPresent(changed -> changedExtensions.getIncreased().put(key, changed))); return isChanged(changedExtensions); } private Optional executeExtensionDiff(String name, Change change, DiffContext context) { - return executeExtension(name, diff -> diff.setOpenApiDiff(openApiDiff).diff(change, context)) - .orElse(Optional.of(CompatibleChanged.compatible(change))); + return executeExtension(name, diff -> diff.setOpenApiDiff(openApiDiff).diff(change, context)); } } diff --git a/src/main/java/com/qdesrame/openapi/diff/utils/Copy.java b/src/main/java/com/qdesrame/openapi/diff/utils/Copy.java new file mode 100644 index 000000000..fa2f170ee --- /dev/null +++ b/src/main/java/com/qdesrame/openapi/diff/utils/Copy.java @@ -0,0 +1,14 @@ +package com.qdesrame.openapi.diff.utils; + +import java.util.LinkedHashMap; +import java.util.Map; + +public class Copy { + public static Map copyMap(Map map) { + if (map == null) { + return new LinkedHashMap<>(); + } else { + return new LinkedHashMap<>(map); + } + } +}