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 <cdeppi...@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);