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 2021/11/18 13:02:40 UTC

[camel] 06/10: CAMEL-16912 - camel-jackson - Make it easy to configure property naming strategy

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 <an...@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());
         }
     }