/* * Copyright 2012 LinkedIn, 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 com.linkedin.parseq; import org.slf4j.helpers.MarkerIgnoringBase; import org.slf4j.helpers.MessageFormatter; import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.concurrent.ConcurrentLinkedQueue; /** * Simple {@link org.slf4j.Logger} that allows test code to capture log * messages. * * @author Chris Pettitt (cpettitt@linkedin.com) */ public class ListLogger extends MarkerIgnoringBase { public static final int LEVEL_TRACE = 0; public static final int LEVEL_DEBUG = 1; public static final int LEVEL_INFO = 2; public static final int LEVEL_WARN = 3; public static final int LEVEL_ERROR = 4; private static final long serialVersionUID = 1; private final ConcurrentLinkedQueue<Entry> _entries = new ConcurrentLinkedQueue<Entry>(); private volatile int _logLevel; public ListLogger(final String name) { this.name = name; reset(); } public List<Entry> getEntries() { return Collections.unmodifiableList(new ArrayList<Entry>(_entries)); } public void setLogLevel(final int level) { assert level >= LEVEL_TRACE && level <= LEVEL_ERROR; _logLevel = level; } public final void reset() { _entries.clear(); _logLevel = LEVEL_INFO; } @Override public boolean isTraceEnabled() { return isLevelEnabled(LEVEL_TRACE); } @Override public void trace(final String s) { log(LEVEL_TRACE, s); } @Override public void trace(final String s, final Object o) { log(LEVEL_TRACE, s, o); } @Override public void trace(final String s, final Object o, final Object o1) { log(LEVEL_TRACE, s, o, o1); } @Override public void trace(final String s, final Object[] objects) { log(LEVEL_TRACE, s, objects); } @Override public void trace(final String s, final Throwable throwable) { log(LEVEL_TRACE, s, throwable); } @Override public boolean isDebugEnabled() { return isLevelEnabled(LEVEL_DEBUG); } @Override public void debug(final String s) { log(LEVEL_DEBUG, s); } @Override public void debug(final String s, final Object o) { log(LEVEL_DEBUG, s, o); } @Override public void debug(final String s, final Object o, final Object o1) { log(LEVEL_DEBUG, s, o, o1); } @Override public void debug(final String s, final Object[] objects) { log(LEVEL_DEBUG, s, objects); } @Override public void debug(final String s, final Throwable throwable) { log(LEVEL_DEBUG, s, throwable); } @Override public boolean isInfoEnabled() { return isLevelEnabled(LEVEL_INFO); } @Override public void info(final String s) { log(LEVEL_INFO, s); } @Override public void info(final String s, final Object o) { log(LEVEL_INFO, s, o); } @Override public void info(final String s, final Object o, final Object o1) { log(LEVEL_INFO, s, o, o1); } @Override public void info(final String s, final Object[] objects) { log(LEVEL_INFO, s, objects); } @Override public void info(final String s, final Throwable throwable) { log(LEVEL_INFO, s, throwable); } @Override public boolean isWarnEnabled() { return isLevelEnabled(LEVEL_WARN); } @Override public void warn(final String s) { log(LEVEL_WARN, s); } @Override public void warn(final String s, final Object o) { log(LEVEL_WARN, s, o); } @Override public void warn(final String s, final Object[] objects) { log(LEVEL_WARN, s, objects); } @Override public void warn(final String s, final Object o, final Object o1) { log(LEVEL_WARN, s, o, o1); } @Override public void warn(final String s, final Throwable throwable) { log(LEVEL_WARN, s, throwable); } @Override public boolean isErrorEnabled() { return isLevelEnabled(LEVEL_ERROR); } @Override public void error(final String s) { log(LEVEL_ERROR, s); } @Override public void error(final String s, final Object o) { log(LEVEL_ERROR, s, o); } @Override public void error(final String s, final Object o, final Object o1) { log(LEVEL_ERROR, s, o, o1); } @Override public void error(final String s, final Object[] objects) { log(LEVEL_ERROR, s, objects); } @Override public void error(final String s, final Throwable throwable) { log(LEVEL_ERROR, s, throwable); } private void log(final int level, final String s) { _entries.add(new Entry(level, s)); } private void log(final int level, final String s, final Object o) { if (isLevelEnabled(level)) { final String msg = MessageFormatter.format(s, o).getMessage(); _entries.add(new Entry(level, msg)); } } private void log(final int level, final String s, final Object o, final Object o1) { if (isLevelEnabled(level)) { final String msg = MessageFormatter.format(s, o, o1).getMessage(); _entries.add(new Entry(level, msg)); } } private void log(final int level, final String s, final Object[] objects) { if (isLevelEnabled(level)) { final String msg = MessageFormatter.arrayFormat(s, objects).getMessage(); _entries.add(new Entry(level, msg)); } } private boolean isLevelEnabled(final int level) { return _logLevel <= level; } public static class Entry { private final int _level; private final String _message; public Entry(final int level, final String message) { _level = level; _message = message; } public int getLevel() { return _level; } public String getMessage() { return _message; } @Override public String toString() { return "Entry{" + "_level=" + _level + ", _message='" + _message + '\'' + '}'; } } }