From 1958c7e504081d6800cd3064b86bc63815f26680 Mon Sep 17 00:00:00 2001
From: ribeaudc <ribeaudc>
Date: Thu, 6 Mar 2008 09:38:12 +0000
Subject: [PATCH] change: - 'ILineFilter' and its implementations moved to its
 own package 'parser.filter'. add: - 'FileUtilities.loadToStringList' accepts
 a 'ILineFilter' parameter (which could be null).

SVN: 4649
---
 .../cisd/common/parser/DefaultParser.java     |  2 +
 .../cisd/common/parser/HeaderLineFilter.java  |  3 +
 .../systemsx/cisd/common/parser/IParser.java  |  2 +
 .../cisd/common/parser/ParserUtilities.java   |  2 +
 .../cisd/common/parser/TabFileLoader.java     |  2 +
 .../{ => filter}/AlwaysAcceptLineFilter.java  |  2 +-
 .../ExcludeEmptyAndCommentLineFilter.java     |  2 +-
 .../parser/{ => filter}/ILineFilter.java      |  2 +-
 .../cisd/common/utilities/FileUtilities.java  | 87 ++++++++++++++-----
 .../common/parser/ParserUtilitiesTest.java    |  1 +
 .../common/utilities/FileUtilitiesTest.java   | 27 ++++++
 11 files changed, 106 insertions(+), 26 deletions(-)
 rename common/source/java/ch/systemsx/cisd/common/parser/{ => filter}/AlwaysAcceptLineFilter.java (90%)
 rename common/source/java/ch/systemsx/cisd/common/parser/{ => filter}/ExcludeEmptyAndCommentLineFilter.java (93%)
 rename common/source/java/ch/systemsx/cisd/common/parser/{ => filter}/ILineFilter.java (95%)

diff --git a/common/source/java/ch/systemsx/cisd/common/parser/DefaultParser.java b/common/source/java/ch/systemsx/cisd/common/parser/DefaultParser.java
index 6cc8fee0920..98a6eeefb3b 100644
--- a/common/source/java/ch/systemsx/cisd/common/parser/DefaultParser.java
+++ b/common/source/java/ch/systemsx/cisd/common/parser/DefaultParser.java
@@ -20,6 +20,8 @@ import java.util.ArrayList;
 import java.util.Iterator;
 import java.util.List;
 
