Skip to content

Commit 3d9c219

Browse files
author
Adarsh Sharma
committed
Added Response Headers diff
1 parent aacfa80 commit 3d9c219

File tree

14 files changed

+675
-40
lines changed

14 files changed

+675
-40
lines changed
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
package com.qdesrame.openapi.diff.compare;
2+
3+
import com.qdesrame.openapi.diff.model.ChangedHeader;
4+
import io.swagger.v3.oas.models.headers.Header;
5+
6+
import java.util.Objects;
7+
import java.util.Optional;
8+
9+
/**
10+
* Created by adarsh.sharma on 28/12/17.
11+
*/
12+
public class HeaderDiff {
13+
private OpenApiDiff openApiDiff;
14+
15+
public HeaderDiff(OpenApiDiff openApiDiff) {
16+
this.openApiDiff = openApiDiff;
17+
}
18+
19+
public ChangedHeader diff(Header left, Header right) {
20+
ChangedHeader changedHeader = new ChangedHeader(left, right);
21+
22+
changedHeader.setChangeDescription(!Objects.equals(left.getDescription(), right.getDescription()));
23+
changedHeader.setChangeRequired(getBooleanDiff(left.getRequired(), right.getRequired()));
24+
changedHeader.setChangeDeprecated(!Boolean.TRUE.equals(left.getDeprecated()) && Boolean.TRUE.equals(right.getDeprecated()));
25+
changedHeader.setChangeAllowEmptyValue(getBooleanDiff(left.getAllowEmptyValue(), right.getAllowEmptyValue()));
26+
changedHeader.setChangeStyle(!Objects.equals(left.getStyle(), right.getStyle()));
27+
changedHeader.setChangeExplode(getBooleanDiff(left.getExplode(), right.getExplode()));
28+
changedHeader.setChangedSchema(openApiDiff.getSchemaDiff().diff(left.getSchema(), right.getSchema()));
29+
changedHeader.setChangedContent(openApiDiff.getContentDiff().diff(left.getContent(), right.getContent()));
30+
31+
return changedHeader;
32+
}
33+
34+
private boolean getBooleanDiff(Boolean left, Boolean right) {
35+
boolean leftRequired = Optional.ofNullable(left).orElse(Boolean.FALSE);
36+
boolean rightRequired = Optional.ofNullable(right).orElse(Boolean.FALSE);
37+
return leftRequired != rightRequired;
38+
}
39+
}
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
package com.qdesrame.openapi.diff.compare;
2+
3+
import com.qdesrame.openapi.diff.model.ChangedHeader;
4+
import com.qdesrame.openapi.diff.model.ChangedHeaders;
5+
import io.swagger.v3.oas.models.headers.Header;
6+
7+
import java.util.HashMap;
8+
import java.util.List;
9+
import java.util.Map;
10+
11+
/**
12+
* Created by adarsh.sharma on 28/12/17.
13+
*/
14+
public class HeadersDiff {
15+
private OpenApiDiff openApiDiff;
16+
17+
public HeadersDiff(OpenApiDiff openApiDiff) {
18+
this.openApiDiff = openApiDiff;
19+
}
20+
21+
public ChangedHeaders diff(Map<String, Header> left, Map<String, Header> right) {
22+
ChangedHeaders changedHeaders = new ChangedHeaders(left, right);
23+
MapKeyDiff<String, Header> headerMapDiff = MapKeyDiff.diff(left, right);
24+
changedHeaders.setIncreased(headerMapDiff.getIncreased());
25+
changedHeaders.setMissing(headerMapDiff.getMissing());
26+
List<String> sharedHeaderKeys = headerMapDiff.getSharedKey();
27+
28+
Map<String, ChangedHeader> changed = new HashMap<>();
29+
for (String headerKey : sharedHeaderKeys) {
30+
Header oldHeader = left.get(headerKey);
31+
Header newHeader = right.get(headerKey);
32+
ChangedHeader changedHeader = openApiDiff.getHeaderDiff().diff(oldHeader, newHeader);
33+
if (changedHeader.isDiff()) {
34+
changed.put(headerKey, changedHeader);
35+
}
36+
}
37+
changedHeaders.setChanged(changed);
38+
39+
return changedHeaders;
40+
}
41+
}

