001 /***************************************************************************** 002 * Copyright (C) PicoContainer Organization. All rights reserved. * 003 * ------------------------------------------------------------------------- * 004 * The software in this package is published under the terms of the BSD * 005 * style license a copy of which has been included with this distribution in * 006 * the LICENSE.txt file. * 007 * * 008 * Original code by Paul Hammaant * 009 *****************************************************************************/ 010 011 package org.picocontainer.monitors; 012 013 import static org.picocontainer.monitors.ComponentMonitorHelper.ctorToString; 014 import static org.picocontainer.monitors.ComponentMonitorHelper.format; 015 import static org.picocontainer.monitors.ComponentMonitorHelper.memberToString; 016 import static org.picocontainer.monitors.ComponentMonitorHelper.methodToString; 017 import static org.picocontainer.monitors.ComponentMonitorHelper.parmsToString; 018 019 import java.io.PrintWriter; 020 import java.io.Writer; 021 import java.lang.reflect.Constructor; 022 import java.lang.reflect.Member; 023 import java.lang.reflect.Method; 024 025 import org.picocontainer.ComponentAdapter; 026 import org.picocontainer.ComponentMonitor; 027 import org.picocontainer.MutablePicoContainer; 028 import org.picocontainer.PicoContainer; 029 import org.picocontainer.injectors.AbstractInjector; 030 031 /** 032 * A {@link ComponentMonitor} which writes to a {@link Writer}. 033 * 034 * @author Paul Hammant 035 * @author Aslak Hellesøy 036 * @author Mauro Talevi 037 */ 038 public class WriterComponentMonitor implements ComponentMonitor { 039 040 private final PrintWriter out; 041 private final ComponentMonitor delegate; 042 043 public WriterComponentMonitor(Writer out) { 044 this(out, new NullComponentMonitor()); 045 } 046 047 public WriterComponentMonitor(Writer out, ComponentMonitor delegate) { 048 this.out = new PrintWriter(out); 049 this.delegate = delegate; 050 } 051 052 public <T> Constructor<T> instantiating(PicoContainer container, ComponentAdapter<T> componentAdapter, 053 Constructor<T> constructor) { 054 out.println(format(ComponentMonitorHelper.INSTANTIATING, ctorToString(constructor))); 055 return delegate.instantiating(container, componentAdapter, constructor); 056 } 057 058 public <T> void instantiated(PicoContainer container, ComponentAdapter<T> componentAdapter, 059 Constructor<T> constructor, 060 Object instantiated, 061 Object[] injected, 062 long duration) { 063 out.println(format(ComponentMonitorHelper.INSTANTIATED, ctorToString(constructor), duration, instantiated.getClass().getName(), parmsToString(injected))); 064 delegate.instantiated(container, componentAdapter, constructor, instantiated, injected, duration); 065 } 066 067 public <T> void instantiationFailed(PicoContainer container, 068 ComponentAdapter<T> componentAdapter, 069 Constructor<T> constructor, 070 Exception cause) { 071 out.println(format(ComponentMonitorHelper.INSTANTIATION_FAILED, ctorToString(constructor), cause.getMessage())); 072 delegate.instantiationFailed(container, null, constructor, cause); 073 } 074 075 public void invoking(PicoContainer container, 076 ComponentAdapter<?> componentAdapter, 077 Member member, 078 Object instance) { 079 out.println(format(ComponentMonitorHelper.INVOKING, memberToString(member), instance)); 080 delegate.invoking(container, componentAdapter, member, instance); 081 } 082 083 public void invoked(PicoContainer container, 084 ComponentAdapter<?> componentAdapter, 085 Method method, 086 Object instance, 087 long duration) { 088 out.println(format(ComponentMonitorHelper.INVOKED, methodToString(method), instance, duration)); 089 delegate.invoked(container, componentAdapter, method, instance, duration); 090 } 091 092 public void invocationFailed(Member member, Object instance, Exception cause) { 093 out.println(format(ComponentMonitorHelper.INVOCATION_FAILED, memberToString(member), instance, cause.getMessage())); 094 delegate.invocationFailed(member, instance, cause); 095 } 096 097 public void lifecycleInvocationFailed(MutablePicoContainer container, 098 ComponentAdapter<?> componentAdapter, Method method, 099 Object instance, 100 RuntimeException cause) { 101 out.println(format(ComponentMonitorHelper.LIFECYCLE_INVOCATION_FAILED, methodToString(method), instance, cause.getMessage())); 102 delegate.lifecycleInvocationFailed(container, componentAdapter, method, instance, cause); 103 } 104 105 public Object noComponentFound(MutablePicoContainer container, Object componentKey) { 106 out.println(format(ComponentMonitorHelper.NO_COMPONENT, componentKey)); 107 return delegate.noComponentFound(container, componentKey); 108 } 109 110 public AbstractInjector newInjectionFactory(AbstractInjector abstractInjector) { 111 return delegate.newInjectionFactory(abstractInjector); 112 } 113 }