+import ch.systemsx.cisd.common.parser.filter.ILineFilter;
+
 /**
  * A default {@link IParser} implementation.
  * <p>
diff --git a/common/source/java/ch/systemsx/cisd/common/parser/HeaderLineFilter.java b/common/source/java/ch/systemsx/cisd/common/parser/HeaderLineFilter.java
index effaf40be6d..6b3d0b08adf 100644
--- a/common/source/java/ch/systemsx/cisd/common/parser/HeaderLineFilter.java
+++ b/common/source/java/ch/systemsx/cisd/common/parser/HeaderLineFilter.java
@@ -1,5 +1,8 @@
 package ch.systemsx.cisd.common.parser;
 
+import ch.systemsx.cisd.common.parser.filter.ExcludeEmptyAndCommentLineFilter;
+import ch.systemsx.cisd.common.parser.filter.ILineFilter;
+
 /**
  * A <code>ILineFilter</code> implementation that extends {@link ExcludeEmptyAndCommentLineFilter} by
  * excluding the header line (if <code>&gt; 1</code>) as well.
diff --git a/common/source/java/ch/systemsx/cisd/common/parser/IParser.java b/common/source/java/ch/systemsx/cisd/common/parser/IParser.java
index 59cbd702d02..28a1f135573 100644
--- a/common/source/java/ch/systemsx/cisd/common/parser/IParser.java
+++ b/common/source/java/ch/systemsx/cisd/common/parser/IParser.java
@@ -19,6 +19,8 @@ package ch.systemsx.cisd.common.parser;
 import java.util.Iterator;
 import java.util.List;
 
+import ch.systemsx.cisd.common.parser.filter.ILineFilter;
+
 /**
  * <code>IReaderParser</code> is able to parse a given text lines and to return a list of objects of type
  * <code>E</code>.
diff --git a/common/source/java/ch/systemsx/cisd/common/parser/ParserUtilities.java b/common/source/java/ch/systemsx/cisd/common/parser/ParserUtilities.java
index 9bd5e73c9e4..f07f180a40e 100644
--- a/common/source/java/ch/systemsx/cisd/common/parser/ParserUtilities.java
+++ b/common/source/java/ch/systemsx/cisd/common/parser/ParserUtilities.java
@@ -25,6 +25,8 @@ import org.apache.log4j.Logger;
 
 import ch.systemsx.cisd.common.logging.LogCategory;
 import ch.systemsx.cisd.common.logging.LogFactory;
+import ch.systemsx.cisd.common.parser.filter.AlwaysAcceptLineFilter;
+import ch.systemsx.cisd.common.parser.filter.ILineFilter;
 
 /**
  * Utilities for parsing files.
diff --git a/common/source/java/ch/systemsx/cisd/common/parser/TabFileLoader.java b/common/source/java/ch/systemsx/cisd/common/parser/TabFileLoader.java
index 6670c82c742..e1b976886e9 100644
--- a/common/source/java/ch/systemsx/cisd/common/parser/TabFileLoader.java
+++ b/common/source/java/ch/systemsx/cisd/common/parser/TabFileLoader.java
@@ -33,6 +33,8 @@ import org.apache.commons.lang.StringUtils;
 
 import ch.systemsx.cisd.common.exceptions.EnvironmentFailureException;
 import ch.systemsx.cisd.common.exceptions.UserFailureException;
+import ch.systemsx.cisd.common.parser.filter.AlwaysAcceptLineFilter;
+import ch.systemsx.cisd.common.parser.filter.ILineFilter;
 
 /**
  * Convenient class to load a tab file and deliver a list of beans of type <code>T</code>. The following formats for
diff --git a/common/source/java/ch/systemsx/cisd/common/parser/AlwaysAcceptLineFilter.java b/common/source/java/ch/systemsx/cisd/common/parser/filter/AlwaysAcceptLineFilter.java
similarity index 90%
rename from common/source/java/ch/systemsx/cisd/common/parser/AlwaysAcceptLineFilter.java
rename to common/source/java/ch/systemsx/cisd/common/parser/filter/AlwaysAcceptLineFilter.java
index 486f87e97e2..7ebf9129639 100644
--- a/common/source/java/ch/systemsx/cisd/common/parser/AlwaysAcceptLineFilter.java
+++ b/common/source/java/ch/systemsx/cisd/common/parser/filter/AlwaysAcceptLineFilter.java
@@ -1,4 +1,4 @@
-package ch.systemsx.cisd.common.parser;
+package ch.systemsx.cisd.common.parser.filter;
 
 /**
  * A default line filter that accepts any line.
diff --git a/common/source/java/ch/systemsx/cisd/common/parser/ExcludeEmptyAndCommentLineFilter.java b/common/source/java/ch/systemsx/cisd/common/parser/filter/ExcludeEmptyAndCommentLineFilter.java
similarity index 93%
rename from common/source/java/ch/systemsx/cisd/common/parser/ExcludeEmptyAndCommentLineFilter.java
rename to common/source/java/ch/systemsx/cisd/common/parser/filter/ExcludeEmptyAndCommentLineFilter.java
index fc0498aaa58..b0c16d27d0c 100644
--- a/common/source/java/ch/systemsx/cisd/common/parser/ExcludeEmptyAndCommentLineFilter.java
+++ b/common/source/java/ch/systemsx/cisd/common/parser/filter/ExcludeEmptyAndCommentLineFilter.java
@@ -1,4 +1,4 @@
-package ch.systemsx.cisd.common.parser;
+package ch.systemsx.cisd.common.parser.filter;
 
 /**
  * A default <code>LineFilter</code> implementation that excludes empty and comment lines.
diff --git a/common/source/java/ch/systemsx/cisd/common/parser/ILineFilter.java b/common/source/java/ch/systemsx/cisd/common/parser/filter/ILineFilter.java
similarity index 95%
rename from common/source/java/ch/systemsx/cisd/common/parser/ILineFilter.java
rename to common/source/java/ch/systemsx/cisd/common/parser/filter/ILineFilter.java
index 79981c2cf0e..cef4af9c34e 100644
--- a/common/source/java/ch/systemsx/cisd/common/parser/ILineFilter.java
+++ b/common/source/java/ch/systemsx/cisd/common/parser/filter/ILineFilter.java
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package ch.systemsx.cisd.common.parser;
+package ch.systemsx.cisd.common.parser.filter;
 
 /**
  * A line filter for <code>ReaderParser</code>.
diff --git a/common/source/java/ch/systemsx/cisd/common/utilities/FileUtilities.java b/common/source/java/ch/systemsx/cisd/common/utilities/FileUtilities.java
index 378b1e95b32..fdc6442caf0 100644
--- a/common/source/java/ch/systemsx/cisd/common/utilities/FileUtilities.java
+++ b/common/source/java/ch/systemsx/cisd/common/utilities/FileUtilities.java
@@ -48,6 +48,8 @@ import ch.systemsx.cisd.common.exceptions.CheckedExceptionTunnel;
 import ch.systemsx.cisd.common.exceptions.EnvironmentFailureException;
 import ch.systemsx.cisd.common.logging.ISimpleLogger;
 import ch.systemsx.cisd.common.logging.LogLevel;
+import ch.systemsx.cisd.common.parser.filter.AlwaysAcceptLineFilter;
+import ch.systemsx.cisd.common.parser.filter.ILineFilter;
 
 /**
  * Some useful utility methods for files and directories.
@@ -178,15 +180,30 @@ public final class FileUtilities
      * @return The content of the file line by line.
      * @throws CheckedExceptionTunnel for wrapping an {@link IOException}, e.g. if the file does not exist.
      */
