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>> 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