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.
This commit is contained in:
Robert Timpe 2014-01-24 20:29:34 +00:00
parent b9f04059bf
commit bb4e77406a
3 changed files with 56 additions and 18 deletions

View File

@ -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;
}
}

View File

@ -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"));
Iterator<ImageReaderSpi> 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;
}
catch (ClassNotFoundException ignore) {
}
catch (SecurityException e) {
e.printStackTrace();
}
return null;
return ret;
}
@SuppressWarnings({"unchecked"})

View File

@ -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"));
Iterator<ImageWriterSpi> 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;
}
catch (ClassNotFoundException ignore) {
}
catch (SecurityException e) {
e.printStackTrace();
}
return null;
return ret;
}
@SuppressWarnings({"unchecked"})