6
6
import java .util .List ;
7
7
import java .util .Objects ;
8
8
import java .util .Optional ;
9
+ import java .util .regex .Matcher ;
10
+ import java .util .regex .Pattern ;
9
11
import org .openapitools .openapidiff .core .model .Changed ;
10
12
import org .openapitools .openapidiff .core .model .ChangedParameters ;
11
13
import org .openapitools .openapidiff .core .model .DiffContext ;
14
16
import org .openapitools .openapidiff .core .utils .RefPointer ;
15
17
import org .openapitools .openapidiff .core .utils .RefType ;
16
18
19
+ class ParametersDiffResult {
20
+ protected DeferredChanged <ChangedParameters > deferredChanged ;
21
+ protected boolean sameOperationsDiffSchema ;
22
+
23
+ public ParametersDiffResult (DeferredChanged <ChangedParameters > deferredChanged , boolean sameOperationsDiffSchema ) {
24
+ this .deferredChanged = deferredChanged ;
25
+ this .sameOperationsDiffSchema = sameOperationsDiffSchema ;
26
+ }
27
+ }
17
28
/** compare two parameter */
18
29
public class ParametersDiff {
19
30
private static final RefPointer <Parameter > refPointer = new RefPointer <>(RefType .PARAMETERS );
@@ -46,9 +57,7 @@ public static boolean same(Parameter left, Parameter right) {
46
57
&& Objects .equals (left .getIn (), right .getIn ());
47
58
}
48
59
49
- public DeferredChanged <ChangedParameters > diff (
50
- List <Parameter > left , List <Parameter > right , DiffContext context ) {
51
-
60
+ public ParametersDiffResult diff (List <Parameter > left , List <Parameter > right , DiffContext context ) {
52
61
DeferredBuilder <Changed > builder = new DeferredBuilder <>();
53
62
ChangedParameters changedParameters =
54
63
new ChangedParameters (left , right != null ? new ArrayList <>(right ) : null , context );
@@ -70,7 +79,59 @@ public DeferredChanged<ChangedParameters> diff(
70
79
}
71
80
}
72
81
changedParameters .getIncreased ().addAll (right );
82
+ return new ParametersDiffResult (
83
+ builder .buildIsChanged (changedParameters ),
84
+ pathUnchangedParametersChanged (changedParameters , context )
85
+ );
86
+ }
87
+
88
+ public boolean pathUnchangedParametersChanged (
89
+ ChangedParameters changedParameters , DiffContext context ) {
90
+ if (!pathUnchanged (changedParameters , context )) return false ;
91
+ // If missing and increased parameter count is different, it's a new endpoint
92
+ if (changedParameters .getMissing ().size () != changedParameters .getIncreased ().size ())
93
+ return false ;
94
+ // Go through each missing Parameter and compare it to newly added Parameters
95
+ for (Parameter parameter : changedParameters .getMissing ()) {
96
+ // Speedy Check. Use the map already created in changedParameters to check if missing param is linked to newParam
97
+ String newParameterName = context .getParameters ().get (parameter .getName ());
98
+ if (newParameterName .isEmpty ()) return false ;
99
+
100
+ Optional <Parameter > newParameter =
101
+ changedParameters .getIncreased ().stream ()
102
+ .filter (p -> p .getName ().equals (newParameterName ))
103
+ .findFirst ();
104
+ if (!newParameter .isPresent ()) return false ;
73
105
74
- return builder .buildIsChanged (changedParameters );
106
+ // Check if the old and new Parameters match . IF so, return TRUE
107
+ Parameter newParameterRealized = newParameter .get ();
108
+ newParameterRealized .setName (parameter .getName ()); // Make names similar
109
+ boolean samePathDifferentParameter = !newParameterRealized .equals (parameter );
110
+ newParameterRealized .setName (newParameterName ); // Important:: MUST Reset the name as this is not a copy
111
+ return samePathDifferentParameter ;
112
+ }
113
+ return false ;
114
+ }
115
+
116
+ public boolean pathUnchanged (ChangedParameters changedParameters , DiffContext context ) {
117
+ final String REGEX_PATH = "\\ {([^/]+)}" ;
118
+ String oldUrl = context .getLeftUrl ();
119
+ String newUrl = context .getRightUrl ();
120
+ ArrayList <String > oldUrlPathParams = matchedItems (oldUrl , REGEX_PATH );
121
+ ArrayList <String > newUrlPathParams = matchedItems (newUrl , REGEX_PATH );
122
+ // Path Param count doesn't match or param-less path doesn't match or param is changed --> It's a new endpoint
123
+ return oldUrlPathParams .size () == newUrlPathParams .size ()
124
+ && changedParameters .getChanged ().isEmpty ()
125
+ && oldUrl .replaceAll (REGEX_PATH , "" ).equals (newUrl .replaceAll (REGEX_PATH , "" ));
126
+ }
127
+
128
+ public ArrayList <String > matchedItems (String string , String regex ) {
129
+ Matcher matcher = Pattern .compile (regex ).matcher (string );
130
+ ArrayList <String > matchedItems = new ArrayList <>();
131
+ while (matcher .find ()) {
132
+ String item = matcher .group ();
133
+ matchedItems .add (item .substring (0 , matcher .group ().length () - 1 ).replaceFirst ("\\ {" , "" ));
134
+ }
135
+ return matchedItems ;
75
136
}
76
137
}
0 commit comments