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 Mauro Talevi * 009 *****************************************************************************/ 010 011 package org.picocontainer.defaults; 012 013 import java.io.Serializable; 014 import java.lang.reflect.Constructor; 015 import java.lang.reflect.Method; 016 017 import org.picocontainer.ComponentMonitor; 018 import org.picocontainer.monitors.DefaultComponentMonitor; 019 020 /** 021 * <p> 022 * A {@link ComponentMonitor monitor} which delegates to another monitor. 023 * It provides a {@link DefaultComponentMonitor default ComponentMonitor}, 024 * but does not allow to use <code>null</code> for the delegate. 025 * </p> 026 * <p> 027 * It also supports a {@link ComponentMonitorStrategy monitor strategy} 028 * that allows to change the delegate. 029 * </p> 030 * 031 * @author Mauro Talevi 032 * @version $Revision: $ 033 * @since 1.2 034 */ 035 public class DelegatingComponentMonitor implements ComponentMonitor, ComponentMonitorStrategy, Serializable { 036 037 private ComponentMonitor delegate; 038 039 /** 040 * Creates a DelegatingComponentMonitor with a given delegate 041 * @param delegate the ComponentMonitor to which this monitor delegates 042 */ 043 public DelegatingComponentMonitor(ComponentMonitor delegate) { 044 checkMonitor(delegate); 045 this.delegate = delegate; 046 } 047 048 /** 049 * Creates a DelegatingComponentMonitor with an instance of 050 * {@link DefaultComponentMonitor}. 051 */ 052 public DelegatingComponentMonitor() { 053 this(DefaultComponentMonitor.getInstance()); 054 } 055 056 public void instantiating(Constructor constructor) { 057 delegate.instantiating(constructor); 058 } 059 060 public void instantiated(Constructor constructor, long duration) { 061 delegate.instantiated(constructor, duration); 062 } 063 064 public void instantiated(Constructor constructor, Object instantiated, Object[] injected, long duration) { 065 delegate.instantiated(constructor, instantiated, injected, duration); 066 } 067 068 public void instantiationFailed(Constructor constructor, Exception e) { 069 delegate.instantiationFailed(constructor, e); 070 } 071 072 public void invoking(Method method, Object instance) { 073 delegate.invoking(method, instance); 074 } 075 076 public void invoked(Method method, Object instance, long duration) { 077 delegate.invoked(method, instance, duration); 078 } 079 080 public void invocationFailed(Method method, Object instance, Exception e) { 081 delegate.invocationFailed(method, instance, e); 082 } 083 084 public void lifecycleInvocationFailed(Method method, Object instance, RuntimeException cause) { 085 delegate.lifecycleInvocationFailed(method,instance, cause); 086 } 087 088 /** 089 * If the delegate supports a {@link ComponentMonitorStrategy monitor strategy}, 090 * this is used to changed the monitor while keeping the same delegate. 091 * Else the delegate is replaced by the new monitor. 092 * {@inheritDoc} 093 */ 094 public void changeMonitor(ComponentMonitor monitor) { 095 checkMonitor(monitor); 096 if ( delegate instanceof ComponentMonitorStrategy ){ 097 ((ComponentMonitorStrategy)delegate).changeMonitor(monitor); 098 } else { 099 delegate = monitor; 100 } 101 } 102 103 public ComponentMonitor currentMonitor() { 104 if ( delegate instanceof ComponentMonitorStrategy ){ 105 return ((ComponentMonitorStrategy)delegate).currentMonitor(); 106 } else { 107 return delegate; 108 } 109 } 110 111 private void checkMonitor(ComponentMonitor monitor) { 112 if ( monitor == null ){ 113 throw new NullPointerException("monitor"); 114 } 115 } 116 117 }