From f61c009c41cf7d869818979f1ac9ad5efb343fcc Mon Sep 17 00:00:00 2001 From: ribeaudc <ribeaudc> Date: Tue, 7 Aug 2007 07:05:08 +0000 Subject: [PATCH] LMS-74 change: - polishing exception handling in parser SVN: 1249 --- .../parser/AbstractParserObjectFactory.java | 5 ++- .../common/parser/DefaultReaderParser.java | 22 ++++++++----- .../AbstractParserObjectFactoryTest.java | 27 +++++++++++++++ .../parser/DefaultReaderParserTest.java | 33 +++++++++++++++++-- .../common/parser/ParserUtilitiesTest.java | 13 +++++--- 5 files changed, 80 insertions(+), 20 deletions(-) create mode 100644 common/sourceTest/java/ch/systemsx/cisd/common/parser/AbstractParserObjectFactoryTest.java diff --git a/common/source/java/ch/systemsx/cisd/common/parser/AbstractParserObjectFactory.java b/common/source/java/ch/systemsx/cisd/common/parser/AbstractParserObjectFactory.java index 9b3c4427704..c9c464a2612 100644 --- a/common/source/java/ch/systemsx/cisd/common/parser/AbstractParserObjectFactory.java +++ b/common/source/java/ch/systemsx/cisd/common/parser/AbstractParserObjectFactory.java @@ -20,7 +20,6 @@ import java.beans.PropertyDescriptor; import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; -import java.util.Arrays; import java.util.Collection; import java.util.Collections; import java.util.HashMap; @@ -148,8 +147,8 @@ public abstract class AbstractParserObjectFactory<E> implements IParserObjectFac int column = propertyModel.getColumn(); if (column >= lineTokens.length) { - throw UserFailureException.fromTemplate("Column index '%s' bigger than available line tokens '%s'.", - column, Arrays.asList(lineTokens)); + throw UserFailureException.fromTemplate("Not enough tokens are available (index: %d, available: %d)", + column, lineTokens.length); } return lineTokens[column]; } diff --git a/common/source/java/ch/systemsx/cisd/common/parser/DefaultReaderParser.java b/common/source/java/ch/systemsx/cisd/common/parser/DefaultReaderParser.java index 112877f94ed..80db898cce1 100644 --- a/common/source/java/ch/systemsx/cisd/common/parser/DefaultReaderParser.java +++ b/common/source/java/ch/systemsx/cisd/common/parser/DefaultReaderParser.java @@ -18,6 +18,7 @@ package ch.systemsx.cisd.common.parser; import java.io.Reader; import java.util.ArrayList; +import java.util.Arrays; import java.util.List; import org.apache.commons.io.IOUtils; @@ -48,15 +49,9 @@ public class DefaultReaderParser<E> implements IReaderParser<E> this.lineTokenizer = lineTokenizer; } - protected E createObject(int lineNumber, String[] tokens) + protected E createObject(String[] tokens) { - try - { - return factory.createObject(tokens); - } catch (RuntimeException ex) - { - throw new ParseException(ex.getMessage(), lineNumber); - } + return factory.createObject(tokens); } /** @@ -92,7 +87,16 @@ public class DefaultReaderParser<E> implements IReaderParser<E> if (lineFilter.acceptLine(nextLine, lineNumber)) { String[] tokens = parseLine(lineNumber, nextLine); - elements.add(createObject(lineNumber, tokens)); + E object; + try + { + object = createObject(tokens); + } catch (RuntimeException ex) + { + throw new ParseException(String.format("Creating an object with following tokens '%s' failed.", + Arrays.asList(tokens)), ex, lineNumber); + } + elements.add(object); } } lineTokenizer.destroy(); diff --git a/common/sourceTest/java/ch/systemsx/cisd/common/parser/AbstractParserObjectFactoryTest.java b/common/sourceTest/java/ch/systemsx/cisd/common/parser/AbstractParserObjectFactoryTest.java new file mode 100644 index 00000000000..f2ca242f0e9 --- /dev/null +++ b/common/sourceTest/java/ch/systemsx/cisd/common/parser/AbstractParserObjectFactoryTest.java @@ -0,0 +1,27 @@ +/* + * Copyright 2007 ETH Zuerich, CISD + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package ch.systemsx.cisd.common.parser; + +/** + * Test cases for corresponding {@link AbstractParserObjectFactory} class. + * + * @author Christian Ribeaud + */ +public final class AbstractParserObjectFactoryTest +{ + +} \ No newline at end of file diff --git a/common/sourceTest/java/ch/systemsx/cisd/common/parser/DefaultReaderParserTest.java b/common/sourceTest/java/ch/systemsx/cisd/common/parser/DefaultReaderParserTest.java index db3bfc85b2b..55636f55f36 100644 --- a/common/sourceTest/java/ch/systemsx/cisd/common/parser/DefaultReaderParserTest.java +++ b/common/sourceTest/java/ch/systemsx/cisd/common/parser/DefaultReaderParserTest.java @@ -18,7 +18,6 @@ package ch.systemsx.cisd.common.parser; import static org.testng.AssertJUnit.assertEquals; -import java.io.IOException; import java.io.Reader; import java.io.StringReader; import java.util.List; @@ -39,7 +38,7 @@ public final class DefaultReaderParserTest + "Marcel\tOdiet\tRue des Pervenches 46\t2800 DelŽmont\n"; @Test - public final void testParseWithoutFactoryAndHeader() throws IOException + public final void testParseWithoutFactoryAndHeader() { final IReaderParser<String[]> parser = new DefaultReaderParser<String[]>(); parser.setObjectFactory(IParserObjectFactory.STRING_ARRAY_OBJECT_FACTORY); @@ -53,7 +52,7 @@ public final class DefaultReaderParserTest } @Test - public final void testParseWithoutFactoryWithLineFilter() throws IOException + public final void testParseWithoutFactoryWithLineFilter() { final IReaderParser<String[]> parser = new DefaultReaderParser<String[]>(); parser.setObjectFactory(IParserObjectFactory.STRING_ARRAY_OBJECT_FACTORY); @@ -64,4 +63,32 @@ public final class DefaultReaderParserTest assertEquals(result.get(1)[2], "Rue des Pervenches 46"); IOUtils.closeQuietly(reader); } + + @Test + public final void testCreateObjectWithException() + { + final IReaderParser<String[]> parser = new DefaultReaderParser<String[]>() + { + // + // DefaultReaderParser + // + @Override + protected String[] createObject(String[] tokens) + { + throw new ArrayIndexOutOfBoundsException(); + } + }; + parser.setObjectFactory(IParserObjectFactory.STRING_ARRAY_OBJECT_FACTORY); + final Reader reader = new StringReader(text); + try + { + parser.parse(reader, new HeaderLineFilter(2)); + } catch (ParseException ex) + { + assertEquals( + "Creating an object with following tokens '[Christian, Ribeaud, Kapfrain 2/2, Efringen-Kirchen]' failed.", + ex.getMessage()); + assertEquals(3, ex.getLineNumber()); + } + } } \ No newline at end of file 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 252dd05efdf..4b4fc1b5878 100644 --- a/common/sourceTest/java/ch/systemsx/cisd/common/parser/ParserUtilitiesTest.java +++ b/common/sourceTest/java/ch/systemsx/cisd/common/parser/ParserUtilitiesTest.java @@ -25,8 +25,8 @@ import java.util.Arrays; import org.apache.commons.io.FileUtils; import org.apache.commons.lang.StringUtils; -import org.testng.annotations.AfterSuite; -import org.testng.annotations.BeforeSuite; +import org.testng.annotations.AfterClass; +import org.testng.annotations.BeforeClass; import org.testng.annotations.Test; import ch.systemsx.cisd.common.logging.LogInitializer; @@ -40,9 +40,11 @@ import ch.systemsx.cisd.common.parser.ParserUtilities.Line; public final class ParserUtilitiesTest { - private static final File workingDirectory = new File("targets" + File.separator + "unit-test-wd"); + private static final File unitTestRootDirectory = new File("targets" + File.separator + "unit-test-wd"); - @BeforeSuite + private static final File workingDirectory = new File(unitTestRootDirectory, "ParserUtilitiesTest"); + + @BeforeClass public final void setUp() { LogInitializer.init(); @@ -50,10 +52,11 @@ public final class ParserUtilitiesTest assert workingDirectory.isDirectory(); } - @AfterSuite + @AfterClass public void tearDown() throws IOException { FileUtils.deleteDirectory(workingDirectory); + workingDirectory.deleteOnExit(); } @Test -- GitLab