/* * Created on Nov 5, 2004 */ package org.springframework.util.logging; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import org.apache.commons.logging.Log; import org.springframework.beans.BeanUtils; import org.springframework.beans.BeansException; import org.springframework.beans.factory.config.BeanPostProcessor; /** * @author robh * */ public class CommonsLogProviderBeanPostProcessor implements BeanPostProcessor { private static final String SET_METHOD = "setLog"; private static final Class[] SET_METHOD_TYPES = new Class[] { Log.class }; private CommonsLogProvider logProvider = new ClassNameCommonsLogProvider(); public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException { Method m = BeanUtils.findMethod(bean.getClass(), SET_METHOD, SET_METHOD_TYPES); if ((m != null) && (m.getReturnType() == void.class)) { setLog(m, bean, beanName); } return bean; } public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException { return bean; } public void setCommonsLogProvider(CommonsLogProvider logProvider) { this.logProvider = logProvider; } private void setLog(Method setLogMethod, Object bean, String beanName) { try { setLogMethod.invoke(bean, new Object[] { logProvider.getLogForBean( bean, beanName) }); } catch (IllegalAccessException ex) { throw new CommonsLogProviderException( "Unable to access target bean.", ex); } catch (InvocationTargetException ex) { throw new CommonsLogProviderException( "Exception when invoking setLog method on target bean.", ex); } } }