From 91e7736d74da2fece71813d9e875ddc84667340f Mon Sep 17 00:00:00 2001 From: kaloyane <kaloyane> Date: Mon, 4 Apr 2011 10:31:06 +0000 Subject: [PATCH] minor: add a method to auto-discover a suitable reader by filename using the available libraries SVN: 20633 --- .../cisd/imagereaders/ImageReaderFactory.java | 32 ++++++++++++++++--- .../imagereaders/ImageReaderFactoryTest.java | 24 +++++++++++--- .../BioFormatsImageJImageViewer.java | 2 +- .../BioFormatsMetaDataReadingTest.java | 2 +- 4 files changed, 50 insertions(+), 10 deletions(-) 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 bc1c34859b3..aad31f3ac4c 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 a42390a8484..02cea552d36 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 001b48c858f..2dc1ce3310e 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 8805a3a8380..2c4b89baaba 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; } -- GitLab