diff -r 000000000000 -r 6474c204b198 mobile/android/base/background/common/log/writers/AndroidLevelCachingLogWriter.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mobile/android/base/background/common/log/writers/AndroidLevelCachingLogWriter.java Wed Dec 31 06:09:35 2014 +0100 @@ -0,0 +1,126 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +package org.mozilla.gecko.background.common.log.writers; + +import java.util.IdentityHashMap; +import java.util.Map; + +import android.util.Log; + +/** + * Make a LogWriter only log when the Android log system says to. + */ +public class AndroidLevelCachingLogWriter extends LogWriter { + protected final LogWriter inner; + + public AndroidLevelCachingLogWriter(LogWriter inner) { + this.inner = inner; + } + + // I can't believe we have to implement this ourselves. + // These aren't synchronized (and neither are the setters) because + // the logging calls themselves are synchronized. + private Map isErrorLoggable = new IdentityHashMap(); + private Map isWarnLoggable = new IdentityHashMap(); + private Map isInfoLoggable = new IdentityHashMap(); + private Map isDebugLoggable = new IdentityHashMap(); + private Map isVerboseLoggable = new IdentityHashMap(); + + /** + * Empty the caches of log levels. + */ + public void refreshLogLevels() { + isErrorLoggable = new IdentityHashMap(); + isWarnLoggable = new IdentityHashMap(); + isInfoLoggable = new IdentityHashMap(); + isDebugLoggable = new IdentityHashMap(); + isVerboseLoggable = new IdentityHashMap(); + } + + private boolean shouldLogError(String logTag) { + Boolean out = isErrorLoggable.get(logTag); + if (out != null) { + return out.booleanValue(); + } + out = Log.isLoggable(logTag, Log.ERROR); + isErrorLoggable.put(logTag, out); + return out; + } + + private boolean shouldLogWarn(String logTag) { + Boolean out = isWarnLoggable.get(logTag); + if (out != null) { + return out.booleanValue(); + } + out = Log.isLoggable(logTag, Log.WARN); + isWarnLoggable.put(logTag, out); + return out; + } + + private boolean shouldLogInfo(String logTag) { + Boolean out = isInfoLoggable.get(logTag); + if (out != null) { + return out.booleanValue(); + } + out = Log.isLoggable(logTag, Log.INFO); + isInfoLoggable.put(logTag, out); + return out; + } + + private boolean shouldLogDebug(String logTag) { + Boolean out = isDebugLoggable.get(logTag); + if (out != null) { + return out.booleanValue(); + } + out = Log.isLoggable(logTag, Log.DEBUG); + isDebugLoggable.put(logTag, out); + return out; + } + + @Override + public boolean shouldLogVerbose(String logTag) { + Boolean out = isVerboseLoggable.get(logTag); + if (out != null) { + return out.booleanValue(); + } + out = Log.isLoggable(logTag, Log.VERBOSE); + isVerboseLoggable.put(logTag, out); + return out; + } + + public void error(String tag, String message, Throwable error) { + if (shouldLogError(tag)) { + inner.error(tag, message, error); + } + } + + public void warn(String tag, String message, Throwable error) { + if (shouldLogWarn(tag)) { + inner.warn(tag, message, error); + } + } + + public void info(String tag, String message, Throwable error) { + if (shouldLogInfo(tag)) { + inner.info(tag, message, error); + } + } + + public void debug(String tag, String message, Throwable error) { + if (shouldLogDebug(tag)) { + inner.debug(tag, message, error); + } + } + + public void trace(String tag, String message, Throwable error) { + if (shouldLogVerbose(tag)) { + inner.trace(tag, message, error); + } + } + + public void close() { + inner.close(); + } +}