trip.spi.helpers.ProducerFactoryMap Maven / Gradle / Ivy
package trip.spi.helpers;
import static trip.spi.helpers.filter.Filter.first;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import lombok.experimental.Delegate;
import lombok.experimental.ExtensionMethod;
import trip.spi.ProducerFactory;
import trip.spi.helpers.filter.Condition;
import trip.spi.helpers.filter.Filter;
@ExtensionMethod( Filter.class )
public class ProducerFactoryMap implements Map, List>> {
@Delegate
final Map, List>> map = new HashMap, List>>();
@SuppressWarnings("rawtypes")
public static ProducerFactoryMap from( final Iterable iterable ) {
final ProducerFactoryMap providers = new ProducerFactoryMap();
for ( final ProducerFactory> provider : iterable ) {
final Class> clazz = getGenericClassFrom( provider );
providers.memorizeProviderForClazz(provider, clazz);
}
return providers;
}
private static Class> getGenericClassFrom( final ProducerFactory> provider ) {
final Type[] types = provider.getClass().getGenericInterfaces();
for ( final Type type : types )
if ( ( (ParameterizedType)type ).getRawType().equals( ProducerFactory.class ) )
return (Class>)( (ParameterizedType)type ).getActualTypeArguments()[0];
return null;
}
public void memorizeProviderForClazz( final ProducerFactory> provider, final Class> clazz ) {
List> iterable = map.get( clazz );
if ( iterable == null ) {
iterable = new ArrayList>();
map.put( clazz, iterable );
}
iterable.add( provider );
}
public ProducerFactory> get( final Class> clazz, final Condition> condition ) {
final List> list = get( clazz );
if ( list == null )
return null;
return first(list, condition);
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy