    001    /*****************************************************************************
    002     * Copyright (C) NanoContainer 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 Aslak Hellesoy & Joerg Schaible                                       *
    009     *****************************************************************************/
    010    package org.picocontainer.gems.util;
    011
    012    import com.thoughtworks.proxy.ProxyFactory;
    013    import com.thoughtworks.proxy.toys.multicast.Multicasting;
    014    import org.picocontainer.PicoContainer;
    015
    016    import java.util.ArrayList;
    017    import java.util.Collections;
    018    import java.util.List;
    019
    020    /**
    021     * Factory for creating a multicaster object that multicasts calls to all
    022     * components in a PicoContainer instance.
    023     *
    024     * @author Aslak Helles&oslash;y
    025     * @author Chris Stevenson
    026     * @author Paul Hammant
    027     */
    028    public class Multicaster {
    029        /**
    030         * Create a {@link Multicasting} proxy for the components of a {@link PicoContainer}.
    031         *
    032         * @param pico the container
    033         * @param callInInstantiationOrder <code>true</code> if the components will be called in instantiation order
    034         * @param proxyFactory the ProxyFactory to use
    035         * @return the Multicasting proxy
    036         */
    037        public static Object object(final PicoContainer pico, boolean callInInstantiationOrder, final ProxyFactory proxyFactory) {
    038            List copy = new ArrayList(pico.getComponents());
    039
    040            if (!callInInstantiationOrder) {
    041                // reverse the list
    042                Collections.reverse(copy);
    043            }
    044            Object[] targets = copy.toArray();
    045            return Multicasting.object(proxyFactory, targets);
    046        }
    047    }