001/* 002 * (C) Copyright 2006-2008 Nuxeo SAS (http://nuxeo.com/) and contributors. 003 * 004 * All rights reserved. This program and the accompanying materials 005 * are made available under the terms of the GNU Lesser General Public License 006 * (LGPL) version 2.1 which accompanies this distribution, and is available at 007 * http://www.gnu.org/licenses/lgpl.html 008 * 009 * This library is distributed in the hope that it will be useful, 010 * but WITHOUT ANY WARRANTY; without even the implied warranty of 011 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 012 * Lesser General Public License for more details. 013 * 014 * Contributors: 015 * Nuxeo - initial API and implementation 016 * 017 * $Id$ 018 */ 019 020package org.nuxeo.ecm.platform.importer.log; 021 022import java.util.LinkedList; 023import java.util.concurrent.locks.ReentrantReadWriteLock; 024 025import org.apache.commons.logging.Log; 026 027/** 028 * @author Thierry Delprat 029 */ 030public class BufferredLogger extends BasicLogger { 031 032 protected ReentrantReadWriteLock lock = new ReentrantReadWriteLock(); 033 034 protected static int DEFAULT_LOG_BUFFER_LENGTH = 50; 035 036 protected Integer bufferSize = null; 037 038 protected LinkedList<String> logStack = new LinkedList<String>(); 039 040 public BufferredLogger(Log javaLogger) { 041 super(javaLogger); 042 } 043 044 public BufferredLogger(Log javaLogger, int bufferSize) { 045 super(javaLogger); 046 this.bufferSize = bufferSize; 047 } 048 049 protected int getMaxStackLen() { 050 if (bufferSize == null) { 051 bufferSize = DEFAULT_LOG_BUFFER_LENGTH; 052 } 053 return bufferSize; 054 } 055 056 protected void logInStack(String level, String message) { 057 if (!bufferActive) { 058 return; 059 } 060 lock.writeLock().lock(); 061 try { 062 logStack.add(level + " : " + message); 063 if (logStack.size() > getMaxStackLen()) { 064 logStack.remove(); 065 } 066 } finally { 067 lock.writeLock().unlock(); 068 } 069 } 070 071 @Override 072 public String getLoggerBuffer(String sep) { 073 StringBuffer sb = new StringBuffer(); 074 075 lock.readLock().lock(); 076 try { 077 for (String line : logStack) { 078 sb.append(line); 079 sb.append(sep); 080 } 081 return sb.toString(); 082 } finally { 083 lock.readLock().unlock(); 084 } 085 } 086 087 @Override 088 public void info(String message) { 089 super.info(message); 090 if (bufferActive) { 091 logInStack("INFO", message); 092 } 093 } 094 095 @Override 096 public void warn(String message) { 097 super.warn(message); 098 if (bufferActive) { 099 logInStack("WARN", message); 100 } 101 } 102 103 @Override 104 public void debug(String message) { 105 super.debug(message); 106 if (bufferActive) { 107 logInStack("DEBUG", message); 108 } 109 } 110 111 @Override 112 public void debug(String message, Throwable t) { 113 super.debug(message, t); 114 if (bufferActive) { 115 logInStack("DEBUG", message); 116 logInStack("=>ERR", t.getClass().getSimpleName() + ":" + t.getMessage()); 117 } 118 } 119 120 @Override 121 public void error(String message) { 122 super.error(message); 123 if (bufferActive) { 124 logInStack("ERROR", message); 125 } 126 } 127 128 @Override 129 public void error(String message, Throwable t) { 130 super.error(message, t); 131 if (bufferActive) { 132 logInStack("ERROR", message); 133 logInStack("=>ERR", t.getClass().getSimpleName() + ":" + t.getMessage()); 134 } 135 } 136 137}