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