diff --git a/microprofile/health/src/main/java/io/helidon/microprofile/health/HealthMpService.java b/microprofile/health/src/main/java/io/helidon/microprofile/health/HealthMpService.java index aaad966a600..d3414605b0d 100644 --- a/microprofile/health/src/main/java/io/helidon/microprofile/health/HealthMpService.java +++ b/microprofile/health/src/main/java/io/helidon/microprofile/health/HealthMpService.java @@ -17,7 +17,6 @@ package io.helidon.microprofile.health; import java.lang.annotation.Annotation; -import java.util.Optional; import java.util.ServiceLoader; import java.util.logging.Logger; @@ -26,6 +25,7 @@ import io.helidon.common.serviceloader.HelidonServiceLoader; import io.helidon.config.Config; import io.helidon.health.HealthSupport; +import io.helidon.microprofile.server.RoutingBuilders; import io.helidon.microprofile.server.spi.MpService; import io.helidon.microprofile.server.spi.MpServiceContext; @@ -94,22 +94,8 @@ public void configure(MpServiceContext mpServiceContext) { healthCheckProvider.readinessChecks().forEach(builder::addReadiness); }); - healthConfig.get("routing") - .asString() - .flatMap(routeName -> { - // support for overriding the routing back to default port using config - if ("@default".equals(routeName)) { - return Optional.empty(); - } else { - return Optional.of(routeName); - } - }) - // use named routing - .map(mpServiceContext::serverNamedRoutingBuilder) - // use default server routing - .orElseGet(mpServiceContext::serverRoutingBuilder) - // register health support + RoutingBuilders.create(mpServiceContext, healthConfig) + .routingBuilder() .register(builder.build()); - } } diff --git a/microprofile/metrics/src/main/java/io/helidon/microprofile/metrics/MetricsMpService.java b/microprofile/metrics/src/main/java/io/helidon/microprofile/metrics/MetricsMpService.java index 736a1c0f22e..3ce17a33317 100644 --- a/microprofile/metrics/src/main/java/io/helidon/microprofile/metrics/MetricsMpService.java +++ b/microprofile/metrics/src/main/java/io/helidon/microprofile/metrics/MetricsMpService.java @@ -21,12 +21,11 @@ import io.helidon.common.CollectionsHelper; import io.helidon.config.Config; -import io.helidon.config.ConfigValue; import io.helidon.metrics.MetricsSupport; import io.helidon.metrics.RegistryFactory; +import io.helidon.microprofile.server.RoutingBuilders; import io.helidon.microprofile.server.spi.MpService; import io.helidon.microprofile.server.spi.MpServiceContext; -import io.helidon.webserver.Routing; /** * Extension of microprofile {@link io.helidon.microprofile.server.Server} to enable support for metrics @@ -46,22 +45,12 @@ public void configure(MpServiceContext serviceContext) { MetricsSupport metricsSupport = MetricsSupport.create(metricsConfig); - ConfigValue routingNameConfig = metricsConfig.get("routing").asString(); - Routing.Builder defaultRouting = serviceContext.serverRoutingBuilder(); + RoutingBuilders routingBuilders = RoutingBuilders.create( + serviceContext, metricsConfig); - Routing.Builder endpointRouting = defaultRouting; - - if (routingNameConfig.isPresent()) { - String routingName = routingNameConfig.get(); - // support for overriding this back to default routing using config - if (!"@default".equals(routingName)) { - endpointRouting = serviceContext.serverNamedRoutingBuilder(routingName); - } - } - - metricsSupport.configureVendorMetrics(null, defaultRouting); + metricsSupport.configureVendorMetrics(null, routingBuilders.defaultRoutingBuilder()); vendorMetricsAdded.add("@default"); - metricsSupport.configureEndpoint(endpointRouting); + metricsSupport.configureEndpoint(routingBuilders.routingBuilder()); // now we may have additional sockets we want to add vendor metrics to metricsConfig.get("vendor-metrics-routings") diff --git a/microprofile/openapi/src/main/java/io/helidon/microprofile/openapi/OpenAPIMpService.java b/microprofile/openapi/src/main/java/io/helidon/microprofile/openapi/OpenAPIMpService.java index a70ed1aadd9..b02156fc46e 100644 --- a/microprofile/openapi/src/main/java/io/helidon/microprofile/openapi/OpenAPIMpService.java +++ b/microprofile/openapi/src/main/java/io/helidon/microprofile/openapi/OpenAPIMpService.java @@ -18,6 +18,7 @@ import java.io.IOException; +import io.helidon.microprofile.server.RoutingBuilders; import io.helidon.microprofile.server.spi.MpService; import io.helidon.microprofile.server.spi.MpServiceContext; import io.helidon.openapi.OpenAPISupport; @@ -44,6 +45,6 @@ public void configure(MpServiceContext context) { throw new RuntimeException(ex); } - openAPISupport.configureEndpoint(context.serverRoutingBuilder()); + openAPISupport.configureEndpoint(RoutingBuilders.create(context, "openapi").routingBuilder()); } } diff --git a/microprofile/server/src/main/java/io/helidon/microprofile/server/RoutingBuilders.java b/microprofile/server/src/main/java/io/helidon/microprofile/server/RoutingBuilders.java new file mode 100644 index 00000000000..b65705c0c7f --- /dev/null +++ b/microprofile/server/src/main/java/io/helidon/microprofile/server/RoutingBuilders.java @@ -0,0 +1,83 @@ +/* + * Copyright (c) 2019 Oracle and/or its affiliates. All rights reserved. + * + * Licensed 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 + * + * http://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 io.helidon.microprofile.server; + +import java.util.Optional; + +import io.helidon.config.Config; +import io.helidon.microprofile.server.spi.MpServiceContext; +import io.helidon.webserver.Routing; + +/** + * Provides {@link Routing.Builder} instances (for the default and the actual) + * for a Helidon MP service, based on configuration for the component (if any) + * and defaults otherwise. + */ +public interface RoutingBuilders { + + /** + * + * @return the default {@code Routing.Builder} for the component + */ + Routing.Builder defaultRoutingBuilder(); + + /** + * + * @return the actual {@code Routing.Builder} for the component; might be the default + */ + Routing.Builder routingBuilder(); + + /** + * Prepares the default and actual {@link Routing.Builder} instances based + * on the "routing" configuration for the specific component. + * + * @param context the {@code MpServiceContext} for the calling service + * @param componentName config key under which "routing" config might exist for the component of interest + * @return {@code RoutingBuilders} based on the named config (or default) + */ + static RoutingBuilders create(MpServiceContext context, String componentName) { + return create(context, context.helidonConfig().get(componentName)); + } + + /** + * Prepares the default and actual {@link Routing.Builder} instances based + * on the "routing" configuration for the specific component configuration. + * + * @param context the {@code MpServiceContext} for the calling service + * @param componentConfig the configuration for the calling service + * @return {@code RoutingBuilders} based on the config (or default) + */ + static RoutingBuilders create(MpServiceContext context, Config componentConfig) { + final Routing.Builder defaultRoutingBuilder = context.serverRoutingBuilder(); + final Routing.Builder actualRoutingBuilder + = componentConfig.get("routing") + .asString() + .flatMap(routeName -> { + // support for overriding the routing back to default port using config + if ("@default".equals(routeName)) { + return Optional.empty(); + } else { + return Optional.of(routeName); + } + }) + // use named routing + .map(context::serverNamedRoutingBuilder) + // use default server routing + .orElse(defaultRoutingBuilder); + return new RoutingBuildersImpl(defaultRoutingBuilder, actualRoutingBuilder); + } +} diff --git a/microprofile/server/src/main/java/io/helidon/microprofile/server/RoutingBuildersImpl.java b/microprofile/server/src/main/java/io/helidon/microprofile/server/RoutingBuildersImpl.java new file mode 100644 index 00000000000..0d48dc14bf9 --- /dev/null +++ b/microprofile/server/src/main/java/io/helidon/microprofile/server/RoutingBuildersImpl.java @@ -0,0 +1,43 @@ +/* + * Copyright (c) 2019 Oracle and/or its affiliates. All rights reserved. + * + * Licensed 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 + * + * http://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 io.helidon.microprofile.server; + +import io.helidon.webserver.Routing; + +/** + * Package-private implementation of the {@code RoutingBuilders} interface. + */ +class RoutingBuildersImpl implements RoutingBuilders { + + private final Routing.Builder defaultBuilder; + private final Routing.Builder effectiveBuilder; + + RoutingBuildersImpl(Routing.Builder defaultBuilder, Routing.Builder effectiveBuilder) { + this.defaultBuilder = defaultBuilder; + this.effectiveBuilder = effectiveBuilder; + } + + @Override + public Routing.Builder defaultRoutingBuilder() { + return defaultBuilder; + } + + @Override + public Routing.Builder routingBuilder() { + return effectiveBuilder; + } +}