    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     *****************************************************************************/
    009    package org.picocontainer.injectors;
    010
    011    import java.util.Properties;
    012
    013    import org.picocontainer.Characteristics;
    014    import org.picocontainer.ComponentAdapter;
    015    import org.picocontainer.ComponentMonitor;
    016    import org.picocontainer.InjectionFactory;
    017    import org.picocontainer.Injector;
    018    import org.picocontainer.LifecycleStrategy;
    019    import org.picocontainer.Parameter;
    020    import org.picocontainer.PicoCompositionException;
    021    import org.picocontainer.behaviors.AbstractBehaviorFactory;
    022
    023    /**
    024     * A Composite of other types on InjectionFactories - pass them into the varargs constructor.
    025     *
    026     * @author Paul Hammant
    027     */
    028    @SuppressWarnings("serial")
    029    public class CompositeInjection extends AbstractInjectionFactory {
    030
    031        private final InjectionFactory[] injectionFactories;
    032
    033        public CompositeInjection(InjectionFactory... injectionFactories) {
    034            this.injectionFactories = injectionFactories;
    035        }
    036
    037        public <T> ComponentAdapter<T> createComponentAdapter(ComponentMonitor componentMonitor,
    038                                                              LifecycleStrategy lifecycleStrategy,
    039                                                              Properties componentProperties,
    040                                                              Object componentKey,
    041                                                              Class<T> componentImplementation,
    042                                                              Parameter... parameters) throws PicoCompositionException {
    043
    044            Injector[] injectors = new Injector[injectionFactories.length];
    045
    046            for (int i = 0; i < injectionFactories.length; i++) {
    047                InjectionFactory injectionFactory = injectionFactories[i];
    048                injectors[i] = (Injector) injectionFactory.createComponentAdapter(componentMonitor,
    049                        lifecycleStrategy, componentProperties, componentKey, componentImplementation, parameters);
    050            }
    051
    052            boolean useNames = AbstractBehaviorFactory.arePropertiesPresent(componentProperties, Characteristics.USE_NAMES, true);
    053            return componentMonitor.newInjector(new CompositeInjector(componentKey, componentImplementation, parameters,
    054                    componentMonitor, lifecycleStrategy,
    055                    useNames, injectors));
    056        }
    057    }