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 package org.picocontainer.defaults; 009 010 import org.picocontainer.ComponentMonitor; 011 import org.picocontainer.Disposable; 012 import org.picocontainer.Startable; 013 014 import java.lang.reflect.Method; 015 016 /** 017 * Default lifecycle strategy. Starts and stops component if Startable, 018 * and disposes it if Disposable. 019 * 020 * @author Mauro Talevi 021 * @author Jörg Schaible 022 * @see Startable 023 * @see Disposable 024 */ 025 public class DefaultLifecycleStrategy extends AbstractMonitoringLifecycleStrategy { 026 027 private static Method start, stop, dispose; 028 { 029 try { 030 start = Startable.class.getMethod("start", (Class[])null); 031 stop = Startable.class.getMethod("stop", (Class[])null); 032 dispose = Disposable.class.getMethod("dispose", (Class[])null); 033 } catch (NoSuchMethodException e) { 034 } 035 } 036 037 public DefaultLifecycleStrategy(ComponentMonitor monitor) { 038 super(monitor); 039 } 040 041 public void start(Object component) { 042 if (component != null && component instanceof Startable) { 043 long str = System.currentTimeMillis(); 044 currentMonitor().invoking(start, component); 045 try { 046 ((Startable) component).start(); 047 currentMonitor().invoked(start, component, System.currentTimeMillis() - str); 048 } catch (RuntimeException cause) { 049 currentMonitor().lifecycleInvocationFailed(start, component, cause); // may re-throw 050 } 051 } 052 } 053 054 public void stop(Object component) { 055 if (component != null && component instanceof Startable) { 056 long str = System.currentTimeMillis(); 057 currentMonitor().invoking(stop, component); 058 try { 059 ((Startable) component).stop(); 060 currentMonitor().invoked(stop, component, System.currentTimeMillis() - str); 061 } catch (RuntimeException cause) { 062 currentMonitor().lifecycleInvocationFailed(stop, component, cause); // may re-throw 063 } 064 } 065 } 066 067 public void dispose(Object component) { 068 if (component != null && component instanceof Disposable) { 069 long str = System.currentTimeMillis(); 070 currentMonitor().invoking(dispose, component); 071 try { 072 ((Disposable) component).dispose(); 073 currentMonitor().invoked(dispose, component, System.currentTimeMillis() - str); 074 } catch (RuntimeException cause) { 075 currentMonitor().lifecycleInvocationFailed(dispose, component, cause); // may re-throw 076 } 077 } 078 } 079 080 public boolean hasLifecycle(Class type) { 081 return Startable.class.isAssignableFrom(type) || Disposable.class.isAssignableFrom(type); 082 } 083 }