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 }