From 244030468f8bc6651c24ba4afff7417687fac6ef Mon Sep 17 00:00:00 2001 From: Nikita Shaposhnikov Date: Thu, 16 Jun 2022 18:33:28 +0400 Subject: [PATCH 1/3] fixed last elements as array from message --- .../com/exactpro/th2/codec/csv/CsvCodec.java | 33 +++++++----- .../exactpro/th2/codec/csv/TestCsvCodec.java | 50 ++++++++++++++++++- 2 files changed, 69 insertions(+), 14 deletions(-) diff --git a/src/main/java/com/exactpro/th2/codec/csv/CsvCodec.java b/src/main/java/com/exactpro/th2/codec/csv/CsvCodec.java index 783ed41..370e893 100644 --- a/src/main/java/com/exactpro/th2/codec/csv/CsvCodec.java +++ b/src/main/java/com/exactpro/th2/codec/csv/CsvCodec.java @@ -174,30 +174,37 @@ private void decodeCsvData(Collection errors, MessageGroup.Builder int headerLength = header.length; int rowLength = strings.length; - for (int i = 0; i < headerLength && i < rowLength; i++) { - int extraLength = getGetExtraLength(i, header, rowLength); - if (extraLength == 0) { + for (int i = 0; i < headerLength && i < rowLength; ) { + int extraLength = getHeaderArrayLength(header, i); + if (extraLength == 1) { builder.putFields(header[i], ValueUtils.toValue(strings[i])); + i++; } else { - String[] values = new String[extraLength + 1]; - System.arraycopy(strings, i, values, 0, extraLength + 1); + String[] values = copyArray(strings, i, i+extraLength); builder.putFields(header[i], ValueUtils.toValue(values)); i+=extraLength; } } + + messageBuilder.setMessage(builder); } } - private int getGetExtraLength(int from, String[] headers, int valueLength) { - int count = 0; - for (int i = from + 1; i < headers.length && i < valueLength; i++) { - if (!headers[i].isEmpty()) { - break; - } - count++; + public static String [] copyArray(String [] original, int from, int to){ + String [] copyArr = new String[Integer.min(to, original.length) - from]; + for (int i = from; i < to && i < original.length; i++){ + copyArr[i-from] = original[i]; + } + return copyArr; + } + + private int getHeaderArrayLength(String[] header, int index) { + int length = 1; + for (int i = index + 1; i < header.length && header[i].isEmpty(); i++) { + length++; } - return count; + return length; } private void setMetadata(RawMessageMetadata originalMetadata, Message.Builder messageBuilder, String messageType, int currentIndex) { diff --git a/src/test/java/com/exactpro/th2/codec/csv/TestCsvCodec.java b/src/test/java/com/exactpro/th2/codec/csv/TestCsvCodec.java index e3bd423..a7faac9 100644 --- a/src/test/java/com/exactpro/th2/codec/csv/TestCsvCodec.java +++ b/src/test/java/com/exactpro/th2/codec/csv/TestCsvCodec.java @@ -115,7 +115,55 @@ void decodeArrayWithDifferentLength() throws IOException { } @Test - void decodeArray() throws IOException { + void decodeArrayInEnd() throws IOException { + CsvCodec codec = createCodec(); + MessageGroupBatch batch = MessageGroupBatch.newBuilder() + .addGroups(MessageGroup.newBuilder() + .addMessages(createCsvMessage("A,B,C ,", "1,2,3")) + ).build(); + codec.handler("", batch); + + var captor = ArgumentCaptor.forClass(MessageGroupBatch.class); + verify(routerMock).sendAll(captor.capture(), eq(CsvCodec.DECODE_OUT_ATTRIBUTE)); + + MessageGroupBatch actualBatch = captor.getValue(); + assertNotNull(actualBatch, "Did not capture any publication"); + assertEquals(1, actualBatch.getGroupsCount()); + MessageGroup value = actualBatch.getGroups(0); + assertEquals(2, value.getMessagesCount()); + + Message header = getMessage(value, 0); + assertFieldCount(1, header); + Message message = getMessage(value, 1); + assertFieldCount(3, message); + + assertAll( + () -> assertAll("Current message: " + header, + () -> assertEquals("Csv_Header", header.getMetadata().getMessageType()), + () -> { + assertEquals(1, header.getMetadata().getId().getSubsequenceCount()); + assertEquals(1, header.getMetadata().getId().getSubsequence(0)); + }, + () -> assertFieldValueEquals(header, "Header", listValue("A", "B", "C", "")) + ), + () -> assertAll("Current message: " + message, + () -> { + assertEquals(1, message.getMetadata().getId().getSubsequenceCount()); + assertEquals(2, message.getMetadata().getId().getSubsequence(0)); + }, + () -> assertEquals("1", getFieldValue(message, "A", () -> "No field A. " + message)), + () -> assertEquals("2", getFieldValue(message, "B", () -> "No field B. " + message)), + () -> { + var listValues = getListValue(message, "C", () -> "No field C. " + message); + assertEquals(1, listValues.length); + assertEquals("3", listValues[0]); + } + ) + ); + } + + @Test + void decodeArrayInMiddle() throws IOException { CsvCodec codec = createCodec(); MessageGroupBatch batch = MessageGroupBatch.newBuilder() .addGroups(MessageGroup.newBuilder() From bdffb33cc5d95c7e87a4fc8b99ec163dbceb7fd2 Mon Sep 17 00:00:00 2001 From: Nikita Shaposhnikov Date: Fri, 17 Jun 2022 13:47:15 +0400 Subject: [PATCH 2/3] version and readme updated --- README.md | 6 +++++- gradle.properties | 2 +- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 1b2e0be..e429f08 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# Csv codec (3.2.0) +# Csv codec (3.2.1) ## Description Designed for decode csv raw messages from csv reader to the parsed messages. @@ -105,6 +105,10 @@ spec: ## Release notes +### 3.1.1 + ++ fixed: last array-field as simple value + ### 3.1.0 + new length validation parameter diff --git a/gradle.properties b/gradle.properties index c34c2b6..f005651 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,3 +1,3 @@ -release_version = 3.2.0 +release_version = 3.2.1 docker_image_name= From f07e986f8a9b2ab1a5f406c82dd6ea8453521555 Mon Sep 17 00:00:00 2001 From: Oleg Date: Thu, 25 Aug 2022 11:20:48 +0400 Subject: [PATCH 3/3] Correct version in readme --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index e429f08..5c83aa9 100644 --- a/README.md +++ b/README.md @@ -105,11 +105,11 @@ spec: ## Release notes -### 3.1.1 +### 3.2.1 + fixed: last array-field as simple value -### 3.1.0 +### 3.2.0 + new length validation parameter + array support, to specify array need to have empty header for each value [^array]