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

mthomsen pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/nifi.git


The following commit(s) were added to refs/heads/master by this push:
     new a5dff7b  NIFI-6096: Fixed ValidateRecord handling of nested maps
a5dff7b is described below

commit a5dff7b45cbba788cc499db301315a306f7a8b5c
Author: Matthew Burgess <[email protected]>
AuthorDate: Tue Apr 9 13:49:12 2019 -0400

    NIFI-6096: Fixed ValidateRecord handling of nested maps
    
    This closes #3424
    
    Signed-off-by: Mike Thomsen <[email protected]>
---
 .../serialization/record/util/DataTypeUtils.java   |  2 +-
 .../nifi-standard-processors/pom.xml               |  2 +
 .../processors/standard/TestValidateRecord.java    | 48 ++++++++++++++++++++++
 .../TestValidateRecord/nested-map-input.json       | 18 ++++++++
 .../TestValidateRecord/nested-map-schema.avsc      | 32 +++++++++++++++
 5 files changed, 101 insertions(+), 1 deletion(-)

diff --git 
a/nifi-commons/nifi-record/src/main/java/org/apache/nifi/serialization/record/util/DataTypeUtils.java
 
b/nifi-commons/nifi-record/src/main/java/org/apache/nifi/serialization/record/util/DataTypeUtils.java
index 3411b13..14782a4 100644
--- 
a/nifi-commons/nifi-record/src/main/java/org/apache/nifi/serialization/record/util/DataTypeUtils.java
+++ 
b/nifi-commons/nifi-record/src/main/java/org/apache/nifi/serialization/record/util/DataTypeUtils.java
@@ -736,7 +736,7 @@ public class DataTypeUtils {
     }
 
     public static boolean isMapTypeCompatible(final Object value) {
-        return value != null && value instanceof Map;
+        return value != null && (value instanceof Map || value instanceof 
MapRecord);
     }
 
 
diff --git 
a/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/pom.xml 
b/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/pom.xml
index 03e9bb4..511334d 100644
--- a/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/pom.xml
+++ b/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/pom.xml
@@ -552,6 +552,8 @@
                         
<exclude>src/test/resources/TestForkRecord/schema/schema.avsc</exclude>
                         
<exclude>src/test/resources/TestConvertRecord/schema/person.avsc</exclude>
                         
<exclude>src/test/resources/TestConvertRecord/input/person.json</exclude>
+                        
<exclude>src/test/resources/TestValidateRecord/nested-map-input.json</exclude>
+                        
<exclude>src/test/resources/TestValidateRecord/nested-map-schema.avsc</exclude>
                     </excludes>
                 </configuration>
             </plugin>
diff --git 
a/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/src/test/java/org/apache/nifi/processors/standard/TestValidateRecord.java
 
b/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/src/test/java/org/apache/nifi/processors/standard/TestValidateRecord.java
index fdb5be4..52b7968 100644
--- 
a/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/src/test/java/org/apache/nifi/processors/standard/TestValidateRecord.java
+++ 
b/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/src/test/java/org/apache/nifi/processors/standard/TestValidateRecord.java
@@ -20,6 +20,7 @@ package org.apache.nifi.processors.standard;
 import java.io.ByteArrayInputStream;
 import java.io.IOException;
 import java.io.UnsupportedEncodingException;
+import java.nio.charset.StandardCharsets;
 import java.nio.file.Files;
 import java.nio.file.Paths;
 import java.util.Optional;
@@ -30,6 +31,7 @@ import org.apache.nifi.csv.CSVReader;
 import org.apache.nifi.csv.CSVRecordSetWriter;
 import org.apache.nifi.csv.CSVUtils;
 import org.apache.nifi.json.JsonRecordSetWriter;
+import org.apache.nifi.json.JsonTreeReader;
 import org.apache.nifi.reporting.InitializationException;
 import org.apache.nifi.schema.access.SchemaAccessUtils;
 import org.apache.nifi.schema.access.SchemaNotFoundException;
@@ -360,4 +362,50 @@ public class TestValidateRecord {
         invalidFlowFile.assertContentEquals(expectedInvalidContents);
     }
 
