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.methodToString;
014 import static org.picocontainer.monitors.ComponentMonitorHelper.memberToString;
015 import static org.picocontainer.monitors.ComponentMonitorHelper.ctorToString;
016 import static org.picocontainer.monitors.ComponentMonitorHelper.parmsToString;
017 import static org.picocontainer.monitors.ComponentMonitorHelper.format;
018
019 import java.io.PrintWriter;
020 import java.io.Writer;
021 import java.lang.reflect.Constructor;
022 import java.lang.reflect.Method;
023 import java.lang.reflect.Member;
024
025 import org.picocontainer.ComponentMonitor;
026 import org.picocontainer.ComponentAdapter;
027 import org.picocontainer.MutablePicoContainer;
028 import org.picocontainer.PicoContainer;
029
030 /**
031 * A {@link ComponentMonitor} which writes to a {@link Writer}.
032 *
033 * @author Paul Hammant
034 * @author Aslak Hellesøy
035 * @author Mauro Talevi
036 */
037 public class WriterComponentMonitor implements ComponentMonitor {
038
039 private final PrintWriter out;
040 private final ComponentMonitor delegate;
041
042 public WriterComponentMonitor(Writer out) {
043 this(out, new NullComponentMonitor());
044 }
045
046 public WriterComponentMonitor(Writer out, ComponentMonitor delegate) {
047 this.out = new PrintWriter(out);
048 this.delegate = delegate;
049 }
050
051 public Constructor instantiating(PicoContainer container, ComponentAdapter componentAdapter,
052 Constructor constructor) {
053 out.println(format(ComponentMonitorHelper.INSTANTIATING, ctorToString(constructor)));
054 return delegate.instantiating(container, componentAdapter, constructor);
055 }
056
057 public void instantiated(PicoContainer container, ComponentAdapter componentAdapter,
058 Constructor constructor,
059 Object instantiated,
060 Object[] injected,
061 long duration) {
062 out.println(format(ComponentMonitorHelper.INSTANTIATED, ctorToString(constructor), duration, instantiated.getClass().getName(), parmsToString(injected)));
063 delegate.instantiated(container, componentAdapter, constructor, instantiated, injected, duration);
064 }
065
066 public void instantiationFailed(PicoContainer container,
067 ComponentAdapter componentAdapter,
068 Constructor constructor,
069 Exception cause) {
070 out.println(format(ComponentMonitorHelper.INSTANTIATION_FAILED, ctorToString(constructor), cause.getMessage()));
071 delegate.instantiationFailed(container, null, constructor, cause);
072 }
073
074 public void invoking(PicoContainer container,
075 ComponentAdapter componentAdapter,
076 Member member,
077 Object instance) {
078 out.println(format(ComponentMonitorHelper.INVOKING, memberToString(member), instance));
079 delegate.invoking(container, componentAdapter, member, instance);
080 }
081
082 public void invoked(PicoContainer container,
083 ComponentAdapter componentAdapter,
084 Method method,
085 Object instance,
086 long duration) {
087 out.println(format(ComponentMonitorHelper.INVOKED, methodToString(method), instance, duration));
088 delegate.invoked(container, componentAdapter, method, instance, duration);
089 }
090
091 public void invocationFailed(Member member, Object instance, Exception cause) {
092 out.println(format(ComponentMonitorHelper.INVOCATION_FAILED, memberToString(member), instance, cause.getMessage()));
093 delegate.invocationFailed(member, instance, cause);
094 }
095
096 public void lifecycleInvocationFailed(MutablePicoContainer container,
097 ComponentAdapter componentAdapter, Method method,
098 Object instance,
099 RuntimeException cause) {
100 out.println(format(ComponentMonitorHelper.LIFECYCLE_INVOCATION_FAILED, methodToString(method), instance, cause.getMessage()));
101 delegate.lifecycleInvocationFailed(container, componentAdapter, method, instance, cause);
102 }
103
104 public Object noComponentFound(MutablePicoContainer container, Object componentKey) {
105 out.println(format(ComponentMonitorHelper.NO_COMPONENT, componentKey));
106 return delegate.noComponentFound(container, componentKey);
107 }
108 }