-    public static List<String> loadToStringList(File file) throws CheckedExceptionTunnel
+    public final static List<String> loadToStringList(final File file) throws CheckedExceptionTunnel
     {
-        assert file != null;
+        return loadToStringList(file, null);
+    }
+
+    /**
+     * Loads a text file line by line to a {@link List} of {@link String}s.
+     * 
+     * @param file the file that should be loaded. This method asserts that given <code>File</code> is not
+     *            <code>null</code>.
+     * @param lineFilterOrNull a line filter if you are not interested in all lines. May be <code>null</code>.
+     * @return The content of the file line by line.
+     * @throws CheckedExceptionTunnel for wrapping an {@link IOException}, e.g. if the file does not exist.
+     */
+    public final static List<String> loadToStringList(final File file, final ILineFilter lineFilterOrNull)
+            throws CheckedExceptionTunnel
+    {
+        assert file != null : "Unspecified file.";
 
         FileReader fileReader = null;
         try
         {
             fileReader = new FileReader(file);
-            return readStringList(new BufferedReader(fileReader));
+            return readStringList(new BufferedReader(fileReader), lineFilterOrNull);
         } catch (IOException ex)
         {
             throw new CheckedExceptionTunnel(ex);
@@ -215,8 +232,8 @@ public final class FileUtilities
         BufferedReader reader = null;
         try
         {
-            reader = getBufferedReader(clazz, resource);
-            return readString(reader);
+            reader = tryGetBufferedReader(clazz, resource);
+            return reader == null ? null : readString(reader);
         } catch (IOException ex)
         {
             throw new CheckedExceptionTunnel(ex);
@@ -230,23 +247,43 @@ public final class FileUtilities
      * Loads a text file line by line to a {@link List} of {@link String}s.
      * <p>
      * A non-existent resource will result in a return value of <code>null</code>.
+     * </p>
      * 
      * @param clazz Class for which <code>getResource()</code> will be invoked.
-     * @param resource Absolute path of the resource (will be the argument of <code>getResource()</code>).
+     * @param resource absolute path of the resource (will be the argument of <code>getResource()</code>).
      * @return The content of the resource line by line.
      * @throws CheckedExceptionTunnel for wrapping an {@link IOException}, e.g. if the file does not exist.
      */
-    public static List<String> loadToStringList(final Class<?> clazz, final String resource)
+    public final static List<String> loadToStringList(final Class<?> clazz, final String resource)
             throws CheckedExceptionTunnel
+    {
+        return loadToStringList(clazz, resource, null);
+    }
+
+    /**
+     * Loads a text file line by line to a {@link List} of {@link String}s.
+     * <p>
+     * A non-existent resource will result in a return value of <code>null</code>.
+     * </p>
+     * 
+     * @param clazz Class for which <code>getResource()</code> will be invoked.
+     * @param resource absolute path of the resource (will be the argument of <code>getResource()</code>).
+     * @param lineFilterOrNull a line filter if you are not interested in all lines. May be <code>null</code>.
+     * @return The content of the resource line by line or <code>null</code> if given <var>resource</var> can not be
+     *         found.
+     * @throws CheckedExceptionTunnel for wrapping an {@link IOException}, e.g. if the file does not exist.
+     */
+    public final static List<String> loadToStringList(final Class<?> clazz, final String resource,
+            final ILineFilter lineFilterOrNull) throws CheckedExceptionTunnel
     {
         assert clazz != null : "Given class can not be null.";
-        assert resource != null && resource.length() > 0 : "Given resource can not be null.";
+        assert StringUtils.isNotEmpty(resource) : "Given resource can not be empty.";
 
         BufferedReader reader = null;
         try
         {
-            reader = getBufferedReader(clazz, resource);
-            return readStringList(reader);
+            reader = tryGetBufferedReader(clazz, resource);
+            return reader == null ? null : readStringList(reader, lineFilterOrNull);
         } catch (IOException ex)
         {
             throw new CheckedExceptionTunnel(ex);
@@ -256,7 +293,7 @@ public final class FileUtilities
         }
     }
 
-    private final static BufferedReader getBufferedReader(final Class<?> clazz, final String resource)
+    private final static BufferedReader tryGetBufferedReader(final Class<?> clazz, final String resource)
             throws FileNotFoundException
     {
         final URL url = clazz.getResource(resource);
@@ -273,13 +310,9 @@ public final class FileUtilities
         }
     }
 
-    private static String readString(BufferedReader reader) throws IOException
+    private static String readString(final BufferedReader reader) throws IOException
     {
-        if (reader == null)
-        {
-            return null;
-        }
-
+        assert reader != null : "Unspecified BufferedReader.";
         final StringBuilder builder = new StringBuilder();
         String line;
         while ((line = reader.readLine()) != null)
@@ -289,18 +322,26 @@ public final class FileUtilities
         return builder.toString();
     }
 
-    private static List<String> readStringList(BufferedReader reader) throws IOException
+    private final static List<String> readStringList(final BufferedReader reader, final ILineFilter lineFilterOrNull)
+            throws IOException
     {
-        if (reader == null)
+        assert reader != null : "Unspecified BufferedReader.";
+        final ILineFilter lineFilter;
+        if (lineFilterOrNull == null)
         {
-            return null;
+            lineFilter = AlwaysAcceptLineFilter.INSTANCE;
+        } else
+        {
+            lineFilter = lineFilterOrNull;
         }
-
         final List<String> list = new ArrayList<String>();
         String line;
-        while ((line = reader.readLine()) != null)
+        for (int lineNumber = 0; (line = reader.readLine()) != null; lineNumber++)
         {
-            list.add(line);
+            if (lineFilter.acceptLine(line, lineNumber))
+            {
+                list.add(line);
+            }
         }
         return list;
     }
diff --git a/common/sourceTest/java/ch/systemsx/cisd/common/parser/ParserUtilitiesTest.java b/common/sourceTest/java/ch/systemsx/cisd/common/parser/ParserUtilitiesTest.java
index dce574df6d6..f2af1aa96ec 100644
--- a/common/sourceTest/java/ch/systemsx/cisd/common/parser/ParserUtilitiesTest.java
+++ b/common/sourceTest/java/ch/systemsx/cisd/common/parser/ParserUtilitiesTest.java
@@ -30,6 +30,7 @@ import org.testng.annotations.BeforeClass;
 import org.testng.annotations.Test;
 
 import ch.systemsx.cisd.common.logging.LogInitializer;
+import ch.systemsx.cisd.common.parser.filter.ExcludeEmptyAndCommentLineFilter;
 
 /**
  * Test cases for corresponding {@link ParserUtilities} class.
diff --git a/common/sourceTest/java/ch/systemsx/cisd/common/utilities/FileUtilitiesTest.java b/common/sourceTest/java/ch/systemsx/cisd/common/utilities/FileUtilitiesTest.java
index 95449dd3761..68e3079d203 100644
--- a/common/sourceTest/java/ch/systemsx/cisd/common/utilities/FileUtilitiesTest.java
+++ b/common/sourceTest/java/ch/systemsx/cisd/common/utilities/FileUtilitiesTest.java
@@ -40,6 +40,7 @@ import org.testng.annotations.Test;
 
 import ch.systemsx.cisd.common.Constants;
 import ch.systemsx.cisd.common.exceptions.CheckedExceptionTunnel;
+import ch.systemsx.cisd.common.parser.filter.ExcludeEmptyAndCommentLineFilter;
 
 /**
  * Test cases for the {@link FileUtilities}.
@@ -215,6 +216,32 @@ public final class FileUtilitiesTest extends AbstractFileSystemTestCase
         assertEquals(Arrays.asList("Hello", "World!"), text);
     }
 
+    @Test
+    public final void testLoadToStringListFileWithLineFilter() throws Exception
+    {
+        final File file = new File(workingDirectory, "test.txt");
+        final FileWriter writer = new FileWriter(file);
+        try
+        {
+            writer.write("\nHello\nWorld!\n\n");
+        } finally
+        {
+            writer.close();
+        }
+        // With no line filter.
+        List<String> text = FileUtilities.loadToStringList(file);
+        assertEquals(4, text.size());
+        assertEquals(Arrays.asList("", "Hello", "World!", ""), text);
+        // With null line filter.
+        text = FileUtilities.loadToStringList(file, null);
+        assertEquals(4, text.size());
+        assertEquals(Arrays.asList("", "Hello", "World!", ""), text);
+        // With a correct line filter.
+        text = FileUtilities.loadToStringList(file, ExcludeEmptyAndCommentLineFilter.INSTANCE);
+        assertEquals(2, text.size());
+        assertEquals(Arrays.asList("Hello", "World!"), text);
+    }
+
     @Test
     public final void testRemovePrefixFromFileName()
     {
-- 
GitLab