    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
    011    package org.picocontainer.gems.behaviors;
    012
    013    import org.picocontainer.ComponentAdapter;
    014    import org.picocontainer.Parameter;
    015    import org.picocontainer.PicoCompositionException;
    016    import org.picocontainer.ComponentMonitor;
    017    import org.picocontainer.LifecycleStrategy;
    018    import org.picocontainer.behaviors.AbstractBehaviorFactory;
    019    import org.picocontainer.gems.GemsCharacteristics;
    020
    021    import java.util.Properties;
    022
    023
    024    /**
    025     * Hides implementation.
    026     *
    027     * @author Paul Hammant
    028     * @author Aslak Helles&oslash;y
    029     * @see HotSwappable
    030     */
    031    @SuppressWarnings("serial")
    032    public 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    }