This is an automated email from the ASF dual-hosted git repository.

ggregory pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/commons-csv.git

commit d81528fb814cfa2675966e163b6885d6b7cb9e58
Author: Gary Gregory <[email protected]>
AuthorDate: Sat Jan 21 14:34:46 2023 -0500

    Revert "Add a setting that controls whether the last field on the last 
line, if quoted, has to have a closing quote before the file ends."
    
    This reverts commit d0ea9e3a000aa358a4960df6cfc8abd735a3d165.
---
 .../java/org/apache/commons/csv/CSVFormat.java     | 46 ++++------------------
 src/main/java/org/apache/commons/csv/Lexer.java    | 14 ++-----
 .../java/org/apache/commons/csv/LexerTest.java     | 15 +------
 3 files changed, 11 insertions(+), 64 deletions(-)

diff --git a/src/main/java/org/apache/commons/csv/CSVFormat.java 
b/src/main/java/org/apache/commons/csv/CSVFormat.java
index 280f99f2..1cdd73c4 100644
--- a/src/main/java/org/apache/commons/csv/CSVFormat.java
+++ b/src/main/java/org/apache/commons/csv/CSVFormat.java
@@ -206,8 +206,6 @@ public final class CSVFormat implements Serializable {
             return new Builder(csvFormat);
         }
 
-        private boolean allowEofWithoutClosingQuote;
-
         private boolean allowMissingColumnNames;
 
         private boolean allowTrailingText;
