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 d0c99bbe4002eded519e2af9ce837d94cf2d6899..3f848408de3a37f14890137b22b641ed93f03d52 100644 --- a/common/source/java/ch/systemsx/cisd/common/parser/DefaultParser.java +++ b/common/source/java/ch/systemsx/cisd/common/parser/DefaultParser.java @@ -73,7 +73,7 @@ public class DefaultParser<E> implements IParser<E> // Parser // - public final List<E> parse(final Iterator<Line> lineIterator, final ILineFilter lineFilter, final long headerLength) + public final List<E> parse(final Iterator<Line> lineIterator, final ILineFilter lineFilter, final int headerLength) throws ParsingException { final List<E> elements = new ArrayList<E>(); @@ -83,7 +83,7 @@ public class DefaultParser<E> implements IParser<E> while (lineIterator.hasNext()) { Line line = lineIterator.next(); - final String nextLine = line.getText(); + String nextLine = line.getText(); int number = line.getNumber(); if (lineFilter.acceptLine(nextLine, number)) { @@ -91,11 +91,23 @@ public class DefaultParser<E> implements IParser<E> E object = null; try { - if (tokens.length > headerLength) + if (tokens.length != headerLength) { + String moreLessStr = tokens.length > headerLength ? "more" : "less"; + StringBuilder lineStructure = new StringBuilder(); + for (int i = 0; i < tokens.length; i++) + { + lineStructure.append(tokens[i]); + if (i + 1 < tokens.length) + { + lineStructure.append(" <TAB> "); + } + } + lineStructure.append(" <END_OF_LINE>"); throw new RuntimeException(String.format( - "Line <%s> has more columns (%s) than the header (%s)", number, String - .valueOf(tokens.length), String.valueOf(headerLength))); + "Line <%s> has %s columns (%s) than the header (%s):\n%s", number, moreLessStr, + String.valueOf(tokens.length), String.valueOf(headerLength), lineStructure + .toString())); } object = createObject(tokens); } catch (final ParserException parserException) 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 f3c5df833d39c58878710141d2348ed4b1e67788..59cbd702d0264025941c53a2a6b56c723ad87b28 100644 --- a/common/source/java/ch/systemsx/cisd/common/parser/IParser.java +++ b/common/source/java/ch/systemsx/cisd/common/parser/IParser.java @@ -35,7 +35,7 @@ public interface IParser<E> * @param headerLength number of columns in the header * @return a <code>List</code> of elements. */ - public List<E> parse(final Iterator<Line> lineIterator, final ILineFilter lineFilter, final long headerLength) + public List<E> parse(final Iterator<Line> lineIterator, final ILineFilter lineFilter, final int headerLength) throws ParsingException; /** 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 2622ce2162f360f17cd77cd1ead484805b3452be..d7880016f6ec89395779f6d263765821bf206868 100644 --- a/common/source/java/ch/systemsx/cisd/common/parser/TabFileLoader.java +++ b/common/source/java/ch/systemsx/cisd/common/parser/TabFileLoader.java @@ -97,7 +97,7 @@ public class TabFileLoader<T> { reader = new FileReader(file); return load(reader); - } catch (IOException ex) + } catch (final IOException ex) { throw new EnvironmentFailureException(ex.getMessage()); } catch (final ParsingException ex) @@ -110,10 +110,10 @@ public class TabFileLoader<T> } } - List<T> load(Reader reader) + List<T> load(final Reader reader) { - List<T> result = new ArrayList<T>(); - Iterator<Line> lineIterator = createLineIterator(reader); + final List<T> result = new ArrayList<T>(); + final Iterator<Line> lineIterator = createLineIterator(reader); if (lineIterator.hasNext() == false) { return result; @@ -136,11 +136,11 @@ public class TabFileLoader<T> final DefaultParser<T> parser = new DefaultParser<T>(); final String[] tokens = StringUtils.split(headerLine, "\t"); - final long headerLength = tokens.length; + final int headerLength = tokens.length; notUnique(tokens); final IAliasPropertyMapper propertyMapper = new HeaderFilePropertyMapper(tokens); parser.setObjectFactory(factory.createFactory(propertyMapper)); - ILineFilter filter = AlwaysAcceptLineFilter.INSTANCE; + final ILineFilter filter = AlwaysAcceptLineFilter.INSTANCE; if (previousLineHasColumnHeaders) { result.addAll(parser.parse(Arrays.asList(line).iterator(), filter, headerLength)); @@ -149,10 +149,10 @@ public class TabFileLoader<T> return result; } - private Iterator<Line> createLineIterator(Reader reader) + private Iterator<Line> createLineIterator(final Reader reader) { final LineIterator lineIterator = IOUtils.lineIterator(reader); - Iterator<Line> iterator = new Iterator<Line>() + final Iterator<Line> iterator = new Iterator<Line>() { private int lineNumber; 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 ac0d353cc24cbe74c13092573652086e231df0b0..7ac7e2c6056fffa6c37e252d1ea864a35c183cfa 100644 --- a/common/sourceTest/java/ch/systemsx/cisd/common/parser/DefaultParserTest.java +++ b/common/sourceTest/java/ch/systemsx/cisd/common/parser/DefaultParserTest.java @@ -36,7 +36,7 @@ public final class DefaultParserTest "Charles\tDarwin\tHumboldt Ave. 1865\t4242 Somewhere", "Albert\tEinstein\tNewton Road 1905\t4711 Princton"); - private final static long HEADER_LENGTH = 4; + private final static int HEADER_LENGTH = 4; @Test public final void testParseWithoutFactoryAndHeader() @@ -80,7 +80,7 @@ public final class DefaultParserTest try { parser.parse(createLineIterator(), new HeaderLineFilter(2), HEADER_LENGTH); - } catch (ParsingException ex) + } catch (final ParsingException ex) { assertEquals("Creating an object with following tokens '[firstName, lastName, address, city]' failed.", ex .getMessage()); @@ -92,7 +92,7 @@ public final class DefaultParserTest { return new Iterator<Line>() { - private Iterator<String> iterator = text.iterator(); + private final Iterator<String> iterator = text.iterator(); private int lineNumber;