From c7466bf0b71cf5e63942b20455584abe3ba106b6 Mon Sep 17 00:00:00 2001 From: Marcel Konrad Date: Wed, 8 Jan 2025 09:05:21 +0000 Subject: [PATCH] Fix xsd:dayTimeDuration validation --- .../main/kotlin/org/orkg/common/Extensions.kt | 3 +- .../orkg/graph/domain/XSDValidationTest.kt | 56 +++++++++++-------- 2 files changed, 34 insertions(+), 25 deletions(-) diff --git a/common/datatypes/src/main/kotlin/org/orkg/common/Extensions.kt b/common/datatypes/src/main/kotlin/org/orkg/common/Extensions.kt index b2c615166..799510a16 100644 --- a/common/datatypes/src/main/kotlin/org/orkg/common/Extensions.kt +++ b/common/datatypes/src/main/kotlin/org/orkg/common/Extensions.kt @@ -233,8 +233,9 @@ private val YEAR_MONTH_DURATION_MATCHER = fun String.isValidYearMonthDuration(): Boolean = YEAR_MONTH_DURATION_MATCHER.test(this) +private const val DU_TIME_FRAG = """(T((\d+H)(\d+M)?(\d+(\.\d+)?S)?|(\d+M)(\d+(\.\d+)?S)?|(\d+(\.\d+)?S)))""" private val DAY_TIME_DURATION_MATCHER = - Pattern.compile("""^-?P((\d+H)(\d+M)?(\d+(\.\d+)?S)?|(\d+M)(\d+(\.\d+)?S)?|(\d+(\.\d+)?S))$""").asMatchPredicate() + Pattern.compile("""^-?P((\d+D)$DU_TIME_FRAG?|$DU_TIME_FRAG$)""").asMatchPredicate() fun String.isValidDayTimeDuration(): Boolean = DAY_TIME_DURATION_MATCHER.test(this) diff --git a/graph/graph-core-model/src/test/kotlin/org/orkg/graph/domain/XSDValidationTest.kt b/graph/graph-core-model/src/test/kotlin/org/orkg/graph/domain/XSDValidationTest.kt index 79931d099..96ab17417 100644 --- a/graph/graph-core-model/src/test/kotlin/org/orkg/graph/domain/XSDValidationTest.kt +++ b/graph/graph-core-model/src/test/kotlin/org/orkg/graph/domain/XSDValidationTest.kt @@ -577,38 +577,46 @@ internal class XSDValidationTest { @JvmStatic fun validDayTimeDuration(): Iterator = iterator { val signs = listOf("", "-") + val ds = listOf(null, "0", "00", "2", "17", "25") val hs = listOf(null, "0", "00", "2", "17", "25") val ms = listOf(null, "0", "00", "2", "41", "65") val ss = listOf(null, "0", "00", "2", "41", "65") val fs = listOf(null, "0", "00", "2", "54", "78956") for (sign in signs) { - for (h in hs) { - for (m in ms) { - for (s in ss) { - for (f in fs) { - val duration = buildString { - append(sign) - append("P") - if (h != null) { - append(h) - append("H") - } - if (m != null) { - append(m) - append("M") - } - if (s != null) { - append(s) - if (f != null) { - append(".") - append(f) + for (d in ds) { + for (h in hs) { + for (m in ms) { + for (s in ss) { + for (f in fs) { + val duration = buildString { + append(sign) + append("P") + if (d != null) { + append(d) + append("D") + } + append("T") + if (h != null) { + append(h) + append("H") + } + if (m != null) { + append(m) + append("M") + } + if (s != null) { + append(s) + if (f != null) { + append(".") + append(f) + } + append("S") } - append("S") } - } - if (!duration.endsWith("P")) { - yield(duration) + if (!duration.endsWith("PT") && !duration.endsWith("DT")) { + yield(duration) + } } } }