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 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 injectors[i] = (Injector) injectionFactory.createComponentAdapter(monitor,
049 lifecycleStrategy, componentProperties, componentKey, componentImplementation, parameters);
050 }
051
052 boolean useNames = AbstractBehaviorFactory.arePropertiesPresent(componentProperties, Characteristics.USE_NAMES, true);
053 return wrapLifeCycle(monitor.newInjector(new CompositeInjector(componentKey, componentImplementation, parameters,
054 monitor, useNames, injectors)), lifecycleStrategy);
055 }
056 }