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 *****************************************************************************/ 009package org.picocontainer.injectors; 010 011import org.picocontainer.Characteristics; 012import org.picocontainer.ComponentAdapter; 013import org.picocontainer.ComponentMonitor; 014import org.picocontainer.InjectionFactory; 015import org.picocontainer.Injector; 016import org.picocontainer.LifecycleStrategy; 017import org.picocontainer.Parameter; 018import org.picocontainer.PicoCompositionException; 019import org.picocontainer.behaviors.AbstractBehaviorFactory; 020 021import java.util.Properties; 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") 029public 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 monitor, 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 ComponentAdapter<T> adapter = injectionFactory.createComponentAdapter(monitor, 049 lifecycleStrategy, componentProperties, componentKey, componentImplementation, parameters); 050 injectors[i] = (Injector) adapter; 051 } 052 053 boolean useNames = AbstractBehaviorFactory.arePropertiesPresent(componentProperties, Characteristics.USE_NAMES, true); 054 return wrapLifeCycle(monitor.newInjector(new CompositeInjector(componentKey, componentImplementation, parameters, 055 monitor, useNames, injectors)), lifecycleStrategy); 056 } 057}