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 *****************************************************************************/
010package org.picocontainer.gems.behaviors;
011
012import org.picocontainer.LifecycleStrategy;
013import org.picocontainer.ComponentAdapter;
014import org.picocontainer.Parameter;
015import org.picocontainer.PicoCompositionException;
016import org.picocontainer.ComponentMonitor;
017import org.picocontainer.Characteristics;
018import org.picocontainer.behaviors.AbstractBehaviorFactory;
019
020import java.util.Properties;
021
022/**
023 * Because AsmImplementationHiding is the same type of behavior as HiddenImplementation, we use the same
024 * characteristic properties for turning on and off AsmImplementation Hiding.
025 * @see org.picocontainer.Characteristics.HIDE_IMPL
026 * @see org.picocontainer.Characteristics.NO_HIDE_IMPL
027 */
028@SuppressWarnings("serial")
029public class AsmImplementationHiding extends AbstractBehaviorFactory {
030
031
032        @Override
033        public <T> ComponentAdapter<T> createComponentAdapter(final ComponentMonitor componentMonitor,
034                                                   final LifecycleStrategy lifecycleStrategy,
035                                                   final Properties componentProperties,
036                                                   final Object componentKey,
037                                                   final Class<T> componentImplementation,
038                                                   final Parameter... parameters) throws PicoCompositionException {
039        if (AbstractBehaviorFactory.removePropertiesIfPresent(componentProperties, Characteristics.NO_HIDE_IMPL)) {
040            return super.createComponentAdapter(componentMonitor, lifecycleStrategy,
041                                                componentProperties, componentKey, componentImplementation, parameters);
042        }
043        AbstractBehaviorFactory.removePropertiesIfPresent(componentProperties, Characteristics.HIDE_IMPL);
044        ComponentAdapter<T> componentAdapter = super.createComponentAdapter(componentMonitor,
045                                                                         lifecycleStrategy,
046                                                                         componentProperties,
047                                                                         componentKey,
048                                                                         componentImplementation,
049                                                                         parameters);
050        return componentMonitor.newBehavior(new AsmHiddenImplementation<T>(componentAdapter));
051    }
052
053    @Override
054        public <T> ComponentAdapter<T> addComponentAdapter(final ComponentMonitor componentMonitor,
055                                                final LifecycleStrategy lifecycleStrategy,
056                                                final Properties componentProperties,
057                                                final ComponentAdapter<T> adapter) {
058        if (AbstractBehaviorFactory.removePropertiesIfPresent(componentProperties, Characteristics.NO_HIDE_IMPL)) {
059            return super.addComponentAdapter(componentMonitor,
060                                             lifecycleStrategy,
061                                             componentProperties,
062                                             adapter);
063        }
064        AbstractBehaviorFactory.removePropertiesIfPresent(componentProperties, Characteristics.HIDE_IMPL);
065        return componentMonitor.newBehavior(new AsmHiddenImplementation<T>(super.addComponentAdapter(componentMonitor,
066                                                                          lifecycleStrategy,
067                                                                          componentProperties,
068                                                                          adapter)));
069    }
070}