You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by da...@apache.org on 2022/01/31 14:52:54 UTC

[camel] branch main updated: CAMEL-17568: camel-core - TypeConverterExists change default to ignore. Fix adding type converter that previously was missed.

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

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


The following commit(s) were added to refs/heads/main by this push:
     new b62260e  CAMEL-17568: camel-core - TypeConverterExists change default to ignore. Fix adding type converter that previously was missed.
b62260e is described below

commit b62260e19db2aa61fa4a6180eaf24b04194c5944
Author: Claus Ibsen <cl...@gmail.com>
AuthorDate: Mon Jan 31 15:50:24 2022 +0100

    CAMEL-17568: camel-core - TypeConverterExists change default to ignore. Fix adding type converter that previously was missed.
---
 .../resources/org/apache/camel/spring/xml/camelContext.json  |  4 ++--
 .../org/apache/camel/spring/xml/CamelContextFactoryBean.java |  8 ++++----
 .../java/org/apache/camel/spi/TypeConverterRegistry.java     |  8 ++++----
 .../camel/impl/converter/CoreTypeConverterRegistry.java      | 12 +++++++++---
 .../modules/ROOT/pages/camel-3x-upgrade-guide-3_16.adoc      |  9 +++++++++
 5 files changed, 28 insertions(+), 13 deletions(-)

