001/*
002 * (C) Copyright 2006-2008 Nuxeo SA (http://nuxeo.com/) and others.
003 *
004 * Licensed under the Apache License, Version 2.0 (the "License");
005 * you may not use this file except in compliance with the License.
006 * You may obtain a copy of the License at
007 *
008 *     http://www.apache.org/licenses/LICENSE-2.0
009 *
010 * Unless required by applicable law or agreed to in writing, software
011 * distributed under the License is distributed on an "AS IS" BASIS,
012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013 * See the License for the specific language governing permissions and
014 * limitations under the License.
015 *
016 * Contributors:
017 *     Nuxeo - initial API and implementation
018 *
019 * $Id$
020 */
021
022package org.nuxeo.ecm.platform.importer.log;
023
024import java.util.LinkedList;
025import java.util.concurrent.locks.ReentrantReadWriteLock;
026
027import org.apache.commons.logging.Log;
028
029/**
030 * @author Thierry Delprat
031 */
032public class BufferredLogger extends BasicLogger {
033
034    protected ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
035
036    protected static int DEFAULT_LOG_BUFFER_LENGTH = 50;
037
038    protected Integer bufferSize = null;
039
040    protected LinkedList<String> logStack = new LinkedList<String>();
041
042    public BufferredLogger(Log javaLogger) {
043        super(javaLogger);
044    }
045
046    public BufferredLogger(Log javaLogger, int bufferSize) {
047        super(javaLogger);
048        this.bufferSize = bufferSize;
049    }
050
051    protected int getMaxStackLen() {
052        if (bufferSize == null) {
053            bufferSize = DEFAULT_LOG_BUFFER_LENGTH;
054        }
055        return bufferSize;
056    }
057
058    protected void logInStack(String level, String message) {
059        if (!bufferActive) {
060            return;
061        }
062        lock.writeLock().lock();
063        try {
064            logStack.add(level + " : " + message);
065            if (logStack.size() > getMaxStackLen()) {
066                logStack.remove();
067            }
068        } finally {
069            lock.writeLock().unlock();
070        }
071    }
072
073    @Override
074    public String getLoggerBuffer(String sep) {
075        StringBuffer sb = new StringBuffer();
076
077        lock.readLock().lock();
078        try {
079            for (String line : logStack) {
080                sb.append(line);
081                sb.append(sep);
082            }
083            return sb.toString();
084        } finally {
085            lock.readLock().unlock();
086        }
087    }
088
089    @Override
090    public void info(String message) {
091        super.info(message);
092        if (bufferActive) {
093            logInStack("INFO", message);
094        }
095    }
096
097    @Override
098    public void warn(String message) {
099        super.warn(message);
100        if (bufferActive) {
101            logInStack("WARN", message);
102        }
103    }
104
105    @Override
106    public void debug(String message) {
107        super.debug(message);
108        if (bufferActive) {
109            logInStack("DEBUG", message);
110        }
111    }
112
113    @Override
114    public void debug(String message, Throwable t) {
115        super.debug(message, t);
116        if (bufferActive) {
117            logInStack("DEBUG", message);
118            logInStack("=>ERR", t.getClass().getSimpleName() + ":" + t.getMessage());
119        }
120    }
121
122    @Override
123    public void error(String message) {
124        super.error(message);
125        if (bufferActive) {
126            logInStack("ERROR", message);
127        }
128    }
129
130    @Override
131    public void error(String message, Throwable t) {
132        super.error(message, t);
133        if (bufferActive) {
134            logInStack("ERROR", message);
135            logInStack("=>ERR", t.getClass().getSimpleName() + ":" + t.getMessage());
136        }
137    }
138
139}