Skip to content

Commit

Permalink
For OSGi services lookup use only classes assignable from service cla…
Browse files Browse the repository at this point in the history
…ss (#5051)
  • Loading branch information
mmeldo authored May 4, 2022
1 parent f5be6ee commit 8016b92
Showing 1 changed file with 14 additions and 6 deletions.
Original file line number Diff line number Diff line change
@@ -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
Expand Down Expand Up @@ -115,7 +115,7 @@ public <T> Iterator<T> createIterator(
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>() {

Expand Down Expand Up @@ -153,7 +153,7 @@ public void remove() {
@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>>() {

Expand Down Expand Up @@ -552,14 +552,22 @@ private void register(final Bundle bundle) {
}
}

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
}
Expand Down

0 comments on commit 8016b92

Please sign in to comment.