Skip to content

Instantly share code, notes, and snippets.

@isopov
Created September 14, 2011 19:43
Show Gist options
  • Save isopov/1217563 to your computer and use it in GitHub Desktop.
Save isopov/1217563 to your computer and use it in GitHub Desktop.
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
import javax.inject.Inject;
import com.google.inject.Binder;
import com.google.inject.Guice;
import com.google.inject.Injector;
import com.google.inject.Module;
import com.google.inject.multibindings.Multibinder;
public class Test {
public static void main(String[] args) {
Injector injector = Guice.createInjector(new Module() {
@Override
public void configure(Binder binder) {
@SuppressWarnings("rawtypes")
Multibinder<Converter> converterBinder = Multibinder.newSetBinder(binder, Converter.class);
converterBinder.addBinding().to(StringBooleanConverter.class);
converterBinder.addBinding().to(BooleanStringConverter.class);
}
});
ConverterRegistryImpl registry = injector.getInstance(ConverterRegistryImpl.class);
System.out.println(registry.converterRegistry.size());
}
public static class ConverterRegistryImpl {
private Map<Key, Converter<?, ?>> converterRegistry = new HashMap<Key, Converter<?, ?>>();
@Inject
public void setConverters(@SuppressWarnings("rawtypes") Set<Converter> converters) {
for (Converter<?, ?> converter : converters) {
register(converter.getFromClass(), converter.getToClass(), converter);
}
}
private void register(Class<?> fromType, Class<?> toType, Converter<?, ?> converter) {
converterRegistry.put(new Key(fromType, toType), converter);
}
}
public static class Key {
Class<?> first;
Class<?> second;
public Key(Class<?> first, Class<?> second) {
this.first = first;
this.second = second;
}
}
private static class StringBooleanConverter implements Converter<String, Boolean> {
@Override
public Boolean convert(String input) {
return Boolean.valueOf(input);
}
@Override
public Class<String> getFromClass() {
return String.class;
}
@Override
public Class<Boolean> getToClass() {
return Boolean.class;
}
}
private static class BooleanStringConverter implements Converter<Boolean, String> {
@Override
public String convert(Boolean input) {
return String.valueOf(input);
}
@Override
public Class<Boolean> getFromClass() {
return Boolean.class;
}
@Override
public Class<String> getToClass() {
return String.class;
}
}
private interface Converter<E, T> {
T convert(E input);
Class<E> getFromClass();
Class<T> getToClass();
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment