diff --git a/image_readers/source/java/ch/systemsx/cisd/imagereaders/ImageReaderFactory.java b/image_readers/source/java/ch/systemsx/cisd/imagereaders/ImageReaderFactory.java index bc1c34859b37c082cc4a9123eeab076d23bda4f0..aad31f3ac4c8fc43a15fb6d9a585e3aa6059873f 100644 --- a/image_readers/source/java/ch/systemsx/cisd/imagereaders/ImageReaderFactory.java +++ b/image_readers/source/java/ch/systemsx/cisd/imagereaders/ImageReaderFactory.java @@ -81,19 +81,43 @@ public class ImageReaderFactory * * @throws IllegalArgumentException if libraryName does not specify a valid library name. */ - public static IImageReader tryGetImageReaderForFile(String libraryName, String fileName) + public static IImageReader tryGetReaderForFile(String libraryName, String fileName) { IImageReaderLibrary library = findLibrary(libraryName); return (library == null) ? null : library.tryGetReaderForFile(fileName); } + /** + * Iterates over all available reader libraries and tries to find a suitable reader for a + * specified <var>fileName</var>. May return <code>null</code> if no suitable reader is found. + * <p> + * The method produces non-deterministic results as it relies upon an arbitrary ordering of the + * known image libraries, where the first library to return a valid image reader "wins". + * <p> + * The behavior of this method may vary across libraries. For example, some image libraries can + * use the suffix of <var>fileName</var> to find the right reader, while others might attempt to + * open the file and apply heuristics on its content to determine the appropriate reader. + * + * @throws IllegalArgumentException if libraryName does not specify a valid library name. + */ + public static IImageReader tryGetReaderForFile(String fileName) + { + for (IImageReaderLibrary library : libraries) + { + IImageReader imageReader = library.tryGetReaderForFile(fileName); + if (imageReader != null) + { + return imageReader; + } + } + return null; + } + private static IImageReaderLibrary findLibrary(String libraryName) throws IllegalArgumentException { - Iterator<IImageReaderLibrary> iterator = libraries.iterator(); - while (iterator.hasNext()) + for (IImageReaderLibrary library : libraries) { - IImageReaderLibrary library = iterator.next(); if (library.getName().equalsIgnoreCase(libraryName)) { return library; diff --git a/image_readers/sourceTest/java/ch/systemsx/cisd/imagereaders/ImageReaderFactoryTest.java b/image_readers/sourceTest/java/ch/systemsx/cisd/imagereaders/ImageReaderFactoryTest.java index a42390a84846dcda26ba7d2fbb7f72cd9cbfaf7d..02cea552d367824d05c2fa9b277918fa9c998b54 100644 --- a/image_readers/sourceTest/java/ch/systemsx/cisd/imagereaders/ImageReaderFactoryTest.java +++ b/image_readers/sourceTest/java/ch/systemsx/cisd/imagereaders/ImageReaderFactoryTest.java @@ -67,10 +67,26 @@ public class ImageReaderFactoryTest extends AbstractImageReaderFactoryTest } } + @Test + public void testFindWithoutLibraryName() throws Exception + { + String tiffFileName = "./demo.tiff"; + ImageReadersTestHelper.setUpLibraries(ImageReaderConstants.IMAGEIO_LIBRARY); + + assertNull("ImageIO library should not return TIFF readers", + ImageReaderFactory.tryGetReaderForFile(tiffFileName)); + + ImageReadersTestHelper.setUpLibraries(ImageReaderConstants.JAI_LIBRARY); + + assertNotNull("JAI library should return TIFF readers", + ImageReaderFactory.tryGetReaderForFile(tiffFileName)); + + } + @Test(expectedExceptions = IllegalArgumentException.class) public void testGetInvalidLibrary() { - ImageReaderFactory.tryGetImageReaderForFile("invalid_library", null); + ImageReaderFactory.tryGetReaderForFile("invalid_library", null); } @Test(expectedExceptions = IOExceptionUnchecked.class) @@ -80,7 +96,7 @@ public class ImageReaderFactoryTest extends AbstractImageReaderFactoryTest final File invalidFile = new File(invalidName); IImageReader reader = - ImageReaderFactory.tryGetImageReaderForFile(BIOFORMATS_LIBRARY, invalidName); + ImageReaderFactory.tryGetReaderForFile(BIOFORMATS_LIBRARY, invalidName); reader.readImage(invalidFile, null); } @@ -97,7 +113,7 @@ public class ImageReaderFactoryTest extends AbstractImageReaderFactoryTest private void assertImageReadable(String libraryName, File file) { IImageReader reader = - ImageReaderFactory.tryGetImageReaderForFile(libraryName, file.getAbsolutePath()); + ImageReaderFactory.tryGetReaderForFile(libraryName, file.getAbsolutePath()); String error = String.format("Cannot find appropriate reader for file '%s' " + "in library '%s'", file.getAbsolutePath(), libraryName); @@ -114,7 +130,7 @@ public class ImageReaderFactoryTest extends AbstractImageReaderFactoryTest private void assertNoReaderFor(String library, File file) { IImageReader reader = - ImageReaderFactory.tryGetImageReaderForFile(library, file.getAbsolutePath()); + ImageReaderFactory.tryGetReaderForFile(library, file.getAbsolutePath()); String error = String.format("Library file '%s' " + " cannot read file '%s'," + " but returns a non-null image reader.", library, file.getAbsolutePath()); diff --git a/image_readers/sourceTest/java/ch/systemsx/cisd/imagereaders/bioformats/BioFormatsImageJImageViewer.java b/image_readers/sourceTest/java/ch/systemsx/cisd/imagereaders/bioformats/BioFormatsImageJImageViewer.java index 001b48c858fdd48a2914d4963e23880a617ce4e5..2dc1ce3310e8cc3eb2c9da40d295a6963a888f7f 100644 --- a/image_readers/sourceTest/java/ch/systemsx/cisd/imagereaders/bioformats/BioFormatsImageJImageViewer.java +++ b/image_readers/sourceTest/java/ch/systemsx/cisd/imagereaders/bioformats/BioFormatsImageJImageViewer.java @@ -62,7 +62,7 @@ public class BioFormatsImageJImageViewer final String fileName = args[0]; IImageReader imageReader = - ImageReaderFactory.tryGetImageReaderForFile(ImageReaderConstants.BIOFORMATS_LIBRARY, + ImageReaderFactory.tryGetReaderForFile(ImageReaderConstants.BIOFORMATS_LIBRARY, fileName); File file = new File(fileName); diff --git a/image_readers/sourceTest/java/ch/systemsx/cisd/imagereaders/bioformats/BioFormatsMetaDataReadingTest.java b/image_readers/sourceTest/java/ch/systemsx/cisd/imagereaders/bioformats/BioFormatsMetaDataReadingTest.java index 8805a3a8380bd25dfde588ac241dc2e0f8713ad9..2c4b89baabaaf856df2b7aef9ab8d53680d9d264 100644 --- a/image_readers/sourceTest/java/ch/systemsx/cisd/imagereaders/bioformats/BioFormatsMetaDataReadingTest.java +++ b/image_readers/sourceTest/java/ch/systemsx/cisd/imagereaders/bioformats/BioFormatsMetaDataReadingTest.java @@ -158,7 +158,7 @@ public class BioFormatsMetaDataReadingTest extends AbstractImageReaderFactoryTes ImageReadersTestHelper.setUpLibraries(ImageReaderConstants.BIOFORMATS_LIBRARY); IImageReader reader = - ImageReaderFactory.tryGetImageReaderForFile(ImageReaderConstants.BIOFORMATS_LIBRARY, + ImageReaderFactory.tryGetReaderForFile(ImageReaderConstants.BIOFORMATS_LIBRARY, imageFile.getAbsolutePath()); return reader; }