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