1
1
package com .qdesrame .openapi .diff .compare ;
2
2
3
+ import com .qdesrame .openapi .diff .model .Change ;
4
+ import com .qdesrame .openapi .diff .model .Changed ;
5
+ import com .qdesrame .openapi .diff .model .CompatibleChanged ;
3
6
import com .qdesrame .openapi .diff .model .DiffContext ;
4
7
import com .qdesrame .openapi .diff .model .schema .ChangedExtensions ;
5
8
6
9
import java .util .*;
10
+ import java .util .function .Function ;
7
11
8
12
import static com .qdesrame .openapi .diff .utils .ChangedUtils .isChanged ;
9
13
@@ -21,23 +25,53 @@ public ExtensionsDiff(OpenApiDiff openApiDiff) {
21
25
}
22
26
}
23
27
28
+ public boolean isParentApplicable (Change .Type type , Object parent , Map <String , Object > extensions , DiffContext context ) {
29
+ if (extensions .size () == 0 ) {
30
+ return true ;
31
+ }
32
+ return extensions .entrySet ().stream ()
33
+ .map (entry -> executeExtension (entry .getKey (), extensionDiff -> extensionDiff .isParentApplicable (type , parent , entry .getValue (), context )))
34
+ .allMatch (aBoolean -> aBoolean .orElse (true ));
35
+ }
36
+
37
+ public Optional <ExtensionDiff > getExtensionDiff (String name ) {
38
+ return extensionsDiff .stream ()
39
+ .filter (diff -> ("x-" + diff .getName ()).equals (name ))
40
+ .findFirst ();
41
+ }
42
+
43
+ public <T > Optional <T > executeExtension (String name , Function <ExtensionDiff , T > predicate ) {
44
+ return getExtensionDiff (name )
45
+ .map (extensionDiff -> extensionDiff .setOpenApiDiff (openApiDiff ))
46
+ .map (predicate );
47
+ }
48
+
49
+ public Optional <ChangedExtensions > diff (Map <String , Object > left , Map <String , Object > right ) {
50
+ return this .diff (left , right , null );
51
+ }
52
+
24
53
public Optional <ChangedExtensions > diff (Map <String , Object > left , Map <String , Object > right , DiffContext context ) {
25
54
if (null == left ) left = new LinkedHashMap <>();
26
55
if (null == right ) right = new LinkedHashMap <>();
27
56
ChangedExtensions changedExtensions = new ChangedExtensions (left , new LinkedHashMap <>(right ), context );
28
- changedExtensions .getIncreased ().putAll (right );
29
57
for (String key : left .keySet ()) {
30
- if (changedExtensions .getIncreased ().containsKey (key )) {
31
- Optional <ExtensionDiff > extensionDiff = extensionsDiff .stream ()
32
- .filter (diff -> ("x-" + diff .getName ()).equals (key )).findFirst ();
33
- Object leftValue = left .get (key );
34
- Object rightValue = changedExtensions .getIncreased ().remove (key );
35
- extensionDiff .ifPresent (diff -> diff .setOpenApiDiff (openApiDiff ).diff (leftValue , rightValue , context )
36
- .ifPresent (changed -> changedExtensions .getChanged ().put (key , changed )));
58
+ Object leftValue = left .get (key );
59
+ if (right .containsKey (key )) {
60
+ Object rightValue = right .remove (key );
61
+ executeExtensionDiff (key , Change .changed (leftValue , rightValue ), context )
62
+ .ifPresent (changed -> changedExtensions .getChanged ().put (key , changed ));
37
63
} else {
38
- changedExtensions .getMissing ().put (key , left .get (key ));
64
+ executeExtensionDiff (key , Change .removed (leftValue ), context )
65
+ .ifPresent (changed -> changedExtensions .getMissing ().put (key , changed ));
39
66
}
40
67
}
68
+ right .forEach ((key , value ) -> executeExtensionDiff (key , Change .added (value ), context )
69
+ .ifPresent (changed -> changedExtensions .getIncreased ().put (key , changed )));
41
70
return isChanged (changedExtensions );
42
71
}
72
+
73
+ private Optional <Changed > executeExtensionDiff (String name , Change change , DiffContext context ) {
74
+ return executeExtension (name , diff -> diff .setOpenApiDiff (openApiDiff ).diff (change , context ))
75
+ .orElse (Optional .of (CompatibleChanged .compatible (change )));
76
+ }
43
77
}
0 commit comments