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.behaviors;
012
013import org.picocontainer.Characteristics;
014import org.picocontainer.ComponentAdapter;
015import org.picocontainer.ComponentMonitor;
016import org.picocontainer.LifecycleStrategy;
017import org.picocontainer.Parameter;
018import org.picocontainer.PicoCompositionException;
019
020import java.util.Properties;
021
022/** @author Paul Hammant */
023@SuppressWarnings("serial")
024public 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}