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.Parameter;
012    import org.picocontainer.ComponentMonitor;
013    import org.picocontainer.LifecycleStrategy;
014    import org.picocontainer.PicoContainer;
015    import org.picocontainer.PicoCompositionException;
016    import org.picocontainer.annotations.Inject;
017    
018    import java.lang.reflect.Constructor;
019    import java.util.Set;
020    
021    /** @author Paul Hammant */
022    public class MultiInjector extends AbstractInjector {
023    
024        private final ConstructorInjector constuctorInjector;
025        private final SetterInjector setterInjector;
026        private AnnotatedMethodInjector annotatedMethodInjector;
027    
028        public MultiInjector(Object componentKey,
029                             Class componentImplementation,
030                             Parameter[] parameters,
031                             ComponentMonitor componentMonitor, LifecycleStrategy lifecycleStrategy, String setterPrefix) {
032            super(componentKey, componentImplementation, parameters, componentMonitor, lifecycleStrategy);
033            constuctorInjector = new ConstructorInjector(componentKey, componentImplementation, parameters, componentMonitor, lifecycleStrategy);
034            setterInjector = new SetterInjector(componentKey, componentImplementation, parameters, componentMonitor, lifecycleStrategy, setterPrefix) {
035                protected Object getOrMakeInstance(PicoContainer container,
036                                                   Constructor constructor,
037                                                   ComponentMonitor componentMonitor) {
038                    return constuctorInjector.getComponentInstance(container);
039                }
040    
041                protected Constructor getConstructor() {
042                    return null;   
043                }
044    
045                protected void unsatisfiedDependencies(PicoContainer container, Set<Class> unsatisfiableDependencyTypes) {
046                }
047            };
048            annotatedMethodInjector = new AnnotatedMethodInjector(componentKey, componentImplementation, parameters, componentMonitor, lifecycleStrategy, Inject.class) {
049                protected Object getOrMakeInstance(PicoContainer container,
050                                                   Constructor constructor,
051                                                   ComponentMonitor componentMonitor)  {
052                    return setterInjector.getComponentInstance(container);
053                }
054    
055                protected Constructor getConstructor() {
056                    return null;
057                }
058    
059                protected void unsatisfiedDependencies(PicoContainer container, Set<Class> unsatisfiableDependencyTypes) {
060                }
061            };
062        }
063    
064        public Object getComponentInstance(PicoContainer container) throws PicoCompositionException {
065            return annotatedMethodInjector.getComponentInstance(container);
066        }
067    
068        public void verify(PicoContainer container) throws PicoCompositionException {
069            constuctorInjector.verify(container);
070            constuctorInjector.verify(container);
071            annotatedMethodInjector.verify(container);
072        }
073    
074    }