diff --git a/core/src/main/java/com/linecorp/armeria/server/docs/DocService.java b/core/src/main/java/com/linecorp/armeria/server/docs/DocService.java index a6d2ee14955..7101cfe7401 100644 --- a/core/src/main/java/com/linecorp/armeria/server/docs/DocService.java +++ b/core/src/main/java/com/linecorp/armeria/server/docs/DocService.java @@ -64,7 +64,6 @@ import com.linecorp.armeria.server.HttpService; import com.linecorp.armeria.server.Server; import com.linecorp.armeria.server.ServerConfig; -import com.linecorp.armeria.server.ServerListenerAdapter; import com.linecorp.armeria.server.Service; import com.linecorp.armeria.server.ServiceConfig; import com.linecorp.armeria.server.ServiceRequestContext; @@ -189,23 +188,18 @@ public void serviceAdded(ServiceConfig cfg) throws Exception { server = cfg.server(); // Build the Specification after all the services are added to the server. - server.addListener(new ServerListenerAdapter() { - @Override - public void serverStarting(Server server) throws Exception { - final ServerConfig config = server.config(); - final List virtualHosts = config.findVirtualHosts(DocService.this); - - final List services = - config.serviceConfigs().stream() - .filter(se -> virtualHosts.contains(se.virtualHost())) - .collect(toImmutableList()); - final ExecutorService executorService = Executors.newSingleThreadExecutor( - ThreadFactories.newThreadFactory("docservice-loader", true)); - vfs().specificationLoader.updateServices(services, executorService).handle((res, e) -> { - executorService.shutdown(); - return null; - }); - } + final ServerConfig config = server.config(); + final List virtualHosts = config.findVirtualHosts(this); + + final List services = + config.serviceConfigs().stream() + .filter(se -> virtualHosts.contains(se.virtualHost())) + .collect(toImmutableList()); + final ExecutorService executorService = Executors.newSingleThreadExecutor( + ThreadFactories.newThreadFactory("docservice-loader", true)); + vfs().specificationLoader.updateServices(services, executorService).handle((res, e) -> { + executorService.shutdown(); + return null; }); } diff --git a/core/src/test/java/com/linecorp/armeria/server/docs/DocServiceReconfigureTest.java b/core/src/test/java/com/linecorp/armeria/server/docs/DocServiceReconfigureTest.java new file mode 100644 index 00000000000..ac67a49091a --- /dev/null +++ b/core/src/test/java/com/linecorp/armeria/server/docs/DocServiceReconfigureTest.java @@ -0,0 +1,64 @@ +/* + * Copyright 2022 LINE Corporation + * + * LINE Corporation licenses this file to you under the Apache License, + * version 2.0 (the "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at: + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ + +package com.linecorp.armeria.server.docs; + +import static net.javacrumbs.jsonunit.fluent.JsonFluentAssert.assertThatJson; + +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.RegisterExtension; + +import com.linecorp.armeria.server.ServerBuilder; +import com.linecorp.armeria.server.annotation.Get; +import com.linecorp.armeria.testing.junit5.server.ServerExtension; + +class DocServiceReconfigureTest { + + @RegisterExtension + static ServerExtension server = new ServerExtension() { + @Override + protected void configure(ServerBuilder sb) throws Exception { + sb.annotatedService("/service", new Object() { + @Get("/before") + public void before() { + } + }); + sb.serviceUnder("/docs", DocService.builder().build()); + } + }; + + @Test + void testReconfigure() { + String specification = server.blockingWebClient().get("/docs/specification.json").contentUtf8(); + assertThatJson(specification).node("services").isArray().ofLength(1); + assertThatJson(specification).node("services[0].methods").isArray().ofLength(1); + assertThatJson(specification).node("services[0].methods[0].name").isEqualTo("before"); + + server.server().reconfigure(sb -> { + sb.annotatedService("/service", new Object() { + @Get("/after") + public void after() { + } + }); + sb.serviceUnder("/docs", DocService.builder().build()); + }); + + specification = server.blockingWebClient().get("/docs/specification.json").contentUtf8(); + assertThatJson(specification).node("services").isArray().ofLength(1); + assertThatJson(specification).node("services[0].methods").isArray().ofLength(1); + assertThatJson(specification).node("services[0].methods[0].name").isEqualTo("after"); + } +}