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.OutputStream; 020 import java.io.PrintStream; 021 import java.io.Serializable; 022 import java.lang.reflect.Constructor; 023 import java.lang.reflect.Member; 024 import java.lang.reflect.Method; 025 026 import org.picocontainer.ComponentAdapter; 027 import org.picocontainer.ComponentMonitor; 028 import org.picocontainer.MutablePicoContainer; 029 import org.picocontainer.PicoContainer; 030 import org.picocontainer.Injector; 031 import org.picocontainer.Behavior; 032 033 /** 034 * A {@link ComponentMonitor} which writes to a {@link OutputStream}. 035 * This is typically used to write to a console. 036 * (TODO After serialization, the output printstream is null) 037 * 038 * @author Paul Hammant 039 * @author Aslak Hellesøy 040 * @author Mauro Talevi 041 */ 042 @SuppressWarnings("serial") 043 public class ConsoleComponentMonitor implements ComponentMonitor, Serializable { 044 045 /** 046 * The outgoing print stream. 047 */ 048 private final transient PrintStream out; 049 050 /** 051 * Delegate component monitor (for component monitor chains). 052 */ 053 private final ComponentMonitor delegate; 054 055 /** 056 * Constructs a console component monitor that sends output to <tt>System.out</tt>. 057 */ 058 public ConsoleComponentMonitor() { 059 this(System.out); 060 } 061 062 /** 063 * Constructs a console component monitor that sends output to the specified output stream. 064 * 065 * @param out the designated output stream. Options include System.out, Socket streams, File streams, 066 * etc. 067 */ 068 public ConsoleComponentMonitor(OutputStream out) { 069 this(out, new NullComponentMonitor()); 070 } 071 072 /** 073 * Constructs a console component monitor chain that sends output to the specified output stream 074 * and then sends all events to the delegate component monitor. 075 * @param out the output stream of choice. 076 * @param delegate the next monitor in the component monitor chain to receive event information. 077 */ 078 public ConsoleComponentMonitor(OutputStream out, ComponentMonitor delegate) { 079 this.out = new PrintStream(out); 080 this.delegate = delegate; 081 } 082 083 public <T> Constructor<T> instantiating(PicoContainer container, ComponentAdapter<T> componentAdapter, 084 Constructor<T> constructor 085 ) { 086 out.println(format(ComponentMonitorHelper.INSTANTIATING, ctorToString(constructor))); 087 return delegate.instantiating(container, componentAdapter, constructor); 088 } 089 090 public <T> void instantiated(PicoContainer container, ComponentAdapter<T> componentAdapter, 091 Constructor<T> constructor, 092 Object instantiated, 093 Object[] parameters, 094 long duration) { 095 out.println(format(ComponentMonitorHelper.INSTANTIATED, ctorToString(constructor), duration, instantiated.getClass().getName(), parmsToString(parameters))); 096 delegate.instantiated(container, componentAdapter, constructor, instantiated, parameters, duration); 097 } 098 099 public <T> void instantiationFailed(PicoContainer container, 100 ComponentAdapter<T> componentAdapter, 101 Constructor<T> constructor, 102 Exception cause) { 103 out.println(format(ComponentMonitorHelper.INSTANTIATION_FAILED, ctorToString(constructor), cause.getMessage())); 104 delegate.instantiationFailed(container, componentAdapter, constructor, cause); 105 } 106 107 public Object invoking(PicoContainer container, 108 ComponentAdapter<?> componentAdapter, 109 Member member, 110 Object instance, Object[] args) { 111 out.println(format(ComponentMonitorHelper.INVOKING, memberToString(member), instance)); 112 return delegate.invoking(container, componentAdapter, member, instance, args); 113 } 114 115 public void invoked(PicoContainer container, 116 ComponentAdapter<?> componentAdapter, 117 Member member, 118 Object instance, 119 long duration, 120 Object[] args, Object retVal) { 121 out.println(format(ComponentMonitorHelper.INVOKED, methodToString(member), instance, duration)); 122 delegate.invoked(container, componentAdapter, member, instance, duration, args, retVal); 123 } 124 125 public void invocationFailed(Member member, Object instance, Exception cause) { 126 out.println(format(ComponentMonitorHelper.INVOCATION_FAILED, memberToString(member), instance, cause.getMessage())); 127 delegate.invocationFailed(member, instance, cause); 128 } 129 130 public void lifecycleInvocationFailed(MutablePicoContainer container, 131 ComponentAdapter<?> componentAdapter, Method method, 132 Object instance, 133 RuntimeException cause) { 134 out.println(format(ComponentMonitorHelper.LIFECYCLE_INVOCATION_FAILED, methodToString(method), instance, cause.getMessage())); 135 delegate.lifecycleInvocationFailed(container, componentAdapter, method, instance, cause); 136 } 137 138 public Object noComponentFound(MutablePicoContainer container, Object componentKey) { 139 out.println(format(ComponentMonitorHelper.NO_COMPONENT, componentKey)); 140 return delegate.noComponentFound(container, componentKey); 141 } 142 143 public Injector newInjector(Injector injector) { 144 return delegate.newInjector(injector); 145 } 146 147 /** {@inheritDoc} **/ 148 public Behavior newBehavior(Behavior behavior) { 149 return delegate.newBehavior(behavior); 150 } 151 152 }