CAMEL-6094: Add option to type converter registry to control what to do if a 
type converter already exists.


Project: http://git-wip-us.apache.org/repos/asf/camel/repo
Commit: http://git-wip-us.apache.org/repos/asf/camel/commit/a7a40d21
Tree: http://git-wip-us.apache.org/repos/asf/camel/tree/a7a40d21
Diff: http://git-wip-us.apache.org/repos/asf/camel/diff/a7a40d21

Branch: refs/heads/master
Commit: a7a40d21fa6e4a82e55ea184a9a2e7368ec3f2e9
Parents: c894c3a
Author: Claus Ibsen <[email protected]>
Authored: Sat Aug 8 16:47:43 2015 +0200
Committer: Claus Ibsen <[email protected]>
Committed: Sat Aug 8 16:47:43 2015 +0200

----------------------------------------------------------------------
 .../converter/BaseTypeConverterRegistry.java    | 28 ++++++++++-------
 .../camel/impl/TypeConverterRegistryTest.java   | 32 ++++++++++++++++++++
 2 files changed, 49 insertions(+), 11 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/camel/blob/a7a40d21/camel-core/src/main/java/org/apache/camel/impl/converter/BaseTypeConverterRegistry.java
----------------------------------------------------------------------
diff --git 
a/camel-core/src/main/java/org/apache/camel/impl/converter/BaseTypeConverterRegistry.java
 
b/camel-core/src/main/java/org/apache/camel/impl/converter/BaseTypeConverterRegistry.java
index 8059b73..1a7bba0 100644
--- 
a/camel-core/src/main/java/org/apache/camel/impl/converter/BaseTypeConverterRegistry.java
+++ 
b/camel-core/src/main/java/org/apache/camel/impl/converter/BaseTypeConverterRegistry.java
@@ -381,23 +381,29 @@ public abstract class BaseTypeConverterRegistry extends 
ServiceSupport implement
         // as race conditions can lead to many threads trying to promote the 
same fallback converter
 
         if (typeConverter != converter) {
-            // duplicate detected
-            if (typeConverterExists == TypeConverterExists.Overwrite) {
-                if (converter != null) {
+
+            // add the converter unless we should ignore
+            boolean add = true;
+
+            // if converter is not null then a duplicate exists
+            if (converter != null) {
+                if (typeConverterExists == TypeConverterExists.Overwrite) {
                     CamelLogger logger = new CamelLogger(log, 
typeConverterExistsLoggingLevel);
                     logger.log("Overriding type converter from: " + converter 
+ " to: " + typeConverter);
+                } else if (typeConverterExists == TypeConverterExists.Ignore) {
+                    CamelLogger logger = new CamelLogger(log, 
typeConverterExistsLoggingLevel);
+                    logger.log("Ignoring duplicate type converter from: " + 
converter + " to: " + typeConverter);
+                    add = false;
+                } else {
+                    // we should fail
+                    throw new TypeConverterExistsException(toType, fromType);
                 }
+            }
+
+            if (add) {
                 typeMappings.put(key, typeConverter);
                 // remove any previous misses, as we added the new type 
converter
                 misses.remove(key);
-            } else if (typeConverterExists == TypeConverterExists.Ignore) {
-                if (converter != null) {
-                    CamelLogger logger = new CamelLogger(log, 
typeConverterExistsLoggingLevel);
-                    logger.log("Ignore duplicate type converter from: " + 
converter + " to: " + typeConverter);
-                }
-            } else {
-                // we should fail
-                throw new TypeConverterExistsException(toType, fromType);
             }
         }
     }

http://git-wip-us.apache.org/repos/asf/camel/blob/a7a40d21/camel-core/src/test/java/org/apache/camel/impl/TypeConverterRegistryTest.java
----------------------------------------------------------------------
diff --git 
a/camel-core/src/test/java/org/apache/camel/impl/TypeConverterRegistryTest.java 
b/camel-core/src/test/java/org/apache/camel/impl/TypeConverterRegistryTest.java
index b5082c4..c12b7d6 100644
--- 
a/camel-core/src/test/java/org/apache/camel/impl/TypeConverterRegistryTest.java
+++ 
b/camel-core/src/test/java/org/apache/camel/impl/TypeConverterRegistryTest.java
@@ -21,7 +21,10 @@ import java.io.InputStream;
 
 import junit.framework.TestCase;
 import org.apache.camel.Exchange;
+import org.apache.camel.LoggingLevel;
 import org.apache.camel.TypeConverter;
+import org.apache.camel.TypeConverterExistsException;
+import org.apache.camel.spi.TypeConverterRegistry;
 import org.apache.camel.support.TypeConverterSupport;
 
 /**
@@ -54,6 +57,35 @@ public class TypeConverterRegistryTest extends TestCase {
         assertEquals(123, order.getId());
     }
 
+    public void testAddDuplicateTypeConverter() {
+        DefaultCamelContext context = new DefaultCamelContext();
+
+        context.getTypeConverterRegistry().addTypeConverter(MyOrder.class, 
String.class, new MyOrderTypeConverter());
+        context.getTypeConverterRegistry().addTypeConverter(MyOrder.class, 
String.class, new MyOrderTypeConverter());
+    }
+
+    public void testAddDuplicateTypeConverterIgnore() {
+        DefaultCamelContext context = new DefaultCamelContext();
+        
context.getTypeConverterRegistry().setTypeConverterExists(TypeConverterRegistry.TypeConverterExists.Ignore);
+        
context.getTypeConverterRegistry().setTypeConverterExistsLoggingLevel(LoggingLevel.INFO);
+
+        context.getTypeConverterRegistry().addTypeConverter(MyOrder.class, 
String.class, new MyOrderTypeConverter());
+        context.getTypeConverterRegistry().addTypeConverter(MyOrder.class, 
String.class, new MyOrderTypeConverter());
+    }
+
+    public void testAddDuplicateTypeConverterFail() {
+        DefaultCamelContext context = new DefaultCamelContext();
+        
context.getTypeConverterRegistry().setTypeConverterExists(TypeConverterRegistry.TypeConverterExists.Fail);
+
+        context.getTypeConverterRegistry().addTypeConverter(MyOrder.class, 
String.class, new MyOrderTypeConverter());
+        try {
+            context.getTypeConverterRegistry().addTypeConverter(MyOrder.class, 
String.class, new MyOrderTypeConverter());
+            fail("Should have thrown exception");
+        } catch (TypeConverterExistsException e) {
+            // expected
+        }
+    }
+
     public void testRemoveTypeConverter() {
         DefaultCamelContext context = new DefaultCamelContext();
 

Reply via email to