This is an automated email from the ASF dual-hosted git repository. rmannibucau pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/aries-cdi.git
The following commit(s) were added to refs/heads/master by this push: new 7571fd1 [ARIES-2007] ensure duplicated extensions between serviceloader usage and requirements are properly solved by ignoring ServiceLoader one 7571fd1 is described below commit 7571fd15de349fb4b3ff0c752691552a17b2aab3 Author: Romain Manni-Bucau <rmannibu...@gmail.com> AuthorDate: Tue Sep 29 15:56:38 2020 +0200 [ARIES-2007] ensure duplicated extensions between serviceloader usage and requirements are properly solved by ignoring ServiceLoader one --- .../internal/container/ContainerBootstrap.java | 25 +++++++++++++++------- 1 file changed, 17 insertions(+), 8 deletions(-) diff --git a/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/ContainerBootstrap.java b/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/ContainerBootstrap.java index 4771a27..63e42e3 100644 --- a/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/ContainerBootstrap.java +++ b/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/ContainerBootstrap.java @@ -20,8 +20,10 @@ import static java.util.Optional.ofNullable; import static org.osgi.service.cdi.CDIConstants.CDI_EXTENSION_PROPERTY; import java.net.URL; +import java.util.Collection; import java.util.Collections; import java.util.Dictionary; +import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.ServiceLoader; @@ -191,12 +193,7 @@ public class ContainerBootstrap extends Phase { Constants.SERVICE_DESCRIPTION, "Aries CDI ServiceAdapterExtension")); // Add extensions found from the bundle's class loader, such as those in the Bundle-ClassPath - ServiceLoader.load(Extension.class, containerState.classLoader()).forEach(extension -> - initializer.addExtension( - extension, - Maps.of(Constants.SERVICE_ID, counter.decrementAndGet(), - Constants.SERVICE_DESCRIPTION, "ClassLoader Extension from " + containerState.bundle())) - ); + final Collection<Class<?>> serviceExtensions = new HashSet<>(); // Add external extensions for (ExtensionDTO extensionDTO : containerState.containerDTO().extensions) { @@ -204,8 +201,9 @@ public class ContainerBootstrap extends Phase { Dictionary<String,Object> properties = extendedExtensionDTO.extension.getServiceReference().getProperties(); - initializer.addExtension( - extendedExtensionDTO.extension.getService(), Maps.of(properties)); + final Extension service = extendedExtensionDTO.extension.getService(); + initializer.addExtension(service, Maps.of(properties)); + serviceExtensions.add(service.getClass()); Bundle extensionBundle = extendedExtensionDTO.extension.getServiceReference().getBundle(); @@ -215,6 +213,17 @@ public class ContainerBootstrap extends Phase { loader.getBundles().add(extensionBundle); } } + + ServiceLoader.load(Extension.class, containerState.classLoader()).forEach(extension -> { + // let ServiceLoader.load have duplicatesd fail (cdi spec) + // we just want to solve conflicts between ServiceLoader and OSGi extensions + if (!serviceExtensions.contains(extension.getClass())) { + initializer.addExtension( + extension, + Maps.of(Constants.SERVICE_ID, counter.decrementAndGet(), + Constants.SERVICE_DESCRIPTION, "ClassLoader Extension from " + containerState.bundle())); + } + }); } private void getClassesFromExtensionCapability(Dictionary<String,Object> properties, Bundle extensionBundle, CDIContainerInitializer initializer) {