package org.cryptocoinpartners.util; import com.google.inject.*; import com.google.inject.matcher.Matchers; import com.google.inject.spi.TypeEncounter; import com.google.inject.spi.TypeListener; import com.google.inject.util.Providers; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.lang.reflect.Field; /** * @author Tim Olson */ public class LogInjector implements Module { @Override public void configure(Binder binder) { // SLF4J logger injection binder.bind(Logger.class).toProvider(Providers.of(dummyLogger)); binder.bindListener(Matchers.any(), new MyTypeListener()); } private static class MyTypeListener implements TypeListener { @Override public <I> void hear(TypeLiteral<I> typeLiteral, TypeEncounter<I> typeEncounter) { for( Class<?> c = typeLiteral.getRawType(); c != Object.class; c = c.getSuperclass() ) { for( final Field field : c.getDeclaredFields() ) { if( field.getType().isAssignableFrom(Logger.class) && field.isAnnotationPresent(Inject.class) ) { typeEncounter.register(new MyMembersInjector<I>(field)); } } } } } private static class MyMembersInjector<I> implements MembersInjector<I> { public MyMembersInjector(Field field) { this.field = field; } public void injectMembers(I i) { try { boolean wasAccessible = field.isAccessible(); field.setAccessible(true); if( field.get(i) == null ) { field.set(i, LoggerFactory.getLogger(field.getDeclaringClass())); } field.setAccessible(wasAccessible); } catch( IllegalAccessException e ) { e.printStackTrace(); } } private final Field field; } private static final Logger dummyLogger = LoggerFactory.getLogger(""); }