Updated Branches:
  refs/heads/camel-2.12.x 2b1527a34 -> 3cf431ad6

CAMEL-7098: Cleaned up the CSV DataFormat unmarshalling logic. Added one more 
test to CsvUnmarshalSkipFirstLineTest. Also polished 
CsvUnmarshalStreamSpringTest and added more asserts to it.


Project: http://git-wip-us.apache.org/repos/asf/camel/repo
Commit: http://git-wip-us.apache.org/repos/asf/camel/commit/3cf431ad
Tree: http://git-wip-us.apache.org/repos/asf/camel/tree/3cf431ad
Diff: http://git-wip-us.apache.org/repos/asf/camel/diff/3cf431ad

Branch: refs/heads/camel-2.12.x
Commit: 3cf431ad66e3523480afb0c7d55fe199b5f33252
Parents: 2b1527a
Author: Babak Vahdat <bvah...@apache.org>
Authored: Fri Dec 27 08:28:53 2013 +0100
Committer: Babak Vahdat <bvah...@apache.org>
Committed: Fri Dec 27 08:30:25 2013 +0100

----------------------------------------------------------------------
 .../camel/dataformat/csv/CsvDataFormat.java     | 58 ++++++++------------
 .../camel/dataformat/csv/CsvIterator.java       | 11 ++--
 .../csv/CsvUnmarshalSkipFirstLineTest.java      | 21 +++++--
 .../csv/CsvUnmarshalStreamSpringTest.java       | 20 ++++---
 4 files changed, 59 insertions(+), 51 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/camel/blob/3cf431ad/components/camel-csv/src/main/java/org/apache/camel/dataformat/csv/CsvDataFormat.java
----------------------------------------------------------------------
diff --git 
a/components/camel-csv/src/main/java/org/apache/camel/dataformat/csv/CsvDataFormat.java
 
b/components/camel-csv/src/main/java/org/apache/camel/dataformat/csv/CsvDataFormat.java
index aff2d2a..ae172db 100644
--- 
a/components/camel-csv/src/main/java/org/apache/camel/dataformat/csv/CsvDataFormat.java
+++ 
b/components/camel-csv/src/main/java/org/apache/camel/dataformat/csv/CsvDataFormat.java
@@ -16,24 +16,20 @@
  */
 package org.apache.camel.dataformat.csv;
 
-import java.io.IOException;
 import java.io.InputStream;
 import java.io.InputStreamReader;
 import java.io.OutputStream;
 import java.io.OutputStreamWriter;
 import java.io.Writer;
 import java.util.ArrayList;
-import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
-import java.util.NoSuchElementException;
 import java.util.Set;
 
 import org.apache.camel.Exchange;
 import org.apache.camel.spi.DataFormat;
 import org.apache.camel.util.ExchangeHelper;
 import org.apache.camel.util.IOHelper;
-import org.apache.camel.util.ObjectHelper;
 import org.apache.commons.csv.CSVParser;
 import org.apache.commons.csv.CSVStrategy;
 import org.apache.commons.csv.writer.CSVConfig;
@@ -102,46 +98,40 @@ public class CsvDataFormat implements DataFormat {
         }
         strategy.setDelimiter(config.getDelimiter());
 
