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.Characteristics;
014    import org.picocontainer.ComponentAdapter;
015    import org.picocontainer.ComponentMonitor;
016    import org.picocontainer.LifecycleStrategy;
017    import org.picocontainer.Parameter;
018    import org.picocontainer.PicoCompositionException;
019    
020    import java.util.Properties;
021    
022    /** @author Paul Hammant */
023    @SuppressWarnings("serial")
024    public class ThreadCaching extends AbstractBehaviorFactory {
025    
026        public <T> ComponentAdapter<T> createComponentAdapter(ComponentMonitor componentMonitor,
027                                                              LifecycleStrategy lifecycleStrategy,
028                                                              Properties componentProperties,
029                                                              Object componentKey,
030                                                              Class<T> componentImplementation,
031                                                              Parameter... parameters)
032            throws PicoCompositionException
033        {
034            if (removePropertiesIfPresent(componentProperties, Characteristics.NO_CACHE)) {
035                return super.createComponentAdapter(componentMonitor,
036                                                    lifecycleStrategy,
037                                                    componentProperties,
038                                                    componentKey,
039                                                    componentImplementation,
040                                                    parameters);
041            }
042            removePropertiesIfPresent(componentProperties, Characteristics.CACHE);
043            return componentMonitor.newBehavior(new ThreadCached<T>(super.createComponentAdapter(componentMonitor,
044                                                                    lifecycleStrategy,
045                                                                    componentProperties,
046                                                                    componentKey,
047                                                                    componentImplementation,
048                                                                    parameters)));
049    
050        }
051    
052        public <T> ComponentAdapter<T> addComponentAdapter(ComponentMonitor componentMonitor,
053                                                           LifecycleStrategy lifecycleStrategy,
054                                                           Properties componentProperties,
055                                                           ComponentAdapter<T> adapter) {
056            if (removePropertiesIfPresent(componentProperties, Characteristics.NO_CACHE)) {
057                return super.addComponentAdapter(componentMonitor, lifecycleStrategy, componentProperties, adapter);
058            }
059            removePropertiesIfPresent(componentProperties, Characteristics.CACHE);
060            return componentMonitor.newBehavior(new ThreadCached<T>(super.addComponentAdapter(componentMonitor,
061                                                                 lifecycleStrategy,
062                                                                 componentProperties,
063                                                                 adapter)));
064        }
065    }