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