diff --git a/docs/migration-guide.md b/docs/migration-guide.md index 504a339703..09f50ceba9 100644 --- a/docs/migration-guide.md +++ b/docs/migration-guide.md @@ -67,6 +67,31 @@ navigator.addInputListener(DirectionalNavigationAdapter( `DirectionalNavigationAdapter` offers a lot of customization options. Take a look at its API. +### Removal of Fuel and Kovenant + +Both the Fuel and Kovenant libraries have been completely removed from the toolkit. With that, several deprecated functions have also been removed. + +#### opds/OPDS1Parser + +* Both `parseURL(url: URL)` and `parseURL(headers: MutableMap, url: URL)` have been replaced with `parseUrlString(url: String, client: HttpClient = DefaultHttpClient())`. +* `fetchOpenSearchTemplate(feed: Feed)` has been replaced with `retrieveOpenSearchTemplate(feed: Feed)`. + +#### opds/OPDS2Parser + +* Both `parseURL(url: URL)` and `parseURL(headers: MutableMap, url: URL)` have been replaced with `parseUrlString(url: String, client: HttpClient = DefaultHttpClient())`. + +#### shared/FuelPromiseExtension + +* `Request.promise()` + +#### shared/format/Deprecated + +* `Response.sniffFormat` has been replaced with `org.readium.r2.shared.util.mediatype.sniffMediaType` + +#### shared/util/mediatype/Extensions + +* `Response.sniffMediaType(...)` has been replaced with `org.readium.r2.shared.util.mediatype.sniffMediaType` + ## 2.3.0 diff --git a/readium/opds/build.gradle.kts b/readium/opds/build.gradle.kts index 749f173f10..e0bd80f0e7 100644 --- a/readium/opds/build.gradle.kts +++ b/readium/opds/build.gradle.kts @@ -49,7 +49,6 @@ dependencies { implementation(libs.androidx.appcompat) implementation(libs.timber) implementation(libs.joda.time) - implementation("nl.komponents.kovenant:kovenant:3.3.0") implementation(libs.kotlinx.coroutines.core) // Tests diff --git a/readium/opds/src/main/java/org/readium/r2/opds/Extensions.kt b/readium/opds/src/main/java/org/readium/r2/opds/Extensions.kt deleted file mode 100644 index b46b1582af..0000000000 --- a/readium/opds/src/main/java/org/readium/r2/opds/Extensions.kt +++ /dev/null @@ -1,18 +0,0 @@ -/* - * Copyright 2021 Readium Foundation. All rights reserved. - * Use of this source code is governed by the BSD-style license - * available in the top-level LICENSE file of the project. - */ - -package org.readium.r2.opds - -import kotlinx.coroutines.runBlocking -import nl.komponents.kovenant.Promise -import nl.komponents.kovenant.task -import org.readium.r2.shared.util.http.HttpClient -import org.readium.r2.shared.util.http.HttpFetchResponse -import org.readium.r2.shared.util.http.HttpRequest - -internal fun HttpClient.fetchPromise(request: HttpRequest): Promise { - return task { runBlocking { fetch(request).getOrThrow() } } -} diff --git a/readium/opds/src/main/java/org/readium/r2/opds/OPDS1Parser.kt b/readium/opds/src/main/java/org/readium/r2/opds/OPDS1Parser.kt index e3258ee607..df1123cf1f 100644 --- a/readium/opds/src/main/java/org/readium/r2/opds/OPDS1Parser.kt +++ b/readium/opds/src/main/java/org/readium/r2/opds/OPDS1Parser.kt @@ -10,8 +10,6 @@ package org.readium.r2.opds import java.net.URL -import nl.komponents.kovenant.Promise -import nl.komponents.kovenant.then import org.joda.time.DateTime import org.readium.r2.shared.extensions.toList import org.readium.r2.shared.extensions.toMap @@ -60,29 +58,6 @@ class OPDS1Parser { } } - @Deprecated( - "Use `parseRequest` or `parseUrlString` with coroutines instead", - ReplaceWith("OPDS1Parser.parseUrlString(url)"), - DeprecationLevel.WARNING - ) - fun parseURL(url: URL): Promise { - return DefaultHttpClient().fetchPromise(HttpRequest(url.toString())) then { - this.parse(xmlData = it.body, url = url) - } - } - - @Deprecated( - "Use `parseRequest` or `parseUrlString` with coroutines instead", - ReplaceWith("OPDS1Parser.parseUrlString(url)"), - DeprecationLevel.WARNING - ) - @Suppress("unused") - fun parseURL(headers: MutableMap, url: URL): Promise { - return DefaultHttpClient().fetchPromise(HttpRequest(url = url.toString(), headers = headers)) then { - this.parse(xmlData = it.body, url = url) - } - } - fun parse(xmlData: ByteArray, url: URL): ParseData { val root = XmlParser().parse(xmlData.inputStream()) return if (root.name == "feed") @@ -254,65 +229,6 @@ class OPDS1Parser { } } - @Deprecated( - "Use `retrieveOpenSearchTemplate` with coroutines instead", - ReplaceWith("OPDS1Parser.retrieveOpenSearchTemplate(feed)"), - DeprecationLevel.WARNING - ) - @Suppress("unused") - fun fetchOpenSearchTemplate(feed: Feed): Promise { - - var openSearchURL: URL? = null - var selfMimeType: String? = null - - for (link in feed.links) { - if (link.rels.contains("self")) { - if (link.type != null) { - selfMimeType = link.type - } - } else if (link.rels.contains("search")) { - openSearchURL = URL(link.href) - } - } - - val unwrappedURL = openSearchURL?.let { - return@let it - } - - return DefaultHttpClient().fetchPromise(HttpRequest(unwrappedURL.toString())) then { - - val document = XmlParser().parse(it.body.inputStream()) - - val urls = document.get("Url", Namespaces.Search) - - var typeAndProfileMatch: ElementNode? = null - var typeMatch: ElementNode? = null - - selfMimeType?.let { s -> - - val selfMimeParams = parseMimeType(mimeTypeString = s) - for (url in urls) { - val urlMimeType = url.getAttr("type") ?: continue - val otherMimeParams = parseMimeType(mimeTypeString = urlMimeType) - if (selfMimeParams.type == otherMimeParams.type) { - if (typeMatch == null) { - typeMatch = url - } - if (selfMimeParams.parameters["profile"] == otherMimeParams.parameters["profile"]) { - typeAndProfileMatch = url - break - } - } - } - val match = typeAndProfileMatch ?: (typeMatch ?: urls[0]) - val template = match.getAttr("template") - - template - } - null - } - } - private fun parseEntry(entry: ElementNode, baseUrl: URL): Publication? { // A title is mandatory val title = entry.getFirst("title", Namespaces.Atom)?.text diff --git a/readium/opds/src/main/java/org/readium/r2/opds/OPDS2Parser.kt b/readium/opds/src/main/java/org/readium/r2/opds/OPDS2Parser.kt index 9d98ea884b..8e5856d50a 100644 --- a/readium/opds/src/main/java/org/readium/r2/opds/OPDS2Parser.kt +++ b/readium/opds/src/main/java/org/readium/r2/opds/OPDS2Parser.kt @@ -10,8 +10,6 @@ package org.readium.r2.opds import java.net.URL -import nl.komponents.kovenant.Promise -import nl.komponents.kovenant.then import org.joda.time.DateTime import org.json.JSONArray import org.json.JSONObject @@ -53,29 +51,6 @@ class OPDS2Parser { } } - @Deprecated( - "Use `parseRequest` or `parseUrlString` with coroutines instead", - ReplaceWith("OPDS2Parser.parseUrlString(url)"), - DeprecationLevel.WARNING - ) - fun parseURL(url: URL): Promise { - return DefaultHttpClient().fetchPromise(HttpRequest(url.toString())) then { - this.parse(it.body, url) - } - } - - @Deprecated( - "Use `parseRequest` or `parseUrlString` with coroutines instead", - ReplaceWith("OPDS2Parser.parseUrlString(url)"), - DeprecationLevel.WARNING - ) - @Suppress("unused") - fun parseURL(headers: MutableMap, url: URL): Promise { - return DefaultHttpClient().fetchPromise(HttpRequest(url = url.toString(), headers = headers)) then { - this.parse(it.body, url) - } - } - fun parse(jsonData: ByteArray, url: URL): ParseData { return if (isFeed(jsonData)) { ParseData(parseFeed(jsonData, url), null, 2) diff --git a/readium/shared/build.gradle.kts b/readium/shared/build.gradle.kts index 219216d124..f856087046 100644 --- a/readium/shared/build.gradle.kts +++ b/readium/shared/build.gradle.kts @@ -47,16 +47,8 @@ apply(from = "$rootDir/scripts/publish-module.gradle") dependencies { implementation(libs.androidx.appcompat) implementation(libs.androidx.browser) - implementation("com.github.kittinunf.fuel:fuel-android:2.3.1") - implementation("com.github.kittinunf.fuel:fuel:2.3.1") implementation(libs.timber) implementation(libs.joda.time) - implementation("nl.komponents.kovenant:kovenant-android:3.3.0") - implementation("nl.komponents.kovenant:kovenant-combine:3.3.0") - implementation("nl.komponents.kovenant:kovenant-core:3.3.0") - implementation("nl.komponents.kovenant:kovenant-functional:3.3.0") - implementation("nl.komponents.kovenant:kovenant-jvm:3.3.0") - implementation("nl.komponents.kovenant:kovenant:3.3.0") implementation(libs.kotlin.reflect) implementation(libs.kotlinx.coroutines.core) implementation(libs.kotlinx.serialization.json) diff --git a/readium/shared/src/main/java/org/readium/r2/shared/FuelPromiseExtension.kt b/readium/shared/src/main/java/org/readium/r2/shared/FuelPromiseExtension.kt deleted file mode 100644 index 555f827b18..0000000000 --- a/readium/shared/src/main/java/org/readium/r2/shared/FuelPromiseExtension.kt +++ /dev/null @@ -1,32 +0,0 @@ -/* - * Module: r2-shared-kotlin - * Developers: Aferdita Muriqi, Clément Baumann - * - * Copyright (c) 2018. Readium Foundation. All rights reserved. - * Use of this source code is governed by a BSD-style license which is detailed in the - * LICENSE file present in the project repository where this source code is maintained. - */ - -package org.readium.r2.shared - -import com.github.kittinunf.fuel.core.Request -import com.github.kittinunf.fuel.core.Response -import com.github.kittinunf.result.Result -import nl.komponents.kovenant.Promise -import nl.komponents.kovenant.deferred -import nl.komponents.kovenant.task - -@Deprecated("Dependency to Fuel and kovenant will eventually be removed from the Readium Toolkit") -fun Request.promise(): Promise, Exception> { - val deferred = deferred, Exception>() - task { response() } success { - val (request, response, result) = it - when (result) { - is Result.Success -> deferred.resolve(Triple(request, response, result.value)) - is Result.Failure -> deferred.reject(result.error) - } - } fail { - deferred.reject(it) - } - return deferred.promise -} diff --git a/readium/shared/src/main/java/org/readium/r2/shared/format/Deprecated.kt b/readium/shared/src/main/java/org/readium/r2/shared/format/Deprecated.kt index 0695cf8f5d..89f4e5c43b 100644 --- a/readium/shared/src/main/java/org/readium/r2/shared/format/Deprecated.kt +++ b/readium/shared/src/main/java/org/readium/r2/shared/format/Deprecated.kt @@ -6,7 +6,6 @@ package org.readium.r2.shared.format -import com.github.kittinunf.fuel.core.Response import java.net.HttpURLConnection import org.readium.r2.shared.util.mediatype.MediaType as NewMediaType import org.readium.r2.shared.util.mediatype.Sniffer @@ -25,14 +24,6 @@ typealias FormatSniffers = Sniffers @Deprecated("Renamed SnifferContext", replaceWith = ReplaceWith("org.readium.r2.shared.util.mediatype.SnifferContext"), level = DeprecationLevel.ERROR) typealias FormatSnifferContext = SnifferContext -@Deprecated("Renamed to another package", ReplaceWith("org.readium.r2.shared.util.mediatype.sniffMediaType"), level = DeprecationLevel.ERROR) -suspend fun Response.sniffFormat( - mediaTypes: List = emptyList(), - fileExtensions: List = emptyList(), - sniffers: List = NewMediaType.sniffers -): NewMediaType? = - sniffMediaType(mediaTypes, fileExtensions, sniffers) - @Deprecated("Renamed to another package", ReplaceWith("org.readium.r2.shared.util.mediatype.sniffMediaType"), level = DeprecationLevel.ERROR) suspend fun HttpURLConnection.sniffFormat( bytes: (() -> ByteArray)? = null, diff --git a/readium/shared/src/main/java/org/readium/r2/shared/util/mediatype/Extensions.kt b/readium/shared/src/main/java/org/readium/r2/shared/util/mediatype/Extensions.kt index e06fd7b67f..6c7d3d5d58 100644 --- a/readium/shared/src/main/java/org/readium/r2/shared/util/mediatype/Extensions.kt +++ b/readium/shared/src/main/java/org/readium/r2/shared/util/mediatype/Extensions.kt @@ -6,7 +6,6 @@ package org.readium.r2.shared.util.mediatype -import com.github.kittinunf.fuel.core.Response import java.net.HttpURLConnection import org.readium.r2.shared.extensions.extension @@ -41,28 +40,3 @@ suspend fun HttpURLConnection.sniffMediaType( MediaType.of(mediaTypes = allMediaTypes, fileExtensions = allFileExtensions, sniffers = sniffers) } } - -/** - * Resolves the format for this [Response], with optional extra file extension and media type - * hints. - */ -suspend fun Response.sniffMediaType( - mediaTypes: List = emptyList(), - fileExtensions: List = emptyList(), - sniffers: List = MediaType.sniffers -): MediaType? { - val allMediaTypes = mediaTypes.toMutableList() - val allFileExtensions = fileExtensions.toMutableList() - - // The value of the `Content-Type` HTTP header. - allMediaTypes.addAll(0, headers["Content-Type"]) - - // The URL file extension. - url.extension?.let { - allFileExtensions.add(0, it) - } - - // TODO: The suggested filename extension, part of the HTTP header `Content-Disposition`. - - return MediaType.ofBytes({ data }, mediaTypes = allMediaTypes, fileExtensions = allFileExtensions, sniffers = sniffers) -}