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     * (TODO Since assimilating is taking types that are not the result type, does this mean that we cannot use generics)
031     * 
032     * @author Jörg Schaible
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