From ba6cd00d6ed357557d22191da4a0276604a2daec Mon Sep 17 00:00:00 2001
From: kaloyane <kaloyane>
Date: Thu, 4 Aug 2011 16:23:21 +0000
Subject: [PATCH] [LMS-2446] image readers must not keep opened file handles

SVN: 22342
---
 .../imagereaders/AbstractImageReader.java     | 17 ++++++++++--
 .../AbstractMetaDataAwareImageReader.java     |  8 +++++-
 .../bioformats/BioFormatsImageUtils.java      | 27 ++++++++++++++++---
 3 files changed, 46 insertions(+), 6 deletions(-)

diff --git a/image_readers/source/java/ch/systemsx/cisd/imagereaders/AbstractImageReader.java b/image_readers/source/java/ch/systemsx/cisd/imagereaders/AbstractImageReader.java
index 0d6611d6a41..40443af7515 100644
--- a/image_readers/source/java/ch/systemsx/cisd/imagereaders/AbstractImageReader.java
+++ b/image_readers/source/java/ch/systemsx/cisd/imagereaders/AbstractImageReader.java
@@ -57,7 +57,14 @@ public abstract class AbstractImageReader implements IImageReader
 
     public final List<ImageID> getImageIDs(File file) throws IOExceptionUnchecked
     {
-        return getImageIDs(new RandomAccessFileImpl(file, "r"));
+        RandomAccessFileImpl raf = new RandomAccessFileImpl(file, "r");
+        try
+        {
+            return getImageIDs(raf);
+        } finally
+        {
+            raf.close();
+        }
     }
 
     public final List<ImageID> getImageIDs(byte[] bytes)
@@ -73,7 +80,13 @@ public abstract class AbstractImageReader implements IImageReader
     public BufferedImage readImage(File file, ImageID imageID, IReadParams params) throws IOExceptionUnchecked
     {
         IRandomAccessFile raf = new RandomAccessFileImpl(file, "r");
-        return readImage(raf, imageID, params);
+        try
+        {
+            return readImage(raf, imageID, params);
+        } finally
+        {
+            raf.close();
+        }
     }
 
     public BufferedImage readImage(byte[] bytes, ImageID imageID, IReadParams params)
diff --git a/image_readers/source/java/ch/systemsx/cisd/imagereaders/AbstractMetaDataAwareImageReader.java b/image_readers/source/java/ch/systemsx/cisd/imagereaders/AbstractMetaDataAwareImageReader.java
index 9c413a25e18..e2a90dba58b 100644
--- a/image_readers/source/java/ch/systemsx/cisd/imagereaders/AbstractMetaDataAwareImageReader.java
+++ b/image_readers/source/java/ch/systemsx/cisd/imagereaders/AbstractMetaDataAwareImageReader.java
@@ -41,7 +41,13 @@ public abstract class AbstractMetaDataAwareImageReader extends AbstractImageRead
             throws IOExceptionUnchecked
     {
         IRandomAccessFile raf = new RandomAccessFileImpl(file, "r");
-        return readMetaData(raf, imageID, params);
+        try
+        {
+            return readMetaData(raf, imageID, params);
+        } finally
+        {
+            raf.close();
+        }
     }
 
     @Override
diff --git a/image_readers/source/java/ch/systemsx/cisd/imagereaders/bioformats/BioFormatsImageUtils.java b/image_readers/source/java/ch/systemsx/cisd/imagereaders/bioformats/BioFormatsImageUtils.java
index 9d0bd012676..abfc8eec4c9 100644
--- a/image_readers/source/java/ch/systemsx/cisd/imagereaders/bioformats/BioFormatsImageUtils.java
+++ b/image_readers/source/java/ch/systemsx/cisd/imagereaders/bioformats/BioFormatsImageUtils.java
@@ -61,16 +61,37 @@ final class BioFormatsImageUtils
      */
     public static IFormatReader tryToCreateReaderForFile(String fileName)
     {
-        for (IFormatReader r : READERS)
+        for (IFormatReader reader : READERS)
         {
-            if (r.isThisType(fileName))
+            try
             {
-                return createReader(r.getClass());
+                if (reader.isThisType(fileName))
+                {
+                    return createReader(reader.getClass());
+                }
+
+            } finally
+            {
+                // "r.isThisType(fileName)" line can open a file handle,
+                // so we need to close it
+                closeOpenedFiles(reader);
             }
         }
         return null;
     }
 
+    private static void closeOpenedFiles(IFormatReader r)
+    {
+        try
+        {
+            r.close(true);
+        } catch (IOException ex)
+        {
+            throw new IOExceptionUnchecked(ex);
+        }
+
+    }
+
     /**
      * Tries to create an {@link IFormatReader} for a specified name. This is a factory method which
      * returns for each invocation a new instance of the requested reader. May return
-- 
GitLab