
package uk.co.wingpath.util;

import java.util.*;

/**
* This class implements of the {@link Reporter} interface by buffering
* all messages. The messages can later be dumped to another reporter.
* This reporter is intended to be used at program startup, before proper
* reporting (e.g. to a GUI or file) has been set up.
*/

public class BufferReporter
    implements Reporter
{
    private static class Entry
    {
        ReporterLevel level;
        String msg;
        String helpId;
        Throwable t;

        private Entry (ReporterLevel level, String helpId, String msg,
            Throwable t)
        {
            this.level = level;
            this.helpId = helpId;
            this.msg = msg;
            this.t = t;
        }
    }

    private ArrayList<Entry> entries;

    public BufferReporter ()
    {
        entries = new ArrayList<Entry> ();
    }

    public void dump (Reporter reporter)
    {
        for (Entry entry : entries)
        {
            switch (entry.level)
            {
            case FATAL:
                if (entry.t == null)
                    reporter.fatal (entry.msg);
                else
                    reporter.fatal (entry.msg, entry.t);
                break;

            case ERROR:
                reporter.error (entry.helpId, entry.msg);
                break;

            case WARNING:
                reporter.warning (entry.helpId, entry.msg);
                break;

            case INFO:
                reporter.info (entry.helpId, entry.msg);
                break;

            case DEBUG:
                if (entry.t == null)
                    reporter.debug (entry.msg);
                else
                    reporter.debug (entry.msg, entry.t);
                break;

            case TRACE:
                reporter.trace (entry.msg);
                break;
            }
        }
    }

    private void buffer (ReporterLevel level, String helpId, String msg,
        Throwable t)
    {
        entries.add (new Entry (level, helpId, msg, t));
    }

    public void fatal (String msg)
    {
        buffer (ReporterLevel.FATAL, null, msg, null);
    }

    public void fatal (String msg, Throwable t)
    {
        buffer (ReporterLevel.FATAL, null, msg, t);
    }

    public void error (String helpId, String msg)
    {
        buffer (ReporterLevel.ERROR, helpId, msg, null);
    }

    public void warning (String helpId, String msg)
    {
        buffer (ReporterLevel.WARNING, helpId, msg, null);
    }

    public void info (String helpId, String msg)
    {
        buffer (ReporterLevel.INFO, helpId, msg, null);
    }

    public void debug (String msg)
    {
        buffer (ReporterLevel.DEBUG, null, msg, null);
    }

    public void debug (String msg, Throwable t)
    {
        buffer (ReporterLevel.DEBUG, null, msg, t);
    }

    public void trace (String msg)
    {
        buffer (ReporterLevel.TRACE, null, msg, null);
    }

    public void clear ()
    {
        entries.clear ();
    }
}

