Alternative fix for #650: Allow usage in OSGi environment.

(cherry picked from commit f50178bc78af3d6b7f288914a1cea121330312b8)
This commit is contained in:
Harald Kuhr 2021-12-23 11:02:27 +01:00
parent 966a9da45d
commit a963e1c355

View File

@ -45,6 +45,7 @@ import java.io.BufferedInputStream;
import java.io.BufferedOutputStream; import java.io.BufferedOutputStream;
import java.io.InputStream; import java.io.InputStream;
import java.io.OutputStream; import java.io.OutputStream;
import java.util.Iterator;
import java.util.SortedSet; import java.util.SortedSet;
import java.util.TreeSet; import java.util.TreeSet;
@ -175,16 +176,23 @@ public final class IIOUtil {
* @param providerClassName name of the provider class. * @param providerClassName name of the provider class.
* @param category provider category * @param category provider category
* *
* @return the provider instance, or {@code null}. * @return the provider instance, or {@code null} if not found
*/ */
public static <T> T lookupProviderByName(final ServiceRegistry registry, final String providerClassName, Class<T> category) { public static <T> T lookupProviderByName(final ServiceRegistry registry, final String providerClassName, Class<T> category) {
try { // NOTE: While more verbose, this is more OSGi-friendly than using
return category.cast(registry.getServiceProviderByClass(Class.forName(providerClassName))); // registry.getServiceProviderByClass(Class.forName(providerClassName))
Iterator<T> providers = registry.getServiceProviders(category, true);
while (providers.hasNext()) {
T provider = providers.next();
if (provider.getClass().getName().equals(providerClassName)) {
return provider;
} }
catch (ClassNotFoundException ignore) { }
return null; return null;
} }
}
/** /**
* Returns a sorted array of format names, that can be read by ImageIO. * Returns a sorted array of format names, that can be read by ImageIO.