From c09bde34ff729ef9b1f3bea602fb53cd4e6dca42 Mon Sep 17 00:00:00 2001 From: Andrzej Ratajczak Date: Fri, 13 Mar 2020 10:46:33 +0100 Subject: Gradle Task supporting multimodular projects --- .../DokkaExternalLocationProviderFactory.kt | 35 ++++++++++++++++++++ .../external/ExternalLocationProviderFactory.kt | 23 ++++++++++++++ .../JavadocExternalLocationProviderFactory.kt | 37 ++++++++++++++++++++++ 3 files changed, 95 insertions(+) create mode 100644 plugins/base/src/main/kotlin/resolvers/external/DokkaExternalLocationProviderFactory.kt create mode 100644 plugins/base/src/main/kotlin/resolvers/external/ExternalLocationProviderFactory.kt create mode 100644 plugins/base/src/main/kotlin/resolvers/external/JavadocExternalLocationProviderFactory.kt (limited to 'plugins/base/src/main/kotlin/resolvers/external') diff --git a/plugins/base/src/main/kotlin/resolvers/external/DokkaExternalLocationProviderFactory.kt b/plugins/base/src/main/kotlin/resolvers/external/DokkaExternalLocationProviderFactory.kt new file mode 100644 index 00000000..ff9186f7 --- /dev/null +++ b/plugins/base/src/main/kotlin/resolvers/external/DokkaExternalLocationProviderFactory.kt @@ -0,0 +1,35 @@ +package org.jetbrains.dokka.base.resolvers.external + +import org.jetbrains.dokka.base.resolvers.local.identifierToFilename +import org.jetbrains.dokka.links.DRI + + +class DokkaExternalLocationProviderFactory : ExternalLocationProviderFactory by ExternalLocationProviderFactoryWithCache( + object : ExternalLocationProviderFactory { + override fun getExternalLocationProvider(param: String): ExternalLocationProvider? = + when (param) { + "kotlin-website-html", "html" -> DokkaExternalLocationProvider(param, ".html") + "markdown" -> DokkaExternalLocationProvider(param, ".md") + else -> null + } + } +) + +class DokkaExternalLocationProvider(override val param: String, val extension: String) : ExternalLocationProvider { + + override fun DRI.toLocation(): String { // TODO: classes without packages? + + val classNamesChecked = classNames ?: return "${packageName ?: ""}/index$extension" + + val classLink = (listOfNotNull(packageName) + classNamesChecked.split('.')).joinToString( + "/", + transform = ::identifierToFilename + ) + + val callableChecked = callable ?: return "$classLink/index$extension" + + return "$classLink/${identifierToFilename( + callableChecked.name + )}$extension" + } +} diff --git a/plugins/base/src/main/kotlin/resolvers/external/ExternalLocationProviderFactory.kt b/plugins/base/src/main/kotlin/resolvers/external/ExternalLocationProviderFactory.kt new file mode 100644 index 00000000..6fb05024 --- /dev/null +++ b/plugins/base/src/main/kotlin/resolvers/external/ExternalLocationProviderFactory.kt @@ -0,0 +1,23 @@ +package org.jetbrains.dokka.base.resolvers.external + +import org.jetbrains.dokka.links.DRI + + +interface ExternalLocationProvider { + + val param: String + fun DRI.toLocation(): String +} + +interface ExternalLocationProviderFactory { + + fun getExternalLocationProvider(param: String): ExternalLocationProvider? +} + +class ExternalLocationProviderFactoryWithCache(val ext: ExternalLocationProviderFactory) : ExternalLocationProviderFactory { + + private val locationProviders: MutableList = mutableListOf() + + override fun getExternalLocationProvider(param: String): ExternalLocationProvider? = + locationProviders.find { it.param == param } ?: ext.getExternalLocationProvider(param)?.also { locationProviders.add(it) } +} \ No newline at end of file diff --git a/plugins/base/src/main/kotlin/resolvers/external/JavadocExternalLocationProviderFactory.kt b/plugins/base/src/main/kotlin/resolvers/external/JavadocExternalLocationProviderFactory.kt new file mode 100644 index 00000000..c52c9bbb --- /dev/null +++ b/plugins/base/src/main/kotlin/resolvers/external/JavadocExternalLocationProviderFactory.kt @@ -0,0 +1,37 @@ +package org.jetbrains.dokka.base.resolvers.external + +import org.jetbrains.dokka.links.DRI +import org.jetbrains.dokka.utilities.htmlEscape + +class JavadocExternalLocationProviderFactory : ExternalLocationProviderFactory by ExternalLocationProviderFactoryWithCache( + object : ExternalLocationProviderFactory { + override fun getExternalLocationProvider(param: String): ExternalLocationProvider? = + when(param) { + "javadoc1" -> JavadocExternalLocationProvider(param, "()", ", ") // Covers JDK 1 - 7 + "javadoc8" -> JavadocExternalLocationProvider(param, "--", "-") // Covers JDK 8 - 9 + "javadoc10" -> JavadocExternalLocationProvider(param, "()", ",") // Covers JDK 10 + else -> null + } + } +) + +class JavadocExternalLocationProvider(override val param: String, val brackets: String, val separator: String) : ExternalLocationProvider { + + override fun DRI.toLocation(): String { + + val packageLink = packageName?.replace(".", "/") + if (classNames == null) { + return "$packageLink/package-summary.html".htmlEscape() + } + val classLink = if (packageLink == null) "$classNames.html" else "$packageLink/$classNames.html" + val callableChecked = callable ?: return classLink.htmlEscape() + + val callableLink = "$classLink#" + + callableChecked.name + + "${brackets.first()}" + + callableChecked.params.joinToString(separator) + + "${brackets.last()}" + + return callableLink.htmlEscape() + } +} \ No newline at end of file -- cgit From e5360a5b26aaaf779e796c16b6ac1bd625d2d02a Mon Sep 17 00:00:00 2001 From: Paweł Marks Date: Mon, 6 Jul 2020 10:18:39 +0200 Subject: Fix racecondition on caching of external providers --- .../kotlin/resolvers/external/ExternalLocationProviderFactory.kt | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) (limited to 'plugins/base/src/main/kotlin/resolvers/external') diff --git a/plugins/base/src/main/kotlin/resolvers/external/ExternalLocationProviderFactory.kt b/plugins/base/src/main/kotlin/resolvers/external/ExternalLocationProviderFactory.kt index 6fb05024..ce6fbba0 100644 --- a/plugins/base/src/main/kotlin/resolvers/external/ExternalLocationProviderFactory.kt +++ b/plugins/base/src/main/kotlin/resolvers/external/ExternalLocationProviderFactory.kt @@ -1,6 +1,7 @@ package org.jetbrains.dokka.base.resolvers.external import org.jetbrains.dokka.links.DRI +import java.util.concurrent.ConcurrentHashMap interface ExternalLocationProvider { @@ -16,8 +17,8 @@ interface ExternalLocationProviderFactory { class ExternalLocationProviderFactoryWithCache(val ext: ExternalLocationProviderFactory) : ExternalLocationProviderFactory { - private val locationProviders: MutableList = mutableListOf() + private val locationProviders = ConcurrentHashMap() override fun getExternalLocationProvider(param: String): ExternalLocationProvider? = - locationProviders.find { it.param == param } ?: ext.getExternalLocationProvider(param)?.also { locationProviders.add(it) } + locationProviders.getOrPut(param) { ext.getExternalLocationProvider(param) } } \ No newline at end of file -- cgit From 2da1f3b1612fd19be8082283c6d070759a42de12 Mon Sep 17 00:00:00 2001 From: Paweł Marks Date: Mon, 6 Jul 2020 16:46:28 +0200 Subject: Add CacheWrapper to mitigate NPE issues --- .../kotlin/resolvers/external/ExternalLocationProviderFactory.kt | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) (limited to 'plugins/base/src/main/kotlin/resolvers/external') diff --git a/plugins/base/src/main/kotlin/resolvers/external/ExternalLocationProviderFactory.kt b/plugins/base/src/main/kotlin/resolvers/external/ExternalLocationProviderFactory.kt index ce6fbba0..83de9911 100644 --- a/plugins/base/src/main/kotlin/resolvers/external/ExternalLocationProviderFactory.kt +++ b/plugins/base/src/main/kotlin/resolvers/external/ExternalLocationProviderFactory.kt @@ -17,8 +17,10 @@ interface ExternalLocationProviderFactory { class ExternalLocationProviderFactoryWithCache(val ext: ExternalLocationProviderFactory) : ExternalLocationProviderFactory { - private val locationProviders = ConcurrentHashMap() + private val locationProviders = ConcurrentHashMap() override fun getExternalLocationProvider(param: String): ExternalLocationProvider? = - locationProviders.getOrPut(param) { ext.getExternalLocationProvider(param) } -} \ No newline at end of file + locationProviders.getOrPut(param) { CacheWrapper(ext.getExternalLocationProvider(param)) }.provider +} + +private class CacheWrapper(val provider: ExternalLocationProvider?) \ No newline at end of file -- cgit