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.behaviors; 012 013 import org.picocontainer.ComponentAdapter; 014 import org.picocontainer.Parameter; 015 import org.picocontainer.PicoCompositionException; 016 import org.picocontainer.Characteristics; 017 import org.picocontainer.ComponentMonitor; 018 import org.picocontainer.behaviors.Cached; 019 import org.picocontainer.behaviors.AbstractBehaviorFactory; 020 import org.picocontainer.LifecycleStrategy; 021 022 import java.util.Properties; 023 024 /** 025 * Behavior that turns off Caching behavior by default. 026 * <p>Example:</p> 027 * <pre> 028 * import org.picocontainer.*; 029 * import static org.picocontainer.Characteristics.*; 030 * 031 * MutablePicoContainer mpc = new PicoBuilder().withBehaviors(new OptInCaching()).build(); 032 * mpc.addComponent(Map.class, HashMap.class) //Multiple Instances, no Caching. 033 * mpc.as(CACHE).addComponent(Set.class, HashSet.class) //Single Cached Instance. 034 * </pre> 035 * @author Aslak Hellesøy 036 * @author <a href="Rafal.Krzewski">rafal@caltha.pl</a> 037 */ 038 @SuppressWarnings("serial") 039 public class OptInCaching extends AbstractBehaviorFactory { 040 041 public <T> ComponentAdapter<T> createComponentAdapter(ComponentMonitor componentMonitor, LifecycleStrategy lifecycleStrategy, Properties componentProperties, Object componentKey, 042 Class<T> componentImplementation, Parameter... parameters) 043 throws PicoCompositionException { 044 if (AbstractBehaviorFactory.removePropertiesIfPresent(componentProperties, Characteristics.CACHE)) { 045 return componentMonitor.newBehavior(new Cached<T>(super.createComponentAdapter(componentMonitor, 046 lifecycleStrategy, 047 componentProperties, 048 componentKey, 049 componentImplementation, 050 parameters))); 051 } 052 AbstractBehaviorFactory.removePropertiesIfPresent(componentProperties, Characteristics.NO_CACHE); 053 return super.createComponentAdapter(componentMonitor, lifecycleStrategy, 054 componentProperties, componentKey, componentImplementation, parameters); 055 } 056 057 058 public <T> ComponentAdapter<T> addComponentAdapter(ComponentMonitor componentMonitor, 059 LifecycleStrategy lifecycleStrategy, 060 Properties componentProperties, 061 ComponentAdapter<T> adapter) { 062 if (AbstractBehaviorFactory.removePropertiesIfPresent(componentProperties, Characteristics.CACHE)) { 063 return componentMonitor.newBehavior(new Cached<T>(super.addComponentAdapter(componentMonitor, 064 lifecycleStrategy, 065 componentProperties, 066 adapter))); 067 } 068 AbstractBehaviorFactory.removePropertiesIfPresent(componentProperties, Characteristics.NO_CACHE); 069 return super.addComponentAdapter(componentMonitor, 070 lifecycleStrategy, 071 componentProperties, 072 adapter); 073 } 074 }