From bb4e77406a8054163c70e65315bccc7f4dc69aec Mon Sep 17 00:00:00 2001 From: Robert Timpe Date: Fri, 24 Jan 2014 20:29:34 +0000 Subject: [PATCH 1/2] 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"}) From 1e42cf1499ece68057eedbb7a650b790a1da7b28 Mon Sep 17 00:00:00 2001 From: Rob Timpe Date: Tue, 28 Jan 2014 13:32:46 -0800 Subject: [PATCH 2/2] Return immediately when the right sun jpeg plugin is found. --- .../imageio/plugins/jpeg/JPEGImageReaderSpi.java | 5 ++--- .../imageio/plugins/jpeg/JPEGImageWriterSpi.java | 5 ++--- 2 files changed, 4 insertions(+), 6 deletions(-) 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 2fd0f277..0550fa90 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 @@ -88,15 +88,14 @@ public class JPEGImageReaderSpi extends ImageReaderSpi { static ImageReaderSpi lookupDelegateProvider(final ServiceRegistry registry) { 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 imageReaderSpi; } } - return ret; + return null; } @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 d4f0db50..2a9cce80 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 @@ -89,15 +89,14 @@ public class JPEGImageWriterSpi extends ImageWriterSpi { static ImageWriterSpi lookupDelegateProvider(final ServiceRegistry registry) { 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 imageWriterSpi; } } - return ret; + return null; } @SuppressWarnings({"unchecked"})