Add Transformation model

This commit is contained in:
2025-06-03 18:38:18 +02:00
parent 69ff62c4c0
commit 9db3753105
7 changed files with 102 additions and 20 deletions

View File

@@ -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<String, Transformation> 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;
}
}

View File

@@ -32,7 +32,7 @@ class ExampleResource(
provider: String, provider: String,
@RestQuery @RestQuery
setName: String setName: String
): Map<String, String> { ): List<Map<String, String>> {
return scrapeService.extractSet( return scrapeService.extractSet(
provider, provider,
setName setName

View File

@@ -0,0 +1,3 @@
package com.rak.model.transform
interface AbstractTransformation

View File

@@ -0,0 +1,6 @@
package com.rak.model.transform
@FunctionalInterface
fun interface ParameterizedTransformation : AbstractTransformation {
fun apply(input: Any, vararg parameters: Any): Any?
}

View File

@@ -0,0 +1,6 @@
package com.rak.model.transform
@FunctionalInterface
fun interface Transformation : AbstractTransformation {
fun apply(input: Any): Any?
}

View File

@@ -0,0 +1,27 @@
package com.rak.model.transform
import jakarta.enterprise.context.ApplicationScoped
@ApplicationScoped
class TransformationRegistry {
private val transformations = hashMapOf<String, (input: Any) -> Any>()
init {
register<String>("trim") {
(it as String).trim()
}
register<String>("replace", { s: Any ->
Integer.
})
}
// fun <T : Any> register(name: String, transformation: (input: Any) -> T) {
// transformations[name] = transformation
// }
fun <T : Any> register(name: String, transformation: Transformation) {
}
}

View File

@@ -46,7 +46,7 @@ class ScrapeService(
fun extractSet( fun extractSet(
provider: String, provider: String,
setName: String, setName: String,
): Map<String, String> { ): List<Map<String, String>> {
val source = val source =
sourceService.getSourceById(provider) ?: throw IllegalArgumentException("Provider $provider not found") sourceService.getSourceById(provider) ?: throw IllegalArgumentException("Provider $provider not found")
@@ -55,27 +55,29 @@ class ScrapeService(
val document: Document = Jsoup.connect("https://${source.getDomain()}/$path").get() val document: Document = Jsoup.connect("https://${source.getDomain()}/$path").get()
val regionalSetSelector = source.getItems().regionalSet().get() val regionalSetSelector = source.getItems().regionalSet().get()
val regionalSetRoot = document.selectFirst(regionalSetSelector.rootSelector().value())!! val regionalSetRoot = document.select(regionalSetSelector.rootSelector().value())
return regionalSetRoot.map {
val setId: String? = extractTextFromRootBySteps( val setId: String? = extractTextFromRootBySteps(
regionalSetRoot, it,
regionalSetSelector.idSelector().steps() regionalSetSelector.idSelector().steps()
) )
val setLanguage: String? = extractTextFromRootBySteps( val setLanguage: String? = extractTextFromRootBySteps(
regionalSetRoot, it,
regionalSetSelector.languageSelector().steps() regionalSetSelector.languageSelector().steps()
) )
val setKey: String? = extractTextFromRootBySteps( val setKey: String? = extractTextFromRootBySteps(
regionalSetRoot, it,
regionalSetSelector.regionKeySelector().steps() regionalSetSelector.regionKeySelector().steps()
) )
return mapOf( mapOf(
Pair("id", setId ?: "N/A"), Pair("id", setId ?: "N/A"),
Pair("language", setLanguage ?: "N/A"), Pair("language", setLanguage ?: "N/A"),
Pair("key", setKey ?: "N/A"), Pair("key", setKey ?: "N/A"),
) )
} }
}
fun extractCard( fun extractCard(