/*******************************************************************************
 * This file is part of the Virgo Web Server.
 *
 * Copyright (c) 2010 Eclipse Foundation.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *    SpringSource, a division of VMware - initial API and implementation and/or initial documentation
 *******************************************************************************/


package org.eclipse.virgo.util.io;

import java.util.ArrayList;
import java.util.List;

import org.slf4j.Logger;
import org.slf4j.Marker;


/**
 * A version of {@link Logger} suitable for testing.
 * <p/>
 * Debug only; markers ignored; no copies made; getEntries() implemented.
 * @author Steve Powell
 */
public class StubLogger implements Logger {

    public class StubLogEntry {
        private final String string;
        private final List<Object> arg1;
        private final Throwable throwable;

        StubLogEntry(String string, Object[] arg1, Throwable throwable) {
            this.string = string;
            List<Object> list = new ArrayList<Object>();
            if (arg1 != null) 
                for(Object o : arg1) { list.add(o); }
            this.arg1 = list;
            this.throwable = throwable;
        }
        public List<Object> getArg1() {
            return this.arg1;
        }
        public Throwable getThrowable() {
            return this.throwable;
        }
        public String getString() {
            return this.string;
        }
        public String toString() {
            StringBuilder sb = new StringBuilder(this.string).append(" [");
            for (int i = 0; i < this.arg1.size(); ++i) {
                if (i > 0)
                    sb.append(", ");
                sb.append(this.arg1.get(i));
            }
            sb.append("] ").append(throwable);
            return sb.toString();
        }
    }
    
    private final Object monitor = new Object();
    private List<StubLogEntry> entries;
    
    private void addDebug(String string, Object[] args, Throwable t) {
        synchronized (monitor) {
            this.entries.add(new StubLogEntry(string, args, t));
        }
    }
    
    public StubLogger() {
        this.entries = new ArrayList<StubLogEntry>();
    }
    
    public List<StubLogEntry> getEntries() {
        synchronized (this.monitor) {
            List<StubLogEntry> list = new ArrayList<StubLogEntry>(this.entries);
            return list;
        }
    }
    
    /** 
     * {@inheritDoc}
     */
    public void debug(String arg0) {
        addDebug(arg0, null, null);
    }

    /** 
     * {@inheritDoc}
     */
    public void debug(String arg0, Object arg1) {
        Object[] args = new Object[1];
        args[0] = arg1;
        addDebug(arg0, args, null);
    }

    /** 
     * {@inheritDoc}
     */
    public void debug(String arg0, Object... arg1) {
        addDebug(arg0, arg1, null);
    }

    /** 
     * {@inheritDoc}
     */
    public void debug(String arg0, Throwable arg1) {
        addDebug(arg0, null, arg1);
    }

    /** 
     * {@inheritDoc}
     */
    public void debug(Marker arg0, String arg1) {
        addDebug(arg1, null, null);
    }

    /** 
     * {@inheritDoc}
     */
    public void debug(String arg0, Object arg1, Object arg2) {
        Object[] args = new Object[2];
        args[0] = arg1;
        args[1] = arg2;
        addDebug(arg0, args, null);
    }

    /** 
     * {@inheritDoc}
     */
    public void debug(Marker arg0, String arg1, Object arg2) {
        Object[] args = new Object[1];
        args[0] = arg2;
        addDebug(arg1, args, null);
    }

    /** 
     * {@inheritDoc}
     */
    public void debug(Marker arg0, String arg1, Object... arg2) {
        addDebug(arg1, arg2, null);
    }

    /** 
     * {@inheritDoc}
     */
    public void debug(Marker arg0, String arg1, Throwable arg2) {
        addDebug(arg1, null, arg2);
    }

    /** 
     * {@inheritDoc}
     */
    public void debug(Marker arg0, String arg1, Object arg2, Object arg3) {
        Object[] args = new Object[2];
        args[0] = arg2;
        args[1] = arg3;
        addDebug(arg1, args, null);
    }

    /** 
     * {@inheritDoc}
     */
    public void error(String arg0) {
    }

    /** 
     * {@inheritDoc}
     */
    public void error(String arg0, Object arg1) {
    }

    /** 
     * {@inheritDoc}
     */
    public void error(String arg0, Object... arg1) {
    }

    /** 
     * {@inheritDoc}
     */
    public void error(String arg0, Throwable arg1) {
    }

    /** 
     * {@inheritDoc}
     */
    public void error(Marker arg0, String arg1) {
    }

    /** 
     * {@inheritDoc}
     */
    public void error(String arg0, Object arg1, Object arg2) {
    }

    /** 
     * {@inheritDoc}
     */
    public void error(Marker arg0, String arg1, Object arg2) {
    }

    /** 
     * {@inheritDoc}
     */
    public void error(Marker arg0, String arg1, Object... arg2) {
    }

    /** 
     * {@inheritDoc}
     */
    public void error(Marker arg0, String arg1, Throwable arg2) {
    }

