001 package org.picocontainer.monitors; 002 003 import java.lang.reflect.Constructor; 004 import java.lang.reflect.Method; 005 import java.util.ArrayList; 006 import java.util.Collection; 007 import java.util.Iterator; 008 import java.util.List; 009 010 import org.picocontainer.ComponentMonitor; 011 import org.picocontainer.PicoException; 012 013 /** 014 * A {@link ComponentMonitor} which collects lifecycle failures 015 * and rethrows them on demand after the failures. 016 * 017 * @author Paul Hammant 018 * @author Mauro Talevi 019 */ 020 public class LifecycleComponentMonitor implements ComponentMonitor { 021 022 private final ComponentMonitor delegate; 023 private final List lifecycleFailures = new ArrayList(); 024 025 public LifecycleComponentMonitor(ComponentMonitor delegate) { 026 this.delegate = delegate; 027 } 028 029 public LifecycleComponentMonitor() { 030 delegate = new NullComponentMonitor(); 031 } 032 033 public void instantiating(Constructor constructor) { 034 delegate.instantiating(constructor); 035 } 036 037 public void instantiated(Constructor constructor, long duration) { 038 delegate.instantiated(constructor, duration); 039 } 040 041 public void instantiated(Constructor constructor, Object instantiated, Object[] parameters, long duration) { 042 delegate.instantiated(constructor, instantiated, parameters, duration); 043 } 044 045 public void instantiationFailed(Constructor constructor, Exception cause) { 046 delegate.instantiationFailed(constructor, cause); 047 } 048 049 public void invoking(Method method, Object instance) { 050 delegate.invoking(method, instance); 051 } 052 053 public void invoked(Method method, Object instance, long duration) { 054 delegate.invoked(method, instance, duration); 055 } 056 057 public void invocationFailed(Method method, Object instance, Exception cause) { 058 delegate.invocationFailed(method, instance, cause); 059 } 060 061 public void lifecycleInvocationFailed(Method method, Object instance, RuntimeException cause) { 062 lifecycleFailures.add(cause); 063 delegate.lifecycleInvocationFailed(method, instance, cause); 064 } 065 066 067 public void rethrowLifecycleFailuresException() { 068 throw new LifecycleFailuresException(lifecycleFailures); 069 } 070 071 /** 072 * Subclass of {@link PicoException} that is thrown when the collected 073 * lifecycle failures need to be be collectively rethrown. 074 * 075 * @author Paul Hammant 076 * @author Mauro Talevi 077 */ 078 public class LifecycleFailuresException extends PicoException { 079 080 private List lifecycleFailures; 081 082 public LifecycleFailuresException(List lifecycleFailures) { 083 this.lifecycleFailures = lifecycleFailures; 084 } 085 086 public String getMessage() { 087 StringBuffer message = new StringBuffer(); 088 for ( Iterator i = lifecycleFailures.iterator(); i.hasNext(); ) { 089 Exception failure = (Exception) i.next(); 090 message.append(failure.getMessage()).append("; "); 091 } 092 return message.toString(); 093 } 094 095 public Collection getFailures() { 096 return lifecycleFailures; 097 } 098 } 099 }