diff --git a/src/main/java/com/rak/model/transform/TestRegistry.java b/src/main/java/com/rak/model/transform/TestRegistry.java new file mode 100644 index 0000000..86c0104 --- /dev/null +++ b/src/main/java/com/rak/model/transform/TestRegistry.java @@ -0,0 +1,38 @@ +package com.rak.model.transform; + +import jakarta.enterprise.context.ApplicationScoped; + +import java.time.LocalDate; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +@ApplicationScoped +public class TestRegistry { + private final Map registry = new ConcurrentHashMap<>(); + + public TestRegistry() { + // Register built-in transformations + register("trim", string -> string.trim()); + register("upper", String::toUpperCase); + register("parseInt", s -> Integer.parseInt((String) s)); + register("parseFloat", s -> Float.parseFloat((String) s)); + register("parseDate", s -> LocalDate.parse((String) s)); + register("extract", this::extract); + } + + public void register(String name, Transformation transformation) { + registry.put(name, transformation); + } + + public Transformation get(String name) { + return registry.get(name); + } + + private Object extract(Object input, String pattern) { + Pattern regex = Pattern.compile(pattern); + Matcher matcher = regex.matcher((String) input); + return matcher.find() ? matcher.group(1) : input; + } +} \ No newline at end of file diff --git a/src/main/kotlin/com/rak/controller/ExampleResource.kt b/src/main/kotlin/com/rak/controller/ExampleResource.kt index 46612e5..01cd9a4 100644 --- a/src/main/kotlin/com/rak/controller/ExampleResource.kt +++ b/src/main/kotlin/com/rak/controller/ExampleResource.kt @@ -32,7 +32,7 @@ class ExampleResource( provider: String, @RestQuery setName: String - ): Map { + ): List> { return scrapeService.extractSet( provider, setName diff --git a/src/main/kotlin/com/rak/model/transform/AbstractTransformation.kt b/src/main/kotlin/com/rak/model/transform/AbstractTransformation.kt new file mode 100644 index 0000000..8790d26 --- /dev/null +++ b/src/main/kotlin/com/rak/model/transform/AbstractTransformation.kt @@ -0,0 +1,3 @@ +package com.rak.model.transform + +interface AbstractTransformation \ No newline at end of file diff --git a/src/main/kotlin/com/rak/model/transform/ParameterizedTransformation.kt b/src/main/kotlin/com/rak/model/transform/ParameterizedTransformation.kt new file mode 100644 index 0000000..c0fb037 --- /dev/null +++ b/src/main/kotlin/com/rak/model/transform/ParameterizedTransformation.kt @@ -0,0 +1,6 @@ +package com.rak.model.transform + +@FunctionalInterface +fun interface ParameterizedTransformation : AbstractTransformation { + fun apply(input: Any, vararg parameters: Any): Any? +} \ No newline at end of file diff --git a/src/main/kotlin/com/rak/model/transform/Transformation.kt b/src/main/kotlin/com/rak/model/transform/Transformation.kt new file mode 100644 index 0000000..2d1051c --- /dev/null +++ b/src/main/kotlin/com/rak/model/transform/Transformation.kt @@ -0,0 +1,6 @@ +package com.rak.model.transform + +@FunctionalInterface +fun interface Transformation : AbstractTransformation { + fun apply(input: Any): Any? +} \ No newline at end of file diff --git a/src/main/kotlin/com/rak/model/transform/TransformationRegistry.kt b/src/main/kotlin/com/rak/model/transform/TransformationRegistry.kt new file mode 100644 index 0000000..ba0559d --- /dev/null +++ b/src/main/kotlin/com/rak/model/transform/TransformationRegistry.kt @@ -0,0 +1,27 @@ +package com.rak.model.transform + +import jakarta.enterprise.context.ApplicationScoped + +@ApplicationScoped +class TransformationRegistry { + + private val transformations = hashMapOf Any>() + + init { + register("trim") { + (it as String).trim() + } + register("replace", { s: Any -> + Integer. + }) + } + +// fun register(name: String, transformation: (input: Any) -> T) { +// transformations[name] = transformation +// } + + fun register(name: String, transformation: Transformation) { + + } + +} \ No newline at end of file diff --git a/src/main/kotlin/com/rak/service/ScrapeService.kt b/src/main/kotlin/com/rak/service/ScrapeService.kt index 1e25082..c8c5095 100644 --- a/src/main/kotlin/com/rak/service/ScrapeService.kt +++ b/src/main/kotlin/com/rak/service/ScrapeService.kt @@ -46,7 +46,7 @@ class ScrapeService( fun extractSet( provider: String, setName: String, - ): Map { + ): List> { val source = sourceService.getSourceById(provider) ?: throw IllegalArgumentException("Provider $provider not found") @@ -55,26 +55,28 @@ class ScrapeService( val document: Document = Jsoup.connect("https://${source.getDomain()}/$path").get() val regionalSetSelector = source.getItems().regionalSet().get() - val regionalSetRoot = document.selectFirst(regionalSetSelector.rootSelector().value())!! + val regionalSetRoot = document.select(regionalSetSelector.rootSelector().value()) - val setId: String? = extractTextFromRootBySteps( - regionalSetRoot, - regionalSetSelector.idSelector().steps() - ) - val setLanguage: String? = extractTextFromRootBySteps( - regionalSetRoot, - regionalSetSelector.languageSelector().steps() - ) - val setKey: String? = extractTextFromRootBySteps( - regionalSetRoot, - regionalSetSelector.regionKeySelector().steps() - ) + return regionalSetRoot.map { + val setId: String? = extractTextFromRootBySteps( + it, + regionalSetSelector.idSelector().steps() + ) + val setLanguage: String? = extractTextFromRootBySteps( + it, + regionalSetSelector.languageSelector().steps() + ) + val setKey: String? = extractTextFromRootBySteps( + it, + regionalSetSelector.regionKeySelector().steps() + ) - return mapOf( - Pair("id", setId ?: "N/A"), - Pair("language", setLanguage ?: "N/A"), - Pair("key", setKey ?: "N/A"), - ) + mapOf( + Pair("id", setId ?: "N/A"), + Pair("language", setLanguage ?: "N/A"), + Pair("key", setKey ?: "N/A"), + ) + } }