    /** 
     * {@inheritDoc}
     */
    public void error(Marker arg0, String arg1, Object arg2, Object arg3) {
    }

    /** 
     * {@inheritDoc}
     */
    public String getName() {
        return "StubLogger";
    }

    /** 
     * {@inheritDoc}
     */
    public void info(String arg0) {
    }

    /** 
     * {@inheritDoc}
     */
    public void info(String arg0, Object arg1) {
    }

    /** 
     * {@inheritDoc}
     */
    public void info(String arg0, Object... arg1) {
    }

    /** 
     * {@inheritDoc}
     */
    public void info(String arg0, Throwable arg1) {
    }

    /** 
     * {@inheritDoc}
     */
    public void info(Marker arg0, String arg1) {
    }

    /** 
     * {@inheritDoc}
     */
    public void info(String arg0, Object arg1, Object arg2) {
    }

    /** 
     * {@inheritDoc}
     */
    public void info(Marker arg0, String arg1, Object arg2) {
    }

    /** 
     * {@inheritDoc}
     */
    public void info(Marker arg0, String arg1, Object... arg2) {
    }

    /** 
     * {@inheritDoc}
     */
    public void info(Marker arg0, String arg1, Throwable arg2) {
    }

    /** 
     * {@inheritDoc}
     */
    public void info(Marker arg0, String arg1, Object arg2, Object arg3) {
    }

    /** 
     * {@inheritDoc}
     */
    public boolean isDebugEnabled() {
        return true;
    }

    /** 
     * {@inheritDoc}
     */
    public boolean isDebugEnabled(Marker arg0) {
        return true;
    }

    /** 
     * {@inheritDoc}
     */
    public boolean isErrorEnabled() {
        return false;
    }

    /** 
     * {@inheritDoc}
     */
    public boolean isErrorEnabled(Marker arg0) {
        return false;
    }

    /** 
     * {@inheritDoc}
     */
    public boolean isInfoEnabled() {
        return false;
    }

    /** 
     * {@inheritDoc}
     */
    public boolean isInfoEnabled(Marker arg0) {
        return false;
    }

    /** 
     * {@inheritDoc}
     */
    public boolean isTraceEnabled() {
        return false;
    }

    /** 
     * {@inheritDoc}
     */
    public boolean isTraceEnabled(Marker arg0) {
        return false;
    }

    /** 
     * {@inheritDoc}
     */
    public boolean isWarnEnabled() {
        return false;
    }

    /** 
     * {@inheritDoc}
     */
    public boolean isWarnEnabled(Marker arg0) {
        return false;
    }

    /** 
     * {@inheritDoc}
     */
    public void trace(String arg0) {
    }

    /** 
     * {@inheritDoc}
     */
    public void trace(String arg0, Object arg1) {
    }

    /** 
     * {@inheritDoc}
     */
    public void trace(String arg0, Object... arg1) {
    }

    /** 
     * {@inheritDoc}
     */
    public void trace(String arg0, Throwable arg1) {
    }

    /** 
     * {@inheritDoc}
     */
    public void trace(Marker arg0, String arg1) {
    }

    /** 
     * {@inheritDoc}
     */
    public void trace(String arg0, Object arg1, Object arg2) {
    }

    /** 
     * {@inheritDoc}
     */
    public void trace(Marker arg0, String arg1, Object arg2) {
    }

    /** 
     * {@inheritDoc}
     */
    public void trace(Marker arg0, String arg1, Object... arg2) {
    }

    /** 
     * {@inheritDoc}
     */
    public void trace(Marker arg0, String arg1, Throwable arg2) {
    }

    /** 
     * {@inheritDoc}
     */
    public void trace(Marker arg0, String arg1, Object arg2, Object arg3) {
    }

    /** 
     * {@inheritDoc}
     */
    public void warn(String arg0) {
    }

    /** 
     * {@inheritDoc}
     */
    public void warn(String arg0, Object arg1) {
    }

    /** 
     * {@inheritDoc}
     */
    public void warn(String arg0, Object... arg1) {
    }

    /** 
     * {@inheritDoc}
     */
    public void warn(String arg0, Throwable arg1) {
    }

    /** 
     * {@inheritDoc}
     */
    public void warn(Marker arg0, String arg1) {
    }

    /** 
     * {@inheritDoc}
     */
    public void warn(String arg0, Object arg1, Object arg2) {
    }

    /** 
     * {@inheritDoc}
     */
    public void warn(Marker arg0, String arg1, Object arg2) {
    }

    /** 
     * {@inheritDoc}
     */
    public void warn(Marker arg0, String arg1, Object... arg2) {
    }

    /** 
     * {@inheritDoc}
     */
    public void warn(Marker arg0, String arg1, Throwable arg2) {
    }

    /** 
     * {@inheritDoc}
     */
    public void warn(Marker arg0, String arg1, Object arg2, Object arg3) {
    }

}
