
package uk.co.wingpath.util;

import java.util.*;
import org.apache.log4j.*;

/**
* This class implements the {@link Reporter} interface by forwarding
* messages to other reporters.
*/

public class BroadcastReporter
    implements Reporter
{
    private final List<Reporter> reporters;

    /**
    * Creates a BroadcastReporter.
    */
    public BroadcastReporter (Reporter... reporters)
    {
        this.reporters = new LinkedList<Reporter> ();
        Collections.addAll (this.reporters, reporters);
    }

    /**
    * Adds the specified reporter to the list of reporters to receive
    * messages.
    * @param reporter the reporter to be added.
    */
    public void addReporter (Reporter reporter)
    {
        if (reporter == null)
            throw new NullPointerException ("reporter must not be null");
        reporters.add (reporter);
    }

    /**
    * Removes the specified reporter from the list of reporters to receive
    * messages.
    * @param reporter the reporter to be removed.
    */
    public void removeReporter (Reporter reporter)
    {
        reporters.remove (reporter);
    }

    @Override
    public boolean fatal (String fmt, Object... args)
    {
        boolean reported = false;

        for (Reporter reporter : reporters)
        {
            if (reporter.fatal (fmt, args))
                reported = true;
        }

        if (!reported)
            StderrReporter.print ("FATAL", fmt, args);
        return true;
    }

    @Override
    public boolean fatal (Throwable t, String fmt, Object... args)
    {
        boolean reported = false;

        for (Reporter reporter : reporters)
        {
            if (reporter.fatal (t, fmt, args))
                reported = true;
        }

        if (!reported)
        {
            StderrReporter.print ("FATAL", fmt, args);
            t.printStackTrace (System.err);
        }
        return true;
    }

    @Override
    public void error (String helpId, String fmt, Object... args)
    {
        for (Reporter reporter : reporters)
            reporter.error (helpId, fmt, args);
    }

    @Override
    public void warn (String helpId, String fmt, Object... args)
    {
        for (Reporter reporter : reporters)
            reporter.warn (helpId, fmt, args);
    }

    @Override
    public void info (String helpId, String fmt, Object... args)
    {
        for (Reporter reporter : reporters)
            reporter.info (helpId, fmt, args);
    }

    @Override
    public void trace (String helpId, String fmt, Object... args)
    {
        for (Reporter reporter : reporters)
            reporter.trace (helpId, fmt, args);
    }

    @Override
    public boolean debug (String fmt, Object... args)
    {
        for (Reporter reporter : reporters)
            reporter.debug (fmt, args);
        return true;
    }

    @Override
    public void clear ()
    {
        for (Reporter reporter : reporters)
            reporter.clear ();
    }
}