-        InputStreamReader in = new InputStreamReader(inputStream, 
IOHelper.getCharsetName(exchange));
-        boolean closeStream = false;
-        CsvIterator csvIterator = null;
+        InputStreamReader in = null;
+        boolean error = false;
         try {
-            CSVParser parser = createParser(in);
-            if (parser == null) {
-                closeStream = true;
-                // return an empty Iterator
-                return ObjectHelper.createIterator(null);
+            in = new InputStreamReader(inputStream, 
IOHelper.getCharsetName(exchange));
+            CSVParser parser = new CSVParser(in, strategy);
+
+            if (skipFirstLine) {
+                // read one line ahead
+                parser.getLine();
             }
-            csvIterator = new CsvIterator(parser, in);
-        } catch (IOException ioe) {
-            closeStream = true;
+
+            CsvIterator csvIterator = new CsvIterator(parser, in);
+            return lazyLoad ? csvIterator : loadAllAsList(csvIterator);
+        } catch (Exception e) {
+            error = true;
+            throw e;
         } finally {
-            if (closeStream) {
+            if (error) {
                 IOHelper.close(in);
             }
         }
-        if (lazyLoad) {
-            return csvIterator;
-        }
-        return loadAllAsList(csvIterator);
     }
 
-    private CSVParser createParser(InputStreamReader in) throws IOException {
-        CSVParser parser = new CSVParser(in, strategy);
-        if (skipFirstLine) {
-            if (parser.getLine() == null) {
-                return null;
+    private List<List<String>> loadAllAsList(CsvIterator iter) {
+        try {
+            List<List<String>> list = new ArrayList<List<String>>();
+            while (iter.hasNext()) {
+                list.add(iter.next());
             }
+            return list;
+        } finally {
+            // close the stream as we've loaded all the data upfront
+            IOHelper.close(iter);
         }
-        return parser;
-    }
-
-    private List<List<String>> loadAllAsList(CsvIterator iter) throws 
IOException {
-        List<List<String>> list = new ArrayList<List<String>>();
-        while (iter.hasNext()) {
-            list.add(iter.next());
-        }
-        return list;
     }
 
     public String getDelimiter() {

http://git-wip-us.apache.org/repos/asf/camel/blob/3cf431ad/components/camel-csv/src/main/java/org/apache/camel/dataformat/csv/CsvIterator.java
----------------------------------------------------------------------
diff --git 
a/components/camel-csv/src/main/java/org/apache/camel/dataformat/csv/CsvIterator.java
 
b/components/camel-csv/src/main/java/org/apache/camel/dataformat/csv/CsvIterator.java
index e9d4c41..6b732da 100644
--- 
a/components/camel-csv/src/main/java/org/apache/camel/dataformat/csv/CsvIterator.java
+++ 
b/components/camel-csv/src/main/java/org/apache/camel/dataformat/csv/CsvIterator.java
@@ -36,8 +36,7 @@ public class CsvIterator implements Iterator<List<String>>, 
Closeable {
     private final InputStreamReader in;
     private String[] line;
 
-    public CsvIterator(CSVParser parser, InputStreamReader in) throws 
IOException
-    {
+    public CsvIterator(CSVParser parser, InputStreamReader in) throws 
IOException {
         this.parser = parser;
         this.in = in;
         line = parser.getLine();
@@ -58,11 +57,11 @@ public class CsvIterator implements Iterator<List<String>>, 
Closeable {
             line = parser.getLine();
         } catch (IOException e) {
             line = null;
-            IOHelper.close(in);
+            close();
             throw new IllegalStateException(e);
         }
         if (line == null) {
-            IOHelper.close(in);
+            close();
         }
         return result;
     }
@@ -73,7 +72,7 @@ public class CsvIterator implements Iterator<List<String>>, 
Closeable {
     }
 
     @Override
-    public void close() throws IOException {
-        in.close();
+    public void close() {
+        IOHelper.close(in);
     }
 }

http://git-wip-us.apache.org/repos/asf/camel/blob/3cf431ad/components/camel-csv/src/test/java/org/apache/camel/dataformat/csv/CsvUnmarshalSkipFirstLineTest.java
----------------------------------------------------------------------
diff --git 
a/components/camel-csv/src/test/java/org/apache/camel/dataformat/csv/CsvUnmarshalSkipFirstLineTest.java
 
b/components/camel-csv/src/test/java/org/apache/camel/dataformat/csv/CsvUnmarshalSkipFirstLineTest.java
index 34dcdc4..800d949 100644
--- 
a/components/camel-csv/src/test/java/org/apache/camel/dataformat/csv/CsvUnmarshalSkipFirstLineTest.java
+++ 
b/components/camel-csv/src/test/java/org/apache/camel/dataformat/csv/CsvUnmarshalSkipFirstLineTest.java
@@ -27,7 +27,7 @@ import org.junit.Test;
 import org.springframework.context.support.ClassPathXmlApplicationContext;
 
 /**
- * Spring based integration test for the <code>CsvDataFormat</code> 
demonstrating the usage of
+ * Spring based test for the <code>CsvDataFormat</code> demonstrating the 
usage of
  * the <tt>skipFirstLine</tt> option.
  */
 public class CsvUnmarshalSkipFirstLineTest extends CamelSpringTestSupport {
@@ -60,8 +60,8 @@ public class CsvUnmarshalSkipFirstLineTest extends 
CamelSpringTestSupport {
     public void testCsvUnMarshalSingleLine() throws Exception {
         result.expectedMessageCount(1);
 
-        // the first line, the same as the second line as well, contains also 
a data row but as we set
-        // skipFirstLine to true the first row gets simply ignored and not 
unmarshalled
+        // the first line contains a data row but as we set skipFirstLine
+        // to true the first line gets simply skipped and not unmarshalled
         template.sendBody("direct:start", "124|ActiveMQ in Action|2\n123|Camel 
in Action|1");
 
         assertMockEndpointsSatisfied();
@@ -72,7 +72,20 @@ public class CsvUnmarshalSkipFirstLineTest extends 
CamelSpringTestSupport {
         assertEquals("Camel in Action", body.get(0).get(1));
         assertEquals("1", body.get(0).get(2));
     }
-    
+
+    @Test
+    public void testCsvUnMarshalNoLine() throws Exception {
+        result.expectedMessageCount(1);
+
+        // the first and last line we intend to skip
+        template.sendBody("direct:start", "123|Camel in Action|1\n");
+
+        assertMockEndpointsSatisfied();
+
+        List<?> body = 
result.getReceivedExchanges().get(0).getIn().getBody(List.class);
+        assertEquals(0, body.size());
+    }
+
     @Override
     protected ClassPathXmlApplicationContext createApplicationContext() {
         return new 
ClassPathXmlApplicationContext("org/apache/camel/dataformat/csv/CsvUnmarshalSkipFirstLineSpringTest-context.xml");

http://git-wip-us.apache.org/repos/asf/camel/blob/3cf431ad/components/camel-csv/src/test/java/org/apache/camel/dataformat/csv/CsvUnmarshalStreamSpringTest.java
----------------------------------------------------------------------
diff --git 
a/components/camel-csv/src/test/java/org/apache/camel/dataformat/csv/CsvUnmarshalStreamSpringTest.java
 
b/components/camel-csv/src/test/java/org/apache/camel/dataformat/csv/CsvUnmarshalStreamSpringTest.java
index 17465b6..42014d1 100644
--- 
a/components/camel-csv/src/test/java/org/apache/camel/dataformat/csv/CsvUnmarshalStreamSpringTest.java
+++ 
b/components/camel-csv/src/test/java/org/apache/camel/dataformat/csv/CsvUnmarshalStreamSpringTest.java
@@ -18,6 +18,7 @@ package org.apache.camel.dataformat.csv;
 
 import java.util.Arrays;
 import java.util.Iterator;
+import java.util.NoSuchElementException;
 
 import org.apache.camel.EndpointInject;
 import org.apache.camel.component.mock.MockEndpoint;
@@ -33,7 +34,6 @@ public class CsvUnmarshalStreamSpringTest extends 
CamelSpringTestSupport {
     @EndpointInject(uri = "mock:result")
     private MockEndpoint result;
 
-    @SuppressWarnings("unchecked")
     @Test
     public void testCsvUnMarshal() throws Exception {
         result.expectedMessageCount(1);
@@ -42,15 +42,21 @@ public class CsvUnmarshalStreamSpringTest extends 
CamelSpringTestSupport {
 
         assertMockEndpointsSatisfied();
 
-        Iterator<String> body = result.getReceivedExchanges().get(0)
-                .getIn().getBody(Iterator.class);
-        assertEquals(CsvIterator.class, body.getClass());
-        assertEquals(Arrays.asList(MESSAGE), body.next());
+        Iterator<?> body = 
result.getReceivedExchanges().get(0).getIn().getBody(Iterator.class);
+        CsvIterator iterator = assertIsInstanceOf(CsvIterator.class, body);
+        assertTrue(iterator.hasNext());
+        assertEquals(Arrays.asList(MESSAGE), iterator.next());
+        assertFalse(iterator.hasNext());
+        try {
+            iterator.next();
+            fail("Should have thrown exception");
+        } catch (NoSuchElementException nsee) {
+            // expected
+        }
     }
 
     @Override
     protected AbstractApplicationContext createApplicationContext() {
-        return new ClassPathXmlApplicationContext(
-                
"org/apache/camel/dataformat/csv/CsvUnmarshalStreamSpringTest-context.xml");
+        return new 
ClassPathXmlApplicationContext("org/apache/camel/dataformat/csv/CsvUnmarshalStreamSpringTest-context.xml");
     }
 }

Reply via email to