From bb4e77406a8054163c70e65315bccc7f4dc69aec Mon Sep 17 00:00:00 2001 From: Robert Timpe Date: Fri, 24 Jan 2014 20:29:34 +0000 Subject: [PATCH] Support registration of JPEG plugins when the classloader can't find sun plugins. In some situations, the classloader may not be able to find the sun jpeg plugins even if they are registered. In this case, we can still find the sun plugins by iterating over all the registered plugins. --- .../plugins/jpeg/ImageFormatFilter.java | 36 +++++++++++++++++++ .../plugins/jpeg/JPEGImageReaderSpi.java | 19 +++++----- .../plugins/jpeg/JPEGImageWriterSpi.java | 19 +++++----- 3 files changed, 56 insertions(+), 18 deletions(-) create mode 100644 imageio/imageio-jpeg/src/main/java/com/twelvemonkeys/imageio/plugins/jpeg/ImageFormatFilter.java diff --git a/imageio/imageio-jpeg/src/main/java/com/twelvemonkeys/imageio/plugins/jpeg/ImageFormatFilter.java b/imageio/imageio-jpeg/src/main/java/com/twelvemonkeys/imageio/plugins/jpeg/ImageFormatFilter.java new file mode 100644 index 00000000..284cb82b --- /dev/null +++ b/imageio/imageio-jpeg/src/main/java/com/twelvemonkeys/imageio/plugins/jpeg/ImageFormatFilter.java @@ -0,0 +1,36 @@ +package com.twelvemonkeys.imageio.plugins.jpeg; + +import javax.imageio.spi.ImageReaderSpi; +import javax.imageio.spi.ImageWriterSpi; +import javax.imageio.spi.ServiceRegistry; + +public class ImageFormatFilter implements ServiceRegistry.Filter { + String name; + + public ImageFormatFilter (String name) { + this.name = name; + } + + public boolean filter (Object obj) { + try { + if (obj instanceof ImageReaderSpi) { + return contains(((ImageReaderSpi) obj).getFormatNames(), name); + } else if (obj instanceof ImageWriterSpi) { + return contains(((ImageWriterSpi) obj).getFormatNames(), name); + } else { + return false; + } + } catch (Exception e) { + return false; + } + } + + private static boolean contains (String[] names, String name) { + for (int i = 0; i < names.length; i++) { + if (name.equalsIgnoreCase(names[i])) { + return true; + } + } + return false; + } +} \ No newline at end of file diff --git a/imageio/imageio-jpeg/src/main/java/com/twelvemonkeys/imageio/plugins/jpeg/JPEGImageReaderSpi.java b/imageio/imageio-jpeg/src/main/java/com/twelvemonkeys/imageio/plugins/jpeg/JPEGImageReaderSpi.java index 72155d33..2fd0f277 100644 --- a/imageio/imageio-jpeg/src/main/java/com/twelvemonkeys/imageio/plugins/jpeg/JPEGImageReaderSpi.java +++ b/imageio/imageio-jpeg/src/main/java/com/twelvemonkeys/imageio/plugins/jpeg/JPEGImageReaderSpi.java @@ -38,6 +38,7 @@ import javax.imageio.spi.ImageReaderSpi; import javax.imageio.spi.ServiceRegistry; import javax.imageio.stream.ImageInputStream; import java.io.IOException; +import java.util.Iterator; import java.util.Locale; /** @@ -85,17 +86,17 @@ public class JPEGImageReaderSpi extends ImageReaderSpi { } static ImageReaderSpi lookupDelegateProvider(final ServiceRegistry registry) { - // Should be safe to lookup now, as the bundled providers are hardcoded usually - try { - return (ImageReaderSpi) registry.getServiceProviderByClass(Class.forName("com.sun.imageio.plugins.jpeg.JPEGImageReaderSpi")); - } - catch (ClassNotFoundException ignore) { - } - catch (SecurityException e) { - e.printStackTrace(); + Iterator it = registry.getServiceProviders(ImageReaderSpi.class, new ImageFormatFilter("JPEG"), true); + + ImageReaderSpi ret = null; + while (it.hasNext()) { + ImageReaderSpi imageReaderSpi = it.next(); + if (imageReaderSpi.getClass().getCanonicalName().equals("com.sun.imageio.plugins.jpeg.JPEGImageReaderSpi")) { + ret = imageReaderSpi; + } } - return null; + return ret; } @SuppressWarnings({"unchecked"}) diff --git a/imageio/imageio-jpeg/src/main/java/com/twelvemonkeys/imageio/plugins/jpeg/JPEGImageWriterSpi.java b/imageio/imageio-jpeg/src/main/java/com/twelvemonkeys/imageio/plugins/jpeg/JPEGImageWriterSpi.java index 735e7a0c..d4f0db50 100644 --- a/imageio/imageio-jpeg/src/main/java/com/twelvemonkeys/imageio/plugins/jpeg/JPEGImageWriterSpi.java +++ b/imageio/imageio-jpeg/src/main/java/com/twelvemonkeys/imageio/plugins/jpeg/JPEGImageWriterSpi.java @@ -39,6 +39,7 @@ import javax.imageio.spi.ImageWriterSpi; import javax.imageio.spi.ServiceRegistry; import java.awt.image.RenderedImage; import java.io.IOException; +import java.util.Iterator; import java.util.Locale; /** @@ -86,17 +87,17 @@ public class JPEGImageWriterSpi extends ImageWriterSpi { } static ImageWriterSpi lookupDelegateProvider(final ServiceRegistry registry) { - // Should be safe to lookup now, as the bundled providers are hardcoded usually - try { - return (ImageWriterSpi) registry.getServiceProviderByClass(Class.forName("com.sun.imageio.plugins.jpeg.JPEGImageWriterSpi")); - } - catch (ClassNotFoundException ignore) { - } - catch (SecurityException e) { - e.printStackTrace(); + Iterator it = registry.getServiceProviders(ImageWriterSpi.class, new ImageFormatFilter("JPEG"), true); + + ImageWriterSpi ret = null; + while (it.hasNext()) { + ImageWriterSpi imageWriterSpi = it.next(); + if (imageWriterSpi.getClass().getCanonicalName().equals("com.sun.imageio.plugins.jpeg.JPEGImageWriterSpi")) { + ret = imageWriterSpi; + } } - return null; + return ret; } @SuppressWarnings({"unchecked"})