src/main/java/com/qdesrame/openapi/diff/compare/OpenApiDiff.java

Lines changed: 27 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,9 @@ public class OpenApiDiff {
3030
private ParametersDiff parametersDiff;
3131
private ParameterDiff parameterDiff;
3232
private RequestBodyDiff requestBodyDiff;
33+
private ResponseDiff responseDiff;
34+
private HeadersDiff headersDiff;
35+
private HeaderDiff headerDiff;
3336

3437
private OpenAPI oldSpecOpenApi;
3538
private OpenAPI newSpecOpenApi;
@@ -87,6 +90,9 @@ private void initializeFields() {
8790
this.parametersDiff = new ParametersDiff(this);
8891
this.parameterDiff = new ParameterDiff(this);
8992
this.requestBodyDiff = new RequestBodyDiff(this);
93+
this.responseDiff = new ResponseDiff(this);
94+
this.headersDiff = new HeadersDiff(this);
95+
this.headerDiff = new HeaderDiff(this);
9096
}
9197

9298
/*
@@ -145,20 +151,19 @@ private ChangedOpenApi compare() {
145151
ChangedParameters changedParameters = parametersDiff.diff(oldOperation.getParameters(), newOperation.getParameters());
146152
changedOperation.setChangedParameters(changedParameters);
147153

148-
MapKeyDiff<String, ApiResponse> responseDiff = MapKeyDiff.diff(oldOperation.getResponses(),
154+
MapKeyDiff<String, ApiResponse> responseMapKeyDiff = MapKeyDiff.diff(oldOperation.getResponses(),
149155
newOperation.getResponses());
150156
ChangedApiResponse changedApiResponse = new ChangedApiResponse(oldOperation.getResponses(), newOperation.getResponses());
151157
changedOperation.setChangedApiResponse(changedApiResponse);
152-
changedApiResponse.setAddResponses(responseDiff.getIncreased());
153-
changedApiResponse.setMissingResponses(responseDiff.getMissing());
154-
List<String> sharedResponseCodes = responseDiff.getSharedKey();
158+
changedApiResponse.setAddResponses(responseMapKeyDiff.getIncreased());
159+
changedApiResponse.setMissingResponses(responseMapKeyDiff.getMissing());
160+
List<String> sharedResponseCodes = responseMapKeyDiff.getSharedKey();
155161
Map<String, ChangedResponse> resps = new HashMap<>();
156162
for (String responseCode : sharedResponseCodes) {
157163
ApiResponse oldResponse = RefPointer.Replace.response(oldSpecOpenApi.getComponents(), oldOperation.getResponses().get(responseCode));
158164
ApiResponse newResponse = RefPointer.Replace.response(newSpecOpenApi.getComponents(), newOperation.getResponses().get(responseCode));
159165
ChangedContent changedContent = contentDiff.diff(oldResponse.getContent(), newResponse.getContent());
160-
ChangedResponse changedResponse = new ChangedResponse(newResponse.getDescription(), oldResponse.getContent(), newResponse.getContent());
161-
changedResponse.setDescription(newResponse.getDescription());
166+
ChangedResponse changedResponse = responseDiff.diff(oldResponse, newResponse);
162167
changedResponse.setChangedContent(changedContent);
163168
if (changedResponse.isDiff()) {
164169
resps.put(responseCode, changedResponse);
@@ -201,6 +206,22 @@ public ParameterDiff getParameterDiff() {
201206
return parameterDiff;
202207
}
203208

209+
public RequestBodyDiff getRequestBodyDiff() {
210+
return requestBodyDiff;
211+
}
212+
213+
public ResponseDiff getResponseDiff() {
214+
return responseDiff;
215+
}
216+
217+
public HeadersDiff getHeadersDiff() {
218+
return headersDiff;
219+
}
220+
221+
public HeaderDiff getHeaderDiff() {
222+
return headerDiff;
223+
}
224+
204225
public OpenAPI getOldSpecOpenApi() {
205226
return oldSpecOpenApi;
206227
}
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
package com.qdesrame.openapi.diff.compare;
2+
3+
import com.qdesrame.openapi.diff.model.ChangedResponse;
4+
import io.swagger.v3.oas.models.responses.ApiResponse;
5+
6+
import java.util.Objects;
7+
8+
/**
9+
* Created by adarsh.sharma on 28/12/17.
10+
*/
11+
public class ResponseDiff {
12+
private OpenApiDiff openApiDiff;
13+
14+
public ResponseDiff(OpenApiDiff openApiDiff) {
15+
this.openApiDiff = openApiDiff;
16+
}
17+
18+
public ChangedResponse diff(ApiResponse left, ApiResponse right) {
19+
ChangedResponse changedResponse = new ChangedResponse(left, right);
20+
21+
changedResponse.setChangedContent(openApiDiff.getContentDiff().diff(left.getContent(), right.getContent()));
22+
changedResponse.setChangedHeaders(openApiDiff.getHeadersDiff().diff(left.getHeaders(), right.getHeaders()));
23+
changedResponse.setChangeDescription(!Objects.equals(left.getDescription(), right.getDescription()));
24+
25+
return changedResponse;
26+
}
27+
}

src/main/java/com/qdesrame/openapi/diff/compare/SchemaDiff.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ public static SchemaDiffResult getSchemaDiffResult(OpenApiDiff openApiDiff) {
3636

3737
public static SchemaDiffResult getSchemaDiffResult(Class<? extends Schema> classType, OpenApiDiff openApiDiff) {
3838
if (classType == null) {
39-
throw new IllegalArgumentException("classType can not be null");
39+
classType = Schema.class;
4040
}
4141

4242
Class<? extends SchemaDiffResult> aClass = schemaDiffResultClassMap.get(classType);
@@ -92,7 +92,7 @@ public ChangedSchema diff(Schema left, Schema right) {
9292
//If schema type is same then get specific SchemaDiffResult and compare the properties
9393
SchemaDiffResult result = SchemaDiff.getSchemaDiffResult(right.getClass(), openApiDiff);
9494
ChangedSchema changedSchema = result.diff(leftComponents, rightComponents, left, right);
95-
if(areBothRefSchemas) {
95+
if (areBothRefSchemas) {
9696
schemaDiffCache.addToCache(leftRef, rightRef, changedSchema);
9797
}
9898
return changedSchema;
Lines changed: 126 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,126 @@
1+
package com.qdesrame.openapi.diff.model;
2+
3+
import io.swagger.v3.oas.models.headers.Header;
4+
5+
/**
6+
* Created by adarsh.sharma on 28/12/17.
7+
*/
8+
public class ChangedHeader implements Changed {
9+
private Header oldHeader;
10+
private Header newHeader;
11+
12+
private boolean changeDescription;
13+
private boolean changeRequired;
14+
private boolean changeDeprecated;
15+
private boolean changeAllowEmptyValue;
16+
private boolean changeStyle;
17+
private boolean changeExplode;
18+
private ChangedSchema changedSchema;
19+
private ChangedContent changedContent;
20+
21+
public ChangedHeader(Header oldHeader, Header newHeader) {
22+
this.oldHeader = oldHeader;
23+
this.newHeader = newHeader;
24+
}
25+
26+
@Override
27+
public boolean isDiff() {
28+
return changeDescription
29+
|| changeRequired
30+
|| changeDeprecated
31+
|| changeAllowEmptyValue
32+
|| changeStyle
33+
|| changeExplode
34+
|| (changedSchema != null && changedSchema.isDiff())
35+
|| (changedContent != null && changedContent.isDiff());
36+
}
37+
38+
@Override
39+
public boolean isDiffBackwardCompatible() {
40+
return changeRequired
41+
&& changeAllowEmptyValue
42+
&& (changedSchema == null || changedSchema.isDiffBackwardCompatible(false))
43+
&& (changedContent == null || changedContent.isDiffBackwardCompatible(false));
44+
}
45+
46+
public Header getOldHeader() {
47+
return oldHeader;
48+
}
49+
50+
public void setOldHeader(Header oldHeader) {
51+
this.oldHeader = oldHeader;
52+
}
53+
54+
public Header getNewHeader() {
55+
return newHeader;
56+
}
57+
58+
public void setNewHeader(Header newHeader) {
59+
this.newHeader = newHeader;
60+
}
61+
62+
public boolean isChangeDescription() {
63+
return changeDescription;
64+
}
65+
66+
public void setChangeDescription(boolean changeDescription) {
67+
this.changeDescription = changeDescription;
68+
}
69+
70+
public boolean isChangeRequired() {
71+
return changeRequired;
72+
}
73+
74+
public void setChangeRequired(boolean changeRequired) {
75+
this.changeRequired = changeRequired;
76+
}
77+
78+
public boolean isChangeDeprecated() {
79+
return changeDeprecated;
80+
}
81+
82+
public void setChangeDeprecated(boolean changeDeprecated) {
83+
this.changeDeprecated = changeDeprecated;
84+
}
85+
86+
public boolean isChangeAllowEmptyValue() {
87+
return changeAllowEmptyValue;
88+
}
89+
90+
public void setChangeAllowEmptyValue(boolean changeAllowEmptyValue) {
91+
this.changeAllowEmptyValue = changeAllowEmptyValue;
92+
}
93+
94+
public boolean isChangeStyle() {
95+
return changeStyle;
96+
}
97+
98+
public void setChangeStyle(boolean changeStyle) {
99+
this.changeStyle = changeStyle;
100+
}
101+
102+
public boolean isChangeExplode() {
103+
return changeExplode;
104+
}
105+
106+
public void setChangeExplode(boolean changeExplode) {
107+
this.changeExplode = changeExplode;
108+
}
109+
110+
public ChangedSchema getChangedSchema() {
111+
return changedSchema;
112+
}
113+
114+
public void setChangedSchema(ChangedSchema changedSchema) {
115+
this.changedSchema = changedSchema;
116+
}
117+
118+
public ChangedContent getChangedContent() {
119+
return changedContent;
120+
}
121+
122+
public void setChangedContent(ChangedContent changedContent) {
123+
this.changedContent = changedContent;
124+
}
125+
126+
}
Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
package com.qdesrame.openapi.diff.model;
2+
3+
import io.swagger.v3.oas.models.headers.Header;
4+
5+
import java.util.Map;
6+
7+
/**
8+
* Created by adarsh.sharma on 28/12/17.
9+
*/
10+
public class ChangedHeaders implements Changed {
11+
private Map<String, Header> oldHeaders;
12+
private Map<String, Header> newHeaders;
13+
14+
private Map<String, Header> increased;
15+
private Map<String, Header> missing;
16+
private Map<String, ChangedHeader> changed;
17+
18+
public ChangedHeaders(Map<String, Header> oldHeaders, Map<String, Header> newHeaders) {
19+
this.oldHeaders = oldHeaders;
20+
this.newHeaders = newHeaders;
21+
}
22+
23+
public Map<String, Header> getOldHeaders() {
24+
return oldHeaders;
25+
}
26+
27+
public void setOldHeaders(Map<String, Header> oldHeaders) {
28+
this.oldHeaders = oldHeaders;
29+
}
30+
31+
public Map<String, Header> getNewHeaders() {
32+
return newHeaders;
33+
}
34+
35+
public void setNewHeaders(Map<String, Header> newHeaders) {
36+
this.newHeaders = newHeaders;
37+
}
38+
39+
public Map<String, Header> getIncreased() {
40+
return increased;
41+
}
42+
43+
public void setIncreased(Map<String, Header> increased) {
44+
this.increased = increased;
45+
}
46+
47+
public Map<String, Header> getMissing() {
48+
return missing;
49+
}
50+
51+
public void setMissing(Map<String, Header> missing) {
52+
this.missing = missing;
53+
}
54+
55+
public Map<String, ChangedHeader> getChanged() {
56+
return changed;
57+
}
58+
59+
public void setChanged(Map<String, ChangedHeader> changed) {
60+
this.changed = changed;
61+
}
62+
63+
@Override
64+
public boolean isDiff() {
65+
return !increased.isEmpty()
66+
|| !missing.isEmpty()
67+
|| (changed != null && !changed.isEmpty());
68+
}
69+
70+
@Override
71+
public boolean isDiffBackwardCompatible() {
72+
return missing.isEmpty()
73+
&& (changed == null || changed.values().stream().allMatch(c -> c.isDiffBackwardCompatible()));
74+
}
75+
}

0 commit comments

Comments
 (0)