/** * Copyright 2008 Google Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ package org.waveprotocol.wave.common.logging; import org.waveprotocol.wave.common.logging.AbstractLogger.Level; import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Set; /** * An in-memory log sink. * * This buffers log entries to a circular buffer to be retrieved later. * */ // TODO(user): Combine this, DomLogger.GWTLogSink and BufferedLogger.BufferedLogSink // into a single class public final class InMemoryLogSink extends LogSink { private static final int MAX_ENTRIES = 2000; private final CircularBuffer<Object> buffer = new CircularBuffer<Object>(MAX_ENTRIES); private final Set<LogSink> sinks = new HashSet<LogSink>(); @Override public void log(Level level, String message) { buffer.add(message); for (LogSink s : sinks) { s.log(level, message); } } @Override public void lazyLog(Level level, Object... messages) { buffer.add(messages); if (!sinks.isEmpty()) { for (LogSink s : sinks) { s.lazyLog(level, messages); } } } /** * Returns all log entries. */ public List<String> showAll() { List<String> ret = new ArrayList<String>(buffer.size()); for (Object o : buffer) { ret.add(LogUtils.stringifyLogObject(o)); } return ret; } /** * Clears the log buffer. */ public void clear() { buffer.clear(); } /** * NOTE(danilatos): Do not chain a sink in any way that could cause * slowness!!! The logging stuff should all be overhauled. * * Adds a log sink to allow forwarding. * @param sink */ public void addLogSink_DO_NOT_USE(LogSink sink) { sinks.add(sink); } /** * Remove log sink from listening to this. * @param sink */ public void removeLogSink(LogSink sink) { sinks.remove(sink); } }