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