diff --git a/components/camel-spring-xml/src/generated/resources/org/apache/camel/spring/xml/camelContext.json b/components/camel-spring-xml/src/generated/resources/org/apache/camel/spring/xml/camelContext.json
index a53b993..9212a3e 100644
--- a/components/camel-spring-xml/src/generated/resources/org/apache/camel/spring/xml/camelContext.json
+++ b/components/camel-spring-xml/src/generated/resources/org/apache/camel/spring/xml/camelContext.json
@@ -46,8 +46,8 @@
     "typeConverterStatisticsEnabled": { "kind": "attribute", "displayName": "Type Converter Statistics Enabled", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets whether or not type converter statistics is enabled. By default the type converter utilization statistics is disabled. Notice: If enabled then there is a slight performance impact under very heavy load. You can enable\/disable the  [...]
     "loadHealthChecks": { "kind": "attribute", "displayName": "Load Health Checks", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "false", "description": "Whether to load custom health checks by scanning classpath." },
     "inflightRepositoryBrowseEnabled": { "kind": "attribute", "displayName": "Inflight Repository Browse Enabled", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets whether the inflight repository should allow browsing each inflight exchange. This is by default disabled as there is a very slight performance overhead when enabled." },
-    "typeConverterExists": { "kind": "attribute", "displayName": "Type Converter Exists", "required": false, "type": "enum", "javaType": "org.apache.camel.TypeConverterExists", "enum": [ "fail", "ignore", "override" ], "deprecated": false, "autowired": false, "secret": false, "defaultValue": "Override", "description": "What should happen when attempting to add a duplicate type converter. The default behavior is to override the existing." },
-    "typeConverterExistsLoggingLevel": { "kind": "attribute", "displayName": "Type Converter Exists Logging Level", "required": false, "type": "enum", "javaType": "org.apache.camel.LoggingLevel", "enum": [ "debug", "error", "info", "off", "trace", "warn" ], "deprecated": false, "autowired": false, "secret": false, "defaultValue": "WARN", "description": "The logging level to use when logging that a type converter already exists when attempting to add a duplicate type converter. The defaul [...]
+    "typeConverterExists": { "kind": "attribute", "displayName": "Type Converter Exists", "required": false, "type": "enum", "javaType": "org.apache.camel.TypeConverterExists", "enum": [ "fail", "ignore", "override" ], "deprecated": false, "autowired": false, "secret": false, "defaultValue": "Ignore", "description": "What should happen when attempting to add a duplicate type converter. The default behavior is to ignore the duplicate." },
+    "typeConverterExistsLoggingLevel": { "kind": "attribute", "displayName": "Type Converter Exists Logging Level", "required": false, "type": "enum", "javaType": "org.apache.camel.LoggingLevel", "enum": [ "debug", "error", "info", "off", "trace", "warn" ], "deprecated": false, "autowired": false, "secret": false, "defaultValue": "DEBUG", "description": "The logging level to use when logging that a type converter already exists when attempting to add a duplicate type converter. The defau [...]
     "globalOptions": { "kind": "element", "displayName": "Global Options", "required": false, "type": "object", "javaType": "org.apache.camel.model.GlobalOptionsDefinition", "deprecated": false, "autowired": false, "secret": false, "description": "Configuration of CamelContext properties such as limit of debug logging and other general options." },
     "propertyPlaceholder": { "kind": "element", "displayName": "Property Placeholder", "required": false, "type": "object", "javaType": "org.apache.camel.core.xml.CamelPropertyPlaceholderDefinition", "deprecated": false, "autowired": false, "secret": false, "description": "Configuration of property placeholder" },
     "package": { "kind": "element", "displayName": "Package", "required": false, "type": "array", "javaType": "java.lang.String[]", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the package names to be recursively searched for Java classes which extend org.apache.camel.builder.RouteBuilder to be auto-wired up to the CamelContext as a route. Note that classes are excluded if they are specifically configured in the spring.xml A more advanced configuration c [...]
diff --git a/components/camel-spring-xml/src/main/java/org/apache/camel/spring/xml/CamelContextFactoryBean.java b/components/camel-spring-xml/src/main/java/org/apache/camel/spring/xml/CamelContextFactoryBean.java
index a1e6acf..94e5054 100644
--- a/components/camel-spring-xml/src/main/java/org/apache/camel/spring/xml/CamelContextFactoryBean.java
+++ b/components/camel-spring-xml/src/main/java/org/apache/camel/spring/xml/CamelContextFactoryBean.java
@@ -191,10 +191,10 @@ public class CamelContextFactoryBean extends AbstractCamelContextFactoryBean<Spr
     @XmlAttribute
     private String inflightRepositoryBrowseEnabled;
     @XmlAttribute
-    @Metadata(defaultValue = "Override")
+    @Metadata(defaultValue = "Ignore")
     private TypeConverterExists typeConverterExists;
     @XmlAttribute
-    @Metadata(defaultValue = "WARN")
+    @Metadata(defaultValue = "DEBUG")
     private LoggingLevel typeConverterExistsLoggingLevel;
     @XmlElement(name = "globalOptions")
     private GlobalOptionsDefinition globalOptions;
@@ -1234,7 +1234,7 @@ public class CamelContextFactoryBean extends AbstractCamelContextFactoryBean<Spr
     /**
      * What should happen when attempting to add a duplicate type converter.
      * <p/>
-     * The default behavior is to override the existing.
+     * The default behavior is to ignore the duplicate.
      */
     public void setTypeConverterExists(TypeConverterExists typeConverterExists) {
         this.typeConverterExists = typeConverterExists;
@@ -1249,7 +1249,7 @@ public class CamelContextFactoryBean extends AbstractCamelContextFactoryBean<Spr
      * The logging level to use when logging that a type converter already exists when attempting to add a duplicate
      * type converter.
      * <p/>
-     * The default logging level is <tt>WARN</tt>
+     * The default logging level is <tt>DEBUG</tt>
      */
     public void setTypeConverterExistsLoggingLevel(LoggingLevel typeConverterExistsLoggingLevel) {
         this.typeConverterExistsLoggingLevel = typeConverterExistsLoggingLevel;
diff --git a/core/camel-api/src/main/java/org/apache/camel/spi/TypeConverterRegistry.java b/core/camel-api/src/main/java/org/apache/camel/spi/TypeConverterRegistry.java
index c80aa17..bd715cd 100644
--- a/core/camel-api/src/main/java/org/apache/camel/spi/TypeConverterRegistry.java
+++ b/core/camel-api/src/main/java/org/apache/camel/spi/TypeConverterRegistry.java
@@ -162,7 +162,7 @@ public interface TypeConverterRegistry extends StaticService, CamelContextAware
      * The logging level to use when logging that a type converter already exists when attempting to add a duplicate
      * type converter.
      * <p/>
-     * The default logging level is <tt>WARN</tt>
+     * The default logging level is <tt>DEBUG</tt>
      */
     LoggingLevel getTypeConverterExistsLoggingLevel();
 
@@ -170,21 +170,21 @@ public interface TypeConverterRegistry extends StaticService, CamelContextAware
      * The logging level to use when logging that a type converter already exists when attempting to add a duplicate
      * type converter.
      * <p/>
-     * The default logging level is <tt>WARN</tt>
+     * The default logging level is <tt>DEBUG</tt>
      */
     void setTypeConverterExistsLoggingLevel(LoggingLevel typeConverterExistsLoggingLevel);
 
     /**
      * What should happen when attempting to add a duplicate type converter.
      * <p/>
-     * The default behavior is to override the existing.
+     * The default behavior is to ignore the duplicate.
      */
     TypeConverterExists getTypeConverterExists();
 
     /**
      * What should happen when attempting to add a duplicate type converter.
      * <p/>
-     * The default behavior is to override the existing.
+     * The default behavior is to ignore the duplicate.
      */
     void setTypeConverterExists(TypeConverterExists typeConverterExists);
 
diff --git a/core/camel-base/src/main/java/org/apache/camel/impl/converter/CoreTypeConverterRegistry.java b/core/camel-base/src/main/java/org/apache/camel/impl/converter/CoreTypeConverterRegistry.java
index a1d4a4a..2828e69 100644
--- a/core/camel-base/src/main/java/org/apache/camel/impl/converter/CoreTypeConverterRegistry.java
+++ b/core/camel-base/src/main/java/org/apache/camel/impl/converter/CoreTypeConverterRegistry.java
@@ -74,8 +74,8 @@ public class CoreTypeConverterRegistry extends ServiceSupport implements TypeCon
     protected final LongAdder hitCounter = new LongAdder();
     protected final LongAdder failedCounter = new LongAdder();
 
-    protected TypeConverterExists typeConverterExists = TypeConverterExists.Override;
-    protected LoggingLevel typeConverterExistsLoggingLevel = LoggingLevel.WARN;
+    protected TypeConverterExists typeConverterExists = TypeConverterExists.Ignore;
+    protected LoggingLevel typeConverterExistsLoggingLevel = LoggingLevel.DEBUG;
 
     // to keep track of number of converters in the bulked classes
     private int sumBulkTypeConverters;
@@ -578,9 +578,15 @@ public class CoreTypeConverterRegistry extends ServiceSupport implements TypeCon
     public void addTypeConverter(Class<?> toType, Class<?> fromType, TypeConverter typeConverter) {
         LOG.trace("Adding type converter: {}", typeConverter);
         TypeConverter converter = typeMappings.get(toType, fromType);
+
+        if (converter == MISS_CONVERTER) {
+            // we have previously attempted to convert but missed so add this converter
+            typeMappings.put(toType, fromType, typeConverter);
+            return;
+        }
+
         // only override it if its different
         // as race conditions can lead to many threads trying to promote the same fallback converter
-
         if (typeConverter != converter) {
 
             // add the converter unless we should ignore
diff --git a/docs/user-manual/modules/ROOT/pages/camel-3x-upgrade-guide-3_16.adoc b/docs/user-manual/modules/ROOT/pages/camel-3x-upgrade-guide-3_16.adoc
index e5599ec..66d1a71 100644
--- a/docs/user-manual/modules/ROOT/pages/camel-3x-upgrade-guide-3_16.adoc
+++ b/docs/user-manual/modules/ROOT/pages/camel-3x-upgrade-guide-3_16.adoc
@@ -12,3 +12,12 @@ The option `camel.main.packageScanRouteBuilders` has been renamed to `camel.main
 
 Using configuration classes must now implement the interface `org.apache.camel.main.CamelConfiguration`
 and the `configure` method now takes a `CamelContext` as argument.
+
+=== camel-core
+
+Change the default from `Override` to `Ignore` in the `TypeConverterExists` option,
+and the TypeConverterExistsLoggingLevel from `WARN` to `DEBUG`.
+
+Previously when Camel detected a duplicate type converter during startup, Camel would
+override the existing converter and log a WARN. A more correct behaviour would be
+to keep the existing and ignore the duplicate.