blob: 430eb6a1333d7fc756f1a027f8b1ea4f5b631fbd [file] [log] [blame]
package com.android.adblib
/**
* A general purpose "Logger" abstraction used throughout adblib.
*/
abstract class AdbLogger {
/**
* The current minimum logging [Level]. This [AdbLogger] instance logs messages
* only if they are of greater or equal severity than [minLevel].
*
* For example, if [minLevel] is [Level.WARN], only [Level.WARN] and [Level.ERROR] messages
* will be logged, while [Level.INFO], [Level.VERBOSE] and [Level.DEBUG] will be skipped.
*/
abstract val minLevel: Level
abstract fun log(level: Level, message: String)
abstract fun log(level: Level, exception: Throwable?, message: String)
inline fun logIf(level: Level, message: () -> String) {
if (minLevel <= level) {
log(level, message())
}
}
inline fun logIf(level: Level, exception: Throwable?, message: () -> String) {
if (minLevel <= level) {
log(level, exception, message())
}
}
inline fun verbose(message: () -> String) {
logIf(Level.VERBOSE, message)
}
inline fun verbose(exception: Throwable?, message: () -> String) {
logIf(Level.VERBOSE, exception, message)
}
inline fun debug(message: () -> String) {
logIf(Level.DEBUG, message)
}
inline fun debug(exception: Throwable?, message: () -> String) {
logIf(Level.DEBUG, exception, message)
}
inline fun info(message: () -> String) {
logIf(Level.INFO, message)
}
inline fun info(exception: Throwable?, message: () -> String) {
logIf(Level.INFO, exception, message)
}
fun warn(message: String) {
log(Level.WARN, message)
}
fun warn(exception: Throwable?, message: String) {
log(Level.WARN, exception, message)
}
fun error(message: String) {
log(Level.ERROR, message)
}
fun error(exception: Throwable?, message: String) {
log(Level.ERROR, exception, message)
}
enum class Level {
VERBOSE, DEBUG, INFO, WARN, ERROR
}
}
/**
* Wraps this [AdbLogger] instance as an [AdbLogger] instance that re-formats all messages
* with the given [prefix].
*/
fun AdbLogger.withPrefix(prefix: String): AdbLogger {
return object : AdbLoggerDelegate(this) {
override fun formatMessage(message: String): String {
return "$prefix$message"
}
}
}
/**
* Creates an [AdbLogger] for the class of this instance.
*/
inline fun <reified T : Any> T.thisLogger(loggerFactory: AdbLoggerFactory): AdbLogger {
return loggerFactory.createLogger(T::class.java)
}
/**
* Creates an [AdbLogger] for the class of this instance.
*/
inline fun <reified T : Any> T.thisLogger(host: AdbLibHost): AdbLogger {
return thisLogger(host.loggerFactory)
}
/**
* Creates an [AdbLogger] for the class of this instance.
*/
inline fun <reified T : Any> T.thisLogger(session: AdbLibSession): AdbLogger {
return thisLogger(session.host)
}
/**
* Abstract implementation of [AdbLogger] that delegates to another [AdbLogger] instance after
* allowing derived classes to re-format the message by implementing [formatMessage].
*/
private abstract class AdbLoggerDelegate(private val delegate: AdbLogger) : AdbLogger() {
abstract fun formatMessage(message: String): String
override val minLevel: Level
get() = delegate.minLevel
override fun log(level: Level, message: String) {
delegate.log(level, formatMessage(message))
}
override fun log(level: Level, exception: Throwable?, message: String) {
delegate.log(level, exception, formatMessage(message))
}
}
/**
* Factory of [AdbLogger] instances.
*/
interface AdbLoggerFactory {
/**
* The "root" logger
*/
val logger: AdbLogger
/**
* Creates a [AdbLogger] specific to the given [cls]
*/
fun createLogger(cls: Class<*>): AdbLogger
/**
* Creates a [AdbLogger] with a given [category]
*/
fun createLogger(category: String): AdbLogger
}