Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -53,16 +53,15 @@ public OpenAPI filter(OpenAPI openAPI, OpenAPISpecFilter filter, Map<String, Lis
clone.setServers(filteredOpenAPI.getServers());
clone.tags(filteredOpenAPI.getTags() == null ? null : new ArrayList<>(openAPI.getTags()));

final Set<String> allowedTags = new HashSet<>();
final Set<String> filteredTags = new HashSet<>();
final TagFilter tagFilter = new TagFilter();

Paths clonedPaths = new Paths();
if (filteredOpenAPI.getPaths() != null) {
for (String resourcePath : filteredOpenAPI.getPaths().keySet()) {
PathItem pathItem = filteredOpenAPI.getPaths().get(resourcePath);

PathItem filteredPathItem = filterPathItem(filter, pathItem, resourcePath, params, cookies, headers);
PathItem clonedPathItem = cloneFilteredPathItem(filter,filteredPathItem, resourcePath, params, cookies, headers, allowedTags, filteredTags);
PathItem clonedPathItem = cloneFilteredPathItem(filter, filteredPathItem, resourcePath, params, cookies, headers, tagFilter);

if (clonedPathItem != null) {
if (!clonedPathItem.readOperations().isEmpty()) {
Expand All @@ -73,22 +72,14 @@ public OpenAPI filter(OpenAPI openAPI, OpenAPISpecFilter filter, Map<String, Lis
clone.paths(clonedPaths);
}

filteredTags.removeAll(allowedTags);

final List<Tag> tags = clone.getTags();
if (tags != null && !filteredTags.isEmpty()) {
tags.removeIf(tag -> filteredTags.contains(tag.getName()));
if (clone.getTags().isEmpty()) {
clone.setTags(null);
}
}
filterTopLevelTags(clone, tagFilter);

if (filteredOpenAPI.getWebhooks() != null) {
for (String resourcePath : filteredOpenAPI.getWebhooks().keySet()) {
PathItem pathItem = filteredOpenAPI.getWebhooks().get(resourcePath);

PathItem filteredPathItem = filterPathItem(filter, pathItem, resourcePath, params, cookies, headers);
PathItem clonedPathItem = cloneFilteredPathItem(filter,filteredPathItem, resourcePath, params, cookies, headers, allowedTags, filteredTags);
PathItem clonedPathItem = cloneFilteredPathItem(filter, filteredPathItem, resourcePath, params, cookies, headers, tagFilter);

if (clonedPathItem != null) {
if (!clonedPathItem.readOperations().isEmpty()) {
Expand Down Expand Up @@ -271,7 +262,7 @@ protected Map<String, Schema> filterComponentsSchema(OpenAPISpecFilter filter, M
try {
// TODO solve this, and generally handle clone and passing references
Schema clonedModel;
if (filter.isOpenAPI31Filter()) {
if (filter.isOpenAPI31Filter()) {
clonedModel = Json31.mapper().readValue(Json31.pretty(definition), Schema.class);
} else {
clonedModel = Json.mapper().readValue(Json.pretty(definition), Schema.class);
Expand All @@ -282,10 +273,10 @@ protected Map<String, Schema> filterComponentsSchema(OpenAPISpecFilter filter, M
if (!clonedProperties.isEmpty()) {
clonedModel.setProperties(clonedProperties);
}
if(clonedModel.getPatternProperties() != null) {
if (clonedModel.getPatternProperties() != null) {
clonedModel.getPatternProperties().clear();
}
if(!clonedPatternProperties.isEmpty()) {
if (!clonedPatternProperties.isEmpty()) {
clonedModel.setPatternProperties(clonedPatternProperties);
}
clonedComponentsSchema.put(key, clonedModel);
Expand All @@ -307,7 +298,7 @@ private void addSchemaRef(Schema schema, Set<String> referencedDefinitions) {
return;
}
if (schema.getDiscriminator() != null && schema.getDiscriminator().getMapping() != null) {
for (Map.Entry<String, String> mapping: schema.getDiscriminator().getMapping().entrySet()) {
for (Map.Entry<String, String> mapping : schema.getDiscriminator().getMapping().entrySet()) {
referencedDefinitions.add(mapping.getValue());
}
}
Expand All @@ -320,7 +311,7 @@ private void addSchemaRef(Schema schema, Set<String> referencedDefinitions) {
}

if (schema.getAdditionalProperties() instanceof Schema) {
addSchemaRef((Schema)schema.getAdditionalProperties(), referencedDefinitions);
addSchemaRef((Schema) schema.getAdditionalProperties(), referencedDefinitions);
}

if (schema.getPatternProperties() != null) {
Expand All @@ -334,8 +325,7 @@ private void addSchemaRef(Schema schema, Set<String> referencedDefinitions) {
addSchemaRef(schema.getPropertyNames(), referencedDefinitions);
}

if (schema instanceof ArraySchema &&
((ArraySchema) schema).getItems() != null) {
if (schema instanceof ArraySchema && ((ArraySchema) schema).getItems() != null) {
addSchemaRef(((ArraySchema) schema).getItems(), referencedDefinitions);
} else if (schema.getTypes() != null && schema.getTypes().contains("array") && schema.getItems() != null) {
addSchemaRef(schema.getItems(), referencedDefinitions);
Expand Down Expand Up @@ -413,7 +403,7 @@ private void addApiResponseSchemaRef(ApiResponse response, Set<String> reference
}

private void addRequestBodySchemaRef(RequestBody requestBody, Set<String> referencedDefinitions) {
addContentSchemaRef(requestBody.getContent(), referencedDefinitions);
addContentSchemaRef(requestBody.getContent(), referencedDefinitions);
}

private void addParameterSchemaRef(Parameter parameter, Set<String> referencedDefinitions) {
Expand All @@ -426,46 +416,46 @@ private void addHeaderSchemaRef(Header header, Set<String> referencedDefinitions
addContentSchemaRef(header.getContent(), referencedDefinitions);
}

private void addCallbackSchemaRef(Callback callback, Set<String> referencedDefinitions){
private void addCallbackSchemaRef(Callback callback, Set<String> referencedDefinitions) {
for (PathItem callbackPathItem : callback.values()) {
addPathItemSchemaRef(callbackPathItem, referencedDefinitions);
}
}

private void addComponentsSchemaRef(Components components, Set<String> referencedDefinitions){
private void addComponentsSchemaRef(Components components, Set<String> referencedDefinitions) {

if (components.getResponses() != null){
if (components.getResponses() != null) {
for (String resourcePath : components.getResponses().keySet()) {
ApiResponse apiResponse = components.getResponses().get(resourcePath);
addApiResponseSchemaRef(apiResponse, referencedDefinitions);
}
}
if (components.getRequestBodies() != null){
if (components.getRequestBodies() != null) {
for (String requestBody : components.getRequestBodies().keySet()) {
RequestBody requestBody1 = components.getRequestBodies().get(requestBody);
addRequestBodySchemaRef(requestBody1, referencedDefinitions);
}
}
if (components.getParameters() != null){
if (components.getParameters() != null) {
for (String parameter : components.getParameters().keySet()) {
Parameter resourceParam = components.getParameters().get(parameter);
addParameterSchemaRef(resourceParam, referencedDefinitions);
}
}
if (components.getHeaders() != null){
if (components.getHeaders() != null) {
for (String header : components.getHeaders().keySet()) {
Header resourceHeader = components.getHeaders().get(header);
addHeaderSchemaRef(resourceHeader, referencedDefinitions);
}
}
if (components.getCallbacks() != null){
for (String callback : components.getCallbacks().keySet()){
if (components.getCallbacks() != null) {
for (String callback : components.getCallbacks().keySet()) {
Callback resourceCallback = components.getCallbacks().get(callback);
addCallbackSchemaRef(resourceCallback, referencedDefinitions);
}
}
if (components.getPathItems() != null){
for (String resourcePath : components.getPathItems().keySet()){
if (components.getPathItems() != null) {
for (String resourcePath : components.getPathItems().keySet()) {
PathItem pathItem = components.getPathItems().get(resourcePath);
addPathItemSchemaRef(pathItem, referencedDefinitions);
}
Expand All @@ -484,13 +474,13 @@ protected OpenAPI removeBrokenReferenceDefinitions(OpenAPI openApi) {
addPathItemSchemaRef(pathItem, referencedDefinitions);
}
}
if (openApi.getWebhooks() != null){
if (openApi.getWebhooks() != null) {
for (String resourcePath : openApi.getWebhooks().keySet()) {
PathItem pathItem = openApi.getWebhooks().get(resourcePath);
addPathItemSchemaRef(pathItem, referencedDefinitions);
}
}
if (openApi.getComponents() != null){
if (openApi.getComponents() != null) {
Components components = openApi.getComponents();
addComponentsSchemaRef(components, referencedDefinitions);
}
Expand Down Expand Up @@ -530,7 +520,13 @@ protected void locateReferencedDefinitions(String ref, Set<String> nestedReferen
}
}

private PathItem cloneFilteredPathItem(OpenAPISpecFilter filter, PathItem filteredPathItem, String resourcePath, Map<String, List<String>> params, Map<String, String> cookies, Map<String, List<String>> headers, Set<String> allowedTags, Set<String> filteredTags) {
private PathItem cloneFilteredPathItem(OpenAPISpecFilter filter,
PathItem filteredPathItem,
String resourcePath,
Map<String, List<String>> params,
Map<String, String> cookies,
Map<String, List<String>> headers,
TagFilter tagFilter) {
if (filteredPathItem == null) {
return null;
}
Expand All @@ -556,15 +552,48 @@ private PathItem cloneFilteredPathItem(OpenAPISpecFilter filter, PathItem filter
op = filterOperation(filter, op, resourcePath, key.toString(), params, cookies, headers);
clonedPathItem.operation(key, op);
if (op == null) {
filteredTags.addAll(opTagsBeforeFilter);
tagFilter.getFilteredTags().addAll(opTagsBeforeFilter);
} else {
if (op.getTags() != null) {
opTagsBeforeFilter.removeAll(op.getTags());
allowedTags.addAll(op.getTags());
tagFilter.getAllowedTags().addAll(op.getTags());
}
filteredTags.addAll(opTagsBeforeFilter);
tagFilter.getFilteredTags().addAll(opTagsBeforeFilter);
}
}
return clonedPathItem;
}

/**
* Removes top level tags that are not used in any operation.
*
* @param openAPI the OpenAPI object to filter
* @param tagFilter the TagFilter object containing allowed and filtered tags
*/
private void filterTopLevelTags(OpenAPI openAPI, TagFilter tagFilter) {
tagFilter.getFilteredTags().removeAll(tagFilter.getAllowedTags());

final List<Tag> tags = openAPI.getTags();
if (tags != null && !tagFilter.getFilteredTags().isEmpty()) {
tags.removeIf(tag -> tagFilter.getFilteredTags().contains(tag.getName()));
if (openAPI.getTags().isEmpty()) {
openAPI.setTags(null);
}
}
}

private static class TagFilter {

public Set<String> getAllowedTags() {
return allowedTags;
}

public Set<String> getFilteredTags() {
return filteredTags;
}

private final Set<String> allowedTags = new HashSet<>();
private final Set<String> filteredTags = new HashSet<>();

}
}