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 2019/05/27 16:10:29 UTC

[camel] branch master updated: CAMEL-13581: Avoid duplicate TypeConverter WARNs from when using OSGi.

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

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


The following commit(s) were added to refs/heads/master by this push:
     new 0192930  CAMEL-13581: Avoid duplicate TypeConverter WARNs from when using OSGi.
0192930 is described below

commit 01929305fda4dd9b9017fd984b00319f368d50ed
Author: Claus Ibsen <cl...@gmail.com>
AuthorDate: Mon May 27 18:10:05 2019 +0200

    CAMEL-13581: Avoid duplicate TypeConverter WARNs from when using OSGi.
---
 .../apache/camel/core/osgi/OsgiTypeConverter.java  | 27 +++++++++++++++++++++-
 1 file changed, 26 insertions(+), 1 deletion(-)

diff --git a/core/camel-core-osgi/src/main/java/org/apache/camel/core/osgi/OsgiTypeConverter.java b/core/camel-core-osgi/src/main/java/org/apache/camel/core/osgi/OsgiTypeConverter.java
index f328be8..0c31bc0 100644
--- a/core/camel-core-osgi/src/main/java/org/apache/camel/core/osgi/OsgiTypeConverter.java
+++ b/core/camel-core-osgi/src/main/java/org/apache/camel/core/osgi/OsgiTypeConverter.java
@@ -43,8 +43,10 @@ import org.apache.camel.impl.converter.DefaultTypeConverter;
 import org.apache.camel.impl.engine.DefaultPackageScanClassResolver;
 import org.apache.camel.spi.FactoryFinder;
 import org.apache.camel.spi.Injector;
+import org.apache.camel.spi.PackageScanClassResolver;
 import org.apache.camel.spi.TypeConverterLoader;
 import org.apache.camel.spi.TypeConverterRegistry;
+import org.apache.camel.support.SimpleTypeConverter;
 import org.apache.camel.support.service.ServiceHelper;
 import org.apache.camel.support.service.ServiceSupport;
 import org.osgi.framework.BundleContext;
@@ -218,7 +220,7 @@ public class OsgiTypeConverter extends ServiceSupport implements TypeConverter,
 
     protected DefaultTypeConverter createRegistry() {
         // base the osgi type converter on the default type converter
-        DefaultTypeConverter answer = new DefaultTypeConverter(new DefaultPackageScanClassResolver() {
+        DefaultTypeConverter answer = new OsgiDefaultTypeConverter(new DefaultPackageScanClassResolver() {
             @Override
             public Set<ClassLoader> getClassLoaders() {
                 // we only need classloaders for loading core TypeConverterLoaders
@@ -280,4 +282,27 @@ public class OsgiTypeConverter extends ServiceSupport implements TypeConverter,
                         Spliterator.ORDERED), false);
     }
 
+    private class OsgiDefaultTypeConverter extends DefaultTypeConverter {
+
+        public OsgiDefaultTypeConverter(PackageScanClassResolver resolver, Injector injector, FactoryFinder factoryFinder, boolean loadTypeConverters) {
+            super(resolver, injector, factoryFinder, loadTypeConverters);
+        }
+
+        @Override
+        public void addTypeConverter(Class<?> toType, Class<?> fromType, TypeConverter typeConverter) {
+            // favour keeping the converter that was loaded via TypeConverterLoader META-INF file
+            // as OSGi loads these first and then gets triggered again later when there is both a META-INF/TypeConverter and META-INF/TypeConverterLoaded file
+            // for the same set of type converters and we get duplicates (so this is a way of filtering out duplicates)
+            TypeConverter converter = typeMappings.get(toType, fromType);
+            if (converter != null && converter != typeConverter) {
+                // the converter is already there which we want to keep (optimized via SimpleTypeConverter)
+                if (converter instanceof SimpleTypeConverter) {
+                    // okay keep this one
+                    return;
+                }
+            }
+            super.addTypeConverter(toType, fromType, typeConverter);
+        }
+    }
+
 }