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     * Idea by Rachel Davies, Original code by Aslak Hellesoy and Paul Hammant   *
009     *****************************************************************************/
010    
011    package org.picocontainer.defaults;
012    
013    import org.picocontainer.ComponentAdapter;
014    import org.picocontainer.Parameter;
015    import org.picocontainer.PicoIntrospectionException;
016    import org.picocontainer.monitors.DefaultComponentMonitor;
017    
018    
019    /**
020     * A {@link ComponentAdapterFactory} for JavaBeans.
021     * The factory creates {@link SetterInjectionComponentAdapter}.
022     *
023     * @author Jörg Schaible
024     * @version $Revision: 2768 $
025     */
026    public class SetterInjectionComponentAdapterFactory extends MonitoringComponentAdapterFactory {
027        private final boolean allowNonPublicClasses;
028        private LifecycleStrategy lifecycleStrategy;
029    
030        public SetterInjectionComponentAdapterFactory(boolean allowNonPublicClasses, 
031                                                    LifecycleStrategy lifecycleStrategy) {
032            this.allowNonPublicClasses = allowNonPublicClasses;
033            this.lifecycleStrategy = lifecycleStrategy;
034        }
035    
036        public SetterInjectionComponentAdapterFactory(boolean allowNonPublicClasses) {
037            this(allowNonPublicClasses, new DefaultLifecycleStrategy(new DefaultComponentMonitor()));
038        }
039    
040        public SetterInjectionComponentAdapterFactory() {
041            this(false);
042        }
043    
044        /**
045         * Create a {@link SetterInjectionComponentAdapter}.
046         *
047         * @param componentKey            The component's key
048         * @param componentImplementation The class of the bean.
049         * @param parameters              Any parameters for the setters. If null the adapter solves the
050         *                                dependencies for all setters internally. Otherwise the number parameters must match
051         *                                the number of the setter.
052         * @return Returns a new {@link SetterInjectionComponentAdapter}.
053         * @throws PicoIntrospectionException if dependencies cannot be solved
054         * @throws AssignabilityRegistrationException
055         *                                    if  the <code>componentKey</code> is a type
056         *                                    that does not match the implementation
057         * @throws NotConcreteRegistrationException
058         *                                    if the implementation is an interface or an
059         *                                    abstract class.
060         */
061        public ComponentAdapter createComponentAdapter(Object componentKey, Class componentImplementation, Parameter[] parameters)
062                throws PicoIntrospectionException, AssignabilityRegistrationException, NotConcreteRegistrationException {
063            return new SetterInjectionComponentAdapter(componentKey, componentImplementation, parameters, 
064                    allowNonPublicClasses, currentMonitor(), lifecycleStrategy);
065        }
066    }