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 c22ff413ac477a0e43c723ec4e265e211f028de0
Author: Gary Gregory <[email protected]>
AuthorDate: Sat Jan 21 14:34:46 2023 -0500

    Revert "Add support for trailing text after the closing quote, for Excel 
compatibility."
    
    This reverts commit ed0ca2232105f6df1f3fc68762f03c7595dc20c2.
---
 .../java/org/apache/commons/csv/CSVFormat.java     | 48 ++++------------------
 src/main/java/org/apache/commons/csv/Lexer.java    | 14 ++-----
 .../java/org/apache/commons/csv/LexerTest.java     | 13 ------
 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 1cdd73c4..81b6f193 100644
--- a/src/main/java/org/apache/commons/csv/CSVFormat.java
+++ b/src/main/java/org/apache/commons/csv/CSVFormat.java
@@ -208,8 +208,6 @@ public final class CSVFormat implements Serializable {
 
         private boolean allowMissingColumnNames;
 
-        private boolean allowTrailingText;
-
         private boolean autoFlush;
 
         private Character commentMarker;
@@ -266,7 +264,6 @@ public final class CSVFormat implements Serializable {
             this.autoFlush = csvFormat.autoFlush;
             this.quotedNullString = csvFormat.quotedNullString;
             this.duplicateHeaderMode = csvFormat.duplicateHeaderMode;
-            this.allowTrailingText = csvFormat.allowTrailingText;
         }
 
         /**
@@ -304,20 +301,6 @@ public final class CSVFormat implements Serializable {
             return this;
         }
 
-        /**
-         * Sets whether to allow trailing text in a quoted field, after the 
closing quote.
-         *
-         * @param allowTrailingText the trailing text behavior, {@code true} 
to append that text to the field contents, {@code false} to throw
-         *        an {@link IOException}.
-         *
-         * @return This instance.
-         * @since 1.10.0
-         */
-        public Builder setAllowTrailingText(final boolean allowTrailingText) {
-            this.allowTrailingText = allowTrailingText;
-            return this;
-        }
-
         /**
          * Sets whether to flush on close.
          *
@@ -827,7 +810,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, DuplicateHeaderMode.ALLOW_ALL);
 
     /**
      * 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
@@ -851,7 +834,6 @@ public final class CSVFormat implements Serializable {
      * <li>{@code setIgnoreEmptyLines(false)}</li>
      * <li>{@code setAllowMissingColumnNames(true)}</li>
      * <li>{@code setDuplicateHeaderMode(DuplicateHeaderMode.ALLOW_ALL)}</li>
-     * <li>{@code setAllowTrailingText(true)}</li>
      * </ul>
      * <p>
      * Note: This is currently like {@link #RFC4180} plus {@link 
Builder#setAllowMissingColumnNames(boolean) 
Builder#setAllowMissingColumnNames(true)} and
@@ -864,7 +846,6 @@ public final class CSVFormat implements Serializable {
     public static final CSVFormat EXCEL = DEFAULT.builder()
             .setIgnoreEmptyLines(false)
             .setAllowMissingColumnNames(true)
-            .setAllowTrailingText(true)
             .build();
     // @formatter:on
 
@@ -1287,7 +1268,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);
+                DuplicateHeaderMode.ALLOW_ALL);
     }
 
     static String[] toStringArray(final Object[] values) {
@@ -1331,8 +1312,6 @@ public final class CSVFormat implements Serializable {
 
     private final boolean allowMissingColumnNames;
 
-    private final boolean allowTrailingText;
-
     private final boolean autoFlush;
 
     private final Character commentMarker; // null if commenting is disabled
@@ -1387,7 +1366,6 @@ public final class CSVFormat implements Serializable {
         this.autoFlush = builder.autoFlush;
         this.quotedNullString = builder.quotedNullString;
         this.duplicateHeaderMode = builder.duplicateHeaderMode;
-        this.allowTrailingText = builder.allowTrailingText;
         validate();
     }
 
@@ -1418,7 +1396,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 DuplicateHeaderMode duplicateHeaderMode) {
         this.delimiter = delimiter;
         this.quoteCharacter = quoteChar;
         this.quoteMode = quoteMode;
@@ -1438,7 +1416,6 @@ public final class CSVFormat implements Serializable {
         this.autoFlush = autoFlush;
         this.quotedNullString = quoteCharacter + nullString + quoteCharacter;
         this.duplicateHeaderMode = duplicateHeaderMode;
-        this.allowTrailingText = allowTrailingText;
         validate();
     }
 
@@ -1492,8 +1469,7 @@ public final class CSVFormat implements Serializable {
                 ignoreHeaderCase == other.ignoreHeaderCase && 
ignoreSurroundingSpaces == other.ignoreSurroundingSpaces &&
                 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;
+                skipHeaderRecord == other.skipHeaderRecord && 
trailingDelimiter == other.trailingDelimiter && trim == other.trim;
     }
 
     /**
@@ -1536,16 +1512,6 @@ public final class CSVFormat implements Serializable {
         return allowMissingColumnNames;
     }
 
-    /**
-     * Gets whether quoted fields allow trailing text after the closing quote.
-     *
-     * @return {@code true} if allowed, {@code false} to throw an {@link 
IOException}.
-     * @since 1.10.0
-     */
-    public boolean getAllowTrailingText() {
-        return allowTrailingText;
-    }
-
     /**
      * Gets whether to flush on close.
      *
@@ -1726,9 +1692,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, 
allowMissingColumnNames, allowTrailingText, autoFlush, commentMarker, delimiter,
-                escapeCharacter, ignoreEmptyLines, ignoreHeaderCase, 
ignoreSurroundingSpaces, nullString, quoteCharacter, quoteMode, 
quotedNullString,
-                recordSeparator, skipHeaderRecord, trailingDelimiter, trim);
+        return prime * result + Objects.hash(duplicateHeaderMode, 
allowMissingColumnNames, 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 fd60b5ac..06b2c9c2 100644
--- a/src/main/java/org/apache/commons/csv/Lexer.java
+++ b/src/main/java/org/apache/commons/csv/Lexer.java
@@ -57,7 +57,6 @@ final class Lexer implements Closeable {
 
     private final boolean ignoreSurroundingSpaces;
     private final boolean ignoreEmptyLines;
-    private final boolean allowTrailingText;
 
     /** The input stream */
     private final ExtendedBufferedReader reader;
@@ -73,7 +72,6 @@ final class Lexer implements Closeable {
         this.commentStart = mapNullToDisabled(format.getCommentMarker());
         this.ignoreSurroundingSpaces = format.getIgnoreSurroundingSpaces();
         this.ignoreEmptyLines = format.getIgnoreEmptyLines();
-        this.allowTrailingText = format.getAllowTrailingText();
         this.delimiterBuf = new char[delimiter.length - 1];
         this.escapeDelimiterBuf = new char[2 * delimiter.length - 1];
     }
@@ -366,14 +364,10 @@ final class Lexer implements Closeable {
                             token.type = EORECORD;
                             return token;
                         }
-                        if (allowTrailingText) {
-                            token.content.append((char) c);
-                        } else {
-                            if (!Character.isWhitespace((char)c)) {
-                                // error invalid char between token and next 
delimiter
-                                throw new IOException("(line " + 
getCurrentLineNumber() +
-                                        ") invalid char between encapsulated 
token and delimiter");
-                            }
+                        if (!Character.isWhitespace((char)c)) {
+                            // error invalid char between token and next 
delimiter
+                            throw new IOException("(line " + 
getCurrentLineNumber() +
+                                    ") invalid char between encapsulated token 
and delimiter");
                         }
                     }
                 }
diff --git a/src/test/java/org/apache/commons/csv/LexerTest.java 
b/src/test/java/org/apache/commons/csv/LexerTest.java
index 7edc7d86..cc8d728a 100644
--- a/src/test/java/org/apache/commons/csv/LexerTest.java
+++ b/src/test/java/org/apache/commons/csv/LexerTest.java
@@ -431,17 +431,4 @@ public class LexerTest {
         lexer.trimTrailingSpaces(buffer);
         assertThat(lexer.nextToken(new Token()), matches(EOF, ""));
     }
-
-    @Test
-    public void testTrailingTextAfterQuote() throws Exception {
-        final String code = "\"a\" b,\"a\" \" b,\"a\" b \"\"";
-        try (final Lexer parser = createLexer(code, 
CSVFormat.Builder.create().setAllowTrailingText(true).build())) {
-            assertThat(parser.nextToken(new Token()), matches(TOKEN, "a b"));
-            assertThat(parser.nextToken(new Token()), matches(TOKEN, "a \" 
b"));
-            assertThat(parser.nextToken(new Token()), matches(EOF, "a b 
\"\""));
-        }
-        try (final Lexer parser = createLexer(code, 
CSVFormat.Builder.create().setAllowTrailingText(false).build())) {
-            assertThrows(IOException.class, () -> lexer.nextToken(new 
Token()));
-        }
-    }
 }

Reply via email to