    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     * Original code by                                                          *
    009     *****************************************************************************/
    010    package org.picocontainer.behaviors;
    011
    012    import org.picocontainer.ComponentAdapter;
    013    import org.picocontainer.Parameter;
    014    import org.picocontainer.ComponentMonitor;
    015    import org.picocontainer.LifecycleStrategy;
    016    import org.picocontainer.Characteristics;
    017    import org.picocontainer.behaviors.AbstractBehaviorFactory;
    018
    019    import java.util.Properties;
    020
    021    /**
    022     * This behavior factory provides java.util.concurrent locks.  It is recommended to be used instead
    023     * of {@link org.picocontainer.behaviors.Synchronizing} since it results in better performance.
    024     * @author Aslak Helles&oslash;y
    025     * @author Paul Hammant.
    026     */
    027    @SuppressWarnings("serial")
    028    public class Locking extends AbstractBehaviorFactory {
    029
    030        /** {@inheritDoc} **/
    031            public <T> ComponentAdapter<T> createComponentAdapter(ComponentMonitor componentMonitor,
    032                                                       LifecycleStrategy lifecycleStrategy,
    033                                                       Properties componentProperties,
    034                                                       Object componentKey,
    035                                                       Class<T> componentImplementation,
    036                                                       Parameter... parameters) {
    037
    038            if (removePropertiesIfPresent(componentProperties, Characteristics.NO_LOCK)) {
    039               return super.createComponentAdapter(
    040                        componentMonitor,
    041                        lifecycleStrategy,
    042                        componentProperties,
    043                        componentKey,
    044                        componentImplementation,
    045                        parameters);
    046            }
    047
    048            removePropertiesIfPresent(componentProperties, Characteristics.LOCK);
    049            return componentMonitor.newBehavior(new Locked<T>(super.createComponentAdapter(
    050                componentMonitor,
    051                lifecycleStrategy,
    052                componentProperties,
    053                componentKey,
    054                componentImplementation,
    055                parameters)));
    056        }
    057
    058        /** {@inheritDoc} **/
    059            public <T> ComponentAdapter<T> addComponentAdapter(ComponentMonitor componentMonitor,
    060                                                    LifecycleStrategy lifecycleStrategy,
    061                                                    Properties componentProperties,
    062                                                    ComponentAdapter<T> adapter) {
    063            if (removePropertiesIfPresent(componentProperties, Characteristics.NO_LOCK)) {
    064                    return super.addComponentAdapter(componentMonitor,
    065                        lifecycleStrategy,
    066                        componentProperties,
    067                        adapter);
    068            }
    069
    070            removePropertiesIfPresent(componentProperties, Characteristics.LOCK);
    071            return componentMonitor.newBehavior(new Locked<T>(super.addComponentAdapter(componentMonitor,
    072                                                              lifecycleStrategy,
    073                                                              componentProperties,
    074                                                              adapter)));
    075        }
    076    }