Merge pull request #32 from rtimpe/master

Support registration of JPEG plugins when the classloader can't find sun plugins
This commit is contained in:
Harald Kuhr 2014-02-06 23:02:43 +01:00
commit 7c012323e5
3 changed files with 52 additions and 16 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,14 +86,13 @@ 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);
while (it.hasNext()) {
ImageReaderSpi imageReaderSpi = it.next();
if (imageReaderSpi.getClass().getCanonicalName().equals("com.sun.imageio.plugins.jpeg.JPEGImageReaderSpi")) {
return imageReaderSpi;
}
catch (ClassNotFoundException ignore) {
}
catch (SecurityException e) {
e.printStackTrace();
}
return null;

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,14 +87,13 @@ 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);
while (it.hasNext()) {
ImageWriterSpi imageWriterSpi = it.next();
if (imageWriterSpi.getClass().getCanonicalName().equals("com.sun.imageio.plugins.jpeg.JPEGImageWriterSpi")) {
return imageWriterSpi;
}
catch (ClassNotFoundException ignore) {
}
catch (SecurityException e) {
e.printStackTrace();
}
return null;