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ø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 }