    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 <strong>synchronized</strong> wrappers to control access to a particular component.
    023     *  It is recommended that you use {@link org.picocontainer.behaviors.Locking} instead since it results in better performance
    024     *  and does the same job.
    025     * @author Aslak Helles&oslash;y
    026     */
    027    @SuppressWarnings("serial")
    028    public class Synchronizing extends AbstractBehaviorFactory {
    029
    030
    031        /** {@inheritDoc} **/
    032            public <T> ComponentAdapter<T> createComponentAdapter(ComponentMonitor componentMonitor, LifecycleStrategy lifecycleStrategy, Properties componentProperties, Object componentKey, Class<T> componentImplementation, Parameter... parameters) {
    033           if (removePropertiesIfPresent(componentProperties, Characteristics.NO_SYNCHRONIZE)) {
    034               return super.createComponentAdapter(
    035                        componentMonitor,
    036                        lifecycleStrategy,
    037                        componentProperties,
    038                        componentKey,
    039                        componentImplementation,
    040                        parameters);
    041           }
    042
    043            removePropertiesIfPresent(componentProperties, Characteristics.SYNCHRONIZE);
    044            return componentMonitor.newBehavior(new Synchronized<T>(super.createComponentAdapter(
    045                componentMonitor,
    046                lifecycleStrategy,
    047                componentProperties,
    048                componentKey,
    049                componentImplementation,
    050                parameters)));
    051        }
    052
    053        /** {@inheritDoc} **/
    054        public <T> ComponentAdapter<T> addComponentAdapter(ComponentMonitor componentMonitor,
    055                                                    LifecycleStrategy lifecycleStrategy,
    056                                                    Properties componentProperties,
    057                                                    ComponentAdapter<T> adapter) {
    058            if (removePropertiesIfPresent(componentProperties, Characteristics.NO_SYNCHRONIZE)) {
    059                    return super.addComponentAdapter(componentMonitor,
    060                        lifecycleStrategy,
    061                        componentProperties,
    062                        adapter);
    063            }
    064
    065            removePropertiesIfPresent(componentProperties, Characteristics.SYNCHRONIZE);
    066            return componentMonitor.newBehavior(new Synchronized<T>(super.addComponentAdapter(componentMonitor,
    067                                             lifecycleStrategy,
    068                                             componentProperties,
    069                                             adapter)));
    070        }
    071    }