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);