    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     * Original code by                                                          *
    009     *****************************************************************************/
    010    package org.picocontainer.injectors;
    011
    012    import org.picocontainer.ComponentAdapter;
    013    import org.picocontainer.ComponentMonitor;
    014    import org.picocontainer.LifecycleStrategy;
    015    import org.picocontainer.Parameter;
    016    import org.picocontainer.PicoCompositionException;
    017    import static org.picocontainer.Characteristics.immutable;
    018
    019    import java.util.Properties;
    020
    021    /**
    022     * A {@link org.picocontainer.InjectionFactory} for named fields.
    023     *
    024     * Use like so: pico.as(injectionFieldNames("field1", "field2")).addComponent(...)
    025     *
    026     * The factory creates {@link org.picocontainer.injectors.NamedFieldInjector}.
    027     *
    028     * @author Paul Hammant
    029     */
    030    @SuppressWarnings("serial")
    031    public class NamedFieldInjection extends AbstractInjectionFactory {
    032
    033
    034        private static final String INJECTION_FIELD_NAMES = "injectionFieldNames";
    035
    036        public <T> ComponentAdapter<T> createComponentAdapter(ComponentMonitor componentMonitor,
    037                                                       LifecycleStrategy lifecycleStrategy,
    038                                                       Properties componentProperties,
    039                                                       Object componentKey,
    040                                                       Class<T> componentImplementation,
    041                                                       Parameter... parameters) throws PicoCompositionException {
    042            String fieldNames = (String) componentProperties.remove(INJECTION_FIELD_NAMES);
    043            if (fieldNames == null) {
    044                fieldNames = "";
    045            }
    046            return componentMonitor.newInjector(new NamedFieldInjector(componentKey, componentImplementation, parameters, componentMonitor,
    047                    lifecycleStrategy, fieldNames));
    048        }
    049
    050        public static Properties injectionFieldNames(String... fieldNames) {
    051            StringBuilder sb = new StringBuilder();
    052            for (int i = 0; i < fieldNames.length; i++) {
    053                sb.append(" ").append(fieldNames[i]);
    054            }
    055            Properties retVal = new Properties();
    056            return immutable(INJECTION_FIELD_NAMES, sb.toString().trim());
    057        }
    058
    059    }