You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by ac...@apache.org on 2022/12/02 08:08:53 UTC

[camel-kamelets] 21/28: Do cache ObjectMapper instance in JsonModelDatType converter

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

acosentino pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/camel-kamelets.git

commit d161ccfc4aa8a55e5bdd4f2edc3439b2f51e48b4
Author: Christoph Deppisch <cd...@redhat.com>
AuthorDate: Tue Nov 29 10:14:20 2022 +0100

    Do cache ObjectMapper instance in JsonModelDatType converter
    
    Also use Camel ClassResolver API to resolve model class
---
 .../utils/format/DefaultDataTypeRegistry.java      |  7 +++++++
 .../converter/standard/JsonModelDataType.java      | 23 ++++++++++++++++++++--
 .../converter/standard/JsonModelDataTypeTest.java  |  6 ++++++
 3 files changed, 34 insertions(+), 2 deletions(-)

diff --git a/library/camel-kamelets-utils/src/main/java/org/apache/camel/kamelets/utils/format/DefaultDataTypeRegistry.java b/library/camel-kamelets-utils/src/main/java/org/apache/camel/kamelets/utils/format/DefaultDataTypeRegistry.java
index 1e530468..24c77b70 100644
--- a/library/camel-kamelets-utils/src/main/java/org/apache/camel/kamelets/utils/format/DefaultDataTypeRegistry.java
+++ b/library/camel-kamelets-utils/src/main/java/org/apache/camel/kamelets/utils/format/DefaultDataTypeRegistry.java
@@ -115,6 +115,13 @@ public class DefaultDataTypeRegistry extends ServiceSupport implements DataTypeR
             loader.load(this);
         }
 
+        // if applicable set Camel context on all loaded data type converters
+        dataTypeConverters.values().forEach(converters -> converters.forEach(converter -> {
+            if (converter instanceof CamelContextAware && ((CamelContextAware) converter).getCamelContext() == null) {
+                CamelContextAware.trySetCamelContext(converter, camelContext);
+            }
+        }));
+
         LOG.debug("Loaded {} schemes holding {} data type converters", dataTypeConverters.size(), dataTypeConverters.values().stream().mapToInt(List::size).sum());
     }
 
diff --git a/library/camel-kamelets-utils/src/main/java/org/apache/camel/kamelets/utils/format/converter/standard/JsonModelDataType.java b/library/camel-kamelets-utils/src/main/java/org/apache/camel/kamelets/utils/format/converter/standard/JsonModelDataType.java
index 54c67785..0a80ee32 100644
--- a/library/camel-kamelets-utils/src/main/java/org/apache/camel/kamelets/utils/format/converter/standard/JsonModelDataType.java
+++ b/library/camel-kamelets-utils/src/main/java/org/apache/camel/kamelets/utils/format/converter/standard/JsonModelDataType.java
@@ -21,12 +21,15 @@ import java.io.ByteArrayInputStream;
 import java.io.InputStream;
 
 import com.fasterxml.jackson.databind.ObjectMapper;
+import org.apache.camel.CamelContext;
+import org.apache.camel.CamelContextAware;
 import org.apache.camel.CamelExecutionException;
 import org.apache.camel.Exchange;
 import org.apache.camel.InvalidPayloadException;
 import org.apache.camel.component.jackson.JacksonDataFormat;
 import org.apache.camel.kamelets.utils.format.spi.DataTypeConverter;
 import org.apache.camel.kamelets.utils.format.spi.annotations.DataType;
+import org.apache.camel.util.ObjectHelper;
 
 /**
  * Data type converter able to unmarshal to given unmarshalType using jackson data format.
@@ -34,18 +37,24 @@ import org.apache.camel.kamelets.utils.format.spi.annotations.DataType;
  * Unmarshal type should be given as a fully qualified class name in the exchange properties.
  */
 @DataType(name = "jsonObject", mediaType = "application/json")
-public class JsonModelDataType implements DataTypeConverter {
+public class JsonModelDataType implements DataTypeConverter, CamelContextAware {
 
     public static final String DATA_TYPE_MODEL_PROPERTY = "CamelDataTypeModel";
 
+    private CamelContext camelContext;
+
+    private static final ObjectMapper mapper = new ObjectMapper();
+
     @Override
     public void convert(Exchange exchange) {
         if (!exchange.hasProperties() || !exchange.getProperties().containsKey(DATA_TYPE_MODEL_PROPERTY)) {
             return;
         }
 
+        ObjectHelper.notNull(camelContext, "camelContext");
+
         String type = exchange.getProperty(DATA_TYPE_MODEL_PROPERTY, String.class);
-        try (JacksonDataFormat dataFormat = new JacksonDataFormat(new ObjectMapper(), Class.forName(type))) {
+        try (JacksonDataFormat dataFormat = new JacksonDataFormat(mapper, camelContext.getClassResolver().resolveMandatoryClass(type))) {
             Object unmarshalled = dataFormat.unmarshal(exchange, getBodyAsStream(exchange));
             exchange.getMessage().setBody(unmarshalled);
         } catch (Exception e) {
@@ -63,4 +72,14 @@ public class JsonModelDataType implements DataTypeConverter {
 
         return bodyStream;
     }
+
+    @Override
+    public CamelContext getCamelContext() {
+        return camelContext;
+    }
+
+    @Override
+    public void setCamelContext(CamelContext camelContext) {
+        this.camelContext = camelContext;
+    }
 }
diff --git a/library/camel-kamelets-utils/src/test/java/org/apache/camel/kamelets/utils/format/converter/standard/JsonModelDataTypeTest.java b/library/camel-kamelets-utils/src/test/java/org/apache/camel/kamelets/utils/format/converter/standard/JsonModelDataTypeTest.java
index d93da234..cb253a16 100644
--- a/library/camel-kamelets-utils/src/test/java/org/apache/camel/kamelets/utils/format/converter/standard/JsonModelDataTypeTest.java
+++ b/library/camel-kamelets-utils/src/test/java/org/apache/camel/kamelets/utils/format/converter/standard/JsonModelDataTypeTest.java
@@ -27,6 +27,7 @@ import org.apache.camel.kamelets.utils.format.DefaultDataTypeRegistry;
 import org.apache.camel.kamelets.utils.format.spi.DataTypeConverter;
 import org.apache.camel.support.DefaultExchange;
 import org.junit.jupiter.api.Assertions;
+import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
 
 import static org.junit.jupiter.api.Assertions.assertEquals;
@@ -37,6 +38,11 @@ public class JsonModelDataTypeTest {
 
     private final JsonModelDataType dataType = new JsonModelDataType();
 
+    @BeforeEach
+    public void setup() {
+        dataType.setCamelContext(camelContext);
+    }
+
     @Test
     void shouldMapFromStringToJsonModel() throws Exception {
         Exchange exchange = new DefaultExchange(camelContext);