From 5752712514deabcb8f089201aab06e86342d07f3 Mon Sep 17 00:00:00 2001 From: Tomas Langer Date: Fri, 31 Jan 2020 09:15:41 +0100 Subject: [PATCH] Use Helidon service loader. Signed-off-by: Tomas Langer --- .../serviceloader/HelidonServiceLoader.java | 30 ++++++++++++++----- .../java/io/helidon/config/BuilderImpl.java | 23 +++++++------- .../helidon/config/internal/ConfigUtils.java | 8 ++--- .../security/abac/policy/PolicyValidator.java | 6 ++-- .../policy/src/main/java/module-info.java | 3 +- .../security/providers/abac/AbacProvider.java | 6 ++-- .../abac/src/main/java/module-info.java | 3 +- .../java/io/helidon/security/Security.java | 7 +++-- .../security/src/main/java/module-info.java | 3 +- .../jersey/client/ClientTracingFilter.java | 5 ++-- .../src/main/java/module-info.java | 8 +++-- 11 files changed, 67 insertions(+), 35 deletions(-) diff --git a/common/service-loader/src/main/java/io/helidon/common/serviceloader/HelidonServiceLoader.java b/common/service-loader/src/main/java/io/helidon/common/serviceloader/HelidonServiceLoader.java index 49fc5f34c..8ea7a3b80 100644 --- a/common/service-loader/src/main/java/io/helidon/common/serviceloader/HelidonServiceLoader.java +++ b/common/service-loader/src/main/java/io/helidon/common/serviceloader/HelidonServiceLoader.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019 Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2019, 2020 Oracle and/or its affiliates. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -145,6 +145,7 @@ public final class HelidonServiceLoader implements Iterable { private boolean useSysPropExclude = true; private boolean useSystemServiceLoader = true; private boolean replaceImplementations = true; + private int defaultPriority = Prioritized.DEFAULT_PRIORITY; private Builder(ServiceLoader serviceLoader) { this.serviceLoader = serviceLoader; @@ -166,10 +167,10 @@ public final class HelidonServiceLoader implements Iterable { serviceLoader.forEach(service -> { if (replaceImplementations) { if (!uniqueImplementations.contains(service.getClass().getName())) { - services.add(new ServiceWithPriority<>(service)); + services.add(ServiceWithPriority.createFindPriority(service, defaultPriority)); } } else { - services.add(new ServiceWithPriority<>(service)); + services.add(ServiceWithPriority.createFindPriority(service, defaultPriority)); } }); } @@ -237,7 +238,7 @@ public final class HelidonServiceLoader implements Iterable { * @return updated builder instance */ public Builder addService(T service) { - this.customServices.add(new ServiceWithPriority<>(service)); + this.customServices.add(ServiceWithPriority.createFindPriority(service, defaultPriority)); return this; } @@ -249,7 +250,7 @@ public final class HelidonServiceLoader implements Iterable { * @return updated builder instance */ public Builder addService(T service, int priority) { - this.customServices.add(new ServiceWithPriority<>(service, priority)); + this.customServices.add(ServiceWithPriority.create(service, priority)); return this; } @@ -277,6 +278,17 @@ public final class HelidonServiceLoader implements Iterable { return this; } + /** + * Configure default priority for services that do not have any. + * + * @param defaultPriority default priority to use, defaults to {@link io.helidon.common.Prioritized#DEFAULT_PRIORITY} + * @return updated builder instance + */ + public Builder defaultPriority(int defaultPriority) { + this.defaultPriority = defaultPriority; + return this; + } + private boolean notExcluded(ServiceWithPriority service) { String className = service.instance.getClass().getName(); if (excludedServiceClasses.contains(className)) { @@ -335,8 +347,12 @@ public final class HelidonServiceLoader implements Iterable { } } - private ServiceWithPriority(T service) { - this(service, Priorities.find(service, Prioritized.DEFAULT_PRIORITY)); + private static ServiceWithPriority create(T instance, int priority) { + return new ServiceWithPriority<>(instance, priority); + } + + private static ServiceWithPriority createFindPriority(T instance, int defaultPriority) { + return new ServiceWithPriority<>(instance, Priorities.find(instance, defaultPriority)); } private int priority() { diff --git a/config/config/src/main/java/io/helidon/config/BuilderImpl.java b/config/config/src/main/java/io/helidon/config/BuilderImpl.java index b79900328..563a32960 100644 --- a/config/config/src/main/java/io/helidon/config/BuilderImpl.java +++ b/config/config/src/main/java/io/helidon/config/BuilderImpl.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2020 Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2020 Oracle and/or its affiliates. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -654,12 +654,17 @@ class BuilderImpl implements Config.Builder { } private static void loadMapperServices(List providers) { - ServiceLoader.load(ConfigMapperProvider.class) + HelidonServiceLoader.builder(ServiceLoader.load(ConfigMapperProvider.class)) + .defaultPriority(ConfigMapperProvider.PRIORITY) + .build() .forEach(providers::add); } private static List loadParserServices() { - return loadPrioritizedServices(ConfigParser.class, ConfigParser.PRIORITY); + return HelidonServiceLoader.builder(ServiceLoader.load(ConfigParser.class)) + .defaultPriority(ConfigParser.PRIORITY) + .build() + .asList(); } private void addAutoLoadedFilters() { @@ -680,17 +685,15 @@ class BuilderImpl implements Config.Builder { /* * Map each autoloaded ConfigFilter to a filter-providing function. */ - ConfigUtils.asStream(ServiceLoader.load(ConfigFilter.class).iterator()) + HelidonServiceLoader.builder(ServiceLoader.load(ConfigFilter.class)) + .defaultPriority(ConfigFilter.PRIORITY) + .build() + .asList() + .stream() .map(filter -> (Function) (Config t) -> filter) .forEach(this::addFilter); } - private static List loadPrioritizedServices(Class serviceClass, int priority) { - return ConfigUtils - .asPrioritizedStream(ServiceLoader.load(serviceClass), priority) - .collect(Collectors.toList()); - } - /** * {@link ConfigContext} implementation. */ diff --git a/config/config/src/main/java/io/helidon/config/internal/ConfigUtils.java b/config/config/src/main/java/io/helidon/config/internal/ConfigUtils.java index 7a8fa24d7..89ffc5df4 100644 --- a/config/config/src/main/java/io/helidon/config/internal/ConfigUtils.java +++ b/config/config/src/main/java/io/helidon/config/internal/ConfigUtils.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2019 Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2020 Oracle and/or its affiliates. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -60,7 +60,7 @@ public final class ConfigUtils { * @return stream of items. */ public static Stream asStream(Iterable items) { - return StreamSupport.stream(Spliterators.spliteratorUnknownSize(items.iterator(), Spliterator.ORDERED), false); + return asStream(items.iterator()); } /** @@ -70,8 +70,8 @@ public final class ConfigUtils { * @param iterator iterator over the items * @return stream of the items */ - public static Stream asStream(Iterator iterator) { - return asStream(() -> iterator); + public static Stream asStream(Iterator iterator) { + return StreamSupport.stream(Spliterators.spliteratorUnknownSize(iterator, Spliterator.ORDERED), false); } /** diff --git a/security/abac/policy/src/main/java/io/helidon/security/abac/policy/PolicyValidator.java b/security/abac/policy/src/main/java/io/helidon/security/abac/policy/PolicyValidator.java index ce1dd4b2b..ce791d2e9 100644 --- a/security/abac/policy/src/main/java/io/helidon/security/abac/policy/PolicyValidator.java +++ b/security/abac/policy/src/main/java/io/helidon/security/abac/policy/PolicyValidator.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, 2020 Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2018, 2020 Oracle and/or its affiliates. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -35,6 +35,7 @@ import java.util.logging.Logger; import io.helidon.common.Errors; import io.helidon.common.HelidonFeatures; +import io.helidon.common.serviceloader.HelidonServiceLoader; import io.helidon.config.Config; import io.helidon.security.EndpointConfig; import io.helidon.security.ProviderRequest; @@ -69,7 +70,8 @@ public final class PolicyValidator implements AbacValidator services = ServiceLoader.load(PolicyExecutorService.class); + HelidonServiceLoader services = + HelidonServiceLoader.create(ServiceLoader.load(PolicyExecutorService.class)); for (PolicyExecutorService service : services) { executors.add(service.instantiate(builder.config.get(service.configKey()))); diff --git a/security/abac/policy/src/main/java/module-info.java b/security/abac/policy/src/main/java/module-info.java index 91c969648..00511f961 100644 --- a/security/abac/policy/src/main/java/module-info.java +++ b/security/abac/policy/src/main/java/module-info.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, 2019 Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2018, 2020 Oracle and/or its affiliates. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -20,6 +20,7 @@ module io.helidon.security.abac.policy { requires io.helidon.security.providers.abac; requires java.logging; + requires io.helidon.common.serviceloader; exports io.helidon.security.abac.policy; exports io.helidon.security.abac.policy.spi; diff --git a/security/providers/abac/src/main/java/io/helidon/security/providers/abac/AbacProvider.java b/security/providers/abac/src/main/java/io/helidon/security/providers/abac/AbacProvider.java index c1749da19..2756c0543 100644 --- a/security/providers/abac/src/main/java/io/helidon/security/providers/abac/AbacProvider.java +++ b/security/providers/abac/src/main/java/io/helidon/security/providers/abac/AbacProvider.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, 2020 Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2018, 2020 Oracle and/or its affiliates. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -35,6 +35,7 @@ import javax.annotation.security.RolesAllowed; import io.helidon.common.Errors; import io.helidon.common.HelidonFeatures; +import io.helidon.common.serviceloader.HelidonServiceLoader; import io.helidon.config.Config; import io.helidon.security.AuthorizationResponse; import io.helidon.security.EndpointConfig; @@ -70,7 +71,8 @@ public final class AbacProvider extends SynchronousProvider implements Authoriza private final boolean failIfNoneValidated; private AbacProvider(Builder builder) { - ServiceLoader services = ServiceLoader.load(AbacValidatorService.class); + HelidonServiceLoader services = + HelidonServiceLoader.create(ServiceLoader.load(AbacValidatorService.class)); for (AbacValidatorService service : services) { validators.add(service.instantiate(builder.config.get(service.configKey()))); diff --git a/security/providers/abac/src/main/java/module-info.java b/security/providers/abac/src/main/java/module-info.java index 3e7e67cb1..c7596972e 100644 --- a/security/providers/abac/src/main/java/module-info.java +++ b/security/providers/abac/src/main/java/module-info.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, 2019 Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2018, 2020 Oracle and/or its affiliates. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -21,6 +21,7 @@ module io.helidon.security.providers.abac { requires transitive io.helidon.config; requires transitive io.helidon.common; requires transitive io.helidon.security; + requires io.helidon.common.serviceloader; exports io.helidon.security.providers.abac; exports io.helidon.security.providers.abac.spi; diff --git a/security/security/src/main/java/io/helidon/security/Security.java b/security/security/src/main/java/io/helidon/security/Security.java index 6f29b04e5..5fadbe5cf 100644 --- a/security/security/src/main/java/io/helidon/security/Security.java +++ b/security/security/src/main/java/io/helidon/security/Security.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, 2020 Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2018, 2020 Oracle and/or its affiliates. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -44,6 +44,7 @@ import java.util.stream.Collectors; import io.helidon.common.HelidonFeatures; import io.helidon.common.HelidonFlavor; import io.helidon.common.configurable.ThreadPoolSupplier; +import io.helidon.common.serviceloader.HelidonServiceLoader; import io.helidon.config.Config; import io.helidon.security.internal.SecurityAuditEvent; import io.helidon.security.spi.AuditProvider; @@ -1036,7 +1037,9 @@ public class Security { Map classNameToService) { Set configKeys = new HashSet<>(); - ServiceLoader loader = ServiceLoader.load(SecurityProviderService.class); + HelidonServiceLoader loader = + HelidonServiceLoader.create(ServiceLoader.load(SecurityProviderService.class)); + loader.forEach(service -> { String configKey = service.providerConfigKey(); if (null != configKey) { diff --git a/security/security/src/main/java/module-info.java b/security/security/src/main/java/module-info.java index 59ac3967d..65d86dd2b 100644 --- a/security/security/src/main/java/module-info.java +++ b/security/security/src/main/java/module-info.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2019 Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2020 Oracle and/or its affiliates. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -35,6 +35,7 @@ module io.helidon.security { requires io.helidon.security.util; requires io.helidon.common.context; requires io.opentracing.noop; + requires io.helidon.common.serviceloader; exports io.helidon.security; exports io.helidon.security.spi; diff --git a/tracing/jersey-client/src/main/java/io/helidon/tracing/jersey/client/ClientTracingFilter.java b/tracing/jersey-client/src/main/java/io/helidon/tracing/jersey/client/ClientTracingFilter.java index 0d76d992f..05037e1cc 100644 --- a/tracing/jersey-client/src/main/java/io/helidon/tracing/jersey/client/ClientTracingFilter.java +++ b/tracing/jersey-client/src/main/java/io/helidon/tracing/jersey/client/ClientTracingFilter.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, 2020 Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2018, 2020 Oracle and/or its affiliates. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -35,6 +35,7 @@ import javax.ws.rs.core.MultivaluedMap; import io.helidon.common.HelidonFeatures; import io.helidon.common.context.Contexts; +import io.helidon.common.serviceloader.HelidonServiceLoader; import io.helidon.tracing.config.SpanTracingConfig; import io.helidon.tracing.config.TracingConfigUtil; import io.helidon.tracing.jersey.client.internal.TracingContext; @@ -153,7 +154,7 @@ public class ClientTracingFilter implements ClientRequestFilter, ClientResponseF * Required by integrated platform. */ public ClientTracingFilter() { - Iterator iterator = ServiceLoader.load(TracerProvider.class) + Iterator iterator = HelidonServiceLoader.create(ServiceLoader.load(TracerProvider.class)) .iterator(); if (iterator.hasNext()) { diff --git a/tracing/jersey-client/src/main/java/module-info.java b/tracing/jersey-client/src/main/java/module-info.java index b80307658..364c59bef 100644 --- a/tracing/jersey-client/src/main/java/module-info.java +++ b/tracing/jersey-client/src/main/java/module-info.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2019 Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2020 Oracle and/or its affiliates. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -36,12 +36,14 @@ module io.helidon.tracing.jersey.client { requires io.helidon.common; requires io.helidon.common.context; requires io.helidon.webclient.jaxrs; + requires io.helidon.common.serviceloader; exports io.helidon.tracing.jersey.client; // needed to propagate tracing context from server to client - opens io.helidon.tracing.jersey.client.internal to io.helidon.tracing.jersey,io.helidon.microprofile.tracing; - exports io.helidon.tracing.jersey.client.internal; + exports io.helidon.tracing.jersey.client.internal to io.helidon.tracing.jersey,io.helidon.microprofile.tracing; + + uses io.helidon.tracing.spi.TracerProvider; provides AutoDiscoverable with io.helidon.tracing.jersey.client.ClientTracingAutoDiscoverable; }