Skip to content

Commit

Permalink
Make implementations of DokkaLogger thread-safe (#2827)
Browse files Browse the repository at this point in the history
  • Loading branch information
IgnatBeresnev committed Jan 31, 2023
1 parent eb54d69 commit fe360f7
Show file tree
Hide file tree
Showing 4 changed files with 51 additions and 17 deletions.
17 changes: 13 additions & 4 deletions core/src/main/kotlin/DokkaBootstrapImpl.kt
@@ -1,6 +1,7 @@
package org.jetbrains.dokka

import org.jetbrains.dokka.utilities.DokkaLogger
import java.util.concurrent.atomic.AtomicInteger

import java.util.function.BiConsumer

Expand All @@ -11,8 +12,16 @@ import java.util.function.BiConsumer
class DokkaBootstrapImpl : DokkaBootstrap {

class DokkaProxyLogger(val consumer: BiConsumer<String, String>) : DokkaLogger {
override var warningsCount: Int = 0
override var errorsCount: Int = 0
private val warningsCounter = AtomicInteger()
private val errorsCounter = AtomicInteger()

override var warningsCount: Int
get() = warningsCounter.get()
set(value) = warningsCounter.set(value)

override var errorsCount: Int
get() = errorsCounter.get()
set(value) = errorsCounter.set(value)

override fun debug(message: String) {
consumer.accept("debug", message)
Expand All @@ -27,11 +36,11 @@ class DokkaBootstrapImpl : DokkaBootstrap {
}

override fun warn(message: String) {
consumer.accept("warn", message).also { warningsCount++ }
consumer.accept("warn", message).also { warningsCounter.incrementAndGet() }
}

override fun error(message: String) {
consumer.accept("error", message).also { errorsCount++ }
consumer.accept("error", message).also { errorsCounter.incrementAndGet() }
}
}

Expand Down
18 changes: 14 additions & 4 deletions core/src/main/kotlin/utilities/DokkaLogging.kt
@@ -1,5 +1,7 @@
package org.jetbrains.dokka.utilities

import java.util.concurrent.atomic.AtomicInteger

interface DokkaLogger {
var warningsCount: Int
var errorsCount: Int
Expand Down Expand Up @@ -40,8 +42,16 @@ class DokkaConsoleLogger(
val minLevel: LoggingLevel = LoggingLevel.DEBUG,
private val emitter: MessageEmitter = MessageEmitter.consoleEmitter
) : DokkaLogger {
override var warningsCount: Int = 0
override var errorsCount: Int = 0
private val warningsCounter = AtomicInteger()
private val errorsCounter = AtomicInteger()

override var warningsCount: Int
get() = warningsCounter.get()
set(value) = warningsCounter.set(value)

override var errorsCount: Int
get() = errorsCounter.get()
set(value) = errorsCounter.set(value)

override fun debug(message: String) {
if (shouldBeDisplayed(LoggingLevel.DEBUG)) emitter(message)
Expand All @@ -59,14 +69,14 @@ class DokkaConsoleLogger(
if (shouldBeDisplayed(LoggingLevel.WARN)) {
emitter("WARN: $message")
}
warningsCount++
warningsCounter.incrementAndGet()
}

override fun error(message: String) {
if (shouldBeDisplayed(LoggingLevel.ERROR)) {
emitter("ERROR: $message")
}
errorsCount++
errorsCounter.incrementAndGet()
}

private fun shouldBeDisplayed(messageLevel: LoggingLevel): Boolean = messageLevel.index >= minLevel.index
Expand Down
16 changes: 11 additions & 5 deletions core/test-api/src/main/kotlin/testApi/logger/TestLogger.kt
@@ -1,24 +1,28 @@
package org.jetbrains.dokka.testApi.logger

import org.jetbrains.dokka.utilities.DokkaLogger
import java.util.Collections

/*
* Even in tests it be used in a concurrent environment, so needs to be thread safe
*/
class TestLogger(private val logger: DokkaLogger) : DokkaLogger {
override var warningsCount: Int by logger::warningsCount
override var errorsCount: Int by logger::errorsCount

private var _debugMessages = mutableListOf<String>()
private var _debugMessages = synchronizedMutableListOf<String>()
val debugMessages: List<String> get() = _debugMessages.toList()

private var _infoMessages = mutableListOf<String>()
private var _infoMessages = synchronizedMutableListOf<String>()
val infoMessages: List<String> get() = _infoMessages.toList()

private var _progressMessages = mutableListOf<String>()
private var _progressMessages = synchronizedMutableListOf<String>()
val progressMessages: List<String> get() = _progressMessages.toList()

private var _warnMessages = mutableListOf<String>()
private var _warnMessages = synchronizedMutableListOf<String>()
val warnMessages: List<String> get() = _warnMessages.toList()

private var _errorMessages = mutableListOf<String>()
private var _errorMessages = synchronizedMutableListOf<String>()
val errorMessages: List<String> get() = _errorMessages.toList()

override fun debug(message: String) {
Expand All @@ -45,4 +49,6 @@ class TestLogger(private val logger: DokkaLogger) : DokkaLogger {
_errorMessages.add(message)
logger.error(message)
}

private fun <T> synchronizedMutableListOf(): MutableList<T> = Collections.synchronizedList(mutableListOf())
}
17 changes: 13 additions & 4 deletions runners/maven-plugin/src/main/kotlin/MavenDokkaLogger.kt
Expand Up @@ -2,14 +2,23 @@ package org.jetbrains.dokka.maven

import org.apache.maven.plugin.logging.Log
import org.jetbrains.dokka.utilities.DokkaLogger
import java.util.concurrent.atomic.AtomicInteger

class MavenDokkaLogger(val log: Log) : DokkaLogger {
override var warningsCount: Int = 0
override var errorsCount: Int = 0
private val warningsCounter = AtomicInteger()
private val errorsCounter = AtomicInteger()

override var warningsCount: Int
get() = warningsCounter.get()
set(value) = warningsCounter.set(value)

override var errorsCount: Int
get() = errorsCounter.get()
set(value) = errorsCounter.set(value)

override fun debug(message: String) = log.debug(message)
override fun info(message: String) = log.info(message)
override fun progress(message: String) = log.info(message)
override fun warn(message: String) = log.warn(message).also { warningsCount++ }
override fun error(message: String) = log.error(message).also { errorsCount++ }
override fun warn(message: String) = log.warn(message).also { warningsCounter.incrementAndGet() }
override fun error(message: String) = log.error(message).also { errorsCounter.incrementAndGet() }
}

0 comments on commit fe360f7

Please sign in to comment.