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 }