package com.google.sitebricks.slf4j; import com.google.inject.ProvisionException; import com.google.inject.TypeLiteral; import com.google.inject.spi.InjectionListener; import com.google.inject.spi.TypeEncounter; import com.google.inject.spi.TypeListener; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.lang.reflect.Field; /** * @author dhanji@gmail.com (Dhanji R. Prasanna) */ class Slf4jInjectionTypeListener implements TypeListener { @Override public <I> void hear(final TypeLiteral<I> type, TypeEncounter<I> encounter) { final Field field = getLoggerField(type.getRawType()); if (field != null) { encounter.register(new InjectionListener<I>() { @Override public void afterInjection(I injectee) { try { boolean b = field.isAccessible(); if (!b) field.setAccessible(true); field.set(injectee, LoggerFactory.getLogger(type.getRawType())); if (!b) field.setAccessible(false); } catch (IllegalAccessException e) { throw new ProvisionException( "Unable to inject SLF4J logger", e); } } }); } } protected Field getLoggerField(Class<?> clazz) { // search for Logger in current class and return it if found for (final Field field : clazz.getDeclaredFields()) { final Class<?> typeOfField = field.getType(); if (Logger.class.isAssignableFrom(typeOfField)) { return field; } } // search for Logger in superclass if not found in this class if (clazz.getSuperclass() != null) { return getLoggerField(clazz.getSuperclass()); } // not in current class and not having superclass, return null return null; } }