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.spi.ServiceRegistry;
import javax.imageio.stream.ImageInputStream; import javax.imageio.stream.ImageInputStream;
import java.io.IOException; import java.io.IOException;
import java.util.Iterator;
import java.util.Locale; import java.util.Locale;
/** /**
@ -85,17 +86,17 @@ public class JPEGImageReaderSpi extends ImageReaderSpi {
} }
static ImageReaderSpi lookupDelegateProvider(final ServiceRegistry registry) { static ImageReaderSpi lookupDelegateProvider(final ServiceRegistry registry) {
// Should be safe to lookup now, as the bundled providers are hardcoded usually Iterator<ImageReaderSpi> it = registry.getServiceProviders(ImageReaderSpi.class, new ImageFormatFilter("JPEG"), true);
try {
return (ImageReaderSpi) registry.getServiceProviderByClass(Class.forName("com.sun.imageio.plugins.jpeg.JPEGImageReaderSpi")); ImageReaderSpi ret = null;
} while (it.hasNext()) {
catch (ClassNotFoundException ignore) { ImageReaderSpi imageReaderSpi = it.next();
} if (imageReaderSpi.getClass().getCanonicalName().equals("com.sun.imageio.plugins.jpeg.JPEGImageReaderSpi")) {
catch (SecurityException e) { ret = imageReaderSpi;
e.printStackTrace(); }
} }
return null; return ret;
} }
@SuppressWarnings({"unchecked"}) @SuppressWarnings({"unchecked"})

View File

@ -39,6 +39,7 @@ import javax.imageio.spi.ImageWriterSpi;
import javax.imageio.spi.ServiceRegistry; import javax.imageio.spi.ServiceRegistry;
import java.awt.image.RenderedImage; import java.awt.image.RenderedImage;
import java.io.IOException; import java.io.IOException;
import java.util.Iterator;
import java.util.Locale; import java.util.Locale;
/** /**
@ -86,17 +87,17 @@ public class JPEGImageWriterSpi extends ImageWriterSpi {
} }
static ImageWriterSpi lookupDelegateProvider(final ServiceRegistry registry) { static ImageWriterSpi lookupDelegateProvider(final ServiceRegistry registry) {
// Should be safe to lookup now, as the bundled providers are hardcoded usually Iterator<ImageWriterSpi> it = registry.getServiceProviders(ImageWriterSpi.class, new ImageFormatFilter("JPEG"), true);
try {
return (ImageWriterSpi) registry.getServiceProviderByClass(Class.forName("com.sun.imageio.plugins.jpeg.JPEGImageWriterSpi")); ImageWriterSpi ret = null;
} while (it.hasNext()) {
catch (ClassNotFoundException ignore) { ImageWriterSpi imageWriterSpi = it.next();
} if (imageWriterSpi.getClass().getCanonicalName().equals("com.sun.imageio.plugins.jpeg.JPEGImageWriterSpi")) {
catch (SecurityException e) { ret = imageWriterSpi;
e.printStackTrace(); }
} }
return null; return ret;
} }
@SuppressWarnings({"unchecked"}) @SuppressWarnings({"unchecked"})