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