diff --git a/springwolf-core/src/main/java/io/github/stavshamir/springwolf/configuration/DefaultAsyncApiDocketService.java b/springwolf-core/src/main/java/io/github/stavshamir/springwolf/configuration/DefaultAsyncApiDocketService.java index 5d096ddbe..a66671935 100644 --- a/springwolf-core/src/main/java/io/github/stavshamir/springwolf/configuration/DefaultAsyncApiDocketService.java +++ b/springwolf-core/src/main/java/io/github/stavshamir/springwolf/configuration/DefaultAsyncApiDocketService.java @@ -25,18 +25,27 @@ public class DefaultAsyncApiDocketService implements AsyncApiDocketService { */ private final SpringwolfConfigProperties configProperties; + /** + * valid Docket instance, either reference to customDocket (if set) or environment based Docket. + * Lazy initialized on first invocation of getAsyncApiDocket(). + */ + private AsyncApiDocket effectiveDocket; + @Override public AsyncApiDocket getAsyncApiDocket() { - if (customDocket.isPresent()) { - log.debug("Reading springwolf configuration from custom defined @Bean AsyncApiDocket"); - return customDocket.get(); - } else { - log.debug("Reading springwolf configuration from application.properties files"); - return parseApplicationConfigProperties(configProperties); + if (effectiveDocket == null) { + if (customDocket.isPresent()) { + log.debug("Reading springwolf configuration from custom defined @Bean AsyncApiDocket"); + effectiveDocket = customDocket.get(); + } else { + log.debug("Reading springwolf configuration from application.properties files"); + effectiveDocket = parseApplicationConfigProperties(); + } } + return effectiveDocket; } - private AsyncApiDocket parseApplicationConfigProperties(SpringwolfConfigProperties configProperties) { + private AsyncApiDocket parseApplicationConfigProperties() { if (configProperties.getDocket() == null || configProperties.getDocket().getBasePackage() == null) { throw new IllegalArgumentException( "One or more required fields (docket, basePackage) " + "in application.properties with path prefix " diff --git a/springwolf-core/src/test/java/io/github/stavshamir/springwolf/configuration/DefaultAsyncApiDocketServiceTest.java b/springwolf-core/src/test/java/io/github/stavshamir/springwolf/configuration/DefaultAsyncApiDocketServiceTest.java index c4a14f312..30ce85e45 100644 --- a/springwolf-core/src/test/java/io/github/stavshamir/springwolf/configuration/DefaultAsyncApiDocketServiceTest.java +++ b/springwolf-core/src/test/java/io/github/stavshamir/springwolf/configuration/DefaultAsyncApiDocketServiceTest.java @@ -17,7 +17,7 @@ class DefaultAsyncApiDocketServiceTest { @Test - void testConfigurationShouldMapAllPropertiesToTheDocket() { + void testServiceShouldMapAllPropertiesToTheDocket() { // given ConfigDocket configDocket = new ConfigDocket(); configDocket.setBasePackage("test-base-package"); @@ -40,9 +40,8 @@ void testConfigurationShouldMapAllPropertiesToTheDocket() { properties.setDocket(configDocket); // when - DefaultAsyncApiDocketService docketConfiguration = - new DefaultAsyncApiDocketService(Optional.empty(), properties); - AsyncApiDocket asyncApiDocket = docketConfiguration.getAsyncApiDocket(); + DefaultAsyncApiDocketService docketService = new DefaultAsyncApiDocketService(Optional.empty(), properties); + AsyncApiDocket asyncApiDocket = docketService.getAsyncApiDocket(); // then assertThat(asyncApiDocket.getDefaultContentType()).isEqualTo(configDocket.getDefaultContentType()); @@ -53,4 +52,61 @@ void testConfigurationShouldMapAllPropertiesToTheDocket() { assertThat(asyncApiDocket.getInfo().getLicense()).isEqualTo(info.getLicense()); assertThat(asyncApiDocket.getInfo().getContact()).isEqualTo(info.getContact()); } + + @Test + void docketServiceShouldDeliverCachedConfigDocketBean() { + // repeatable invocations of AsyncApiDocketService.getAsyncApiDocket() should return the same docket instance + // if a ConfigDocket @Bean is present. + + // given + AsyncApiDocket customDocket = AsyncApiDocket.builder() + .basePackage("test-base-package") + .info(com.asyncapi.v2._6_0.model.info.Info.builder() + .title("some-title") + .version("some-version") + .build()) + .build(); + + SpringwolfConfigProperties configProperties = new SpringwolfConfigProperties(); + + // when + AsyncApiDocketService docketService = + new DefaultAsyncApiDocketService(Optional.of(customDocket), configProperties); + + // then + assertThat(docketService.getAsyncApiDocket()).isSameAs(customDocket); + // second invocation should again return same instance + assertThat(docketService.getAsyncApiDocket()).isSameAs(customDocket); + } + + @Test + void docketServiceShouldDeliverCachedEnvironmentBasedDocket() { + // repeatable invocations of AsyncApiDocketService.getAsyncApiDocket() should return the same docket instance + // if docket is based on environment properties. + + // given + ConfigDocket configDocket = new ConfigDocket(); + configDocket.setBasePackage("test-base-package"); + configDocket.setDefaultContentType("application/json"); + + Info info = new Info(); + info.setTitle("some-title"); + info.setVersion("some-version"); + configDocket.setInfo(info); + + Server server = + Server.builder().protocol("some-protocol").url("some-url").build(); + configDocket.setServers(newHashMap("some-protocol", server)); + + SpringwolfConfigProperties configProperties = new SpringwolfConfigProperties(); + configProperties.setDocket(configDocket); + + // when + AsyncApiDocketService docketService = new DefaultAsyncApiDocketService(Optional.empty(), configProperties); + AsyncApiDocket asyncApiDocket = docketService.getAsyncApiDocket(); + + // then + // second invocation should again return same instance + assertThat(docketService.getAsyncApiDocket()).isSameAs(asyncApiDocket); + } }