Repository: nifi Updated Branches: refs/heads/master 4fe7cb33e -> c6106d1d8
NIFI-5525 - CSVRecordReader fails with StringIndexOutOfBoundsException when field is a double quote review Signed-off-by: Matthew Burgess <[email protected]> This closes #3092 Project: http://git-wip-us.apache.org/repos/asf/nifi/repo Commit: http://git-wip-us.apache.org/repos/asf/nifi/commit/c6106d1d Tree: http://git-wip-us.apache.org/repos/asf/nifi/tree/c6106d1d Diff: http://git-wip-us.apache.org/repos/asf/nifi/diff/c6106d1d Branch: refs/heads/master Commit: c6106d1d885598dcc16dd0420112f6624e5685da Parents: 4fe7cb3 Author: Pierre Villard <[email protected]> Authored: Fri Oct 19 10:44:00 2018 +0200 Committer: Matthew Burgess <[email protected]> Committed: Mon Oct 22 16:58:36 2018 -0400 ---------------------------------------------------------------------- .../java/org/apache/nifi/csv/AbstractCSVRecordReader.java | 9 ++++++--- .../test/java/org/apache/nifi/csv/TestCSVRecordReader.java | 9 ++++++--- 2 files changed, 12 insertions(+), 6 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/nifi/blob/c6106d1d/nifi-nar-bundles/nifi-standard-services/nifi-record-serialization-services-bundle/nifi-record-serialization-services/src/main/java/org/apache/nifi/csv/AbstractCSVRecordReader.java ---------------------------------------------------------------------- diff --git a/nifi-nar-bundles/nifi-standard-services/nifi-record-serialization-services-bundle/nifi-record-serialization-services/src/main/java/org/apache/nifi/csv/AbstractCSVRecordReader.java b/nifi-nar-bundles/nifi-standard-services/nifi-record-serialization-services-bundle/nifi-record-serialization-services/src/main/java/org/apache/nifi/csv/AbstractCSVRecordReader.java index 62ddc81..746b1ce 100644 --- a/nifi-nar-bundles/nifi-standard-services/nifi-record-serialization-services-bundle/nifi-record-serialization-services/src/main/java/org/apache/nifi/csv/AbstractCSVRecordReader.java +++ b/nifi-nar-bundles/nifi-standard-services/nifi-record-serialization-services-bundle/nifi-record-serialization-services/src/main/java/org/apache/nifi/csv/AbstractCSVRecordReader.java @@ -17,7 +17,6 @@ package org.apache.nifi.csv; - import org.apache.nifi.logging.ComponentLog; import org.apache.nifi.serialization.RecordReader; import org.apache.nifi.serialization.record.DataType; @@ -79,7 +78,7 @@ abstract public class AbstractCSVRecordReader implements RecordReader { return value; } - final String trimmed = value.startsWith("\"") && value.endsWith("\"") && (value.length() > 1) ? value.substring(1, value.length() - 1) : value; + final String trimmed = trim(value); if (trimmed.isEmpty()) { return null; } @@ -92,7 +91,7 @@ abstract public class AbstractCSVRecordReader implements RecordReader { return value; } - final String trimmed = value.startsWith("\"") && value.endsWith("\"") ? value.substring(1, value.length() - 1) : value; + final String trimmed = trim(value); if (trimmed.isEmpty()) { return null; } @@ -132,6 +131,10 @@ abstract public class AbstractCSVRecordReader implements RecordReader { return value; } + private String trim(String value) { + return (value.length() > 1) && value.startsWith("\"") && value.endsWith("\"") ? value.substring(1, value.length() - 1) : value; + } + @Override public RecordSchema getSchema() { return schema; http://git-wip-us.apache.org/repos/asf/nifi/blob/c6106d1d/nifi-nar-bundles/nifi-standard-services/nifi-record-serialization-services-bundle/nifi-record-serialization-services/src/test/java/org/apache/nifi/csv/TestCSVRecordReader.java ---------------------------------------------------------------------- diff --git a/nifi-nar-bundles/nifi-standard-services/nifi-record-serialization-services-bundle/nifi-record-serialization-services/src/test/java/org/apache/nifi/csv/TestCSVRecordReader.java b/nifi-nar-bundles/nifi-standard-services/nifi-record-serialization-services-bundle/nifi-record-serialization-services/src/test/java/org/apache/nifi/csv/TestCSVRecordReader.java index 5095767..7ddcc29 100644 --- a/nifi-nar-bundles/nifi-standard-services/nifi-record-serialization-services-bundle/nifi-record-serialization-services/src/test/java/org/apache/nifi/csv/TestCSVRecordReader.java +++ b/nifi-nar-bundles/nifi-standard-services/nifi-record-serialization-services-bundle/nifi-record-serialization-services/src/test/java/org/apache/nifi/csv/TestCSVRecordReader.java @@ -597,7 +597,7 @@ public class TestCSVRecordReader { @Test public void testQuote() throws IOException, MalformedRecordException { final CSVFormat format = CSVFormat.RFC4180.withFirstRecordAsHeader().withTrim().withQuote('"'); - final String text = "\"name\"\n\"\"\"\""; + final String text = "\"name\"\n\"\"\"\"\n\"\"\"\""; final List<RecordField> fields = new ArrayList<>(); fields.add(new RecordField("name", RecordFieldType.STRING.getDataType())); @@ -607,9 +607,12 @@ public class TestCSVRecordReader { final CSVRecordReader reader = new CSVRecordReader(bais, Mockito.mock(ComponentLog.class), schema, format, true, false, RecordFieldType.DATE.getDefaultFormat(), RecordFieldType.TIME.getDefaultFormat(), RecordFieldType.TIMESTAMP.getDefaultFormat(), StandardCharsets.UTF_8.name())) { - final Record record = reader.nextRecord(); - final String name = (String)record.getValue("name"); + Record record = reader.nextRecord(); + String name = (String)record.getValue("name"); + assertEquals("\"", name); + record = reader.nextRecord(false, false); + name = (String)record.getValue("name"); assertEquals("\"", name); } }