+    @Test
+    public void testValidateNestedMap() throws InitializationException, 
IOException {
+        final String validateSchema = new 
String(Files.readAllBytes(Paths.get("src/test/resources/TestValidateRecord/nested-map-schema.avsc")),
 StandardCharsets.UTF_8);
+
+        final JsonTreeReader jsonReader = new JsonTreeReader();
+        runner.addControllerService("reader", jsonReader);
+        runner.setProperty(jsonReader, 
SchemaAccessUtils.SCHEMA_ACCESS_STRATEGY, "schema-text-property");
+        runner.setProperty(jsonReader, SchemaAccessUtils.SCHEMA_TEXT, 
validateSchema);
+        runner.enableControllerService(jsonReader);
+
+        final JsonRecordSetWriter validWriter = new JsonRecordSetWriter();
+        runner.addControllerService("writer", validWriter);
+        runner.setProperty(validWriter, "Schema Write Strategy", 
"full-schema-attribute");
+        runner.enableControllerService(validWriter);
+
+        final MockRecordWriter invalidWriter = new MockRecordWriter("invalid", 
true);
+        runner.addControllerService("invalid-writer", invalidWriter);
+        runner.enableControllerService(invalidWriter);
+
+        runner.setProperty(ValidateRecord.RECORD_READER, "reader");
+        runner.setProperty(ValidateRecord.RECORD_WRITER, "writer");
+        runner.setProperty(ValidateRecord.SCHEMA_ACCESS_STRATEGY, 
SchemaAccessUtils.SCHEMA_TEXT_PROPERTY);
+        runner.setProperty(ValidateRecord.SCHEMA_TEXT, validateSchema);
+        runner.setProperty(ValidateRecord.INVALID_RECORD_WRITER, 
"invalid-writer");
+        runner.setProperty(ValidateRecord.ALLOW_EXTRA_FIELDS, "false");
+
+        // Both records should be valid if strict type checking is off
+        runner.setProperty(ValidateRecord.STRICT_TYPE_CHECKING, "false");
+        
runner.enqueue(Paths.get("src/test/resources/TestValidateRecord/nested-map-input.json"));
+        runner.run();
+
+        runner.assertTransferCount(ValidateRecord.REL_VALID, 1);
+        runner.assertTransferCount(ValidateRecord.REL_INVALID, 0);
+        runner.assertTransferCount(ValidateRecord.REL_FAILURE, 0);
+        runner.clearTransferState();
+
+        // The second record should be invalid if strict type checking is on
+        runner.setProperty(ValidateRecord.STRICT_TYPE_CHECKING, "true");
+        
runner.enqueue(Paths.get("src/test/resources/TestValidateRecord/nested-map-input.json"));
+        runner.run();
+
+        runner.assertTransferCount(ValidateRecord.REL_VALID, 1);
+        runner.assertTransferCount(ValidateRecord.REL_INVALID, 1);
+        runner.assertTransferCount(ValidateRecord.REL_FAILURE, 0);
+    }
+
 }
diff --git 
a/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/src/test/resources/TestValidateRecord/nested-map-input.json
 
b/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/src/test/resources/TestValidateRecord/nested-map-input.json
new file mode 100644
index 0000000..ed8dc3b
--- /dev/null
+++ 
b/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/src/test/resources/TestValidateRecord/nested-map-input.json
@@ -0,0 +1,18 @@
+[{
+  "images" : [ {
+    "headers" : {
+      "Accept-Ranges" : "bytes",
+      "Server" : "Apache"
+    },
+    "id" : "205f40e3-2675-4c61-abc1-a0aeb609c023"
+  } ]
+},
+{
+  "images" : [ {
+    "headers" : {
+      "Accept-Ranges" : 4,
+      "Server" : 10
+    },
+    "id" : "205f40e3-2675-4c61-abc1-a0aeb609c023"
+  } ]
+}]
\ No newline at end of file
diff --git 
a/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/src/test/resources/TestValidateRecord/nested-map-schema.avsc
 
b/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/src/test/resources/TestValidateRecord/nested-map-schema.avsc
new file mode 100644
index 0000000..f7dabab
--- /dev/null
+++ 
b/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/src/test/resources/TestValidateRecord/nested-map-schema.avsc
@@ -0,0 +1,32 @@
+{
+  "type": "record",
+  "name": "example",
+  "fields": [
+    {
+      "name": "images",
+      "type": {
+        "type": "array",
+        "items": {
+          "type": "record",
+          "name": "images",
+          "fields": [
+            {
+              "name": "id",
+              "type": [
+                "string",
+                "null"
+              ]
+            },
+            {
+              "name": "headers",
+              "type": {
+                "type": "map",
+                "values": "string"
+              }
+            }
+          ]
+        }
+      }
+    }
+  ]
+}
\ No newline at end of file

Reply via email to