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())); } } }
