Make source ID generation function reusable to extensions (#9836)
* Make source ID generation function reusable to extensions. * Add parameters and return documentation.
This commit is contained in:
parent
8a6a104987
commit
3411ac40c0
1 changed files with 31 additions and 8 deletions
|
@ -43,15 +43,16 @@ abstract class HttpSource : CatalogueSource {
|
||||||
open val versionId = 1
|
open val versionId = 1
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Id of the source. By default it uses a generated id using the first 16 characters (64 bits)
|
* ID of the source. By default it uses a generated id using the first 16 characters (64 bits)
|
||||||
* of the MD5 of the string: sourcename/language/versionId
|
* of the MD5 of the string `"${name.lowercase()}/$lang/$versionId"`.
|
||||||
* Note the generated id sets the sign bit to 0.
|
*
|
||||||
|
* The ID is generated by the [generateId] function, which can be reused if needed
|
||||||
|
* to generate outdated IDs for cases where the source name or language needs to
|
||||||
|
* be changed but migrations can be avoided.
|
||||||
|
*
|
||||||
|
* Note: the generated ID sets the sign bit to `0`.
|
||||||
*/
|
*/
|
||||||
override val id by lazy {
|
override val id by lazy { generateId(name, lang, versionId) }
|
||||||
val key = "${name.lowercase()}/$lang/$versionId"
|
|
||||||
val bytes = MessageDigest.getInstance("MD5").digest(key.toByteArray())
|
|
||||||
(0..7).map { bytes[it].toLong() and 0xff shl 8 * (7 - it) }.reduce(Long::or) and Long.MAX_VALUE
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Headers used for requests.
|
* Headers used for requests.
|
||||||
|
@ -64,6 +65,28 @@ abstract class HttpSource : CatalogueSource {
|
||||||
open val client: OkHttpClient
|
open val client: OkHttpClient
|
||||||
get() = network.client
|
get() = network.client
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Generates a unique ID for the source based on the provided [name], [lang] and
|
||||||
|
* [versionId]. It will use the first 16 characters (64 bits) of the MD5 of the string
|
||||||
|
* `"${name.lowercase()}/$lang/$versionId"`.
|
||||||
|
*
|
||||||
|
* Note: the generated ID sets the sign bit to `0`.
|
||||||
|
*
|
||||||
|
* Can be used to generate outdated IDs, such as when the source name or language
|
||||||
|
* needs to be changed but migrations can be avoided.
|
||||||
|
*
|
||||||
|
* @since extensions-lib 1.5
|
||||||
|
* @param name [String] the name of the source
|
||||||
|
* @param lang [String] the language of the source
|
||||||
|
* @param versionId [Int] the version ID of the source
|
||||||
|
* @return a unique ID for the source
|
||||||
|
*/
|
||||||
|
protected fun generateId(name: String, lang: String, versionId: Int): Long {
|
||||||
|
val key = "${name.lowercase()}/$lang/$versionId"
|
||||||
|
val bytes = MessageDigest.getInstance("MD5").digest(key.toByteArray())
|
||||||
|
return (0..7).map { bytes[it].toLong() and 0xff shl 8 * (7 - it) }.reduce(Long::or) and Long.MAX_VALUE
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Headers builder for requests. Implementations can override this method for custom headers.
|
* Headers builder for requests. Implementations can override this method for custom headers.
|
||||||
*/
|
*/
|
||||||
|
|
Reference in a new issue