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