    001    /*****************************************************************************
    002     * Copyright (C) NanoContainer 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 Joerg Schaibe                                            *
    009     *****************************************************************************/
    010
    011    package org.picocontainer.gems.behaviors;
    012
    013    import com.thoughtworks.proxy.ProxyFactory;
    014    import com.thoughtworks.proxy.factory.StandardProxyFactory;
    015
    016    import org.picocontainer.ComponentAdapter;
    017    import org.picocontainer.Parameter;
    018    import org.picocontainer.PicoCompositionException;
    019    import org.picocontainer.ComponentMonitor;
    020    import org.picocontainer.LifecycleStrategy;
    021    import org.picocontainer.behaviors.AbstractBehaviorFactory;
    022    import org.picocontainer.ComponentFactory;
    023
    024    import java.util.Properties;
    025
    026
    027    /**
    028     * Factory for the Assimilated. This factory will create {@link Assimilated} instances for all
    029     * {@link ComponentAdapter} instances created by the delegate. This will assimilate every component for a specific type.
    030     *
    031     * @author J&ouml;rg Schaible
    032     * @todo Since assimilating is taking types that are not the result type, does this mean that we cannot use generics
    033     * for this type?  I've been unable to actually get it working.
    034     */
    035    @SuppressWarnings("serial")
    036    public class Assimilating extends AbstractBehaviorFactory {
    037
    038            private final ProxyFactory proxyFactory;
    039        private final Class<?> assimilationType;
    040
    041        /**
    042         * Construct an Assimilating. The instance will use the {@link StandardProxyFactory} using the JDK
    043         * implementation.
    044         *
    045         * @param type The assimilated type.
    046         */
    047        public Assimilating(final Class<?> type) {
    048            this(type, new StandardProxyFactory());
    049        }
    050
    051        /**
    052         * Construct an Assimilating using a special {@link ProxyFactory}.
    053         *
    054         * @param type The assimilated type.
    055         * @param proxyFactory The proxy factory to use.
    056         */
    057        public Assimilating(final Class<?> type, final ProxyFactory proxyFactory) {
    058            this.assimilationType = type;
    059            this.proxyFactory = proxyFactory;
    060        }
    061
    062        /**
    063         * Create a {@link Assimilated}. This adapter will wrap the returned {@link ComponentAdapter} of the
    064         * deleated {@link ComponentFactory}.
    065         *
    066         * @see ComponentFactory#createComponentAdapter(ComponentMonitor,LifecycleStrategy,Properties,Object,Class,Parameter...)
    067         */
    068            @Override
    069            public ComponentAdapter createComponentAdapter(
    070                final ComponentMonitor componentMonitor, final LifecycleStrategy lifecycleStrategy, final Properties componentProperties, final Object componentKey, final Class componentImplementation, final Parameter... parameters)
    071                throws PicoCompositionException {
    072            return componentMonitor.newBehavior(new Assimilated(assimilationType, super.createComponentAdapter(
    073                    componentMonitor, lifecycleStrategy, componentProperties, componentKey, componentImplementation, parameters), proxyFactory));
    074        }
    075
    076
    077        @Override
    078            public ComponentAdapter addComponentAdapter(final ComponentMonitor componentMonitor,
    079                                                    final LifecycleStrategy lifecycleStrategy,
    080                                                    final Properties componentProperties,
    081                                                    final ComponentAdapter adapter) {
    082            return componentMonitor.newBehavior(new Assimilated(assimilationType, super.addComponentAdapter(componentMonitor,
    083                                             lifecycleStrategy,
    084                                             componentProperties,
    085                                             adapter)));
    086        }
    087    }
    088