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.lang.reflect.Type;
012    import java.util.logging.Logger;
013    
014    import org.picocontainer.ComponentMonitor;
015    import org.picocontainer.Injector;
016    import org.picocontainer.LifecycleStrategy;
017    import org.picocontainer.Parameter;
018    import org.picocontainer.PicoCompositionException;
019    import org.picocontainer.PicoContainer;
020    import org.picocontainer.PicoVisitor;
021    import org.picocontainer.ComponentAdapter;
022    
023    @SuppressWarnings("serial")
024    public class CompositeInjector<T> extends AbstractInjector<T> {
025    
026        private final Injector<T>[] injectors;
027    
028        public CompositeInjector(Object componentKey, Class<?> componentImplementation, Parameter[] parameters, ComponentMonitor monitor, LifecycleStrategy lifecycleStrategy,
029                                 boolean useNames, Injector... injectors) {
030            super(componentKey, componentImplementation, parameters, monitor, lifecycleStrategy, useNames);
031            this.injectors = injectors;
032        }
033    
034    
035        public T getComponentInstance(PicoContainer container) throws PicoCompositionException {
036            return getComponentInstance(container, NOTHING.class);
037        }
038    
039        public T getComponentInstance(PicoContainer container, Type into) throws PicoCompositionException {
040            T instance = null;
041            for (int i = 0; i < injectors.length; i++) {
042                Injector<T> injector = injectors[i];
043                if (instance == null) {
044                    instance = injector.getComponentInstance(container, ComponentAdapter.NOTHING.class);
045                } else {
046                    injector.decorateComponentInstance(container, into, instance);
047                }
048            }
049            return (T) instance;
050        }
051    
052    
053        /**
054         * @return the object returned is the result of the last of the injectors delegated to
055         */
056        @Override
057        public Object decorateComponentInstance(PicoContainer container, Type into, T instance) {
058            Object result = null;
059            for (int i = 0; i < injectors.length; i++) {
060                result = injectors[i].decorateComponentInstance(container, into, instance);
061            }        
062            return result;
063        }
064    
065        public void verify(PicoContainer container) throws PicoCompositionException {
066            for (int i = 0; i < injectors.length; i++) {
067                injectors[i].verify(container);
068            }
069        }
070    
071        public final void accept(PicoVisitor visitor) {
072            super.accept(visitor);
073            for (int i = 0; i < injectors.length; i++) {
074                injectors[i].accept(visitor);
075            }
076        }
077    
078        public String getDescriptor() {
079            return "CompositeInjector";
080        }
081    }