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();
