/******************************************************************************** * CruiseControl, a Continuous Integration Toolkit * Copyright (c) 2001-2003, ThoughtWorks, Inc. * 200 E. Randolph, 25th Floor * Chicago, IL 60601 USA * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * + Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * + Redistributions in binary form must reproduce the above * copyright notice, this list of conditions and the following * disclaimer in the documentation and/or other materials provided * with the distribution. * * + Neither the name of ThoughtWorks, Inc., CruiseControl, nor the * names of its contributors may be used to endorse or promote * products derived from this software without specific prior * written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ********************************************************************************/ package net.sourceforge.cruisecontrol.launch; import java.util.ArrayDeque; import java.util.Queue; /** * Implementation of the {@link LogInterface} storing data in memory and printing them to * <code>STDERR</code> as well */ class LogBuffer implements LogInterface { /** Supported message types */ private enum MessageType { info, warning, error }; /** Message holder */ private class Message { /** Content of the message */ final Object message; /** Type of the message */ final MessageType type; /** Constructor * @param m value of {@link #message} * @param t value of {@link #type} */ Message(Object m, MessageType t) { message = m; type = t; } } /** Buffer of messages */ private final Queue<Message> messages = new ArrayDeque<Message>(); /** Maximum number of messages hold in the buffer */ private final int messMax = 512; @Override public void error(Object message) { add(MessageType.error, message); } @Override public void warn(Object message) { add(MessageType.warning, message); } @Override public void info(Object message) { add(MessageType.info, message); } @Override public void flush(LogInterface log) { for (Message m : messages) { switch (m.type) { case error: log.error(m.message); break; case warning: log.warn(m.message); break; case info: log.info(m.message); break; default: break; } } messages.clear(); } /** Add message to the queue, removing the older one is the buffer max size is reached * @param type type of the message * @param message content to be stored */ private void add(final MessageType type, final Object message) { // Print it to STDERR first String prefix = ""; switch (type) { case error: prefix = "ERROR: "; break; case warning: prefix = "WARNING: "; break; default: break; } System.err.println(prefix + message); // Add it to the queue messages.add(new Message(message, type)); if (messages.size() > messMax) { messages.poll(); } } }