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 * Idea by Rachel Davies, Original code by Aslak Hellesoy and Paul Hammant   *
009 *****************************************************************************/
010
011package org.picocontainer.gems.behaviors;
012
013import org.picocontainer.ComponentAdapter;
014import org.picocontainer.Parameter;
015import org.picocontainer.PicoCompositionException;
016import org.picocontainer.ComponentMonitor;
017import org.picocontainer.LifecycleStrategy;
018import org.picocontainer.behaviors.AbstractBehaviorFactory;
019import org.picocontainer.gems.GemsCharacteristics;
020
021import java.util.Properties;
022
023
024/**
025 * Hides implementation.
026 * 
027 * @author Paul Hammant
028 * @author Aslak Hellesøy
029 * @see HotSwappable
030 */
031@SuppressWarnings("serial")
032public class HotSwapping extends AbstractBehaviorFactory {
033
034
035        @Override
036        public <T> ComponentAdapter<T> createComponentAdapter(final ComponentMonitor componentMonitor, final LifecycleStrategy lifecycleStrategy, final Properties componentProperties, final Object componentKey, final Class<T> componentImplementation, final Parameter... parameters)
037            throws PicoCompositionException {
038        ComponentAdapter<T> delegateAdapter = super.createComponentAdapter(componentMonitor, lifecycleStrategy,
039                componentProperties, componentKey, componentImplementation, parameters);
040
041        if (AbstractBehaviorFactory.removePropertiesIfPresent(componentProperties, GemsCharacteristics.NO_HOT_SWAP)) {
042                return delegateAdapter;
043                } 
044
045                AbstractBehaviorFactory.removePropertiesIfPresent(componentProperties, GemsCharacteristics.HOT_SWAP);        
046        return componentMonitor.newBehavior(new HotSwappable<T>(delegateAdapter));
047    }
048
049    @Override
050        public <T> ComponentAdapter<T> addComponentAdapter(final ComponentMonitor componentMonitor,
051                                                final LifecycleStrategy lifecycleStrategy,
052                                                final Properties componentProperties,
053                                                final ComponentAdapter<T> adapter) {
054        if (AbstractBehaviorFactory.removePropertiesIfPresent(componentProperties, GemsCharacteristics.NO_HOT_SWAP)) {
055                return super.addComponentAdapter(componentMonitor,
056                    lifecycleStrategy,
057                    componentProperties,
058                    adapter);
059                } 
060
061        
062                AbstractBehaviorFactory.removePropertiesIfPresent(componentProperties, GemsCharacteristics.HOT_SWAP);        
063        return componentMonitor.newBehavior(new HotSwappable<T>(super.addComponentAdapter(componentMonitor,
064                                                                 lifecycleStrategy,
065                                                                 componentProperties,
066                                                                 adapter)));
067    }
068}