diff --git a/imageio/imageio-core/src/main/java/com/twelvemonkeys/imageio/util/IIOUtil.java b/imageio/imageio-core/src/main/java/com/twelvemonkeys/imageio/util/IIOUtil.java index f8e32f31..3e053f85 100644 --- a/imageio/imageio-core/src/main/java/com/twelvemonkeys/imageio/util/IIOUtil.java +++ b/imageio/imageio-core/src/main/java/com/twelvemonkeys/imageio/util/IIOUtil.java @@ -45,6 +45,7 @@ import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.InputStream; import java.io.OutputStream; +import java.util.Iterator; import java.util.SortedSet; import java.util.TreeSet; @@ -175,15 +176,22 @@ public final class IIOUtil { * @param providerClassName name of the provider class. * @param category provider category * - * @return the provider instance, or {@code null}. + * @return the provider instance, or {@code null} if not found */ public static T lookupProviderByName(final ServiceRegistry registry, final String providerClassName, Class category) { - try { - return category.cast(registry.getServiceProviderByClass(Class.forName(providerClassName))); - } - catch (ClassNotFoundException ignore) { - return null; + // NOTE: While more verbose, this is more OSGi-friendly than using + // registry.getServiceProviderByClass(Class.forName(providerClassName)) + Iterator providers = registry.getServiceProviders(category, true); + + while (providers.hasNext()) { + T provider = providers.next(); + + if (provider.getClass().getName().equals(providerClassName)) { + return provider; + } } + + return null; } /**