aboutsummaryrefslogtreecommitdiff
path: root/plugins/base/src/main/kotlin/resolvers/shared
diff options
context:
space:
mode:
authorKamil Doległo <kamilok1965@interia.pl>2020-08-11 21:47:26 +0200
committerSebastian Sellmair <34319766+sellmair@users.noreply.github.com>2020-08-19 13:34:10 +0200
commit852a6ce6c0f43c9b2044320dcceb4c6cc0a3b302 (patch)
treefb95be79e816769ca5305cf3a601348549000c6d /plugins/base/src/main/kotlin/resolvers/shared
parent822653f017fa58352148e1c586690debb6773965 (diff)
downloaddokka-852a6ce6c0f43c9b2044320dcceb4c6cc0a3b302.tar.gz
dokka-852a6ce6c0f43c9b2044320dcceb4c6cc0a3b302.tar.bz2
dokka-852a6ce6c0f43c9b2044320dcceb4c6cc0a3b302.zip
Refactor location providers
Diffstat (limited to 'plugins/base/src/main/kotlin/resolvers/shared')
-rw-r--r--plugins/base/src/main/kotlin/resolvers/shared/ExternalDocumentationInfo.kt5
-rw-r--r--plugins/base/src/main/kotlin/resolvers/shared/LinkFormat.kt6
-rw-r--r--plugins/base/src/main/kotlin/resolvers/shared/PackageList.kt42
-rw-r--r--plugins/base/src/main/kotlin/resolvers/shared/RecognizedLinkFormat.kt18
-rw-r--r--plugins/base/src/main/kotlin/resolvers/shared/utils.kt36
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
+ }
+}