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