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.git
commit f9ccda8afc2128b2a4b636c45d359e874aba4e13 Author: Andrea Cosentino <anco...@gmail.com> AuthorDate: Thu Nov 18 13:49:03 2021 +0100 CAMEL-16912 - camel-jackson - Make it easy to configure property naming strategy --- .../jackson/JacksonDataFormatConfigurer.java | 2 +- .../jackson/AbstractJacksonDataFormat.java | 39 +++++++++++++++++-- .../jackson/JacksonMarshalNamingStrategyTest.java | 3 +- ...ngJacksonJsonDataFormatNamingStrategyTest.java} | 21 ++++------- ...ringJacksonJsonDataFormatNamingStrategyTest.xml | 44 ++++++++++++++++++++++ .../reifier/dataformat/JsonDataFormatReifier.java | 1 + 6 files changed, 89 insertions(+), 21 deletions(-) diff --git a/components/camel-jackson/src/generated/java/org/apache/camel/component/jackson/JacksonDataFormatConfigurer.java b/components/camel-jackson/src/generated/java/org/apache/camel/component/jackson/JacksonDataFormatConfigurer.java index 7c60bd1..55ad712 100644 --- a/components/camel-jackson/src/generated/java/org/apache/camel/component/jackson/JacksonDataFormatConfigurer.java +++ b/components/camel-jackson/src/generated/java/org/apache/camel/component/jackson/JacksonDataFormatConfigurer.java @@ -55,7 +55,7 @@ public class JacksonDataFormatConfigurer extends PropertyConfigurerSupport imple case "autodiscoverschemaresolver": case "autoDiscoverSchemaResolver": dataformat.setAutoDiscoverSchemaResolver(property(camelContext, boolean.class, value)); return true; case "namingstrategy": - case "namingStrategy": dataformat.setNamingStrategy(property(camelContext, com.fasterxml.jackson.databind.PropertyNamingStrategy.class, value)); return true; + case "namingStrategy": dataformat.setNamingStrategy(property(camelContext, java.lang.String.class, value)); return true; default: return false; } } diff --git a/components/camel-jackson/src/main/java/org/apache/camel/component/jackson/AbstractJacksonDataFormat.java b/components/camel-jackson/src/main/java/org/apache/camel/component/jackson/AbstractJacksonDataFormat.java index aa04e68..67f838d6 100644 --- a/components/camel-jackson/src/main/java/org/apache/camel/component/jackson/AbstractJacksonDataFormat.java +++ b/components/camel-jackson/src/main/java/org/apache/camel/component/jackson/AbstractJacksonDataFormat.java @@ -33,6 +33,7 @@ import com.fasterxml.jackson.databind.DeserializationFeature; import com.fasterxml.jackson.databind.MapperFeature; import com.fasterxml.jackson.databind.Module; import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.PropertyNamingStrategies; import com.fasterxml.jackson.databind.PropertyNamingStrategy; import com.fasterxml.jackson.databind.SerializationFeature; import com.fasterxml.jackson.databind.type.CollectionType; @@ -81,7 +82,7 @@ public abstract class AbstractJacksonDataFormat extends ServiceSupport private boolean autoDiscoverObjectMapper; private SchemaResolver schemaResolver; private boolean autoDiscoverSchemaResolver = true; - private PropertyNamingStrategy namingStrategy; + private String namingStrategy; /** * Use the default Jackson {@link ObjectMapper} and {@link Object} @@ -287,11 +288,11 @@ public abstract class AbstractJacksonDataFormat extends ServiceSupport return modules; } - public PropertyNamingStrategy getNamingStrategy() { + public String getNamingStrategy() { return namingStrategy; } - public void setNamingStrategy(PropertyNamingStrategy namingStrategy) { + public void setNamingStrategy(String namingStrategy) { this.namingStrategy = namingStrategy; } @@ -659,7 +660,10 @@ public abstract class AbstractJacksonDataFormat extends ServiceSupport } if (org.apache.camel.util.ObjectHelper.isNotEmpty(namingStrategy)) { - objectMapper.setPropertyNamingStrategy(namingStrategy); + PropertyNamingStrategy selectedNamingStrategy = determineNamingStrategy(namingStrategy); + if (org.apache.camel.util.ObjectHelper.isNotEmpty(selectedNamingStrategy)) { + objectMapper.setPropertyNamingStrategy(selectedNamingStrategy); + } } } else { LOG.debug("The objectMapper was already found in the registry, no customizations will be applied"); @@ -682,6 +686,33 @@ public abstract class AbstractJacksonDataFormat extends ServiceSupport } } + private PropertyNamingStrategy determineNamingStrategy(String namingStrategy) { + PropertyNamingStrategy strategy = null; + switch (namingStrategy) { + case "LOWER_CAMEL_CASE": + strategy = PropertyNamingStrategies.LOWER_CAMEL_CASE; + break; + case "LOWER_DOT_CASE": + strategy = PropertyNamingStrategies.LOWER_DOT_CASE; + break; + case "LOWER_CASE": + strategy = PropertyNamingStrategies.LOWER_CASE; + break; + case "KEBAB_CASE": + strategy = PropertyNamingStrategies.KEBAB_CASE; + break; + case "SNAKE_CASE": + strategy = PropertyNamingStrategies.SNAKE_CASE; + break; + case "UPPER_CAMEL_CASE": + strategy = PropertyNamingStrategies.UPPER_CAMEL_CASE; + break; + default: + break; + } + return strategy; + } + @Override protected void doStop() throws Exception { // noop diff --git a/components/camel-jackson/src/test/java/org/apache/camel/component/jackson/JacksonMarshalNamingStrategyTest.java b/components/camel-jackson/src/test/java/org/apache/camel/component/jackson/JacksonMarshalNamingStrategyTest.java index 612a2f1..4437e6a 100644 --- a/components/camel-jackson/src/test/java/org/apache/camel/component/jackson/JacksonMarshalNamingStrategyTest.java +++ b/components/camel-jackson/src/test/java/org/apache/camel/component/jackson/JacksonMarshalNamingStrategyTest.java @@ -16,7 +16,6 @@ */ package org.apache.camel.component.jackson; -import com.fasterxml.jackson.databind.PropertyNamingStrategies; import org.apache.camel.builder.RouteBuilder; import org.apache.camel.component.mock.MockEndpoint; import org.apache.camel.test.junit5.CamelTestSupport; @@ -48,7 +47,7 @@ public class JacksonMarshalNamingStrategyTest extends CamelTestSupport { @Override public void configure() throws Exception { JacksonDataFormat format = new JacksonDataFormat(); - format.setNamingStrategy(PropertyNamingStrategies.LOWER_DOT_CASE); + format.setNamingStrategy("LOWER_DOT_CASE"); from("direct:in").marshal(format).to("mock:result"); } }; diff --git a/components/camel-jackson/src/test/java/org/apache/camel/component/jackson/JacksonMarshalNamingStrategyTest.java b/components/camel-jackson/src/test/java/org/apache/camel/component/jackson/SpringJacksonJsonDataFormatNamingStrategyTest.java similarity index 71% copy from components/camel-jackson/src/test/java/org/apache/camel/component/jackson/JacksonMarshalNamingStrategyTest.java copy to components/camel-jackson/src/test/java/org/apache/camel/component/jackson/SpringJacksonJsonDataFormatNamingStrategyTest.java index 612a2f1..665140d 100644 --- a/components/camel-jackson/src/test/java/org/apache/camel/component/jackson/JacksonMarshalNamingStrategyTest.java +++ b/components/camel-jackson/src/test/java/org/apache/camel/component/jackson/SpringJacksonJsonDataFormatNamingStrategyTest.java @@ -16,15 +16,15 @@ */ package org.apache.camel.component.jackson; -import com.fasterxml.jackson.databind.PropertyNamingStrategies; -import org.apache.camel.builder.RouteBuilder; import org.apache.camel.component.mock.MockEndpoint; -import org.apache.camel.test.junit5.CamelTestSupport; +import org.apache.camel.test.spring.junit5.CamelSpringTestSupport; import org.junit.jupiter.api.Test; +import org.springframework.context.support.AbstractXmlApplicationContext; +import org.springframework.context.support.ClassPathXmlApplicationContext; import static org.junit.jupiter.api.Assertions.assertEquals; -public class JacksonMarshalNamingStrategyTest extends CamelTestSupport { +public class SpringJacksonJsonDataFormatNamingStrategyTest extends CamelSpringTestSupport { @Test public void testMarshalAndUnmarshalMap() throws Exception { @@ -42,16 +42,9 @@ public class JacksonMarshalNamingStrategyTest extends CamelTestSupport { } @Override - protected RouteBuilder createRouteBuilder() throws Exception { - return new RouteBuilder() { - - @Override - public void configure() throws Exception { - JacksonDataFormat format = new JacksonDataFormat(); - format.setNamingStrategy(PropertyNamingStrategies.LOWER_DOT_CASE); - from("direct:in").marshal(format).to("mock:result"); - } - }; + protected AbstractXmlApplicationContext createApplicationContext() { + return new ClassPathXmlApplicationContext( + "org/apache/camel/component/jackson/SpringJacksonJsonDataFormatNamingStrategyTest.xml"); } } diff --git a/components/camel-jackson/src/test/resources/org/apache/camel/component/jackson/SpringJacksonJsonDataFormatNamingStrategyTest.xml b/components/camel-jackson/src/test/resources/org/apache/camel/component/jackson/SpringJacksonJsonDataFormatNamingStrategyTest.xml new file mode 100644 index 0000000..0ce8cea --- /dev/null +++ b/components/camel-jackson/src/test/resources/org/apache/camel/component/jackson/SpringJacksonJsonDataFormatNamingStrategyTest.xml @@ -0,0 +1,44 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + +--> +<beans xmlns="http://www.springframework.org/schema/beans" + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation=" + http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd + http://camel.apache.org/schema/spring http://camel.apache.org/schema/spring/camel-spring.xsd + "> + + <!-- START SNIPPET: e1 --> + <camelContext id="camel" xmlns="http://camel.apache.org/schema/spring"> + + <!-- we define the json jackson data formats to be used --> + <dataFormats> + <json id="jack" library="Jackson" namingStrategy="LOWER_DOT_CASE"/> + </dataFormats> + + <route> + <from uri="direct:in"/> + <marshal><custom ref="jack"/></marshal> + <to uri="mock:result"/> + </route> + + </camelContext> + <!-- END SNIPPET: e1 --> + +</beans> diff --git a/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/dataformat/JsonDataFormatReifier.java b/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/dataformat/JsonDataFormatReifier.java index 383037d..848c49e 100644 --- a/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/dataformat/JsonDataFormatReifier.java +++ b/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/dataformat/JsonDataFormatReifier.java @@ -75,6 +75,7 @@ public class JsonDataFormatReifier extends DataFormatReifier<JsonDataFormat> { if (definition.getLibrary() == JsonLibrary.Jackson) { properties.put("schemaResolver", asRef(definition.getSchemaResolver())); properties.put("autoDiscoverSchemaResolver", definition.getAutoDiscoverSchemaResolver()); + properties.put("namingStrategy", definition.getNamingStrategy()); } }