/* * HJB4U is toolchain for creating a HyperJAXB front end for database users. * Copyright (C) 2010 NigelB * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ package hjb4u.logging; import org.apache.log4j.AppenderSkeleton; import org.apache.log4j.Layout; import org.apache.log4j.spi.LoggingEvent; import java.util.ArrayList; /** * <code>MemoryAppender</code> * Date: Aug 20, 2009 * Time: 7:50:10 PM * * @author Nigel B */ public class MemoryAppender extends AppenderSkeleton { private int size = 5000; private LoggingEvent[] events; private ArrayList<LoggingEvent> _events; private int pos; private boolean isSized = true; private boolean open = true; public MemoryAppender(Layout layout, int size) { this.size = size; if (size > 0) { events = new LoggingEvent[size]; } else { _events = new ArrayList<LoggingEvent>(); isSized = false; } setLayout(layout); } protected void append(LoggingEvent event) { if (!open) { return; } if (isSized) { events[pos] = event; pos = (pos + 1) % size; } else { _events.add(event); } } public boolean requiresLayout() { return true; } public void close() { open = false; } private String getEventString(LoggingEvent event) { StringBuffer toRet = new StringBuffer(layout.format(event)); toRet.append(Layout.LINE_SEP); if (layout.ignoresThrowable()) { String[] s = event.getThrowableStrRep(); if (s != null) { int len = s.length; for (int i = 0; i < len; i++) { toRet.append(s[i]).append(Layout.LINE_SEP); } } } return toRet.toString(); } @Override public String toString() { StringBuffer toRet = new StringBuffer(); if (layout.getHeader() != layout.getHeader()) { toRet.append(layout.getHeader()); } if (isSized) { int _pos = pos; for (int i = 0; i < events.length; i++) { LoggingEvent event = events[_pos]; _pos = (_pos + 1) % size; if (event != null) { toRet.append(getEventString(event));//.append(Layout.LINE_SEP); } } } else { for (LoggingEvent event : _events) { toRet.append(getEventString(event));//.append(Layout.LINE_SEP); } } if (layout.getFooter() != null) { toRet.append(layout.getFooter()); } return toRet.toString(); } }