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                                                          *
009     *****************************************************************************/
010    package org.picocontainer.defaults;
011    
012    import org.picocontainer.LifecycleManager;
013    import org.picocontainer.PicoContainer;
014    import org.picocontainer.monitors.DefaultComponentMonitor;
015    
016    /**
017     * <p>
018     * Component adapter which wraps a component instance.
019     * </p>
020     * <p>
021     * This component adapter supports both a {@link LifecycleManager LifecycleManager} and a 
022     * {@link LifecycleStrategy LifecycleStrategy} to control the lifecycle of the component.
023     * The lifecycle manager methods simply delegate to the lifecycle strategy methods 
024     * on the component instance.
025     * </p>
026     * 
027     * @author Aslak Helles&oslash;y
028     * @author Paul Hammant
029     * @author Mauro Talevi
030     * @version $Revision: 2823 $
031     */
032    public class InstanceComponentAdapter extends AbstractComponentAdapter implements LifecycleManager, LifecycleStrategy {
033        private Object componentInstance;
034        private LifecycleStrategy lifecycleStrategy;
035    
036        public InstanceComponentAdapter(Object componentKey, Object componentInstance) throws AssignabilityRegistrationException, NotConcreteRegistrationException {
037            this(componentKey, componentInstance, new DefaultLifecycleStrategy(new DefaultComponentMonitor()));
038        }
039    
040        public InstanceComponentAdapter(Object componentKey, Object componentInstance, LifecycleStrategy lifecycleStrategy) throws AssignabilityRegistrationException, NotConcreteRegistrationException {
041            super(componentKey, getInstanceClass(componentInstance));
042            this.componentInstance = componentInstance;
043            this.lifecycleStrategy = lifecycleStrategy;
044        }
045    
046        private static Class getInstanceClass(Object componentInstance) {
047            if (componentInstance == null) {
048                throw new NullPointerException("componentInstance cannot be null");
049            }
050            return componentInstance.getClass();
051        }
052    
053        public Object getComponentInstance(PicoContainer container) {
054            return componentInstance;
055        }
056        
057        public void verify(PicoContainer container) {
058        }
059    
060        // ~~~~~~~~ LifecylceManager ~~~~~~~~
061    
062        public void start(PicoContainer container) {
063            start(componentInstance);
064        }
065    
066        public void stop(PicoContainer container) {
067            stop(componentInstance);
068        }
069    
070        public void dispose(PicoContainer container) {
071            dispose(componentInstance);
072        }
073    
074        public boolean hasLifecycle() {
075            return hasLifecycle(componentInstance.getClass());
076        }
077    
078        // ~~~~~~~~ LifecylceStrategy ~~~~~~~~
079        
080        public void start(Object component) {
081            lifecycleStrategy.start(componentInstance);
082        }
083    
084        public void stop(Object component) {
085            lifecycleStrategy.stop(componentInstance);
086        }
087    
088        public void dispose(Object component) {
089            lifecycleStrategy.dispose(componentInstance);
090        }
091    
092        public boolean hasLifecycle(Class type) {
093            return lifecycleStrategy.hasLifecycle(type);
094        }
095    
096    }