You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@camel.apache.org by "Jan Bednar (JIRA)" <ji...@apache.org> on 2019/05/25 17:36:00 UTC

[jira] [Created] (CAMEL-13578) Implementation of List and Map utilising TypeConverter

Jan Bednar created CAMEL-13578:
----------------------------------

             Summary: Implementation of List and Map utilising TypeConverter
                 Key: CAMEL-13578
                 URL: https://issues.apache.org/jira/browse/CAMEL-13578
             Project: Camel
          Issue Type: New Feature
          Components: camel-core
    Affects Versions: 3.0.0-M2
            Reporter: Jan Bednar


We have implemented this in our project. This is convenient for working with List<Map<>> and Map<List<>>objects.

I can implement this into Camel, but there is massive refactoring in Camel 3 about modules and I`m not quite sure if this should be part of core, support, base,... , or event special new module. Any thoughts or docs about camel 3 module architecture?

*Usage:*
{code:java}
//Body contains List<Map<String, String>>
String.value = exchange.getIn()
.getBody(TypeConverterList.class)
.get(0, TypeConverterMap.class)
.get("key1", String.class);{code}
which is more flexible alternative to current approach
{code:java}
String value = (String)(((Map)exchange.getIn().getBody(List.class).get(0)).get("key1"));{code}
 

This is achieved implementing two new TypeConverters: *List -> TypeConverterList* and *Map -> TypeConverterMap*.

Instances of *TypeConverterList* and *TypeConverterMap* holds reference to org.apache.camel.TypeConverter
 and looks like:

 
{code:java}
public class TypeConverterMap<K,V> extends ForwardingMap<K,V> {
    private final TypeConverter typeConverter;
    private final Map<K,V> delegate;

    public TypeConverterMap(CamelContext camelContext, Map<K,V> delegate) {
        this.delegate = delegate;
        this.typeConverter = camelContext.getTypeConverter();
    }

    @Override
    protected Map<K,V> delegate() {
        return delegate;
    }

    public <T> T get(K key, Class<T> clazz){
        return typeConverter.convertTo(clazz, get(key));
    }

    public <T extends V> T getOrDefault(K key, V defaultValue, Class<T> clazz) {
        return typeConverter.convertTo(clazz, getOrDefault(key, defaultValue));
    }
}{code}
 



--
This message was sent by Atlassian JIRA
(v7.6.3#76005)