For OSGi services lookup use only classes assignable from service class (#5051)
diff --git a/core-common/src/main/java/org/glassfish/jersey/internal/OsgiRegistry.java b/core-common/src/main/java/org/glassfish/jersey/internal/OsgiRegistry.java index ada9081..b95a070 100644 --- a/core-common/src/main/java/org/glassfish/jersey/internal/OsgiRegistry.java +++ b/core-common/src/main/java/org/glassfish/jersey/internal/OsgiRegistry.java
@@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, 2019 Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2022 Oracle and/or its affiliates. All rights reserved. * * This program and the accompanying materials are made available under the * terms of the Eclipse Public License v. 2.0, which is available at @@ -115,7 +115,7 @@ final ClassLoader loader, final boolean ignoreOnClassNotFound) { - final List<Class<?>> providerClasses = locateAllProviders(serviceName); + final List<Class<?>> providerClasses = locateAllProviders(serviceClass); if (!providerClasses.isEmpty()) { return new Iterator<T>() { @@ -153,7 +153,7 @@ @Override public <T> Iterator<Class<T>> createClassIterator( final Class<T> service, final String serviceName, final ClassLoader loader, final boolean ignoreOnClassNotFound) { - final List<Class<?>> providerClasses = locateAllProviders(serviceName); + final List<Class<?>> providerClasses = locateAllProviders(service); if (!providerClasses.isEmpty()) { return new Iterator<Class<T>>() { @@ -552,14 +552,22 @@ } } - private List<Class<?>> locateAllProviders(final String serviceName) { + private List<Class<?>> locateAllProviders(final Class<?> serviceClass) { lock.readLock().lock(); try { final List<Class<?>> result = new LinkedList<Class<?>>(); for (final Map<String, Callable<List<Class<?>>>> value : factories.values()) { - if (value.containsKey(serviceName)) { + if (value.containsKey(serviceClass.getName())) { try { - result.addAll(value.get(serviceName).call()); + for (final Class<?> clazz : value.get(serviceClass.getName()).call()) { + if (serviceClass.isAssignableFrom(clazz)) { + result.add(clazz); + } else if (LOGGER.isLoggable(Level.FINER)) { + LOGGER.log(Level.FINER, + "Ignoring provider class " + clazz.getName() + " because it is not assignable to " + + " service class " + serviceClass.getName()); + } + } } catch (final Exception ex) { // ignore }