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.lifecycle;
009    
010    import org.picocontainer.LifecycleStrategy;
011    
012    /**
013     * Allow for use of alternate LifecycleStrategy strategies to be used
014     * at the same time. A component can be started/stopped/disposed according
015     * to *any* of the supplied LifecycleStrategy instances.
016     *
017     * @author Paul Hammant
018     */
019    public class CompositeLifecycleStrategy implements LifecycleStrategy {
020    
021        private final StartableLifecycleStrategy[] alternateStrategies;
022    
023        public CompositeLifecycleStrategy(StartableLifecycleStrategy... alternateStrategies) {
024            this.alternateStrategies = alternateStrategies;
025        }
026    
027        public void start(Object component) {
028            for (StartableLifecycleStrategy lifecycleStrategy : alternateStrategies) {
029                lifecycleStrategy.start(component);
030            }
031        }
032    
033        public void stop(Object component) {
034            for (StartableLifecycleStrategy lifecycleStrategy : alternateStrategies) {
035                lifecycleStrategy.stop(component);
036            }
037        }
038    
039        public void dispose(Object component) {
040            for (StartableLifecycleStrategy lifecycleStrategy : alternateStrategies) {
041                lifecycleStrategy.dispose(component);
042            }
043        }
044    
045        public boolean hasLifecycle(Class<?> type) {
046            for (StartableLifecycleStrategy lifecycleStrategy : alternateStrategies) {
047                if (lifecycleStrategy.hasLifecycle(type)) {
048                    return true;
049                }
050            }
051            return false;
052        }
053    }