diff --git a/core/src/main/kotlin/DokkaBootstrapImpl.kt b/core/src/main/kotlin/DokkaBootstrapImpl.kt index 114bade7d2..d2e138f075 100644 --- a/core/src/main/kotlin/DokkaBootstrapImpl.kt +++ b/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 @@ -11,8 +12,16 @@ import java.util.function.BiConsumer class DokkaBootstrapImpl : DokkaBootstrap { class DokkaProxyLogger(val consumer: BiConsumer) : 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) @@ -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() } } } diff --git a/core/src/main/kotlin/utilities/DokkaLogging.kt b/core/src/main/kotlin/utilities/DokkaLogging.kt index 0302b8a221..80c762a360 100644 --- a/core/src/main/kotlin/utilities/DokkaLogging.kt +++ b/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 @@ -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) @@ -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 diff --git a/core/test-api/src/main/kotlin/testApi/logger/TestLogger.kt b/core/test-api/src/main/kotlin/testApi/logger/TestLogger.kt index 0bc66a2b1b..e70200a7bc 100644 --- a/core/test-api/src/main/kotlin/testApi/logger/TestLogger.kt +++ b/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() + private var _debugMessages = synchronizedMutableListOf() val debugMessages: List get() = _debugMessages.toList() - private var _infoMessages = mutableListOf() + private var _infoMessages = synchronizedMutableListOf() val infoMessages: List get() = _infoMessages.toList() - private var _progressMessages = mutableListOf() + private var _progressMessages = synchronizedMutableListOf() val progressMessages: List get() = _progressMessages.toList() - private var _warnMessages = mutableListOf() + private var _warnMessages = synchronizedMutableListOf() val warnMessages: List get() = _warnMessages.toList() - private var _errorMessages = mutableListOf() + private var _errorMessages = synchronizedMutableListOf() val errorMessages: List get() = _errorMessages.toList() override fun debug(message: String) { @@ -45,4 +49,6 @@ class TestLogger(private val logger: DokkaLogger) : DokkaLogger { _errorMessages.add(message) logger.error(message) } + + private fun synchronizedMutableListOf(): MutableList = Collections.synchronizedList(mutableListOf()) } diff --git a/runners/maven-plugin/src/main/kotlin/MavenDokkaLogger.kt b/runners/maven-plugin/src/main/kotlin/MavenDokkaLogger.kt index 4b5f4fa983..ac8ed37673 100644 --- a/runners/maven-plugin/src/main/kotlin/MavenDokkaLogger.kt +++ b/runners/maven-plugin/src/main/kotlin/MavenDokkaLogger.kt @@ -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() } }