@@ -269,7 +267,6 @@ public final class CSVFormat implements Serializable {
             this.quotedNullString = csvFormat.quotedNullString;
             this.duplicateHeaderMode = csvFormat.duplicateHeaderMode;
             this.allowTrailingText = csvFormat.allowTrailingText;
-            this.allowEofWithoutClosingQuote = 
csvFormat.allowEofWithoutClosingQuote;
         }
 
         /**
@@ -294,19 +291,6 @@ public final class CSVFormat implements Serializable {
             return this;
         }
 
-        /**
-         * Sets whether the last field on the last line, if quoted, can have 
no closing quote when the file ends, {@code true} if this is ok,
-         * {@code false} if {@link IOException} should be thrown.
-         *
-         * @param allowEofWithoutClosingQuote whether to allow the last field 
on the last line to have a missing closing quote when the file ends,
-         *                                    {@code true} if so, or {@code 
false} to cause an {@link IOException} to be thrown.
-         * @since 1.10.0
-         */
-        public Builder setAllowEofWithoutClosingQuote(final boolean 
allowEofWithoutClosingQuote) {
-            this.allowEofWithoutClosingQuote = allowEofWithoutClosingQuote;
-            return this;
-        }
-
         /**
          * Sets the parser missing column names behavior, {@code true} to 
allow missing column names in the header line, {@code false} to cause an
          * {@link IllegalArgumentException} to be thrown.
@@ -843,7 +827,7 @@ public final class CSVFormat implements Serializable {
      * @see Predefined#Default
      */
     public static final CSVFormat DEFAULT = new CSVFormat(COMMA, 
DOUBLE_QUOTE_CHAR, null, null, null, false, true, CRLF, null, null, null, 
false, false, false,
-            false, false, false, DuplicateHeaderMode.ALLOW_ALL, false, false);
+            false, false, false, DuplicateHeaderMode.ALLOW_ALL, false);
 
     /**
      * Excel file format (using a comma as the value delimiter). Note that the 
actual value delimiter used by Excel is locale dependent, it might be necessary
@@ -868,7 +852,6 @@ public final class CSVFormat implements Serializable {
      * <li>{@code setAllowMissingColumnNames(true)}</li>
      * <li>{@code setDuplicateHeaderMode(DuplicateHeaderMode.ALLOW_ALL)}</li>
      * <li>{@code setAllowTrailingText(true)}</li>
-     * <li>{@code setAllowEofWithoutClosingQuote(true)}</li>
      * </ul>
      * <p>
      * Note: This is currently like {@link #RFC4180} plus {@link 
Builder#setAllowMissingColumnNames(boolean) 
Builder#setAllowMissingColumnNames(true)} and
@@ -882,7 +865,6 @@ public final class CSVFormat implements Serializable {
             .setIgnoreEmptyLines(false)
             .setAllowMissingColumnNames(true)
             .setAllowTrailingText(true)
-            .setAllowEofWithoutClosingQuote(true)
             .build();
     // @formatter:on
 
@@ -1305,7 +1287,7 @@ public final class CSVFormat implements Serializable {
      */
     public static CSVFormat newFormat(final char delimiter) {
         return new CSVFormat(String.valueOf(delimiter), null, null, null, 
null, false, false, null, null, null, null, false, false, false, false, false, 
false,
-                DuplicateHeaderMode.ALLOW_ALL, false, false);
+                DuplicateHeaderMode.ALLOW_ALL, false);
     }
 
     static String[] toStringArray(final Object[] values) {
@@ -1347,8 +1329,6 @@ public final class CSVFormat implements Serializable {
 
     private final DuplicateHeaderMode duplicateHeaderMode;
 
-    private final boolean allowEofWithoutClosingQuote;
-
     private final boolean allowMissingColumnNames;
 
     private final boolean allowTrailingText;
@@ -1408,7 +1388,6 @@ public final class CSVFormat implements Serializable {
         this.quotedNullString = builder.quotedNullString;
         this.duplicateHeaderMode = builder.duplicateHeaderMode;
         this.allowTrailingText = builder.allowTrailingText;
-        this.allowEofWithoutClosingQuote = builder.allowEofWithoutClosingQuote;
         validate();
     }
 
@@ -1439,7 +1418,7 @@ public final class CSVFormat implements Serializable {
             final boolean ignoreSurroundingSpaces, final boolean 
ignoreEmptyLines, final String recordSeparator, final String nullString,
             final Object[] headerComments, final String[] header, final 
boolean skipHeaderRecord, final boolean allowMissingColumnNames,
             final boolean ignoreHeaderCase, final boolean trim, final boolean 
trailingDelimiter, final boolean autoFlush,
-            final DuplicateHeaderMode duplicateHeaderMode, final boolean 
allowTrailingText, final boolean allowEofWithoutClosingQuote) {
+            final DuplicateHeaderMode duplicateHeaderMode, final boolean 
allowTrailingText) {
         this.delimiter = delimiter;
         this.quoteCharacter = quoteChar;
         this.quoteMode = quoteMode;
@@ -1460,7 +1439,6 @@ public final class CSVFormat implements Serializable {
         this.quotedNullString = quoteCharacter + nullString + quoteCharacter;
         this.duplicateHeaderMode = duplicateHeaderMode;
         this.allowTrailingText = allowTrailingText;
-        this.allowEofWithoutClosingQuote = allowEofWithoutClosingQuote;
         validate();
     }
 
@@ -1515,7 +1493,7 @@ public final class CSVFormat implements Serializable {
                 Objects.equals(nullString, other.nullString) && 
Objects.equals(quoteCharacter, other.quoteCharacter) && quoteMode == 
other.quoteMode &&
                 Objects.equals(quotedNullString, other.quotedNullString) && 
Objects.equals(recordSeparator, other.recordSeparator) &&
                 skipHeaderRecord == other.skipHeaderRecord && 
trailingDelimiter == other.trailingDelimiter && trim == other.trim &&
-                allowTrailingText == other.allowTrailingText && 
allowEofWithoutClosingQuote == other.allowEofWithoutClosingQuote;
+                allowTrailingText == other.allowTrailingText;
     }
 
     /**
@@ -1549,16 +1527,6 @@ public final class CSVFormat implements Serializable {
         return duplicateHeaderMode == DuplicateHeaderMode.ALLOW_ALL;
     }
 
-    /**
-     * Gets whether the file can end before the last field on the last line, 
if quoted, has a closing quote.
-     *
-     * @return {@code true} if so, {@code false} to throw an {@link 
IOException}.
-     * @since 1.10.0
-     */
-    public boolean getAllowEofWithoutClosingQuote() {
-        return allowEofWithoutClosingQuote;
-    }
-
     /**
      * Gets whether missing column names are allowed when parsing the header 
line.
      *
@@ -1758,9 +1726,9 @@ public final class CSVFormat implements Serializable {
         int result = 1;
         result = prime * result + Arrays.hashCode(headers);
         result = prime * result + Arrays.hashCode(headerComments);
-        return prime * result + Objects.hash(duplicateHeaderMode, 
allowEofWithoutClosingQuote, allowMissingColumnNames, allowTrailingText,
-                autoFlush, commentMarker, delimiter, escapeCharacter, 
ignoreEmptyLines, ignoreHeaderCase, ignoreSurroundingSpaces,
-                nullString, quoteCharacter, quoteMode, quotedNullString, 
recordSeparator, skipHeaderRecord, trailingDelimiter, trim);
+        return prime * result + Objects.hash(duplicateHeaderMode, 
allowMissingColumnNames, allowTrailingText, autoFlush, commentMarker, delimiter,
+                escapeCharacter, ignoreEmptyLines, ignoreHeaderCase, 
ignoreSurroundingSpaces, nullString, quoteCharacter, quoteMode, 
quotedNullString,
+                recordSeparator, skipHeaderRecord, trailingDelimiter, trim);
     }
 
     /**
diff --git a/src/main/java/org/apache/commons/csv/Lexer.java 
b/src/main/java/org/apache/commons/csv/Lexer.java
index c43c52ed..fd60b5ac 100644
--- a/src/main/java/org/apache/commons/csv/Lexer.java
+++ b/src/main/java/org/apache/commons/csv/Lexer.java
@@ -58,7 +58,6 @@ final class Lexer implements Closeable {
     private final boolean ignoreSurroundingSpaces;
     private final boolean ignoreEmptyLines;
     private final boolean allowTrailingText;
-    private final boolean allowEofWithoutClosingQuote;
 
     /** The input stream */
     private final ExtendedBufferedReader reader;
@@ -75,7 +74,6 @@ final class Lexer implements Closeable {
         this.ignoreSurroundingSpaces = format.getIgnoreSurroundingSpaces();
         this.ignoreEmptyLines = format.getIgnoreEmptyLines();
         this.allowTrailingText = format.getAllowTrailingText();
-        this.allowEofWithoutClosingQuote = 
format.getAllowEofWithoutClosingQuote();
         this.delimiterBuf = new char[delimiter.length - 1];
         this.escapeDelimiterBuf = new char[2 * delimiter.length - 1];
     }
@@ -380,15 +378,9 @@ final class Lexer implements Closeable {
                     }
                 }
             } else if (isEndOfFile(c)) {
-                if (allowEofWithoutClosingQuote) {
-                    token.type = EOF;
-                    token.isReady = true; // There is data at EOF
-                    return token;
-                } else {
-                    // error condition (end of file before end of token)
-                    throw new IOException("(startline " + startLineNumber +
-                            ") EOF reached before encapsulated token 
finished");
-                }
+                // error condition (end of file before end of token)
+                throw new IOException("(startline " + startLineNumber +
+                        ") EOF reached before encapsulated token finished");
             } else {
                 // consume character
                 token.content.append((char) c);
diff --git a/src/test/java/org/apache/commons/csv/LexerTest.java 
b/src/test/java/org/apache/commons/csv/LexerTest.java
index 85199072..7edc7d86 100644
--- a/src/test/java/org/apache/commons/csv/LexerTest.java
+++ b/src/test/java/org/apache/commons/csv/LexerTest.java
@@ -441,20 +441,7 @@ public class LexerTest {
             assertThat(parser.nextToken(new Token()), matches(EOF, "a b 
\"\""));
         }
         try (final Lexer parser = createLexer(code, 
CSVFormat.Builder.create().setAllowTrailingText(false).build())) {
-            assertThrows(IOException.class, () -> parser.nextToken(new 
Token()));
-        }
-    }
-
-    @Test
-    public void testEOFWithoutClosingQuote() throws Exception {
-        final String code = "a,\"b";
-        try (final Lexer parser = createLexer(code, 
CSVFormat.Builder.create().setAllowEofWithoutClosingQuote(true).build())) {
-            assertThat(parser.nextToken(new Token()), matches(TOKEN, "a"));
-            assertThat(parser.nextToken(new Token()), matches(EOF, "b"));
-        }
-        try (final Lexer parser = createLexer(code, 
CSVFormat.Builder.create().setAllowEofWithoutClosingQuote(false).build())) {
-            assertThat(parser.nextToken(new Token()), matches(TOKEN, "a"));
-            assertThrows(IOException.class, () -> parser.nextToken(new 
Token()));
+            assertThrows(IOException.class, () -> lexer.nextToken(new 
Token()));
         }
     }
 }

Reply via email to