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 014209e81f0a37d7a8e79d67a4958a8b221c4e82..c8c3ab70acabd31acc948df36769096e43dd9df3 100644 --- a/common/source/java/ch/systemsx/cisd/common/parser/DefaultParser.java +++ b/common/source/java/ch/systemsx/cisd/common/parser/DefaultParser.java @@ -21,6 +21,8 @@ import java.util.Iterator; import java.util.List; import java.util.NoSuchElementException; +import org.apache.commons.lang.StringUtils; + import ch.systemsx.cisd.common.parser.filter.ILineFilter; /** @@ -73,17 +75,21 @@ public class DefaultParser<E, T> implements IParser<E, T> { E object = null; String[] tokens = parseLine(number, nextLine, headerLength); - try - { - object = createObject(tokens); - } catch (final ParserException parserException) + // skip empty lines + if (false == areAllTokensBlank(tokens)) { - throw new ParsingException(parserException, tokens, number); - } - // Skip null values - if (null != object) - { - elements.add(object); + try + { + object = createObject(tokens); + } catch (final ParserException parserException) + { + throw new ParsingException(parserException, tokens, number); + } + // Skip null values + if (null != object) + { + elements.add(object); + } } } } @@ -91,6 +97,18 @@ public class DefaultParser<E, T> implements IParser<E, T> return elements; } + private boolean areAllTokensBlank(String[] tokens) + { + for (String token : tokens) + { + if (false == StringUtils.isBlank(token)) + { + return false; + } + } + return true; + } + public final Iterator<E> parseIteratively(final Iterator<ILine<T>> lineIterator, final ILineFilter lineFilter, final int headerLength) throws ParsingException { diff --git a/common/sourceTest/java/ch/systemsx/cisd/common/parser/DefaultParserTest.java b/common/sourceTest/java/ch/systemsx/cisd/common/parser/DefaultParserTest.java index 4b0b19824a937865a939a7587b91f5db7300a6bb..adb945651db4c9f039d9edcccae117860d125952 100644 --- a/common/sourceTest/java/ch/systemsx/cisd/common/parser/DefaultParserTest.java +++ b/common/sourceTest/java/ch/systemsx/cisd/common/parser/DefaultParserTest.java @@ -47,6 +47,10 @@ public final class DefaultParserTest "# This is a comment", "firstName\tlastName\taddress\tcity", "\tDarwin\tHumboldt Ave. 1865", "Albert\tEinstein"); + private final static List<String> textWithEmptyLines = Arrays.asList("", "# This is a comment", + "firstName\tlastName\taddress\tcity", "\tDarwin\tHumboldt Ave. 1865", " \t \t \t ", + "Albert\tEinstein"); + private final static int HEADER_LENGTH = 4; private final static IParser<String[], String> createParser() @@ -130,6 +134,18 @@ public final class DefaultParserTest assertEquals("", result.get(2)[3]); } + @Test + public final void testParseEmptyLinesIgnored() + { + final IParser<String[], String> parser = createParser(); + final List<String[]> result = + parser.parse(createLineIterator(textWithEmptyLines), new HeaderLineFilter(), + HEADER_LENGTH); + assertEquals(3, result.size()); + assertEquals("Darwin", result.get(1)[1]); + assertEquals("Albert", result.get(2)[0]); + } + @Test public final void testParseWithColumnSizeMismatching() {