From f876fd900bd938b0ab420b827a46d26391ce8190 Mon Sep 17 00:00:00 2001 From: bnasslah Date: Wed, 6 Apr 2022 22:09:30 +0200 Subject: [PATCH] Add title property to GroupedOpenApi class for displaying a Human readable group name. Fixes #1596. --- .../AbstractSwaggerUiConfigProperties.java | 32 +++++++++++++++---- .../org/springdoc/core/GroupedOpenApi.java | 32 +++++++++++++++++++ .../core/SpringDocConfigProperties.java | 28 +++++++++++++++- .../core/SwaggerUiConfigParameters.java | 4 +-- .../core/SwaggerUiConfigProperties.java | 2 +- .../springdoc/ui/AbstractSwaggerWelcome.java | 2 +- .../springdoc/ui/app4/SpringDocApp4Test.java | 2 +- .../springdoc/ui/app4/SpringDocTestApp.java | 5 +-- .../webflux/api/MultipleOpenApiResource.java | 2 +- .../webmvc/api/MultipleOpenApiResource.java | 8 ++--- 10 files changed, 95 insertions(+), 22 deletions(-) diff --git a/springdoc-openapi-common/src/main/java/org/springdoc/core/AbstractSwaggerUiConfigProperties.java b/springdoc-openapi-common/src/main/java/org/springdoc/core/AbstractSwaggerUiConfigProperties.java index d6c6245e3..5d4390048 100644 --- a/springdoc-openapi-common/src/main/java/org/springdoc/core/AbstractSwaggerUiConfigProperties.java +++ b/springdoc-openapi-common/src/main/java/org/springdoc/core/AbstractSwaggerUiConfigProperties.java @@ -24,7 +24,9 @@ import java.util.Objects; import java.util.Set; +import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonProperty; +import org.apache.commons.lang3.StringUtils; import static org.springdoc.core.Constants.GROUP_NAME_NOT_NULL; @@ -672,9 +674,15 @@ public static class SwaggerUrl { /** * The Name. */ - @JsonProperty("name") + @JsonIgnore private String name; + /** + * The Display name. + */ + @JsonProperty("name") + private String displayName; + /** * Instantiates a new Swagger url. */ @@ -686,21 +694,31 @@ public SwaggerUrl() { * * @param group the group * @param url the url + * @param displayName the display name */ - public SwaggerUrl(String group, String url) { + public SwaggerUrl(String group, String url, String displayName) { Objects.requireNonNull(group, GROUP_NAME_NOT_NULL); this.url = url; this.name = group; + this.displayName = StringUtils.defaultIfEmpty(displayName, this.name); } /** - * Instantiates a new Swagger url. + * Gets display name. * - * @param group the group + * @return the display name */ - public SwaggerUrl(String group) { - Objects.requireNonNull(group, GROUP_NAME_NOT_NULL); - this.name = group; + public String getDisplayName() { + return displayName; + } + + /** + * Sets display name. + * + * @param displayName the display name + */ + public void setDisplayName(String displayName) { + this.displayName = displayName; } /** diff --git a/springdoc-openapi-common/src/main/java/org/springdoc/core/GroupedOpenApi.java b/springdoc-openapi-common/src/main/java/org/springdoc/core/GroupedOpenApi.java index c6b9afad0..d707bcecd 100644 --- a/springdoc-openapi-common/src/main/java/org/springdoc/core/GroupedOpenApi.java +++ b/springdoc-openapi-common/src/main/java/org/springdoc/core/GroupedOpenApi.java @@ -25,6 +25,7 @@ import java.util.List; import java.util.Objects; +import org.apache.commons.lang3.StringUtils; import org.springdoc.core.customizers.OpenApiCustomiser; import org.springdoc.core.customizers.OperationCustomizer; import org.springdoc.core.filters.OpenApiMethodFilter; @@ -94,6 +95,11 @@ public class GroupedOpenApi { */ private final List openApiMethodFilters; + /** + * The Display name. + */ + private final String displayName; + /** * Instantiates a new Grouped open api. * @@ -108,6 +114,7 @@ private GroupedOpenApi(Builder builder) { this.headersToMatch = builder.headersToMatch; this.packagesToExclude = builder.packagesToExclude; this.pathsToExclude = builder.pathsToExclude; + this.displayName = StringUtils.defaultIfEmpty(builder.displayName, this.group); this.openApiCustomisers = Objects.requireNonNull(builder.openApiCustomisers); this.operationCustomizers = Objects.requireNonNull(builder.operationCustomizers); this.openApiMethodFilters = Objects.requireNonNull(builder.methodFilters); @@ -232,6 +239,15 @@ public List getOpenApiMethodFilters() { return openApiMethodFilters; } + /** + * Gets display name. + * + * @return the display name + */ + public String getDisplayName() { + return displayName; + } + /** * The type Builder. * @author bnasslahsen @@ -292,6 +308,11 @@ public static class Builder { */ private List consumesToMatch; + /** + * The Display name. + */ + private String displayName; + /** * Instantiates a new Builder. */ @@ -420,6 +441,17 @@ public Builder addOpenApiMethodFilter(OpenApiMethodFilter methodFilter) { return this; } + /** + * Display name builder. + * + * @param displayName the display name + * @return the builder + */ + public Builder displayName(String displayName) { + this.displayName = displayName; + return this; + } + /** * Build grouped open api. * diff --git a/springdoc-openapi-common/src/main/java/org/springdoc/core/SpringDocConfigProperties.java b/springdoc-openapi-common/src/main/java/org/springdoc/core/SpringDocConfigProperties.java index d3532e1d7..d7f6948ce 100644 --- a/springdoc-openapi-common/src/main/java/org/springdoc/core/SpringDocConfigProperties.java +++ b/springdoc-openapi-common/src/main/java/org/springdoc/core/SpringDocConfigProperties.java @@ -1081,6 +1081,11 @@ public static class GroupConfig { */ private List consumesToMatch; + /** + * The Display name. + */ + private String displayName; + /** * Instantiates a new Group config. */ @@ -1098,10 +1103,12 @@ public GroupConfig() { * @param producesToMatch the produces to match * @param consumesToMatch the consumes to match * @param headersToMatch the headers to match + * @param displayName the display name */ public GroupConfig(String group, List pathsToMatch, List packagesToScan, List packagesToExclude, List pathsToExclude, - List producesToMatch,List consumesToMatch,List headersToMatch) { + List producesToMatch, List consumesToMatch, List headersToMatch, + String displayName) { this.pathsToMatch = pathsToMatch; this.pathsToExclude = pathsToExclude; this.packagesToExclude = packagesToExclude; @@ -1110,6 +1117,7 @@ public GroupConfig(String group, List pathsToMatch, List package this.producesToMatch = producesToMatch; this.consumesToMatch = consumesToMatch; this.headersToMatch = headersToMatch; + this.displayName = displayName; } /** @@ -1255,5 +1263,23 @@ public List getProducesToMatch() { public void setProducesToMatch(List producesToMatch) { this.producesToMatch = producesToMatch; } + + /** + * Gets display name. + * + * @return the display name + */ + public String getDisplayName() { + return displayName; + } + + /** + * Sets display name. + * + * @param displayName the display name + */ + public void setDisplayName(String displayName) { + this.displayName = displayName; + } } } diff --git a/springdoc-openapi-common/src/main/java/org/springdoc/core/SwaggerUiConfigParameters.java b/springdoc-openapi-common/src/main/java/org/springdoc/core/SwaggerUiConfigParameters.java index 0b63203c7..82c545fb8 100644 --- a/springdoc-openapi-common/src/main/java/org/springdoc/core/SwaggerUiConfigParameters.java +++ b/springdoc-openapi-common/src/main/java/org/springdoc/core/SwaggerUiConfigParameters.java @@ -183,8 +183,8 @@ public SwaggerUiConfigParameters(SwaggerUiConfigProperties swaggerUiConfig) { * * @param group the group */ - public void addGroup(String group) { - SwaggerUrl swaggerUrl = new SwaggerUrl(group); + public void addGroup(String group, String displayName) { + SwaggerUrl swaggerUrl = new SwaggerUrl(group, null, displayName); urls.add(swaggerUrl); } diff --git a/springdoc-openapi-common/src/main/java/org/springdoc/core/SwaggerUiConfigProperties.java b/springdoc-openapi-common/src/main/java/org/springdoc/core/SwaggerUiConfigProperties.java index bd91a92b5..58c88255a 100644 --- a/springdoc-openapi-common/src/main/java/org/springdoc/core/SwaggerUiConfigProperties.java +++ b/springdoc-openapi-common/src/main/java/org/springdoc/core/SwaggerUiConfigProperties.java @@ -428,7 +428,7 @@ public void setSyntaxHighlight(SyntaxHighlight syntaxHighlight) { * @return the set */ public Set cloneUrls(){ - return this.urls.stream().map(swaggerUrl -> new SwaggerUrl(swaggerUrl.getName(), swaggerUrl.getUrl())).collect(Collectors.toSet()); + return this.urls.stream().map(swaggerUrl -> new SwaggerUrl(swaggerUrl.getName(), swaggerUrl.getUrl(), swaggerUrl.getDisplayName())).collect(Collectors.toSet()); } } \ No newline at end of file diff --git a/springdoc-openapi-common/src/main/java/org/springdoc/ui/AbstractSwaggerWelcome.java b/springdoc-openapi-common/src/main/java/org/springdoc/ui/AbstractSwaggerWelcome.java index 2088eceff..483ad8a6b 100644 --- a/springdoc-openapi-common/src/main/java/org/springdoc/ui/AbstractSwaggerWelcome.java +++ b/springdoc-openapi-common/src/main/java/org/springdoc/ui/AbstractSwaggerWelcome.java @@ -86,7 +86,7 @@ public AbstractSwaggerWelcome(SwaggerUiConfigProperties swaggerUiConfig, SpringD } protected void init() { - springDocConfigProperties.getGroupConfigs().forEach(groupConfig -> swaggerUiConfigParameters.addGroup(groupConfig.getGroup())); + springDocConfigProperties.getGroupConfigs().forEach(groupConfig -> swaggerUiConfigParameters.addGroup(groupConfig.getGroup(), groupConfig.getDisplayName())); calculateUiRootPath(); } diff --git a/springdoc-openapi-ui/src/test/java/test/org/springdoc/ui/app4/SpringDocApp4Test.java b/springdoc-openapi-ui/src/test/java/test/org/springdoc/ui/app4/SpringDocApp4Test.java index d78912b64..1d809ef9f 100644 --- a/springdoc-openapi-ui/src/test/java/test/org/springdoc/ui/app4/SpringDocApp4Test.java +++ b/springdoc-openapi-ui/src/test/java/test/org/springdoc/ui/app4/SpringDocApp4Test.java @@ -40,7 +40,7 @@ public void swagger_config_for_multiple_groups() throws Exception { .andExpect(jsonPath("urls[0].url", equalTo("/v3/api-docs/stores"))) .andExpect(jsonPath("urls[0].name", equalTo("stores"))) .andExpect(jsonPath("urls[1].url", equalTo("/v3/api-docs/pets"))) - .andExpect(jsonPath("urls[1].name", equalTo("pets"))) + .andExpect(jsonPath("urls[1].name", equalTo("The pets"))) .andExpect(jsonPath("$['urls.primaryName']", equalTo("pets"))); } } \ No newline at end of file diff --git a/springdoc-openapi-ui/src/test/java/test/org/springdoc/ui/app4/SpringDocTestApp.java b/springdoc-openapi-ui/src/test/java/test/org/springdoc/ui/app4/SpringDocTestApp.java index 9ee1624b3..e8cbc5cdf 100644 --- a/springdoc-openapi-ui/src/test/java/test/org/springdoc/ui/app4/SpringDocTestApp.java +++ b/springdoc-openapi-ui/src/test/java/test/org/springdoc/ui/app4/SpringDocTestApp.java @@ -20,16 +20,12 @@ import org.springdoc.core.GroupedOpenApi; -import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.context.annotation.Bean; @SpringBootApplication public class SpringDocTestApp { - public static void main(String[] args) { - SpringApplication.run(SpringDocTestApp.class, args); - } @Bean public GroupedOpenApi storeOpenApi() { @@ -45,6 +41,7 @@ public GroupedOpenApi groupOpenApi() { String paths[] = { "/pet/**" }; return GroupedOpenApi.builder() .group("pets") + .displayName("The pets") .pathsToMatch(paths) .build(); } diff --git a/springdoc-openapi-webflux-core/src/main/java/org/springdoc/webflux/api/MultipleOpenApiResource.java b/springdoc-openapi-webflux-core/src/main/java/org/springdoc/webflux/api/MultipleOpenApiResource.java index 18ae85ab3..52c5af835 100644 --- a/springdoc-openapi-webflux-core/src/main/java/org/springdoc/webflux/api/MultipleOpenApiResource.java +++ b/springdoc-openapi-webflux-core/src/main/java/org/springdoc/webflux/api/MultipleOpenApiResource.java @@ -130,7 +130,7 @@ public void afterPropertiesSet() { this.groupedOpenApiResources = groupedOpenApis.stream() .collect(Collectors.toMap(GroupedOpenApi::getGroup, item -> { - GroupConfig groupConfig = new GroupConfig(item.getGroup(), item.getPathsToMatch(), item.getPackagesToScan(), item.getPackagesToExclude(), item.getPathsToExclude(), item.getProducesToMatch(), item.getConsumesToMatch(),item.getHeadersToMatch()); + GroupConfig groupConfig = new GroupConfig(item.getGroup(), item.getPathsToMatch(), item.getPackagesToScan(), item.getPackagesToExclude(), item.getPathsToExclude(), item.getProducesToMatch(), item.getConsumesToMatch(), item.getHeadersToMatch(),item.getDisplayName()); springDocConfigProperties.addGroupConfig(groupConfig); return buildWebFluxOpenApiResource(item); } diff --git a/springdoc-openapi-webmvc-core/src/main/java/org/springdoc/webmvc/api/MultipleOpenApiResource.java b/springdoc-openapi-webmvc-core/src/main/java/org/springdoc/webmvc/api/MultipleOpenApiResource.java index 505ae5efb..dda08001e 100644 --- a/springdoc-openapi-webmvc-core/src/main/java/org/springdoc/webmvc/api/MultipleOpenApiResource.java +++ b/springdoc-openapi-webmvc-core/src/main/java/org/springdoc/webmvc/api/MultipleOpenApiResource.java @@ -121,7 +121,7 @@ public MultipleOpenApiResource(List groupedOpenApis, } @Override - public void afterPropertiesSet() { + public void afterPropertiesSet() { if (springDocConfigProperties.getApiDocs().isResolveSchemaProperties()) { OpenApiCustomiser propertiesResolverForSchemaCustomizer = (OpenApiCustomiser) applicationContext.getBean("propertiesResolverForSchema"); this.groupedOpenApis.forEach(groupedOpenApi -> groupedOpenApi.addOpenApiCustomizer(propertiesResolverForSchemaCustomizer)); @@ -129,7 +129,7 @@ public void afterPropertiesSet() { this.groupedOpenApiResources = groupedOpenApis.stream() .collect(Collectors.toMap(GroupedOpenApi::getGroup, item -> { - GroupConfig groupConfig = new GroupConfig(item.getGroup(), item.getPathsToMatch(), item.getPackagesToScan(), item.getPackagesToExclude(), item.getPathsToExclude(), item.getProducesToMatch(), item.getConsumesToMatch(), item.getHeadersToMatch()); + GroupConfig groupConfig = new GroupConfig(item.getGroup(), item.getPathsToMatch(), item.getPackagesToScan(), item.getPackagesToExclude(), item.getPathsToExclude(), item.getProducesToMatch(), item.getConsumesToMatch(), item.getHeadersToMatch(), item.getDisplayName()); springDocConfigProperties.addGroupConfig(groupConfig); return buildWebMvcOpenApiResource(item); } @@ -152,7 +152,7 @@ private OpenApiResource buildWebMvcOpenApiResource(GroupedOpenApi item) { Optional.of(item.getOperationCustomizers()), Optional.of(item.getOpenApiCustomisers()), Optional.of(item.getOpenApiMethodFilters()), - springDocConfigProperties,springDocProviders + springDocConfigProperties, springDocProviders ); else @@ -164,7 +164,7 @@ private OpenApiResource buildWebMvcOpenApiResource(GroupedOpenApi item) { Optional.of(item.getOperationCustomizers()), Optional.of(item.getOpenApiCustomisers()), Optional.of(item.getOpenApiMethodFilters()), - springDocConfigProperties,springDocProviders + springDocConfigProperties, springDocProviders ); }