refactor: harden BCP47 functions

This commit is contained in:
Gauthier Roebroeck 2023-08-01 11:39:32 +08:00
parent 1a2acac71c
commit 82dd23a870
7 changed files with 38 additions and 25 deletions

View file

@ -36,10 +36,12 @@ class V20230801104436__fix_incorrect_language_codes : BaseJavaMigration() {
}
}
private fun normalize(value: String): String =
try {
private fun normalize(value: String?): String {
if (value.isNullOrBlank()) return ""
return try {
ULocale.forLanguageTag(value).toLanguageTag()
} catch (e: Exception) {
""
}
}
}

View file

@ -0,0 +1,23 @@
package org.gotson.komga.domain.model
import com.ibm.icu.util.ULocale
object BCP47TagValidator {
private val languages by lazy { ULocale.getISOLanguages().toSet() }
fun isValid(value: String?): Boolean {
if (value == null) return false
return ULocale.forLanguageTag(value).let {
it.language.isNotBlank() && languages.contains(it.language)
}
}
fun normalize(value: String?): String {
if (value.isNullOrBlank()) return ""
return try {
ULocale.forLanguageTag(value).toLanguageTag()
} catch (e: Exception) {
""
}
}
}

View file

@ -1,6 +1,5 @@
package org.gotson.komga.domain.model
import org.gotson.komga.infrastructure.validation.BCP47TagValidator
import org.gotson.komga.language.lowerNotBlank
import java.time.LocalDateTime

View file

@ -4,6 +4,7 @@ import com.fasterxml.jackson.dataformat.xml.XmlMapper
import mu.KotlinLogging
import org.apache.commons.validator.routines.ISBNValidator
import org.gotson.komga.domain.model.Author
import org.gotson.komga.domain.model.BCP47TagValidator
import org.gotson.komga.domain.model.BookMetadataPatch
import org.gotson.komga.domain.model.BookMetadataPatchCapability
import org.gotson.komga.domain.model.BookWithMedia
@ -17,7 +18,6 @@ import org.gotson.komga.infrastructure.metadata.BookMetadataProvider
import org.gotson.komga.infrastructure.metadata.SeriesMetadataFromBookProvider
import org.gotson.komga.infrastructure.metadata.comicrack.dto.ComicInfo
import org.gotson.komga.infrastructure.metadata.comicrack.dto.Manga
import org.gotson.komga.infrastructure.validation.BCP47TagValidator
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.stereotype.Service
import java.net.URI

View file

@ -2,6 +2,7 @@ package org.gotson.komga.infrastructure.metadata.epub
import org.apache.commons.validator.routines.ISBNValidator
import org.gotson.komga.domain.model.Author
import org.gotson.komga.domain.model.BCP47TagValidator
import org.gotson.komga.domain.model.BookMetadataPatch
import org.gotson.komga.domain.model.BookMetadataPatchCapability
import org.gotson.komga.domain.model.BookWithMedia
@ -13,7 +14,6 @@ import org.gotson.komga.domain.model.SeriesMetadataPatch
import org.gotson.komga.infrastructure.mediacontainer.EpubExtractor
import org.gotson.komga.infrastructure.metadata.BookMetadataProvider
import org.gotson.komga.infrastructure.metadata.SeriesMetadataFromBookProvider
import org.gotson.komga.infrastructure.validation.BCP47TagValidator
import org.jsoup.Jsoup
import org.jsoup.parser.Parser
import org.jsoup.safety.Safelist

View file

@ -1,9 +1,9 @@
package org.gotson.komga.infrastructure.validation
import com.ibm.icu.util.ULocale
import jakarta.validation.Constraint
import jakarta.validation.ConstraintValidator
import jakarta.validation.ConstraintValidatorContext
import org.gotson.komga.domain.model.BCP47TagValidator
import kotlin.reflect.KClass
@Constraint(validatedBy = [BCP47Validator::class])
@ -23,19 +23,4 @@ class BCP47Validator : ConstraintValidator<BCP47, String> {
}
}
object BCP47TagValidator {
private val languages by lazy { ULocale.getISOLanguages().toSet() }
fun isValid(value: String): Boolean {
return ULocale.forLanguageTag(value).let {
it.language.isNotBlank() && languages.contains(it.language)
}
}
fun normalize(value: String): String =
try {
ULocale.forLanguageTag(value).toLanguageTag()
} catch (e: Exception) {
""
}
}

View file

@ -1,4 +1,4 @@
package org.gotson.komga.infrastructure.validation
package org.gotson.komga.domain.model
import org.assertj.core.api.Assertions.assertThat
import org.junit.jupiter.params.ParameterizedTest
@ -10,12 +10,14 @@ class BCP47TagValidatorTest {
@ParameterizedTest
@MethodSource("languagesNormalized")
fun `given source languageTag when normalizing then result is expected`(source: String, expected: String) {
fun `given source languageTag when normalizing then result is expected`(source: String?, expected: String) {
assertThat(BCP47TagValidator.normalize(source)).isEqualTo(expected)
}
private fun languagesNormalized(): Stream<Arguments> =
Stream.of(
Arguments.of(null, ""),
Arguments.of("", ""),
Arguments.of("fra", "fr"),
Arguments.of("fra-be", "fr-BE"),
Arguments.of("JA", "ja"),
@ -26,12 +28,14 @@ class BCP47TagValidatorTest {
@ParameterizedTest
@MethodSource("languagesValid")
fun `given source languageTag when validating then result is expected`(source: String, expected: Boolean) {
fun `given source languageTag when validating then result is expected`(source: String?, expected: Boolean) {
assertThat(BCP47TagValidator.isValid(source)).isEqualTo(expected)
}
fun languagesValid(): Stream<Arguments> =
private fun languagesValid(): Stream<Arguments> =
Stream.of(
Arguments.of(null, false),
Arguments.of("", false),
Arguments.of("fra", true),
Arguments.of("fra-BE", true),
Arguments.of("en-us", true),