OsgiDefaultCamelContext.getTypeConverterRegistry() returns null 
----------------------------------------------------------------

                 Key: CAMEL-3143
                 URL: https://issues.apache.org/activemq/browse/CAMEL-3143
             Project: Apache Camel
          Issue Type: Bug
          Components: osgi
    Affects Versions: 2.4.0
            Reporter: Claes Redestad


The showed up when using dozer as shown in 
http://camel.apache.org/dozer-type-conversion.html, whose 
DozerTypeConverterLoader tries to get the type converter registry using: 
{{{TypeConverterRegistry registry = camelContext.getTypeConverterRegistry();}}}

Plausible error:
{code:title=OsgiDefaultCamelContext.java}
   @Override
    protected TypeConverter createTypeConverter() {
        return new OsgiTypeConverter(bundleContext, getInjector());
    }
{code}

{code:title=DefaultCamelContext.java}
public TypeConverterRegistry getTypeConverterRegistry() {
        if (typeConverterRegistry == null) {
            // init type converter as its lazy
            if (typeConverter == null) {
                getTypeConverter();
            }
            // type converter is usually the default one that also is the 
registry
            if (typeConverter instanceof DefaultTypeConverter) {
                typeConverterRegistry = (DefaultTypeConverter) typeConverter;
            }
        }
        return typeConverterRegistry;
    }
{code}

Error:
getTypeConverter() returns an OsgiTypeConverter 
OsgiTypeConverter does not inherit from DefaultTypeConverter, thus the 
instanceof returns false
=> null is returned

Solution:
Lots of different ways to do this, and it's getting late here. In this case, 
maybe it's OsgiDefaultCamelContext's responsibility to also override 
getTypeConverterRegistry with something along the lines of:
{code}
@Override
public TypeConverterRegistry getTypeConverterRegistry() {
        if (typeConverterRegistry == null) {
            // init type converter as its lazy
            if (typeConverter == null) {
                getTypeConverter();
            }
            // type converter is usually the default one that also is the 
registry
            if (typeConverter instanceof OsgiDefaultTypeConverter) {
                typeConverterRegistry = ((OsgiDefaultTypeConverter) 
typeConverter).getRegistry();
            }
        }
        return typeConverterRegistry;
    }
{code}

We've employed an (ugly) workaround in a local version of 
DozerTypeConverterLoader.java:
{code:java}
        TypeConverter typeConverter = camelContext.getTypeConverter();
        DefaultTypeConverter registry = null;
        if (typeConverter instanceof DefaultTypeConverter) {
            registry = (DefaultTypeConverter)typeConverter;
        } else if (typeConverter instanceof OsgiTypeConverter) {
            OsgiTypeConverter osgiTypeConverter = 
(OsgiTypeConverter)typeConverter;
            registry = osgiTypeConverter.getRegistry();
        }
{code}

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.

Reply via email to