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

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


The following commit(s) were added to refs/heads/master by this push:
     new 872b74a  CAMEL-16254: Add nested Structs support (#5117)
872b74a is described below

commit 872b74a54c0f08891d32ddbf48e9417dbace8daa
Author: Omar Al-Safi <omars...@gmail.com>
AuthorDate: Wed Feb 24 11:29:29 2021 +0100

    CAMEL-16254: Add nested Structs support (#5117)
---
 .../component/debezium/DebeziumTypeConverter.java  | 12 +++++-----
 .../debezium/DebeziumTypeConverterTest.java        | 26 ++++++++++++++++++++++
 2 files changed, 33 insertions(+), 5 deletions(-)

diff --git 
a/components/camel-debezium-common/camel-debezium-common-component/src/main/java/org/apache/camel/component/debezium/DebeziumTypeConverter.java
 
b/components/camel-debezium-common/camel-debezium-common-component/src/main/java/org/apache/camel/component/debezium/DebeziumTypeConverter.java
index ffd9184..867d10d 100644
--- 
a/components/camel-debezium-common/camel-debezium-common-component/src/main/java/org/apache/camel/component/debezium/DebeziumTypeConverter.java
+++ 
b/components/camel-debezium-common/camel-debezium-common-component/src/main/java/org/apache/camel/component/debezium/DebeziumTypeConverter.java
@@ -21,7 +21,6 @@ import java.util.Map;
 
 import org.apache.camel.Converter;
 import org.apache.kafka.connect.data.Struct;
-import org.apache.kafka.connect.errors.DataException;
 
 @Converter(generateLoader = true)
 public final class DebeziumTypeConverter {
@@ -41,10 +40,13 @@ public final class DebeziumTypeConverter {
         final HashMap<String, Object> fieldsToValues = new HashMap<>();
 
         struct.schema().fields().forEach(field -> {
-            try {
-                fieldsToValues.put(field.name(), struct.get(field));
-            } catch (DataException e) {
-                fieldsToValues.put(field.name(), null);
+            Object value = struct.get(field);
+
+            // recursive call if we have nested structs
+            if (value instanceof Struct) {
+                fieldsToValues.put(field.name(), toMap((Struct) value));
+            } else {
+                fieldsToValues.put(field.name(), value);
             }
         });
 
diff --git 
a/components/camel-debezium-common/camel-debezium-common-component/src/test/java/org/apache/camel/component/debezium/DebeziumTypeConverterTest.java
 
b/components/camel-debezium-common/camel-debezium-common-component/src/test/java/org/apache/camel/component/debezium/DebeziumTypeConverterTest.java
index ecf1112..8381b4f 100644
--- 
a/components/camel-debezium-common/camel-debezium-common-component/src/test/java/org/apache/camel/component/debezium/DebeziumTypeConverterTest.java
+++ 
b/components/camel-debezium-common/camel-debezium-common-component/src/test/java/org/apache/camel/component/debezium/DebeziumTypeConverterTest.java
@@ -45,6 +45,32 @@ public class DebeziumTypeConverterTest {
         assertTrue((boolean) outputValue.get("valid"));
     }
 
+    @Test
+    void testToMapNestedStruct() {
+        Schema detailsSchema = SchemaBuilder.struct().field("age", 
SchemaBuilder.INT32_SCHEMA).build();
+
+        Schema valueSchema = SchemaBuilder.struct()
+                .name("valueSchema")
+                .field("id", SchemaBuilder.INT32_SCHEMA)
+                .field("name", SchemaBuilder.STRING_SCHEMA)
+                .field("isAdult", SchemaBuilder.BOOLEAN_SCHEMA)
+                .field("details", detailsSchema)
+                .build();
+
+        Struct inputValue = new Struct(valueSchema)
+                .put("id", 12)
+                .put("name", "jane doe")
+                .put("isAdult", true)
+                .put("details", new Struct(detailsSchema).put("age", 30));
+
+        final Map<String, Object> outputValue = 
DebeziumTypeConverter.toMap(inputValue);
+
+        assertEquals("jane doe", outputValue.get("name"));
+        assertEquals(12, outputValue.get("id"));
+        assertTrue((Boolean) outputValue.get("isAdult"));
+        assertEquals(30, ((Map) outputValue.get("details")).get("age"));
+    }
+
     private Struct createTestStruct(final int id, final String name, final 
boolean valid) {
         final Schema schema = SchemaBuilder.struct()
                 .field("id", Schema.INT32_SCHEMA)

Reply via email to