    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.gems.behaviors;
    011
    012    import org.picocontainer.LifecycleStrategy;
    013    import org.picocontainer.ComponentAdapter;
    014    import org.picocontainer.Parameter;
    015    import org.picocontainer.PicoCompositionException;
    016    import org.picocontainer.ComponentMonitor;
    017    import org.picocontainer.Characteristics;
    018    import org.picocontainer.behaviors.AbstractBehaviorFactory;
    019
    020    import 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")
    029    public 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    }