You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by gg...@apache.org on 2013/07/30 18:22:07 UTC
svn commit: r1508509 - in /commons/proper/csv/trunk/src:
main/java/org/apache/commons/csv/ test/java/org/apache/commons/csv/
Author: ggregory
Date: Tue Jul 30 16:22:07 2013
New Revision: 1508509
URL: http://svn.apache.org/r1508509
Log:
Change CSVFormat#Iterable<CSVRecord> parse(final Reader in) to return a CSVParser, which is compatible since CSVParser implements Iterable<CSVRecord>. This allows a caller to end the parsing by calling CSVParser#close() or to use CSVParser in a Java 7 try-with-resources, without tracking a reader or input stream.
Modified:
commons/proper/csv/trunk/src/main/java/org/apache/commons/csv/CSVFormat.java
commons/proper/csv/trunk/src/main/java/org/apache/commons/csv/CSVParser.java
commons/proper/csv/trunk/src/main/java/org/apache/commons/csv/ExtendedBufferedReader.java
commons/proper/csv/trunk/src/main/java/org/apache/commons/csv/Lexer.java
commons/proper/csv/trunk/src/test/java/org/apache/commons/csv/CSVParserTest.java
Modified: commons/proper/csv/trunk/src/main/java/org/apache/commons/csv/CSVFormat.java
URL: http://svn.apache.org/viewvc/commons/proper/csv/trunk/src/main/java/org/apache/commons/csv/CSVFormat.java?rev=1508509&r1=1508508&r2=1508509&view=diff
==============================================================================
--- commons/proper/csv/trunk/src/main/java/org/apache/commons/csv/CSVFormat.java (original)
+++ commons/proper/csv/trunk/src/main/java/org/apache/commons/csv/CSVFormat.java Tue Jul 30 16:22:07 2013
@@ -449,16 +449,16 @@ public class CSVFormat implements Serial
return quoteChar != null;
}
- /**
- * Parses the specified content.
- *
- * @param in
- * the input stream
- * @return a stream of CSVRecord
- * @throws IOException
- * If an I/O error occurs
- */
- public Iterable<CSVRecord> parse(final Reader in) throws IOException {
+ /**
+ * Parses the specified content.
+ *
+ * @param in
+ * the input stream
+ * @return a parser over a stream of {@link #CSVRecord}s.
+ * @throws IOException
+ * If an I/O error occurs
+ */
+ public CSVParser parse(final Reader in) throws IOException {
return new CSVParser(in, this);
}
Modified: commons/proper/csv/trunk/src/main/java/org/apache/commons/csv/CSVParser.java
URL: http://svn.apache.org/viewvc/commons/proper/csv/trunk/src/main/java/org/apache/commons/csv/CSVParser.java?rev=1508509&r1=1508508&r2=1508509&view=diff
==============================================================================
--- commons/proper/csv/trunk/src/main/java/org/apache/commons/csv/CSVParser.java (original)
+++ commons/proper/csv/trunk/src/main/java/org/apache/commons/csv/CSVParser.java Tue Jul 30 16:22:07 2013
@@ -236,6 +236,9 @@ public class CSVParser implements Iterab
/**
* Closes resources.
+ *
+ * @throws IOException
+ * If an I/O error occurs
*/
public void close() throws IOException {
if (lexer != null) {
@@ -309,6 +312,9 @@ public class CSVParser implements Iterab
}
public boolean hasNext() {
+ if (isClosed()) {
+ return false;
+ }
if (current == null) {
current = getNextRecord();
}
@@ -317,6 +323,9 @@ public class CSVParser implements Iterab
}
public CSVRecord next() {
+ if (isClosed()) {
+ return null;
+ }
CSVRecord next = current;
current = null;
@@ -337,4 +346,8 @@ public class CSVParser implements Iterab
};
}
+ public boolean isClosed() {
+ return lexer.isClosed();
+ }
+
}
Modified: commons/proper/csv/trunk/src/main/java/org/apache/commons/csv/ExtendedBufferedReader.java
URL: http://svn.apache.org/viewvc/commons/proper/csv/trunk/src/main/java/org/apache/commons/csv/ExtendedBufferedReader.java?rev=1508509&r1=1508508&r2=1508509&view=diff
==============================================================================
--- commons/proper/csv/trunk/src/main/java/org/apache/commons/csv/ExtendedBufferedReader.java (original)
+++ commons/proper/csv/trunk/src/main/java/org/apache/commons/csv/ExtendedBufferedReader.java Tue Jul 30 16:22:07 2013
@@ -41,6 +41,8 @@ final class ExtendedBufferedReader exten
/** The count of EOLs (CR/LF/CRLF) seen so far */
private long eolCounter = 0;
+
+ private boolean closed;
/**
* Created extended buffered reader using default buffer-size
@@ -154,4 +156,23 @@ final class ExtendedBufferedReader exten
}
return eolCounter + 1; // Allow for counter being incremented only at EOL
}
+
+ public boolean isClosed() {
+ return closed;
+ }
+
+ /**
+ * Closes the stream.
+ *
+ * @throws IOException
+ * If an I/O error occurs
+ */
+ @Override
+ public void close() throws IOException {
+ // Set ivars before calling super close() in case close() throws an IOException.
+ closed = true;
+ lastChar = END_OF_STREAM;
+ super.close();
+ }
+
}
Modified: commons/proper/csv/trunk/src/main/java/org/apache/commons/csv/Lexer.java
URL: http://svn.apache.org/viewvc/commons/proper/csv/trunk/src/main/java/org/apache/commons/csv/Lexer.java?rev=1508509&r1=1508508&r2=1508509&view=diff
==============================================================================
--- commons/proper/csv/trunk/src/main/java/org/apache/commons/csv/Lexer.java (original)
+++ commons/proper/csv/trunk/src/main/java/org/apache/commons/csv/Lexer.java Tue Jul 30 16:22:07 2013
@@ -148,6 +148,10 @@ abstract class Lexer implements Closeabl
abstract Token nextToken(Token reusableToken) throws IOException;
+ boolean isClosed() {
+ return in.isClosed();
+ }
+
/**
* @return true if the given char is a whitespace character
*/
@@ -197,10 +201,11 @@ abstract class Lexer implements Closeabl
/**
* Closes resources.
+ *
+ * @throws IOException
+ * If an I/O error occurs
*/
public void close() throws IOException {
- if (in != null) {
- in.close();
- }
+ in.close();
}
}
Modified: commons/proper/csv/trunk/src/test/java/org/apache/commons/csv/CSVParserTest.java
URL: http://svn.apache.org/viewvc/commons/proper/csv/trunk/src/test/java/org/apache/commons/csv/CSVParserTest.java?rev=1508509&r1=1508508&r2=1508509&view=diff
==============================================================================
--- commons/proper/csv/trunk/src/test/java/org/apache/commons/csv/CSVParserTest.java (original)
+++ commons/proper/csv/trunk/src/test/java/org/apache/commons/csv/CSVParserTest.java Tue Jul 30 16:22:07 2013
@@ -39,7 +39,6 @@ import java.util.Map;
import java.util.NoSuchElementException;
import org.junit.Assert;
-
import org.junit.Ignore;
import org.junit.Test;
@@ -396,6 +395,19 @@ public class CSVParserTest {
}
@Test
+ public void testClose() throws Exception {
+ final Reader in = new StringReader("# comment\na,b,c\n1,2,3\nx,y,z");
+ final CSVParser parser = CSVFormat.DEFAULT.withCommentStart('#').withHeader().parse(in);
+ final Iterator<CSVRecord> records = parser.iterator();
+ assertTrue(records.hasNext());
+ parser.close();
+ assertFalse(records.hasNext());
+ assertNull(records.next());
+ assertFalse(records.hasNext());
+ assertNull(records.next());
+ }
+
+ @Test
public void testCarriageReturnEndings() throws IOException {
final String code = "foo\rbaar,\rhello,world\r,kanu";
final CSVParser parser = new CSVParser(new StringReader(code));
@@ -605,22 +617,22 @@ public class CSVParserTest {
@Test
public void testGetLineNumberWithLF() throws Exception {
- validateLineNumbers(String.valueOf(LF));
+ this.validateLineNumbers(String.valueOf(LF));
}
@Test
public void testGetLineNumberWithCRLF() throws Exception {
- validateLineNumbers(CRLF);
+ this.validateLineNumbers(CRLF);
}
@Test
public void testGetLineNumberWithCR() throws Exception {
- validateLineNumbers(String.valueOf(CR));
+ this.validateLineNumbers(String.valueOf(CR));
}
@Test
public void testGetRecordNumberWithLF() throws Exception {
- validateRecordNumbers(String.valueOf(LF));
+ this.validateRecordNumbers(String.valueOf(LF));
}
@Test
@@ -649,17 +661,17 @@ public class CSVParserTest {
@Test
public void testGetRecordNumberWithCRLF() throws Exception {
- validateRecordNumbers(CRLF);
+ this.validateRecordNumbers(CRLF);
}
@Test
public void testGetRecordNumberWithCR() throws Exception {
- validateRecordNumbers(String.valueOf(CR));
+ this.validateRecordNumbers(String.valueOf(CR));
}
@Test(expected = IllegalArgumentException.class)
public void testInvalidFormat() throws Exception {
- CSVFormat invalidFormat = CSVFormat.DEFAULT.withDelimiter(CR);
+ final CSVFormat invalidFormat = CSVFormat.DEFAULT.withDelimiter(CR);
new CSVParser((Reader) null, invalidFormat);
}