diff options
author | Kamil Doległo <kamilok1965@interia.pl> | 2020-08-11 21:47:26 +0200 |
---|---|---|
committer | Sebastian Sellmair <34319766+sellmair@users.noreply.github.com> | 2020-08-19 13:34:10 +0200 |
commit | 852a6ce6c0f43c9b2044320dcceb4c6cc0a3b302 (patch) | |
tree | fb95be79e816769ca5305cf3a601348549000c6d /plugins/base/src/main/kotlin/resolvers/shared | |
parent | 822653f017fa58352148e1c586690debb6773965 (diff) | |
download | dokka-852a6ce6c0f43c9b2044320dcceb4c6cc0a3b302.tar.gz dokka-852a6ce6c0f43c9b2044320dcceb4c6cc0a3b302.tar.bz2 dokka-852a6ce6c0f43c9b2044320dcceb4c6cc0a3b302.zip |
Refactor location providers
Diffstat (limited to 'plugins/base/src/main/kotlin/resolvers/shared')
5 files changed, 107 insertions, 0 deletions
diff --git a/plugins/base/src/main/kotlin/resolvers/shared/ExternalDocumentationInfo.kt b/plugins/base/src/main/kotlin/resolvers/shared/ExternalDocumentationInfo.kt new file mode 100644 index 00000000..473d46d1 --- /dev/null +++ b/plugins/base/src/main/kotlin/resolvers/shared/ExternalDocumentationInfo.kt @@ -0,0 +1,5 @@ +package org.jetbrains.dokka.base.resolvers.shared + +import java.net.URL + +data class ExternalDocumentationInfo(val documentationURL: URL, val packageList: PackageList)
\ No newline at end of file diff --git a/plugins/base/src/main/kotlin/resolvers/shared/LinkFormat.kt b/plugins/base/src/main/kotlin/resolvers/shared/LinkFormat.kt new file mode 100644 index 00000000..42be72c4 --- /dev/null +++ b/plugins/base/src/main/kotlin/resolvers/shared/LinkFormat.kt @@ -0,0 +1,6 @@ +package org.jetbrains.dokka.base.resolvers.shared + +interface LinkFormat { + val formatName: String + val linkExtension: String +}
\ No newline at end of file diff --git a/plugins/base/src/main/kotlin/resolvers/shared/PackageList.kt b/plugins/base/src/main/kotlin/resolvers/shared/PackageList.kt new file mode 100644 index 00000000..a9f0e618 --- /dev/null +++ b/plugins/base/src/main/kotlin/resolvers/shared/PackageList.kt @@ -0,0 +1,42 @@ +package org.jetbrains.dokka.base.resolvers.shared + +import org.jetbrains.dokka.base.renderers.PackageListService +import org.jetbrains.dokka.plugability.DokkaContext +import java.net.URL + +data class PackageList( + val linkFormat: RecognizedLinkFormat, + val packages: Set<String>, + val locations: Map<String, String>, + val url: URL +) { + companion object { + fun load(url: URL, jdkVersion: Int, dokkaContext: DokkaContext): PackageList? { + if (dokkaContext.configuration.offlineMode && url.protocol.toLowerCase() != "file") + return null + + val packageListStream = url.doOpenConnectionToReadContent().getInputStream() + val (params, packages) = + packageListStream + .bufferedReader() + .useLines { lines -> lines.partition { it.startsWith(PackageListService.DOKKA_PARAM_PREFIX) } } + + val paramsMap = params.asSequence() + .map { it.removePrefix("${PackageListService.DOKKA_PARAM_PREFIX}.").split(":", limit = 2) } + .groupBy({ (key, _) -> key }, { (_, value) -> value }) + + val format = paramsMap["format"]?.singleOrNull()?.let { RecognizedLinkFormat.fromString(it) } ?: when { + jdkVersion < 8 -> RecognizedLinkFormat.Javadoc1 // Covers JDK 1 - 7 + jdkVersion < 10 -> RecognizedLinkFormat.Javadoc8 // Covers JDK 8 - 9 + else -> RecognizedLinkFormat.Javadoc10 // Covers JDK 10+ + } + + val locations = paramsMap["location"].orEmpty() + .map { it.split("\u001f", limit = 2) } + .map { (key, value) -> key to value } + .toMap() + + return PackageList(format, packages.toSet(), locations, url) + } + } +}
\ No newline at end of file diff --git a/plugins/base/src/main/kotlin/resolvers/shared/RecognizedLinkFormat.kt b/plugins/base/src/main/kotlin/resolvers/shared/RecognizedLinkFormat.kt new file mode 100644 index 00000000..e8044b4f --- /dev/null +++ b/plugins/base/src/main/kotlin/resolvers/shared/RecognizedLinkFormat.kt @@ -0,0 +1,18 @@ +package org.jetbrains.dokka.base.resolvers.shared + +enum class RecognizedLinkFormat(override val formatName: String, override val linkExtension: String) : LinkFormat { + DokkaHtml("html-v1", "html"), + DokkaJavadoc("javadoc-v1", "html"), + DokkaGFM("gfm-v1", "md"), + DokkaJekyll("jekyll-v1", "md"), + Javadoc1("javadoc1", "html"), + Javadoc8("javadoc8", "html"), + Javadoc10("javadoc10", "html"), + DokkaOldHtml("html", "html"), + KotlinWebsiteHtml("kotlin-website-html", "html"); + + companion object { + fun fromString(formatName: String) = + values().asSequence().filter { it.formatName == formatName }.firstOrNull() + } +}
\ No newline at end of file diff --git a/plugins/base/src/main/kotlin/resolvers/shared/utils.kt b/plugins/base/src/main/kotlin/resolvers/shared/utils.kt new file mode 100644 index 00000000..cb737041 --- /dev/null +++ b/plugins/base/src/main/kotlin/resolvers/shared/utils.kt @@ -0,0 +1,36 @@ +package org.jetbrains.dokka.base.resolvers.shared + +import java.net.HttpURLConnection +import java.net.URL +import java.net.URLConnection + +internal fun URL.doOpenConnectionToReadContent(timeout: Int = 10000, redirectsAllowed: Int = 16): URLConnection { + val connection = this.openConnection().apply { + connectTimeout = timeout + readTimeout = timeout + } + + when (connection) { + is HttpURLConnection -> { + return when (connection.responseCode) { + in 200..299 -> { + connection + } + HttpURLConnection.HTTP_MOVED_PERM, + HttpURLConnection.HTTP_MOVED_TEMP, + HttpURLConnection.HTTP_SEE_OTHER -> { + if (redirectsAllowed > 0) { + val newUrl = connection.getHeaderField("Location") + URL(newUrl).doOpenConnectionToReadContent(timeout, redirectsAllowed - 1) + } else { + throw RuntimeException("Too many redirects") + } + } + else -> { + throw RuntimeException("Unhandled http code: ${connection.responseCode}") + } + } + } + else -> return connection + } +} |