diff --git a/src/main/java/com/qdesrame/openapi/diff/compare/OpenApiDiff.java b/src/main/java/com/qdesrame/openapi/diff/compare/OpenApiDiff.java index 3374b9400..5339176cd 100644 --- a/src/main/java/com/qdesrame/openapi/diff/compare/OpenApiDiff.java +++ b/src/main/java/com/qdesrame/openapi/diff/compare/OpenApiDiff.java @@ -6,8 +6,6 @@ import io.swagger.v3.oas.models.OpenAPI; import io.swagger.v3.oas.models.Operation; import io.swagger.v3.oas.models.PathItem; -import io.swagger.v3.oas.models.media.Content; -import io.swagger.v3.oas.models.parameters.RequestBody; import io.swagger.v3.oas.models.responses.ApiResponse; import io.swagger.v3.parser.OpenAPIV3Parser; import io.swagger.v3.parser.core.models.AuthorizationValue; @@ -31,6 +29,7 @@ public class OpenApiDiff { private ContentDiff contentDiff; private ParametersDiff parametersDiff; private ParameterDiff parameterDiff; + private RequestBodyDiff requestBodyDiff; private OpenAPI oldSpecOpenApi; private OpenAPI newSpecOpenApi; @@ -87,6 +86,7 @@ private void initializeFields() { this.contentDiff = new ContentDiff(this); this.parametersDiff = new ParametersDiff(this); this.parameterDiff = new ParameterDiff(this); + this.requestBodyDiff = new RequestBodyDiff(this); } /* @@ -138,19 +138,9 @@ private ChangedOpenApi compare() { changedOperation.setSummary(newOperation.getSummary()); changedOperation.setDeprecated(!Boolean.TRUE.equals(oldOperation.getDeprecated()) && Boolean.TRUE.equals(newOperation.getDeprecated())); - Content oldRequestContent = new Content(); - Content newRequestContent = new Content(); - if (oldOperation.getRequestBody() != null) { - RequestBody oldRequestBody = RefPointer.Replace.requestBody(oldSpecOpenApi.getComponents(), oldOperation.getRequestBody()); - if (oldRequestBody.getContent() != null) { - oldRequestContent = oldRequestBody.getContent(); - } - } - if (newOperation.getRequestBody() != null) { - RequestBody newRequestBody = RefPointer.Replace.requestBody(oldSpecOpenApi.getComponents(), newOperation.getRequestBody()); - newRequestContent = newRequestBody.getContent(); + if (oldOperation.getRequestBody() != null || newOperation.getRequestBody() != null) { + changedOperation.setChangedRequestBody(requestBodyDiff.diff(oldOperation.getRequestBody(), newOperation.getRequestBody())); } - changedOperation.setRequestChangedContent(contentDiff.diff(oldRequestContent, newRequestContent)); ChangedParameters changedParameters = parametersDiff.diff(oldOperation.getParameters(), newOperation.getParameters()); changedOperation.setChangedParameters(changedParameters); diff --git a/src/main/java/com/qdesrame/openapi/diff/compare/RequestBodyDiff.java b/src/main/java/com/qdesrame/openapi/diff/compare/RequestBodyDiff.java new file mode 100644 index 000000000..7633b566b --- /dev/null +++ b/src/main/java/com/qdesrame/openapi/diff/compare/RequestBodyDiff.java @@ -0,0 +1,51 @@ +package com.qdesrame.openapi.diff.compare; + +import com.qdesrame.openapi.diff.model.ChangedRequestBody; +import com.qdesrame.openapi.diff.utils.RefPointer; +import io.swagger.v3.oas.models.media.Content; +import io.swagger.v3.oas.models.parameters.RequestBody; + +import java.util.Objects; + +/** + * Created by adarsh.sharma on 28/12/17. + */ +public class RequestBodyDiff { + private OpenApiDiff openApiDiff; + + public RequestBodyDiff(OpenApiDiff openApiDiff) { + this.openApiDiff = openApiDiff; + } + + public ChangedRequestBody diff(RequestBody left, RequestBody right) { + Content oldRequestContent = new Content(); + Content newRequestContent = new Content(); + RequestBody oldRequestBody = null; + RequestBody newRequestBody = null; + if (left != null) { + oldRequestBody = RefPointer.Replace.requestBody(openApiDiff.getOldSpecOpenApi().getComponents(), left); + if (oldRequestBody.getContent() != null) { + oldRequestContent = oldRequestBody.getContent(); + } + } + if (right != null) { + newRequestBody = RefPointer.Replace.requestBody(openApiDiff.getOldSpecOpenApi().getComponents(), right); + if (newRequestBody.getContent() != null) { + newRequestContent = newRequestBody.getContent(); + } + } + + ChangedRequestBody changedRequestBody = new ChangedRequestBody(left, right); + + boolean leftRequired = oldRequestBody != null ? Boolean.TRUE.equals(oldRequestBody.getRequired()) : false; + boolean rightRequired = newRequestBody != null ? Boolean.TRUE.equals(newRequestBody.getRequired()) : false; + changedRequestBody.setChangeRequired(leftRequired != rightRequired); + + String leftDescription = oldRequestBody != null ? oldRequestBody.getDescription() : null; + String rightDescription = newRequestBody != null ? newRequestBody.getDescription() : null; + changedRequestBody.setChangeDescription(!Objects.equals(leftDescription, rightDescription)); + + changedRequestBody.setChangedContent(openApiDiff.getContentDiff().diff(oldRequestContent, newRequestContent)); + return changedRequestBody; + } +} diff --git a/src/main/java/com/qdesrame/openapi/diff/model/ChangedOperation.java b/src/main/java/com/qdesrame/openapi/diff/model/ChangedOperation.java index df12336ca..b355f1075 100644 --- a/src/main/java/com/qdesrame/openapi/diff/model/ChangedOperation.java +++ b/src/main/java/com/qdesrame/openapi/diff/model/ChangedOperation.java @@ -13,7 +13,7 @@ public class ChangedOperation implements Changed { private String summary; private boolean deprecated; private ChangedParameters changedParameters; - private ChangedContent requestChangedContent; + private ChangedRequestBody changedRequestBody; private ChangedApiResponse changedApiResponse; public ChangedOperation(String pathUrl, PathItem.HttpMethod httpMethod, Operation oldOperation, Operation newOperation) { @@ -63,12 +63,12 @@ public void setChangedParameters(ChangedParameters changedParameters) { this.changedParameters = changedParameters; } - public ChangedContent getRequestChangedContent() { - return requestChangedContent; + public ChangedRequestBody getChangedRequestBody() { + return changedRequestBody; } - public void setRequestChangedContent(ChangedContent requestChangedContent) { - this.requestChangedContent = requestChangedContent; + public void setChangedRequestBody(ChangedRequestBody changedRequestBody) { + this.changedRequestBody = changedRequestBody; } public ChangedApiResponse getChangedApiResponse() { @@ -87,7 +87,7 @@ public boolean isDiff() { @Override public boolean isDiffBackwardCompatible() { return changedParameters.isDiffBackwardCompatible() - && requestChangedContent.isDiffBackwardCompatible(true) + && (changedRequestBody == null || changedRequestBody.isDiffBackwardCompatible()) && changedApiResponse.isDiffBackwardCompatible(); } @@ -100,7 +100,7 @@ public boolean isDiffResponse() { } public boolean isDiffRequest() { - return requestChangedContent.isDiff(); + return changedRequestBody != null && changedRequestBody.isDiff(); } } diff --git a/src/main/java/com/qdesrame/openapi/diff/model/ChangedRequestBody.java b/src/main/java/com/qdesrame/openapi/diff/model/ChangedRequestBody.java new file mode 100644 index 000000000..c3c4b4ae0 --- /dev/null +++ b/src/main/java/com/qdesrame/openapi/diff/model/ChangedRequestBody.java @@ -0,0 +1,69 @@ +package com.qdesrame.openapi.diff.model; + +import io.swagger.v3.oas.models.parameters.RequestBody; + +/** + * Created by adarsh.sharma on 27/12/17. + */ +public class ChangedRequestBody implements Changed { + private RequestBody oldRequestBody; + private RequestBody newRequestBody; + private boolean changeDescription; + private boolean changeRequired; + private ChangedContent changedContent; + + public ChangedRequestBody(RequestBody oldRequestBody, RequestBody newRequestBody) { + this.oldRequestBody = oldRequestBody; + this.newRequestBody = newRequestBody; + } + + public RequestBody getOldRequestBody() { + return oldRequestBody; + } + + public void setOldRequestBody(RequestBody oldRequestBody) { + this.oldRequestBody = oldRequestBody; + } + + public RequestBody getNewRequestBody() { + return newRequestBody; + } + + public void setNewRequestBody(RequestBody newRequestBody) { + this.newRequestBody = newRequestBody; + } + + public boolean isChangeDescription() { + return changeDescription; + } + + public void setChangeDescription(boolean changeDescription) { + this.changeDescription = changeDescription; + } + + public boolean isChangeRequired() { + return changeRequired; + } + + public void setChangeRequired(boolean changeRequired) { + this.changeRequired = changeRequired; + } + + public ChangedContent getChangedContent() { + return changedContent; + } + + public void setChangedContent(ChangedContent changedContent) { + this.changedContent = changedContent; + } + + @Override + public boolean isDiff() { + return changeDescription || changeRequired || changedContent.isDiff(); + } + + @Override + public boolean isDiffBackwardCompatible() { + return !changeRequired && changedContent.isDiffBackwardCompatible(true); + } +} diff --git a/src/main/java/com/qdesrame/openapi/diff/output/ConsoleRender.java b/src/main/java/com/qdesrame/openapi/diff/output/ConsoleRender.java index 93a732a50..b91e273d7 100644 --- a/src/main/java/com/qdesrame/openapi/diff/output/ConsoleRender.java +++ b/src/main/java/com/qdesrame/openapi/diff/output/ConsoleRender.java @@ -65,7 +65,7 @@ private String ol_changed(List operations) { if (operation.isDiffRequest()) { ul_detail.append(StringUtils.repeat(' ', 2)).append("Request:") .append(System.lineSeparator()) - .append(ul_content(operation.getRequestChangedContent(), true)); + .append(ul_content(operation.getChangedRequestBody().getChangedContent(), true)); } if (operation.isDiffResponse()) { ul_detail.append(StringUtils.repeat(' ', 2)).append("Return Type:") diff --git a/src/main/java/com/qdesrame/openapi/diff/output/HtmlRender.java b/src/main/java/com/qdesrame/openapi/diff/output/HtmlRender.java index 8c692330d..ff9fa8f51 100644 --- a/src/main/java/com/qdesrame/openapi/diff/output/HtmlRender.java +++ b/src/main/java/com/qdesrame/openapi/diff/output/HtmlRender.java @@ -125,7 +125,7 @@ private ContainerTag ol_changed(List changedOperations) { ul_detail.with(li().with(h3("Parameters")).with(ul_param(changedOperation.getChangedParameters()))); } if (changedOperation.isDiffRequest()) { - ul_detail.with(li().with(h3("Request")).with(ul_request(changedOperation.getRequestChangedContent()))); + ul_detail.with(li().with(h3("Request")).with(ul_request(changedOperation.getChangedRequestBody().getChangedContent()))); } else { } if (changedOperation.isDiffResponse()) { diff --git a/src/main/java/com/qdesrame/openapi/diff/output/MarkdownRender.java b/src/main/java/com/qdesrame/openapi/diff/output/MarkdownRender.java index be549795b..97982f473 100644 --- a/src/main/java/com/qdesrame/openapi/diff/output/MarkdownRender.java +++ b/src/main/java/com/qdesrame/openapi/diff/output/MarkdownRender.java @@ -103,7 +103,7 @@ private String ol_changed(List changedOperations) { } if (changedOperation.isDiffRequest()) { ul_detail.append(PRE_LI).append("Request") - .append(ul_request(changedOperation.getRequestChangedContent())); + .append(ul_request(changedOperation.getChangedRequestBody().getChangedContent())); } if (changedOperation.isDiffResponse()) { ul_detail.append(PRE_LI).append("Return Type")