diff --git a/cache/cache-annotation-processor/src/main/java/io/koraframework/cache/annotation/processor/CacheAnnotationProcessor.java b/cache/cache-annotation-processor/src/main/java/io/koraframework/cache/annotation/processor/CacheAnnotationProcessor.java index 1e567906a..4b4348887 100644 --- a/cache/cache-annotation-processor/src/main/java/io/koraframework/cache/annotation/processor/CacheAnnotationProcessor.java +++ b/cache/cache-annotation-processor/src/main/java/io/koraframework/cache/annotation/processor/CacheAnnotationProcessor.java @@ -216,14 +216,14 @@ private MethodSpec getCacheMethodConfig(TypeElement cacheImpl, ParameterizedType } else { throw new IllegalArgumentException("Unknown cache type: " + cacheType.rawType()); } - var extractorType = ParameterizedTypeName.get(CommonClassNames.configValueExtractor, returnType); + var extractorType = ParameterizedTypeName.get(CommonClassNames.configValueMapper, returnType); return MethodSpec.methodBuilder(methodName) .addAnnotation(TagUtils.makeAnnotationSpec(cacheContractName)) .addModifiers(Modifier.DEFAULT, Modifier.PUBLIC) .addParameter(CommonClassNames.config, "config") - .addParameter(extractorType, "extractor") - .addStatement("return extractor.extractOrThrow(config.get($S))", configPath) + .addParameter(extractorType, "mapper") + .addStatement("return mapper.mapOrThrow(config.get($S))", configPath) .returns(returnType) .build(); } diff --git a/cache/cache-annotation-processor/src/test/java/io/koraframework/cache/annotation/processor/CacheRunner.java b/cache/cache-annotation-processor/src/test/java/io/koraframework/cache/annotation/processor/CacheRunner.java index 05a5da335..e5df265ff 100644 --- a/cache/cache-annotation-processor/src/test/java/io/koraframework/cache/annotation/processor/CacheRunner.java +++ b/cache/cache-annotation-processor/src/test/java/io/koraframework/cache/annotation/processor/CacheRunner.java @@ -1,14 +1,13 @@ package io.koraframework.cache.annotation.processor; -import io.koraframework.cache.caffeine.$CaffeineCacheConfig_CaffeineTelemetryConfig_CaffeineLoggingConfig_ConfigValueExtractor; -import io.koraframework.cache.caffeine.$CaffeineCacheConfig_CaffeineTelemetryConfig_CaffeineMetricsConfig_ConfigValueExtractor; +import io.koraframework.cache.caffeine.$CaffeineCacheConfig_CaffeineTelemetryConfig_CaffeineLoggingConfig_ConfigValueMapper; +import io.koraframework.cache.caffeine.$CaffeineCacheConfig_CaffeineTelemetryConfig_CaffeineMetricsConfig_ConfigValueMapper; import io.koraframework.cache.caffeine.CaffeineCacheConfig; import io.koraframework.cache.redis.*; import io.koraframework.cache.redis.RedisCacheClient; -import io.koraframework.cache.redis.telemetry.$RedisCacheTelemetryConfig_ConfigValueExtractor; -import io.koraframework.cache.redis.telemetry.$RedisCacheTelemetryConfig_RedisCacheLoggingConfig_ConfigValueExtractor; -import io.koraframework.cache.redis.telemetry.$RedisCacheTelemetryConfig_RedisCacheMetricsConfig_ConfigValueExtractor; -import io.koraframework.cache.redis.telemetry.$RedisCacheTelemetryConfig_RedisCacheTracingConfig_ConfigValueExtractor; +import io.koraframework.cache.redis.telemetry.*; +import io.koraframework.cache.redis.telemetry.$RedisCacheTelemetryConfig_RedisCacheMetricsConfig_ConfigValueMapper; +import io.koraframework.cache.redis.telemetry.$RedisCacheTelemetryConfig_RedisCacheTracingConfig_ConfigValueMapper; import org.jspecify.annotations.NullMarked; import org.mockito.Mockito; @@ -28,18 +27,18 @@ public static CaffeineCacheConfig getCaffeineConfig() { when(config.maximumSize()).thenReturn(100_000L); when(config.expireAfterAccess()).thenReturn(null); when(config.expireAfterWrite()).thenReturn(null); - when(telemetry.metrics()).thenReturn(new $CaffeineCacheConfig_CaffeineTelemetryConfig_CaffeineMetricsConfig_ConfigValueExtractor.CaffeineMetricsConfig_Defaults()); - when(telemetry.logging()).thenReturn(new $CaffeineCacheConfig_CaffeineTelemetryConfig_CaffeineLoggingConfig_ConfigValueExtractor.CaffeineLoggingConfig_Defaults()); + when(telemetry.metrics()).thenReturn(new $CaffeineCacheConfig_CaffeineTelemetryConfig_CaffeineMetricsConfig_ConfigValueMapper.CaffeineMetricsConfig_Defaults()); + when(telemetry.logging()).thenReturn(new $CaffeineCacheConfig_CaffeineTelemetryConfig_CaffeineLoggingConfig_ConfigValueMapper.CaffeineLoggingConfig_Defaults()); return config; } public static RedisCacheConfig getRedisConfig() { var config = Mockito.mock(RedisCacheConfig.class); when(config.keyPrefix()).thenReturn("pref"); - when(config.telemetry()).thenReturn(new $RedisCacheTelemetryConfig_ConfigValueExtractor.RedisCacheTelemetryConfig_Impl( - new $RedisCacheTelemetryConfig_RedisCacheLoggingConfig_ConfigValueExtractor.RedisCacheLoggingConfig_Defaults(), - new $RedisCacheTelemetryConfig_RedisCacheTracingConfig_ConfigValueExtractor.RedisCacheTracingConfig_Defaults(), - new $RedisCacheTelemetryConfig_RedisCacheMetricsConfig_ConfigValueExtractor.RedisCacheMetricsConfig_Defaults() + when(config.telemetry()).thenReturn(new $RedisCacheTelemetryConfig_ConfigValueMapper.RedisCacheTelemetryConfig_Impl( + new $RedisCacheTelemetryConfig_RedisCacheLoggingConfig_ConfigValueMapper.RedisCacheLoggingConfig_Defaults(), + new $RedisCacheTelemetryConfig_RedisCacheTracingConfig_ConfigValueMapper.RedisCacheTracingConfig_Defaults(), + new $RedisCacheTelemetryConfig_RedisCacheMetricsConfig_ConfigValueMapper.RedisCacheMetricsConfig_Defaults() )); return config; } diff --git a/cache/cache-caffeine/src/main/java/io/koraframework/cache/caffeine/CaffeineCacheConfig.java b/cache/cache-caffeine/src/main/java/io/koraframework/cache/caffeine/CaffeineCacheConfig.java index 46cdd748b..83a17aab4 100644 --- a/cache/cache-caffeine/src/main/java/io/koraframework/cache/caffeine/CaffeineCacheConfig.java +++ b/cache/cache-caffeine/src/main/java/io/koraframework/cache/caffeine/CaffeineCacheConfig.java @@ -1,14 +1,14 @@ package io.koraframework.cache.caffeine; -import io.koraframework.config.common.annotation.ConfigValueExtractor; +import io.koraframework.config.common.annotation.ConfigMapper; import io.koraframework.telemetry.common.TelemetryConfig; import org.jspecify.annotations.Nullable; import java.time.Duration; import java.util.Map; -@ConfigValueExtractor +@ConfigMapper public interface CaffeineCacheConfig { @Nullable @@ -26,17 +26,17 @@ default Long maximumSize() { CaffeineTelemetryConfig telemetry(); - @ConfigValueExtractor + @ConfigMapper interface CaffeineTelemetryConfig { CaffeineMetricsConfig metrics(); CaffeineLoggingConfig logging(); - @ConfigValueExtractor + @ConfigMapper interface CaffeineLoggingConfig extends TelemetryConfig.LoggingConfig {} - @ConfigValueExtractor + @ConfigMapper interface CaffeineMetricsConfig { default boolean enabled() { diff --git a/cache/cache-caffeine/src/test/java/io/koraframework/cache/caffeine/CacheRunner.java b/cache/cache-caffeine/src/test/java/io/koraframework/cache/caffeine/CacheRunner.java index 9f1c31b45..05b2d0ed4 100644 --- a/cache/cache-caffeine/src/test/java/io/koraframework/cache/caffeine/CacheRunner.java +++ b/cache/cache-caffeine/src/test/java/io/koraframework/cache/caffeine/CacheRunner.java @@ -14,8 +14,8 @@ public static CaffeineCacheConfig getConfig() { when(config.maximumSize()).thenReturn(100_000L); when(config.expireAfterAccess()).thenReturn(null); when(config.expireAfterWrite()).thenReturn(null); - when(telemetry.metrics()).thenReturn(new $CaffeineCacheConfig_CaffeineTelemetryConfig_CaffeineMetricsConfig_ConfigValueExtractor.CaffeineMetricsConfig_Defaults()); - when(telemetry.logging()).thenReturn(new $CaffeineCacheConfig_CaffeineTelemetryConfig_CaffeineLoggingConfig_ConfigValueExtractor.CaffeineLoggingConfig_Defaults()); + when(telemetry.metrics()).thenReturn(new $CaffeineCacheConfig_CaffeineTelemetryConfig_CaffeineMetricsConfig_ConfigValueMapper.CaffeineMetricsConfig_Defaults()); + when(telemetry.logging()).thenReturn(new $CaffeineCacheConfig_CaffeineTelemetryConfig_CaffeineLoggingConfig_ConfigValueMapper.CaffeineLoggingConfig_Defaults()); return config; } // public static CaffeineCacheConfig getConfig() { @@ -40,9 +40,9 @@ public static CaffeineCacheConfig getConfig() { // // @Override // public CaffeineTelemetryConfig telemetry() { -// return new $CaffeineCacheConfig_CaffeineTelemetryConfig_ConfigValueExtractor.CaffeineTelemetryConfig_Impl( -// new $CaffeineCacheConfig_CaffeineTelemetryConfig_CaffeineMetricsConfig_ConfigValueExtractor.CaffeineMetricsConfig_Defaults(), -// new $CaffeineCacheConfig_CaffeineTelemetryConfig_CaffeineLoggingConfig_ConfigValueExtractor.CaffeineLoggingConfig_Defaults() +// return new $CaffeineCacheConfig_CaffeineTelemetryConfig_ConfigValueMapper.CaffeineTelemetryConfig_Impl( +// new $CaffeineCacheConfig_CaffeineTelemetryConfig_CaffeineMetricsConfig_ConfigValueMapper.CaffeineMetricsConfig_Defaults(), +// new $CaffeineCacheConfig_CaffeineTelemetryConfig_CaffeineLoggingConfig_ConfigValueMapper.CaffeineLoggingConfig_Defaults() // ); // } // }; diff --git a/cache/cache-redis-lettuce/src/main/java/io/koraframework/cache/redis/RedisCacheConfig.java b/cache/cache-redis-lettuce/src/main/java/io/koraframework/cache/redis/RedisCacheConfig.java index a3620428a..ad2fb5cbd 100644 --- a/cache/cache-redis-lettuce/src/main/java/io/koraframework/cache/redis/RedisCacheConfig.java +++ b/cache/cache-redis-lettuce/src/main/java/io/koraframework/cache/redis/RedisCacheConfig.java @@ -2,12 +2,12 @@ import io.koraframework.cache.redis.telemetry.RedisCacheTelemetryConfig; -import io.koraframework.config.common.annotation.ConfigValueExtractor; +import io.koraframework.config.common.annotation.ConfigMapper; import org.jspecify.annotations.Nullable; import java.time.Duration; -@ConfigValueExtractor +@ConfigMapper public interface RedisCacheConfig { /** diff --git a/cache/cache-redis-lettuce/src/main/java/io/koraframework/cache/redis/telemetry/RedisCacheTelemetryConfig.java b/cache/cache-redis-lettuce/src/main/java/io/koraframework/cache/redis/telemetry/RedisCacheTelemetryConfig.java index f397383e3..72c506336 100644 --- a/cache/cache-redis-lettuce/src/main/java/io/koraframework/cache/redis/telemetry/RedisCacheTelemetryConfig.java +++ b/cache/cache-redis-lettuce/src/main/java/io/koraframework/cache/redis/telemetry/RedisCacheTelemetryConfig.java @@ -1,9 +1,9 @@ package io.koraframework.cache.redis.telemetry; -import io.koraframework.config.common.annotation.ConfigValueExtractor; +import io.koraframework.config.common.annotation.ConfigMapper; import io.koraframework.telemetry.common.TelemetryConfig; -@ConfigValueExtractor +@ConfigMapper public interface RedisCacheTelemetryConfig extends TelemetryConfig { @Override @@ -15,12 +15,12 @@ public interface RedisCacheTelemetryConfig extends TelemetryConfig { @Override RedisCacheMetricsConfig metrics(); - @ConfigValueExtractor + @ConfigMapper interface RedisCacheTracingConfig extends TelemetryConfig.TracingConfig {} - @ConfigValueExtractor + @ConfigMapper interface RedisCacheLoggingConfig extends TelemetryConfig.LoggingConfig {} - @ConfigValueExtractor + @ConfigMapper interface RedisCacheMetricsConfig extends TelemetryConfig.MetricsConfig {} } diff --git a/cache/cache-redis-lettuce/src/main/java/io/koraframework/cache/redis/telemetry/impl/DefaultRedisCacheTelemetry.java b/cache/cache-redis-lettuce/src/main/java/io/koraframework/cache/redis/telemetry/impl/DefaultRedisCacheTelemetry.java index 069ed585d..fa074fa29 100644 --- a/cache/cache-redis-lettuce/src/main/java/io/koraframework/cache/redis/telemetry/impl/DefaultRedisCacheTelemetry.java +++ b/cache/cache-redis-lettuce/src/main/java/io/koraframework/cache/redis/telemetry/impl/DefaultRedisCacheTelemetry.java @@ -18,10 +18,10 @@ public record TelemetryContext(RedisCacheTelemetryConfig config, String cacheImplCanonicalName, String cacheImplSimpleName) { - public static final TelemetryContext EMPTY = new TelemetryContext(new $RedisCacheTelemetryConfig_ConfigValueExtractor.RedisCacheTelemetryConfig_Impl( - new $RedisCacheTelemetryConfig_RedisCacheLoggingConfig_ConfigValueExtractor.RedisCacheLoggingConfig_Defaults(), - new $RedisCacheTelemetryConfig_RedisCacheTracingConfig_ConfigValueExtractor.RedisCacheTracingConfig_Defaults(), - new $RedisCacheTelemetryConfig_RedisCacheMetricsConfig_ConfigValueExtractor.RedisCacheMetricsConfig_Defaults() + public static final TelemetryContext EMPTY = new TelemetryContext(new $RedisCacheTelemetryConfig_ConfigValueMapper.RedisCacheTelemetryConfig_Impl( + new $RedisCacheTelemetryConfig_RedisCacheLoggingConfig_ConfigValueMapper.RedisCacheLoggingConfig_Defaults(), + new $RedisCacheTelemetryConfig_RedisCacheTracingConfig_ConfigValueMapper.RedisCacheTracingConfig_Defaults(), + new $RedisCacheTelemetryConfig_RedisCacheMetricsConfig_ConfigValueMapper.RedisCacheMetricsConfig_Defaults() ), false, false, DefaultRedisCacheTelemetryFactory.NOOP_METER_REGISTRY, DefaultRedisCacheTelemetryFactory.NOOP_TRACER, "", "", ""); } diff --git a/cache/cache-redis-lettuce/src/test/java/io/koraframework/cache/redis/CacheRunner.java b/cache/cache-redis-lettuce/src/test/java/io/koraframework/cache/redis/CacheRunner.java index b3b6a28aa..2b1c4a566 100644 --- a/cache/cache-redis-lettuce/src/test/java/io/koraframework/cache/redis/CacheRunner.java +++ b/cache/cache-redis-lettuce/src/test/java/io/koraframework/cache/redis/CacheRunner.java @@ -3,12 +3,11 @@ import io.koraframework.application.graph.Lifecycle; import io.koraframework.cache.redis.telemetry.*; import io.koraframework.cache.redis.testdata.DummyCache; -import io.koraframework.redis.lettuce.$LettuceConfig_SslConfig_ConfigValueExtractor; +import io.koraframework.redis.lettuce.$LettuceConfig_SslConfig_ConfigValueMapper; import io.koraframework.redis.lettuce.LettuceConfig; -import io.koraframework.redis.lettuce.telemetry.$LettuceTelemetryConfig_ConfigValueExtractor; -import io.koraframework.redis.lettuce.telemetry.$LettuceTelemetryConfig_LettuceLoggingConfig_ConfigValueExtractor; -import io.koraframework.redis.lettuce.telemetry.$LettuceTelemetryConfig_LettuceMetricsConfig_ConfigValueExtractor; -import io.koraframework.redis.lettuce.telemetry.LettuceTelemetryConfig; +import io.koraframework.redis.lettuce.telemetry.*; +import io.koraframework.redis.lettuce.telemetry.$LettuceTelemetryConfig_ConfigValueMapper; +import io.koraframework.redis.lettuce.telemetry.$LettuceTelemetryConfig_LettuceMetricsConfig_ConfigValueMapper; import io.koraframework.test.redis.RedisParams; import org.jspecify.annotations.Nullable; import org.junit.jupiter.api.Assertions; @@ -42,10 +41,10 @@ public Duration expireAfterAccess() { @Override public RedisCacheTelemetryConfig telemetry() { - return new $RedisCacheTelemetryConfig_ConfigValueExtractor.RedisCacheTelemetryConfig_Impl( - new $RedisCacheTelemetryConfig_RedisCacheLoggingConfig_ConfigValueExtractor.RedisCacheLoggingConfig_Defaults(), - new $RedisCacheTelemetryConfig_RedisCacheTracingConfig_ConfigValueExtractor.RedisCacheTracingConfig_Defaults(), - new $RedisCacheTelemetryConfig_RedisCacheMetricsConfig_ConfigValueExtractor.RedisCacheMetricsConfig_Defaults() + return new $RedisCacheTelemetryConfig_ConfigValueMapper.RedisCacheTelemetryConfig_Impl( + new $RedisCacheTelemetryConfig_RedisCacheLoggingConfig_ConfigValueMapper.RedisCacheLoggingConfig_Defaults(), + new $RedisCacheTelemetryConfig_RedisCacheTracingConfig_ConfigValueMapper.RedisCacheTracingConfig_Defaults(), + new $RedisCacheTelemetryConfig_RedisCacheMetricsConfig_ConfigValueMapper.RedisCacheMetricsConfig_Defaults() ); } }; @@ -76,14 +75,14 @@ public String password() { @Override public LettuceConfig.SslConfig ssl() { - return new $LettuceConfig_SslConfig_ConfigValueExtractor.SslConfig_Defaults(); + return new $LettuceConfig_SslConfig_ConfigValueMapper.SslConfig_Defaults(); } @Override public LettuceTelemetryConfig telemetry() { - return new $LettuceTelemetryConfig_ConfigValueExtractor.LettuceTelemetryConfig_Impl( - new $LettuceTelemetryConfig_LettuceLoggingConfig_ConfigValueExtractor.LettuceLoggingConfig_Defaults(), - new $LettuceTelemetryConfig_LettuceMetricsConfig_ConfigValueExtractor.LettuceMetricsConfig_Defaults() + return new $LettuceTelemetryConfig_ConfigValueMapper.LettuceTelemetryConfig_Impl( + new $LettuceTelemetryConfig_LettuceLoggingConfig_ConfigValueMapper.LettuceLoggingConfig_Defaults(), + new $LettuceTelemetryConfig_LettuceMetricsConfig_ConfigValueMapper.LettuceMetricsConfig_Defaults() ); } }; diff --git a/cache/cache-symbol-processor/src/main/kotlin/io/koraframework/cache/symbol/processor/CacheSymbolProcessor.kt b/cache/cache-symbol-processor/src/main/kotlin/io/koraframework/cache/symbol/processor/CacheSymbolProcessor.kt index ab4e2a96f..dc65097cf 100644 --- a/cache/cache-symbol-processor/src/main/kotlin/io/koraframework/cache/symbol/processor/CacheSymbolProcessor.kt +++ b/cache/cache-symbol-processor/src/main/kotlin/io/koraframework/cache/symbol/processor/CacheSymbolProcessor.kt @@ -18,7 +18,7 @@ import io.koraframework.ksp.common.AnnotationUtils.findValueNoDefault import io.koraframework.ksp.common.BaseSymbolProcessor import io.koraframework.ksp.common.CommonAopUtils.extendsKeepAop import io.koraframework.ksp.common.CommonClassNames -import io.koraframework.ksp.common.CommonClassNames.configValueExtractor +import io.koraframework.ksp.common.CommonClassNames.configValueMapper import io.koraframework.ksp.common.KspCommonUtils.addOriginatingKSFile import io.koraframework.ksp.common.KspCommonUtils.generated import io.koraframework.ksp.common.KspCommonUtils.toTypeName @@ -216,14 +216,14 @@ class CacheSymbolProcessor( REDIS_CACHE -> resolver.getClassDeclarationByName(REDIS_CACHE_CONFIG.canonicalName)!! else -> throw IllegalArgumentException("Unknown cache type: ${cacheType.rawType}") } - val extractorType = configValueExtractor.parameterizedBy(returnType.asType(listOf()).toTypeName()) + val extractorType = configValueMapper.parameterizedBy(returnType.asType(listOf()).toTypeName()) return FunSpec.builder(methodName) .addAnnotation(cacheImpl.toClassName().toTagAnnotation()) .addModifiers(KModifier.PUBLIC) .addParameter("config", CommonClassNames.config) - .addParameter("extractor", extractorType) - .addStatement("return extractor.extractOrThrow(config.get(%S))!!", configPath) + .addParameter("mapper", extractorType) + .addStatement("return mapper.mapOrThrow(config.get(%S))!!", configPath) .returns(returnType.asType(listOf()).toTypeName()) .build() } diff --git a/cache/cache-symbol-processor/src/test/kotlin/io/koraframework/cache/symbol/processor/CacheRunner.kt b/cache/cache-symbol-processor/src/test/kotlin/io/koraframework/cache/symbol/processor/CacheRunner.kt index 960af098b..0bee98aab 100644 --- a/cache/cache-symbol-processor/src/test/kotlin/io/koraframework/cache/symbol/processor/CacheRunner.kt +++ b/cache/cache-symbol-processor/src/test/kotlin/io/koraframework/cache/symbol/processor/CacheRunner.kt @@ -1,15 +1,15 @@ package io.koraframework.cache.symbol.processor -import io.koraframework.cache.caffeine.`$CaffeineCacheConfig_CaffeineTelemetryConfig_CaffeineLoggingConfig_ConfigValueExtractor` -import io.koraframework.cache.caffeine.`$CaffeineCacheConfig_CaffeineTelemetryConfig_CaffeineMetricsConfig_ConfigValueExtractor` +import io.koraframework.cache.caffeine.`$CaffeineCacheConfig_CaffeineTelemetryConfig_CaffeineLoggingConfig_ConfigValueMapper` +import io.koraframework.cache.caffeine.`$CaffeineCacheConfig_CaffeineTelemetryConfig_CaffeineMetricsConfig_ConfigValueMapper` import io.koraframework.cache.caffeine.CaffeineCacheConfig import io.koraframework.cache.caffeine.CaffeineCacheConfig.CaffeineTelemetryConfig import io.koraframework.cache.redis.* import io.koraframework.cache.redis.RedisCacheClient -import io.koraframework.cache.redis.telemetry.`$RedisCacheTelemetryConfig_ConfigValueExtractor` -import io.koraframework.cache.redis.telemetry.`$RedisCacheTelemetryConfig_RedisCacheLoggingConfig_ConfigValueExtractor` -import io.koraframework.cache.redis.telemetry.`$RedisCacheTelemetryConfig_RedisCacheMetricsConfig_ConfigValueExtractor` -import io.koraframework.cache.redis.telemetry.`$RedisCacheTelemetryConfig_RedisCacheTracingConfig_ConfigValueExtractor` +import io.koraframework.cache.redis.telemetry.`$RedisCacheTelemetryConfig_ConfigValueMapper` +import io.koraframework.cache.redis.telemetry.`$RedisCacheTelemetryConfig_RedisCacheLoggingConfig_ConfigValueMapper` +import io.koraframework.cache.redis.telemetry.`$RedisCacheTelemetryConfig_RedisCacheMetricsConfig_ConfigValueMapper` +import io.koraframework.cache.redis.telemetry.`$RedisCacheTelemetryConfig_RedisCacheTracingConfig_ConfigValueMapper` import org.mockito.Mockito import org.mockito.Mockito.`when` import java.nio.ByteBuffer @@ -30,8 +30,8 @@ class CacheRunner { `when`(config.maximumSize()).thenReturn(100000L) `when`(config.expireAfterAccess()).thenReturn(null) `when`(config.expireAfterWrite()).thenReturn(null) - `when`(telemetry.metrics()).thenReturn(`$CaffeineCacheConfig_CaffeineTelemetryConfig_CaffeineMetricsConfig_ConfigValueExtractor`.CaffeineMetricsConfig_Defaults()) - `when`(telemetry.logging()).thenReturn(`$CaffeineCacheConfig_CaffeineTelemetryConfig_CaffeineLoggingConfig_ConfigValueExtractor`.CaffeineLoggingConfig_Defaults()) + `when`(telemetry.metrics()).thenReturn(`$CaffeineCacheConfig_CaffeineTelemetryConfig_CaffeineMetricsConfig_ConfigValueMapper`.CaffeineMetricsConfig_Defaults()) + `when`(telemetry.logging()).thenReturn(`$CaffeineCacheConfig_CaffeineTelemetryConfig_CaffeineLoggingConfig_ConfigValueMapper`.CaffeineLoggingConfig_Defaults()) return config } @@ -43,10 +43,10 @@ class CacheRunner { override fun expireAfterWrite(): Duration? = null override fun expireAfterAccess(): Duration? = null - override fun telemetry() = `$RedisCacheTelemetryConfig_ConfigValueExtractor`.RedisCacheTelemetryConfig_Impl( - `$RedisCacheTelemetryConfig_RedisCacheLoggingConfig_ConfigValueExtractor`.RedisCacheLoggingConfig_Defaults(), - `$RedisCacheTelemetryConfig_RedisCacheTracingConfig_ConfigValueExtractor`.RedisCacheTracingConfig_Defaults(), - `$RedisCacheTelemetryConfig_RedisCacheMetricsConfig_ConfigValueExtractor`.RedisCacheMetricsConfig_Defaults() + override fun telemetry() = `$RedisCacheTelemetryConfig_ConfigValueMapper`.RedisCacheTelemetryConfig_Impl( + `$RedisCacheTelemetryConfig_RedisCacheLoggingConfig_ConfigValueMapper`.RedisCacheLoggingConfig_Defaults(), + `$RedisCacheTelemetryConfig_RedisCacheTracingConfig_ConfigValueMapper`.RedisCacheTracingConfig_Defaults(), + `$RedisCacheTelemetryConfig_RedisCacheMetricsConfig_ConfigValueMapper`.RedisCacheMetricsConfig_Defaults() ) } } diff --git a/config/config-annotation-processor/src/main/java/io/koraframework/config/annotation/processor/ConfigClassNames.java b/config/config-annotation-processor/src/main/java/io/koraframework/config/annotation/processor/ConfigClassNames.java index f872b6a88..f90e2c33a 100644 --- a/config/config-annotation-processor/src/main/java/io/koraframework/config/annotation/processor/ConfigClassNames.java +++ b/config/config-annotation-processor/src/main/java/io/koraframework/config/annotation/processor/ConfigClassNames.java @@ -8,7 +8,7 @@ public class ConfigClassNames { public static final ClassName config = CommonClassNames.config; public static final ClassName configSourceAnnotation = ClassName.get("io.koraframework.config.common.annotation", "ConfigSource"); - public static final ClassName configValueExtractorAnnotation = ClassName.get("io.koraframework.config.common.annotation", "ConfigValueExtractor"); + public static final ClassName configValueMapperAnnotation = ClassName.get("io.koraframework.config.common.annotation", "ConfigMapper"); public static final ClassName configValue = ClassName.get("io.koraframework.config.common", "ConfigValue"); public static final ClassName configValuePath = ClassName.get("io.koraframework.config.common", "ConfigValuePath"); public static final ClassName pathElement = ClassName.get("io.koraframework.config.common", "PathElement"); @@ -16,8 +16,8 @@ public class ConfigClassNames { - public static final ClassName configValueExtractor = CommonClassNames.configValueExtractor; - public static final ClassName configValueExtractionException = ClassName.get("io.koraframework.config.common.extractor", "ConfigValueExtractionException"); + public static final ClassName configValueMapper = CommonClassNames.configValueMapper; + public static final ClassName configValueException = ClassName.get("io.koraframework.config.common.exception", "ConfigValueException"); public static final ClassName objectValue = ClassName.get("io.koraframework.config.common", "ConfigValue", "ObjectValue"); public static final ClassName optional = ClassName.get(Optional.class); } diff --git a/config/config-annotation-processor/src/main/java/io/koraframework/config/annotation/processor/ConfigParserGenerator.java b/config/config-annotation-processor/src/main/java/io/koraframework/config/annotation/processor/ConfigParserGenerator.java index 05f2dd9a7..e46e51aaf 100644 --- a/config/config-annotation-processor/src/main/java/io/koraframework/config/annotation/processor/ConfigParserGenerator.java +++ b/config/config-annotation-processor/src/main/java/io/koraframework/config/annotation/processor/ConfigParserGenerator.java @@ -34,11 +34,11 @@ public Either> generateForInterface(DeclaredType tar if (f.isRight()) { return Either.right(f.right()); } - var typeName = NameUtils.generatedType(element, ConfigClassNames.configValueExtractor); + var typeName = NameUtils.generatedType(element, ConfigClassNames.configValueMapper); var typeBuilder = TypeSpec.classBuilder(typeName) .addOriginatingElement(element) .addAnnotation(AnnotationUtils.generated(ConfigParserGenerator.class)) - .addSuperinterface(ParameterizedTypeName.get(ConfigClassNames.configValueExtractor, TypeName.get(targetType))) + .addSuperinterface(ParameterizedTypeName.get(ConfigClassNames.configValueMapper, TypeName.get(targetType))) .addModifiers(Modifier.PUBLIC, Modifier.FINAL); var fields = Objects.requireNonNull(f.left()); var defaultsType = buildDefaultsType(targetType, element, fields); @@ -79,14 +79,14 @@ private MethodSpec buildExtractMethod(TypeElement element, TypeName typeName, Cl var nonEmptyConstructor = constructors.stream().filter(e -> !e.getParameters().isEmpty()).findFirst().orElse(null); var constructorParams = nonEmptyConstructor == null ? Set.of() : nonEmptyConstructor.getParameters().stream().map(VariableElement::getSimpleName).map(Objects::toString).collect(Collectors.toSet()); - var rootParse = MethodSpec.methodBuilder("extract") + var rootParse = MethodSpec.methodBuilder("map") .addModifiers(Modifier.PUBLIC) .addAnnotation(Override.class) .returns(typeName.withoutAnnotations()); rootParse.addParameter(ParameterizedTypeName.get(ConfigClassNames.configValue, WildcardTypeName.subtypeOf(ClassName.OBJECT)), "_sourceValue"); rootParse.beginControlFlow("if (_sourceValue instanceof $T.NullValue _nullValue)", ConfigClassNames.configValue); - var annotation = AnnotationUtils.findAnnotation(element, ConfigClassNames.configValueExtractorAnnotation); + var annotation = AnnotationUtils.findAnnotation(element, ConfigClassNames.configValueMapperAnnotation); if (annotation == null || Boolean.TRUE.equals(Objects.requireNonNullElse(AnnotationUtils.parseAnnotationValueWithoutDefault(annotation, "mapNullAsEmptyObject"), true))) { rootParse.addStatement("_sourceValue = new $T.ObjectValue(_sourceValue.origin(), $T.of())", ConfigClassNames.configValue, Map.class); } else { @@ -143,11 +143,11 @@ public Either> generateForRecord(DeclaredType target if (f.isRight()) { return Either.right(f.right()); } - var typeName = NameUtils.generatedType(element, ConfigClassNames.configValueExtractor); + var typeName = NameUtils.generatedType(element, ConfigClassNames.configValueMapper); var typeBuilder = TypeSpec.classBuilder(typeName) .addOriginatingElement(element) .addAnnotation(AnnotationUtils.generated(ConfigParserGenerator.class)) - .addSuperinterface(ParameterizedTypeName.get(ConfigClassNames.configValueExtractor, TypeName.get(targetType))) + .addSuperinterface(ParameterizedTypeName.get(ConfigClassNames.configValueMapper, TypeName.get(targetType))) .addModifiers(Modifier.PUBLIC, Modifier.FINAL); var fields = Objects.requireNonNull(f.left()); var implClassName = ClassName.get(element); @@ -175,11 +175,11 @@ public Either> generateForPojo(DeclaredType targetTy if (f.isRight()) { return Either.right(f.right()); } - var typeName = NameUtils.generatedType(element, ConfigClassNames.configValueExtractor); + var typeName = NameUtils.generatedType(element, ConfigClassNames.configValueMapper); var typeBuilder = TypeSpec.classBuilder(typeName) .addOriginatingElement(element) .addAnnotation(AnnotationUtils.generated(ConfigParserGenerator.class)) - .addSuperinterface(ParameterizedTypeName.get(ConfigClassNames.configValueExtractor, TypeName.get(targetType))) + .addSuperinterface(ParameterizedTypeName.get(ConfigClassNames.configValueMapper, TypeName.get(targetType))) .addModifiers(Modifier.PUBLIC, Modifier.FINAL); var fields = Objects.requireNonNull(f.left()); @@ -241,7 +241,7 @@ private MethodSpec buildParseField(TypeElement element, ConfigUtils.ConfigField } else if (optionalType.isPresent()) { parse.addStatement("return $T.empty()", ConfigClassNames.optional); } else { - parse.addStatement("throw $T.missingValue(nullValue)", ConfigClassNames.configValueExtractionException); + parse.addStatement("throw $T.missingValue(nullValue)", ConfigClassNames.configValueException); } parse.nextControlFlow("else"); parse.addStatement("return defaultValue"); @@ -253,7 +253,7 @@ private MethodSpec buildParseField(TypeElement element, ConfigUtils.ConfigField } else if (optionalType.isPresent()) { parse.addStatement("return $T.empty()", ConfigClassNames.optional); } else { - parse.addStatement("throw $T.missingValue(nullValue)", ConfigClassNames.configValueExtractionException); + parse.addStatement("throw $T.missingValue(nullValue)", ConfigClassNames.configValueException); } } parse.endControlFlow(); @@ -279,7 +279,7 @@ private MethodSpec buildParseField(TypeElement element, ConfigUtils.ConfigField } else if (optionalType.isPresent()) { parse.addStatement("return $T.empty()", ConfigClassNames.optional); } else { - parse.addStatement("throw $T.missingValue(value)", ConfigClassNames.configValueExtractionException); + parse.addStatement("throw $T.missingValue(value)", ConfigClassNames.configValueException); } parse.nextControlFlow("else"); parse.addStatement("return defaultValue"); @@ -292,11 +292,11 @@ private MethodSpec buildParseField(TypeElement element, ConfigUtils.ConfigField parse.endControlFlow(); } if (field.isNullable()) { - parse.addStatement("return $L_parser.extract(value)", field.name()); + parse.addStatement("return $L_parser.map(value)", field.name()); } else { - parse.addStatement("var parsed = $L_parser.extract(value)", field.name()); + parse.addStatement("var parsed = $L_parser.map(value)", field.name()); parse.beginControlFlow("if (parsed == null)"); - parse.addStatement("throw $T.missingValueAfterParse(value)", ConfigClassNames.configValueExtractionException); + parse.addStatement("throw $T.missingValueAfterParse(value)", ConfigClassNames.configValueException); parse.endControlFlow(); parse.addStatement("return parsed"); } @@ -307,7 +307,7 @@ private MethodSpec buildParseField(TypeElement element, ConfigUtils.ConfigField private MethodSpec buildConstructor(TypeSpec.Builder parser, List fields) { var constructor = MethodSpec.constructorBuilder() .addModifiers(Modifier.PUBLIC); - var fieldFactory = new FieldFactory(this.types, elements, null, constructor, "extractor"); + var fieldFactory = new FieldFactory(this.types, elements, null, constructor, "mapper"); for (var field : fields) { var isSupported = field.mapping() == null && (ConfigUtils.isSupportedType(field.typeName()) @@ -315,7 +315,7 @@ private MethodSpec buildConstructor(TypeSpec.Builder parser, List, List> parseRecord(Type for (var recordComponent : te.getRecordComponents()) { var recordComponentType = types.asMemberOf(typeMirror, recordComponent); var name = recordComponent.getSimpleName().toString(); - var mapping = CommonUtils.parseMapping(recordComponent).getMapping(ConfigClassNames.configValueExtractor); + var mapping = CommonUtils.parseMapping(recordComponent).getMapping(ConfigClassNames.configValueMapper); var isNullable = CommonUtils.isNullable(recordComponent) && !recordComponentType.getKind().isPrimitive(); fields.add(new ConfigUtils.ConfigField( name, TypeName.get(recordComponentType), isNullable, false, mapping @@ -106,7 +106,7 @@ private static void parseInterface(Types types, DeclaredType typeMirror, TypeEle var name = method.getSimpleName().toString(); if (seen.add(name)) { var isNullable = CommonUtils.isNullable(method) && !methodType.getReturnType().getKind().isPrimitive(); - var mapping = CommonUtils.parseMapping(method).getMapping(ConfigClassNames.configValueExtractor); + var mapping = CommonUtils.parseMapping(method).getMapping(ConfigClassNames.configValueMapper); fields.add(new ConfigUtils.ConfigField( name, TypeName.get(methodType.getReturnType()), isNullable, method.getModifiers().contains(Modifier.DEFAULT), mapping )); @@ -189,11 +189,11 @@ class FieldAndAccessors { var fieldType = types.asMemberOf(typeMirror, value.field); if (seen.add(name)) { var isNullable = CommonUtils.isNullable(value.field) && !fieldType.getKind().isPrimitive(); - var mapping = CommonUtils.parseMapping(value.field).getMapping(ConfigClassNames.configValueExtractor); + var mapping = CommonUtils.parseMapping(value.field).getMapping(ConfigClassNames.configValueMapper); var constructorParam = constructorParams.get(name); if (constructorParam != null) { if (mapping == null) { - mapping = CommonUtils.parseMapping(constructorParam).getMapping(ConfigClassNames.configValueExtractor); + mapping = CommonUtils.parseMapping(constructorParam).getMapping(ConfigClassNames.configValueMapper); } isNullable = CommonUtils.isNullable(constructorParam) && !fieldType.getKind().isPrimitive(); ; diff --git a/config/config-annotation-processor/src/main/java/io/koraframework/config/annotation/processor/extension/ConfigKoraExtension.java b/config/config-annotation-processor/src/main/java/io/koraframework/config/annotation/processor/extension/ConfigKoraExtension.java index a69abfd68..7c185eca1 100644 --- a/config/config-annotation-processor/src/main/java/io/koraframework/config/annotation/processor/extension/ConfigKoraExtension.java +++ b/config/config-annotation-processor/src/main/java/io/koraframework/config/annotation/processor/extension/ConfigKoraExtension.java @@ -18,19 +18,19 @@ public final class ConfigKoraExtension implements KoraExtension { private final Elements elements; private final Types types; - private final TypeMirror configValueExtractorTypeErasure; + private final TypeMirror configValueMapperTypeErasure; public ConfigKoraExtension(ProcessingEnvironment processingEnv) { this.elements = processingEnv.getElementUtils(); this.types = processingEnv.getTypeUtils(); - this.configValueExtractorTypeErasure = types.erasure(elements.getTypeElement(ConfigClassNames.configValueExtractor.canonicalName()).asType()); + this.configValueMapperTypeErasure = types.erasure(elements.getTypeElement(ConfigClassNames.configValueMapper.canonicalName()).asType()); } @Override @Nullable public KoraExtensionDependencyGenerator getDependencyGenerator(RoundEnvironment roundEnvironment, TypeMirror typeMirror, String tag) { if (tag != null) return null; - if (!types.isSameType(types.erasure(typeMirror), configValueExtractorTypeErasure)) { + if (!types.isSameType(types.erasure(typeMirror), configValueMapperTypeErasure)) { return null; } @@ -39,8 +39,8 @@ public KoraExtensionDependencyGenerator getDependencyGenerator(RoundEnvironment return null; } var element = ((TypeElement) types.asElement(paramType)); - var mapperName = NameUtils.generatedType(element, ConfigClassNames.configValueExtractor); - if (AnnotationUtils.isAnnotationPresent(element, ConfigClassNames.configValueExtractorAnnotation) || AnnotationUtils.isAnnotationPresent(element, ConfigClassNames.configSourceAnnotation)) { + var mapperName = NameUtils.generatedType(element, ConfigClassNames.configValueMapper); + if (AnnotationUtils.isAnnotationPresent(element, ConfigClassNames.configValueMapperAnnotation) || AnnotationUtils.isAnnotationPresent(element, ConfigClassNames.configSourceAnnotation)) { return KoraExtensionDependencyGenerator.generatedFromWithName(this.elements, element, mapperName); } return null; diff --git a/config/config-annotation-processor/src/main/java/io/koraframework/config/annotation/processor/processor/ConfigParserAnnotationProcessor.java b/config/config-annotation-processor/src/main/java/io/koraframework/config/annotation/processor/processor/ConfigParserAnnotationProcessor.java index bc4932ec6..b2f1549a8 100644 --- a/config/config-annotation-processor/src/main/java/io/koraframework/config/annotation/processor/processor/ConfigParserAnnotationProcessor.java +++ b/config/config-annotation-processor/src/main/java/io/koraframework/config/annotation/processor/processor/ConfigParserAnnotationProcessor.java @@ -25,7 +25,7 @@ public class ConfigParserAnnotationProcessor extends AbstractKoraProcessor { @Override public Set getSupportedAnnotationClassNames() { - return Set.of(ConfigClassNames.configValueExtractorAnnotation, ConfigClassNames.configSourceAnnotation); + return Set.of(ConfigClassNames.configValueMapperAnnotation, ConfigClassNames.configSourceAnnotation); } @Override @@ -43,12 +43,12 @@ protected void process(Set annotations, RoundEnvironment var className = ClassName.get(te); elementsToProcess.put(className, te); } else { - processingEnv.getMessager().printMessage(Diagnostic.Kind.ERROR, "@" + ConfigClassNames.configValueExtractorAnnotation.simpleName() + " is applicable only to records, classes or interfaces"); + processingEnv.getMessager().printMessage(Diagnostic.Kind.ERROR, "@" + ConfigClassNames.configValueMapperAnnotation.simpleName() + " is applicable only to records, classes or interfaces"); } } } var elements = new ArrayList<>(elementsToProcess.values()); - LogUtils.logElementsFull(log, Level.DEBUG, "Generating ConfigValueExtractor for", elements); + LogUtils.logElementsFull(log, Level.DEBUG, "Generating ConfigValueMapper for", elements); for (var element : elements) { if (element.getKind() == ElementKind.INTERFACE) { var result = configParserGenerator.generateForInterface((DeclaredType) element.asType()); @@ -67,7 +67,7 @@ protected void process(Set annotations, RoundEnvironment } } } else { - processingEnv.getMessager().printMessage(Diagnostic.Kind.ERROR, "@" + ConfigClassNames.configValueExtractorAnnotation.simpleName() + " is applicable only to records, classes or interfaces"); + processingEnv.getMessager().printMessage(Diagnostic.Kind.ERROR, "@" + ConfigClassNames.configValueMapperAnnotation.simpleName() + " is applicable only to records, classes or interfaces"); } } } diff --git a/config/config-annotation-processor/src/main/java/io/koraframework/config/annotation/processor/processor/ConfigSourceAnnotationProcessor.java b/config/config-annotation-processor/src/main/java/io/koraframework/config/annotation/processor/processor/ConfigSourceAnnotationProcessor.java index bc2434dfd..eb233b3ef 100644 --- a/config/config-annotation-processor/src/main/java/io/koraframework/config/annotation/processor/processor/ConfigSourceAnnotationProcessor.java +++ b/config/config-annotation-processor/src/main/java/io/koraframework/config/annotation/processor/processor/ConfigSourceAnnotationProcessor.java @@ -44,8 +44,8 @@ protected void process(Set annotations, RoundEnvironment .returns(TypeName.get(config.asType())) .addModifiers(Modifier.PUBLIC, Modifier.DEFAULT) .addParameter(ConfigClassNames.config, "config") - .addParameter(ParameterizedTypeName.get(ConfigClassNames.configValueExtractor, TypeName.get(config.asType())), "extractor") - .addStatement("return extractor.extractOrThrow(config.get($S))", path); + .addParameter(ParameterizedTypeName.get(ConfigClassNames.configValueMapper, TypeName.get(config.asType())), "mapper") + .addStatement("return mapper.mapOrThrow(config.get($S))", path); var type = typeBuilder.addMethod(method.build()) .addAnnotation(CommonClassNames.module) diff --git a/config/config-annotation-processor/src/test/java/io/koraframework/config/annotation/processor/AbstractConfigTest.java b/config/config-annotation-processor/src/test/java/io/koraframework/config/annotation/processor/AbstractConfigTest.java index 2475d21bb..e3ee2f7c3 100644 --- a/config/config-annotation-processor/src/test/java/io/koraframework/config/annotation/processor/AbstractConfigTest.java +++ b/config/config-annotation-processor/src/test/java/io/koraframework/config/annotation/processor/AbstractConfigTest.java @@ -3,7 +3,7 @@ import io.koraframework.annotation.processor.common.AbstractAnnotationProcessorTest; import io.koraframework.config.annotation.processor.processor.ConfigParserAnnotationProcessor; import io.koraframework.config.annotation.processor.processor.ConfigSourceAnnotationProcessor; -import io.koraframework.config.common.extractor.ConfigValueExtractor; +import io.koraframework.config.common.mapper.ConfigValueMapper; import org.intellij.lang.annotations.Language; import java.lang.reflect.InvocationTargetException; @@ -18,7 +18,7 @@ protected String commonImports() { """; } - protected ConfigValueExtractor compileConfig(List arguments, @Language("java") String... sources) { + protected ConfigValueMapper compileConfig(List arguments, @Language("java") String... sources) { super.compile(List.of(new ConfigParserAnnotationProcessor(), new ConfigSourceAnnotationProcessor()), sources); this.compileResult.assertSuccess(); var args = arguments @@ -28,7 +28,7 @@ protected ConfigValueExtractor compileConfig(List arguments, @Languag try { @SuppressWarnings("unchecked") - var result = (ConfigValueExtractor) this.compileResult.loadClass("$TestConfig_ConfigValueExtractor") + var result = (ConfigValueMapper) this.compileResult.loadClass("$TestConfig_ConfigValueMapper") .getConstructors()[0] .newInstance(args); return result; diff --git a/config/config-annotation-processor/src/test/java/io/koraframework/config/annotation/processor/AnnotationConfigTest.java b/config/config-annotation-processor/src/test/java/io/koraframework/config/annotation/processor/AnnotationConfigTest.java index 372bb2e7d..eca5f3a6c 100644 --- a/config/config-annotation-processor/src/test/java/io/koraframework/config/annotation/processor/AnnotationConfigTest.java +++ b/config/config-annotation-processor/src/test/java/io/koraframework/config/annotation/processor/AnnotationConfigTest.java @@ -1,9 +1,9 @@ package io.koraframework.config.annotation.processor; import io.koraframework.config.common.ConfigValue; -import io.koraframework.config.common.extractor.ConfigValueExtractionException; -import io.koraframework.config.common.extractor.ConfigValueExtractor; -import io.koraframework.config.common.factory.MapConfigFactory; +import io.koraframework.config.common.exception.ConfigValueException; +import io.koraframework.config.common.mapper.ConfigValueMapper; +import io.koraframework.config.common.util.ConfigMappingUtils; import org.junit.jupiter.api.Test; import org.mockito.Mockito; @@ -21,153 +21,153 @@ public class AnnotationConfigTest extends AbstractConfigTest { @Test public void testIntSupported() { - var extractor = this.compileConfig(List.of(), """ - @io.koraframework.config.common.annotation.ConfigValueExtractor + var mapper = this.compileConfig(List.of(), """ + @ConfigMapper public interface TestConfig { int value(); } """); - assertThat(extractor.extract(MapConfigFactory.fromMap(Map.of("value", 42)).root())) - .isEqualTo(newObject("$TestConfig_ConfigValueExtractor$TestConfig_Impl", 42)); + assertThat(mapper.map(ConfigMappingUtils.fromMap(Map.of("value", 42)).root())) + .isEqualTo(newObject("$TestConfig_ConfigValueMapper$TestConfig_Impl", 42)); } @Test public void testIntArraySupported() { - var mapper = Mockito.mock(ConfigValueExtractor.class); - when(mapper.extract(any())).thenReturn((Object) new int[] {42}); + var mockMapper = Mockito.mock(ConfigValueMapper.class); + when(mockMapper.map(any())).thenReturn((Object) new int[] {42}); - var extractor = this.compileConfig(List.of(mapper), """ - @io.koraframework.config.common.annotation.ConfigValueExtractor + var mapper = this.compileConfig(List.of(mockMapper), """ + @ConfigMapper public interface TestConfig { int[] value(); } """); - assertThat(extractor.extract(MapConfigFactory.fromMap(Map.of("value", List.of(42))).root())) - .isEqualTo(newObject("$TestConfig_ConfigValueExtractor$TestConfig_Impl", (Object) new int[] {42})); + assertThat(mapper.map(ConfigMappingUtils.fromMap(Map.of("value", List.of(42))).root())) + .isEqualTo(newObject("$TestConfig_ConfigValueMapper$TestConfig_Impl", (Object) new int[] {42})); - verify(mapper).extract(any()); + verify(mockMapper).map(any()); } @Test public void testIntArrayNullableSupported() { - var mapper = Mockito.mock(ConfigValueExtractor.class); - when(mapper.extract(any())).thenReturn((Object) new int[] {42}); + var mockMapper = Mockito.mock(ConfigValueMapper.class); + when(mockMapper.map(any())).thenReturn((Object) new int[] {42}); - var extractor = this.compileConfig(List.of(mapper), """ - @io.koraframework.config.common.annotation.ConfigValueExtractor + var mapper = this.compileConfig(List.of(mockMapper), """ + @ConfigMapper public interface TestConfig { @Nullable int[] value(); } """); - assertThat(extractor.extract(MapConfigFactory.fromMap(Map.of("value", List.of(42))).root())) - .isEqualTo(newObject("$TestConfig_ConfigValueExtractor$TestConfig_Impl", (Object) new int[] {42})); + assertThat(mapper.map(ConfigMappingUtils.fromMap(Map.of("value", List.of(42))).root())) + .isEqualTo(newObject("$TestConfig_ConfigValueMapper$TestConfig_Impl", (Object) new int[] {42})); - verify(mapper).extract(any()); + verify(mockMapper).map(any()); } @Test public void testIntegerSupported() { - var extractor = this.compileConfig(List.of(), """ - @io.koraframework.config.common.annotation.ConfigValueExtractor + var mapper = this.compileConfig(List.of(), """ + @ConfigMapper public interface TestConfig { @Nullable Integer value(); } """); - assertThat(extractor.extract(MapConfigFactory.fromMap(Map.of("value", 42)).root())) - .isEqualTo(newObject("$TestConfig_ConfigValueExtractor$TestConfig_Impl", 42)); - assertThat(extractor.extract(MapConfigFactory.fromMap(Map.of()).root())) - .isEqualTo(newObject("$TestConfig_ConfigValueExtractor$TestConfig_Impl", new Object[]{null})); + assertThat(mapper.map(ConfigMappingUtils.fromMap(Map.of("value", 42)).root())) + .isEqualTo(newObject("$TestConfig_ConfigValueMapper$TestConfig_Impl", 42)); + assertThat(mapper.map(ConfigMappingUtils.fromMap(Map.of()).root())) + .isEqualTo(newObject("$TestConfig_ConfigValueMapper$TestConfig_Impl", new Object[]{null})); } @Test public void testStringSupported() { - var extractor = this.compileConfig(List.of(), """ - @io.koraframework.config.common.annotation.ConfigValueExtractor + var mapper = this.compileConfig(List.of(), """ + @ConfigMapper public interface TestConfig { String value(); } """); - assertThat(extractor.extract(MapConfigFactory.fromMap(Map.of("value", "test")).root())) - .isEqualTo(newObject("$TestConfig_ConfigValueExtractor$TestConfig_Impl", "test")); - assertThatThrownBy(() -> extractor.extract(MapConfigFactory.fromMap(Map.of()).root())) - .isInstanceOf(ConfigValueExtractionException.class) + assertThat(mapper.map(ConfigMappingUtils.fromMap(Map.of("value", "test")).root())) + .isEqualTo(newObject("$TestConfig_ConfigValueMapper$TestConfig_Impl", "test")); + assertThatThrownBy(() -> mapper.map(ConfigMappingUtils.fromMap(Map.of()).root())) + .isInstanceOf(ConfigValueException.class) .hasMessageStartingWith("Config expected value, but got null at path: 'ROOT.value' for origin"); } @Test public void testLongSupported() { - var extractor = this.compileConfig(List.of(), """ - @io.koraframework.config.common.annotation.ConfigValueExtractor + var mapper = this.compileConfig(List.of(), """ + @ConfigMapper public interface TestConfig { Long value(); } """); - assertThat(extractor.extract(MapConfigFactory.fromMap(Map.of("value", 42L)).root())) - .isEqualTo(newObject("$TestConfig_ConfigValueExtractor$TestConfig_Impl", 42L)); - assertThatThrownBy(() -> extractor.extract(MapConfigFactory.fromMap(Map.of()).root())) - .isInstanceOf(ConfigValueExtractionException.class) + assertThat(mapper.map(ConfigMappingUtils.fromMap(Map.of("value", 42L)).root())) + .isEqualTo(newObject("$TestConfig_ConfigValueMapper$TestConfig_Impl", 42L)); + assertThatThrownBy(() -> mapper.map(ConfigMappingUtils.fromMap(Map.of()).root())) + .isInstanceOf(ConfigValueException.class) .hasMessageStartingWith("Config expected value, but got null at path: 'ROOT.value' for origin"); } @Test public void testBooleanSupported() { - var extractor = this.compileConfig(List.of(), """ - @io.koraframework.config.common.annotation.ConfigValueExtractor + var mapper = this.compileConfig(List.of(), """ + @ConfigMapper public interface TestConfig { Boolean value(); } """); - assertThat(extractor.extract(MapConfigFactory.fromMap(Map.of("value", true)).root())) - .isEqualTo(newObject("$TestConfig_ConfigValueExtractor$TestConfig_Impl", true)); - assertThatThrownBy(() -> extractor.extract(MapConfigFactory.fromMap(Map.of()).root())) - .isInstanceOf(ConfigValueExtractionException.class) + assertThat(mapper.map(ConfigMappingUtils.fromMap(Map.of("value", true)).root())) + .isEqualTo(newObject("$TestConfig_ConfigValueMapper$TestConfig_Impl", true)); + assertThatThrownBy(() -> mapper.map(ConfigMappingUtils.fromMap(Map.of()).root())) + .isInstanceOf(ConfigValueException.class) .hasMessageStartingWith("Config expected value, but got null at path: 'ROOT.value' for origin"); } @Test public void testDoubleSupported() { - var extractor = this.compileConfig(List.of(), """ - @io.koraframework.config.common.annotation.ConfigValueExtractor + var mapper = this.compileConfig(List.of(), """ + @ConfigMapper public interface TestConfig { Double value(); } """); - assertThat(extractor.extract(MapConfigFactory.fromMap(Map.of("value", 42.5)).root())) - .isEqualTo(newObject("$TestConfig_ConfigValueExtractor$TestConfig_Impl", 42.5)); - assertThatThrownBy(() -> extractor.extract(MapConfigFactory.fromMap(Map.of()).root())) - .isInstanceOf(ConfigValueExtractionException.class) + assertThat(mapper.map(ConfigMappingUtils.fromMap(Map.of("value", 42.5)).root())) + .isEqualTo(newObject("$TestConfig_ConfigValueMapper$TestConfig_Impl", 42.5)); + assertThatThrownBy(() -> mapper.map(ConfigMappingUtils.fromMap(Map.of()).root())) + .isInstanceOf(ConfigValueException.class) .hasMessageStartingWith("Config expected value, but got null at path: 'ROOT.value' for origin"); } @Test public void testDefaultValues() { - var extractor = this.compileConfig(List.of(), """ - @io.koraframework.config.common.annotation.ConfigValueExtractor + var mapper = this.compileConfig(List.of(), """ + @ConfigMapper public interface TestConfig { default String value() { return "default-value"; } } """); - assertThat(extractor.extract(MapConfigFactory.fromMap(Map.of("value", "test")).root())) - .isEqualTo(newObject("$TestConfig_ConfigValueExtractor$TestConfig_Impl", "test")); - assertThat(extractor.extract(MapConfigFactory.fromMap(Map.of()).root())) - .isEqualTo(newObject("$TestConfig_ConfigValueExtractor$TestConfig_Impl", "default-value")); + assertThat(mapper.map(ConfigMappingUtils.fromMap(Map.of("value", "test")).root())) + .isEqualTo(newObject("$TestConfig_ConfigValueMapper$TestConfig_Impl", "test")); + assertThat(mapper.map(ConfigMappingUtils.fromMap(Map.of()).root())) + .isEqualTo(newObject("$TestConfig_ConfigValueMapper$TestConfig_Impl", "default-value")); } @Test public void testDefaultAndNullable() { - var extractor = this.compileConfig(List.of(), """ - @io.koraframework.config.common.annotation.ConfigValueExtractor + var mapper = this.compileConfig(List.of(), """ + @ConfigMapper public interface TestConfig { default String value1() { return "default-value"; } @@ -176,24 +176,24 @@ public interface TestConfig { } """); - assertThat(extractor.extract(MapConfigFactory.fromMap(Map.of("value1", "test")).root())) - .isEqualTo(newObject("$TestConfig_ConfigValueExtractor$TestConfig_Impl", "test", null)); - assertThat(extractor.extract(MapConfigFactory.fromMap(Map.of()).root())) - .isEqualTo(newObject("$TestConfig_ConfigValueExtractor$TestConfig_Impl", "default-value", null)); + assertThat(mapper.map(ConfigMappingUtils.fromMap(Map.of("value1", "test")).root())) + .isEqualTo(newObject("$TestConfig_ConfigValueMapper$TestConfig_Impl", "test", null)); + assertThat(mapper.map(ConfigMappingUtils.fromMap(Map.of()).root())) + .isEqualTo(newObject("$TestConfig_ConfigValueMapper$TestConfig_Impl", "default-value", null)); } @Test public void testInterfaceWithUnknownType() { - var mapper = Mockito.mock(ConfigValueExtractor.class); - when(mapper.extract(any())).thenAnswer(invocation -> { + var mockMapper = Mockito.mock(ConfigValueMapper.class); + when(mockMapper.map(any())).thenAnswer(invocation -> { if (invocation.getArguments()[0] instanceof ConfigValue.NullValue) { throw new IllegalArgumentException(); } return Duration.ofDays(3000); }); - var extractor = this.compileConfig(List.of(mapper), """ - @io.koraframework.config.common.annotation.ConfigValueExtractor + var mapper = this.compileConfig(List.of(mockMapper), """ + @ConfigMapper public interface TestConfig { java.time.Duration value(); @@ -201,16 +201,16 @@ public interface TestConfig { } """); - assertThat(extractor.extract(MapConfigFactory.fromMap(Map.of("value", "test")).root())) - .isEqualTo(newObject("$TestConfig_ConfigValueExtractor$TestConfig_Impl", Duration.ofDays(3000), null)); + assertThat(mapper.map(ConfigMappingUtils.fromMap(Map.of("value", "test")).root())) + .isEqualTo(newObject("$TestConfig_ConfigValueMapper$TestConfig_Impl", Duration.ofDays(3000), null)); - verify(mapper).extract(any()); + verify(mockMapper).map(any()); } @Test public void testInterfaceWithUnknownTypeAndMapping() { - var extractor = this.compileConfig(List.of(newGeneratedObject("TestExtractor")), """ - @io.koraframework.config.common.annotation.ConfigValueExtractor + var mapper = this.compileConfig(List.of(newGeneratedObject("TestExtractor")), """ + @ConfigMapper public interface TestConfig { @Mapping(TestExtractor.class) @Tag(TestExtractor.class) @@ -220,31 +220,31 @@ public interface TestConfig { java.time.@Nullable Duration value2(); } """, """ - import io.koraframework.config.common.extractor.ConfigValueExtractor;import io.koraframework.config.common.ConfigValue; + import io.koraframework.config.common.mapper.ConfigValueMapper;import io.koraframework.config.common.ConfigValue; - public class TestExtractor implements ConfigValueExtractor { - public java.time.Duration extract(ConfigValue value) { + public class TestExtractor implements ConfigValueMapper { + public java.time.Duration map(ConfigValue value) { return value instanceof ConfigValue.NullValue ? null : java.time.Duration.ofDays(3000); } } """, """ - import io.koraframework.config.common.extractor.ConfigValueExtractor;import io.koraframework.config.common.ConfigValue; + import io.koraframework.config.common.mapper.ConfigValueMapper;import io.koraframework.config.common.ConfigValue; - public final class TestFinalExtractor implements ConfigValueExtractor { - public java.time.Duration extract(ConfigValue value) { + public final class TestFinalExtractor implements ConfigValueMapper { + public java.time.Duration map(ConfigValue value) { return value instanceof ConfigValue.NullValue ? null : java.time.Duration.ofDays(3000); } } """); - assertThat(extractor.extract(MapConfigFactory.fromMap(Map.of("value1", "test")).root())) - .isEqualTo(newObject("$TestConfig_ConfigValueExtractor$TestConfig_Impl", Duration.ofDays(3000), null)); + assertThat(mapper.map(ConfigMappingUtils.fromMap(Map.of("value1", "test")).root())) + .isEqualTo(newObject("$TestConfig_ConfigValueMapper$TestConfig_Impl", Duration.ofDays(3000), null)); } @Test public void testInterfaceWithSuper() { - var extractor = this.compileConfig(List.of(), """ - @io.koraframework.config.common.annotation.ConfigValueExtractor + var mapper = this.compileConfig(List.of(), """ + @ConfigMapper public interface TestConfig extends SuperTestConfig{ String value1(); } @@ -256,14 +256,14 @@ public interface SuperTestConfig { } """); - assertThat(extractor.extract(MapConfigFactory.fromMap(Map.of("value1", "test1", "value2", "test2", "value3", "test3")).root())) - .isEqualTo(newObject("$TestConfig_ConfigValueExtractor$TestConfig_Impl", "test1", "test2", "test3")); + assertThat(mapper.map(ConfigMappingUtils.fromMap(Map.of("value1", "test1", "value2", "test2", "value3", "test3")).root())) + .isEqualTo(newObject("$TestConfig_ConfigValueMapper$TestConfig_Impl", "test1", "test2", "test3")); } @Test public void testInterfaceNoFieldsWithSuper() { - var extractor = this.compileConfig(List.of(), """ - @io.koraframework.config.common.annotation.ConfigValueExtractor + var mapper = this.compileConfig(List.of(), """ + @ConfigMapper public interface TestConfig extends SuperTestConfig{ } """, """ @@ -274,74 +274,74 @@ public interface SuperTestConfig { } """); - assertThat(extractor.extract(MapConfigFactory.fromMap(Map.of("value2", "test2", "value3", "test3")).root())) - .isEqualTo(newObject("$TestConfig_ConfigValueExtractor$TestConfig_Impl", "test2", "test3")); + assertThat(mapper.map(ConfigMappingUtils.fromMap(Map.of("value2", "test2", "value3", "test3")).root())) + .isEqualTo(newObject("$TestConfig_ConfigValueMapper$TestConfig_Impl", "test2", "test3")); } @Test public void testInterfaceWithArray() { - var mapper = Mockito.mock(ConfigValueExtractor.class); - when(mapper.extract(any())).thenAnswer(invocation -> new int[]{1, 2, 3}); + var mockMapper = Mockito.mock(ConfigValueMapper.class); + when(mockMapper.map(any())).thenAnswer(invocation -> new int[]{1, 2, 3}); - var extractor = this.compileConfig(List.of(mapper), """ - @io.koraframework.config.common.annotation.ConfigValueExtractor + var mapper = this.compileConfig(List.of(mockMapper), """ + @ConfigMapper public interface TestConfig { int[] value(); } """); - assertThat(extractor.extract(MapConfigFactory.fromMap(Map.of("value1", "test")).root())) - .isEqualTo(newObject("$TestConfig_ConfigValueExtractor$TestConfig_Impl", (Object) new int[]{1, 2, 3})); + assertThat(mapper.map(ConfigMappingUtils.fromMap(Map.of("value1", "test")).root())) + .isEqualTo(newObject("$TestConfig_ConfigValueMapper$TestConfig_Impl", (Object) new int[]{1, 2, 3})); - verify(mapper).extract(any()); + verify(mockMapper).map(any()); } @Test public void testRecord() { - var extractor = this.compileConfig(List.of(), """ - @io.koraframework.config.common.annotation.ConfigValueExtractor + var mapper = this.compileConfig(List.of(), """ + @ConfigMapper public record TestConfig(String value) { } """); - assertThat(extractor.extract(MapConfigFactory.fromMap(Map.of("value", "test")).root())) + assertThat(mapper.map(ConfigMappingUtils.fromMap(Map.of("value", "test")).root())) .isEqualTo(newObject("TestConfig", "test")); } @Test public void testRecordAllNullable() { - var extractor = this.compileConfig(List.of(), """ - @io.koraframework.config.common.annotation.ConfigValueExtractor + var mapper = this.compileConfig(List.of(), """ + @ConfigMapper public record TestConfig(@Nullable String value) { } """); - assertThat(extractor.extract(MapConfigFactory.fromMap(Map.of("value", "test")).root())) + assertThat(mapper.map(ConfigMappingUtils.fromMap(Map.of("value", "test")).root())) .isEqualTo(newObject("TestConfig", "test")); } @Test public void testRecordWithUnknownType() { - var mapper = Mockito.mock(ConfigValueExtractor.class); - when(mapper.extract(any())).thenReturn(Duration.ofDays(3000)); + var mockMapper = Mockito.mock(ConfigValueMapper.class); + when(mockMapper.map(any())).thenReturn(Duration.ofDays(3000)); - var extractor = this.compileConfig(List.of(mapper), """ - @io.koraframework.config.common.annotation.ConfigValueExtractor + var mapper = this.compileConfig(List.of(mockMapper), """ + @ConfigMapper public record TestConfig ( java.time.Duration value ){} """); - assertThat(extractor.extract(MapConfigFactory.fromMap(Map.of("value1", "test")).root())) + assertThat(mapper.map(ConfigMappingUtils.fromMap(Map.of("value1", "test")).root())) .isEqualTo(newObject("TestConfig", Duration.ofDays(3000))); - verify(mapper).extract(any()); + verify(mockMapper).map(any()); } @Test public void testPojo() { - var extractor = this.compileConfig(List.of(), """ - @io.koraframework.config.common.annotation.ConfigValueExtractor + var mapper = this.compileConfig(List.of(), """ + @ConfigMapper public class TestConfig { private String value; @@ -370,14 +370,14 @@ public String toString() { var expected = newObject("TestConfig"); invoke(expected, "setValue", "test"); - assertThat(extractor.extract(MapConfigFactory.fromMap(Map.of("value", "test")).root())) + assertThat(mapper.map(ConfigMappingUtils.fromMap(Map.of("value", "test")).root())) .isEqualTo(expected); } @Test public void testPojoWithDefault() { - var extractor = this.compileConfig(List.of(), """ - @io.koraframework.config.common.annotation.ConfigValueExtractor + var mapper = this.compileConfig(List.of(), """ + @ConfigMapper public class TestConfig { private String value = "default-value"; @@ -401,18 +401,18 @@ public boolean equals(Object obj) { var expected = newObject("TestConfig"); invoke(expected, "setValue", "test"); - assertThat(extractor.extract(MapConfigFactory.fromMap(Map.of("value", "test")).root())) + assertThat(mapper.map(ConfigMappingUtils.fromMap(Map.of("value", "test")).root())) .isEqualTo(expected); invoke(expected, "setValue", "default-value"); - assertThat(extractor.extract(MapConfigFactory.fromMap(Map.of()).root())) + assertThat(mapper.map(ConfigMappingUtils.fromMap(Map.of()).root())) .isEqualTo(expected); } @Test public void testPojoWithConstructor() { - var extractor = this.compileConfig(List.of(), """ - @io.koraframework.config.common.annotation.ConfigValueExtractor + var mapper = this.compileConfig(List.of(), """ + @ConfigMapper public class TestConfig { @Nullable private final String value1; @@ -447,14 +447,14 @@ public String toString() { var expected = newObject("TestConfig", "test", null); - assertThat(extractor.extract(MapConfigFactory.fromMap(Map.of("value1", "test")).root())) + assertThat(mapper.map(ConfigMappingUtils.fromMap(Map.of("value1", "test")).root())) .isEqualTo(expected); } @Test public void testPojoWithFluent() { - var extractor = this.compileConfig(List.of(), """ - @io.koraframework.config.common.annotation.ConfigValueExtractor + var mapper = this.compileConfig(List.of(), """ + @ConfigMapper public class TestConfig { @Nullable private final String value1; @@ -489,10 +489,10 @@ public String toString() { var expected = newObject("TestConfig", "test", null); - assertThat(extractor.extract(MapConfigFactory.fromMap(Map.of("value1", "test")).root())) + assertThat(mapper.map(ConfigMappingUtils.fromMap(Map.of("value1", "test")).root())) .isEqualTo(expected); - assertThatThrownBy(() -> extractor.extract(MapConfigFactory.fromMap(Map.of("value2", "test")).root())); + assertThatThrownBy(() -> mapper.map(ConfigMappingUtils.fromMap(Map.of("value2", "test")).root())); } } diff --git a/config/config-annotation-processor/src/test/java/io/koraframework/config/annotation/processor/ConfigSourceAnnotationTest.java b/config/config-annotation-processor/src/test/java/io/koraframework/config/annotation/processor/ConfigSourceAnnotationTest.java index 9194dca2f..7e6753d22 100644 --- a/config/config-annotation-processor/src/test/java/io/koraframework/config/annotation/processor/ConfigSourceAnnotationTest.java +++ b/config/config-annotation-processor/src/test/java/io/koraframework/config/annotation/processor/ConfigSourceAnnotationTest.java @@ -1,9 +1,9 @@ package io.koraframework.config.annotation.processor; +import io.koraframework.config.common.mapper.ConfigValueMapper; import org.junit.jupiter.api.Test; import io.koraframework.config.common.Config; -import io.koraframework.config.common.extractor.ConfigValueExtractor; -import io.koraframework.config.common.factory.MapConfigFactory; +import io.koraframework.config.common.util.ConfigMappingUtils; import java.util.List; import java.util.Map; @@ -14,15 +14,15 @@ public class ConfigSourceAnnotationTest extends AbstractConfigTest { @Test public void testConfigSourceGeneratesConfigExtractor() { - var extractor = this.compileConfig(List.of(), """ + var mapper = this.compileConfig(List.of(), """ @io.koraframework.config.common.annotation.ConfigSource("test.path") public interface TestConfig { int value(); } """); - assertThat(extractor.extract(MapConfigFactory.fromMap(Map.of("value", 42)).root())) - .isEqualTo(newObject("$TestConfig_ConfigValueExtractor$TestConfig_Impl", 42)); + assertThat(mapper.map(ConfigMappingUtils.fromMap(Map.of("value", 42)).root())) + .isEqualTo(newObject("$TestConfig_ConfigValueMapper$TestConfig_Impl", 42)); } @Test @@ -40,7 +40,7 @@ public interface TestConfig { .isInterface() .hasMethods("testConfig"); - var method = moduleClass.getMethod("testConfig", Config.class, ConfigValueExtractor.class); + var method = moduleClass.getMethod("testConfig", Config.class, ConfigValueMapper.class); assertThat(method).isNotNull(); assertThat(method.getReturnType()).isEqualTo(this.compileResult.loadClass("TestConfig")); assertThat(method.isDefault()).isTrue(); diff --git a/config/config-annotation-processor/src/test/java/io/koraframework/config/annotation/processor/ConfigExtractorGeneratorExtensionTest.java b/config/config-annotation-processor/src/test/java/io/koraframework/config/annotation/processor/ConfigValueMapperGeneratorExtensionTest.java similarity index 83% rename from config/config-annotation-processor/src/test/java/io/koraframework/config/annotation/processor/ConfigExtractorGeneratorExtensionTest.java rename to config/config-annotation-processor/src/test/java/io/koraframework/config/annotation/processor/ConfigValueMapperGeneratorExtensionTest.java index 9936d2d23..7d66232ed 100644 --- a/config/config-annotation-processor/src/test/java/io/koraframework/config/annotation/processor/ConfigExtractorGeneratorExtensionTest.java +++ b/config/config-annotation-processor/src/test/java/io/koraframework/config/annotation/processor/ConfigValueMapperGeneratorExtensionTest.java @@ -10,17 +10,17 @@ import static org.assertj.core.api.Assertions.assertThat; -class ConfigExtractorGeneratorExtensionTest extends AbstractAnnotationProcessorTest { +class ConfigValueMapperGeneratorExtensionTest extends AbstractAnnotationProcessorTest { @Test public void testExtensionAnnotatedRecord() throws Exception { compile(List.of(new KoraAppProcessor(), new ConfigParserAnnotationProcessor()), """ @KoraApp public interface TestApp { @Root - default String root(io.koraframework.config.common.extractor.ConfigValueExtractor extractor) { return ""; } + default String root(io.koraframework.config.common.mapper.ConfigValueMapper mapper) { return ""; } } """, """ - @io.koraframework.config.common.annotation.ConfigValueExtractor + @io.koraframework.config.common.annotation.ConfigMapper public record TestConfig(String value){} """); compileResult.assertSuccess(); @@ -35,10 +35,10 @@ public void testExtensionAnnotatedInterface() throws Exception { @KoraApp public interface TestApp { @Root - default String root(io.koraframework.config.common.extractor.ConfigValueExtractor extractor) { return ""; } + default String root(io.koraframework.config.common.mapper.ConfigValueMapper mapper) { return ""; } } """, """ - @io.koraframework.config.common.annotation.ConfigValueExtractor + @io.koraframework.config.common.annotation.ConfigMapper public interface TestConfig { String value(); } @@ -55,10 +55,10 @@ public void testExtensionAnnotatedPojo() throws Exception { @KoraApp public interface TestApp { @Root - default String root(io.koraframework.config.common.extractor.ConfigValueExtractor extractor) { return ""; } + default String root(io.koraframework.config.common.mapper.ConfigValueMapper mapper) { return ""; } } """, """ - @io.koraframework.config.common.annotation.ConfigValueExtractor + @io.koraframework.config.common.annotation.ConfigMapper public class TestConfig { private String value; diff --git a/config/config-common/src/main/java/io/koraframework/config/common/Config.java b/config/config-common/src/main/java/io/koraframework/config/common/Config.java index d1c48adf8..0ca347f38 100644 --- a/config/config-common/src/main/java/io/koraframework/config/common/Config.java +++ b/config/config-common/src/main/java/io/koraframework/config/common/Config.java @@ -1,8 +1,8 @@ package io.koraframework.config.common; -import io.koraframework.config.common.impl.ConfigResolver; -import io.koraframework.config.common.impl.ConfigUtils; import io.koraframework.config.common.origin.ConfigOrigin; +import io.koraframework.config.common.util.ConfigResolverUtils; +import io.koraframework.config.common.util.ConfigValueExtractorUtils; /** * Русский: Базовое предоставления конфигурации в Kora. @@ -26,11 +26,11 @@ public interface Config { ConfigValue.ObjectValue root(); default Config resolve() { - return ConfigResolver.resolve(this); + return ConfigResolverUtils.resolve(this); } default ConfigValue get(ConfigValuePath path) { - return ConfigUtils.get(this, path); + return ConfigValueExtractorUtils.extract(this, path); } /** diff --git a/config/config-common/src/main/java/io/koraframework/config/common/CommonConfigModule.java b/config/config-common/src/main/java/io/koraframework/config/common/ConfigModule.java similarity index 54% rename from config/config-common/src/main/java/io/koraframework/config/common/CommonConfigModule.java rename to config/config-common/src/main/java/io/koraframework/config/common/ConfigModule.java index f7f3565ca..28d604252 100644 --- a/config/config-common/src/main/java/io/koraframework/config/common/CommonConfigModule.java +++ b/config/config-common/src/main/java/io/koraframework/config/common/ConfigModule.java @@ -5,32 +5,32 @@ import io.koraframework.common.annotation.DefaultComponent; import io.koraframework.common.annotation.Root; import io.koraframework.config.common.annotation.ApplicationConfig; -import io.koraframework.config.common.annotation.Environment; -import io.koraframework.config.common.annotation.SystemProperties; -import io.koraframework.config.common.extractor.ConfigValueExtractorModule; -import io.koraframework.config.common.factory.MapConfigFactory; -import io.koraframework.config.common.factory.MergeConfigFactory; +import io.koraframework.config.common.annotation.EnvironmentConfig; +import io.koraframework.config.common.annotation.SystemPropertiesConfig; +import io.koraframework.config.common.mapper.ConfigValueMapperModule; +import io.koraframework.config.common.util.ConfigMappingUtils; +import io.koraframework.config.common.util.ConfigMergingUtils; import io.koraframework.config.common.origin.ConfigOrigin; import io.koraframework.config.common.origin.EnvironmentOrigin; import io.koraframework.config.common.origin.SystemPropertiesOrigin; import org.jspecify.annotations.Nullable; -public interface CommonConfigModule extends ConfigValueExtractorModule { +public interface ConfigModule extends ConfigValueMapperModule { - @Environment + @EnvironmentConfig default Config environmentConfig() { - return MapConfigFactory.fromMap(new EnvironmentOrigin("Environment Variables"), System.getenv()); + return ConfigMappingUtils.fromMap(new EnvironmentOrigin("Environment Variables"), System.getenv()); } - @SystemProperties + @SystemPropertiesConfig default Config systemPropertiesConfig() { - return MapConfigFactory.fromProperties(new SystemPropertiesOrigin("System Properties"), System.getProperties()); + return ConfigMappingUtils.fromProperties(new SystemPropertiesOrigin("System Properties"), System.getProperties()); } - default Config config(@Environment Config environment, @SystemProperties Config systemProperties, @Nullable @ApplicationConfig Config applicationConfig) { - var config = MergeConfigFactory.merge(environment, systemProperties); + default Config config(@EnvironmentConfig Config environment, @SystemPropertiesConfig Config systemProperties, @Nullable @ApplicationConfig Config applicationConfig) { + var config = ConfigMergingUtils.merge(environment, systemProperties); if (applicationConfig != null) { - config = MergeConfigFactory.merge(config, applicationConfig); + config = ConfigMergingUtils.merge(config, applicationConfig); } return config.resolve(); } diff --git a/config/config-common/src/main/java/io/koraframework/config/common/ConfigValue.java b/config/config-common/src/main/java/io/koraframework/config/common/ConfigValue.java index e1ccc268b..e4e1f5580 100644 --- a/config/config-common/src/main/java/io/koraframework/config/common/ConfigValue.java +++ b/config/config-common/src/main/java/io/koraframework/config/common/ConfigValue.java @@ -1,7 +1,7 @@ package io.koraframework.config.common; +import io.koraframework.config.common.exception.ConfigValueException; import org.jspecify.annotations.Nullable; -import io.koraframework.config.common.extractor.ConfigValueExtractionException; import java.math.BigDecimal; import java.util.Iterator; @@ -23,15 +23,12 @@ sealed public interface ConfigValue { ConfigValueOrigin origin(); default String asString() { - if (this instanceof ConfigValue.StringValue str) { - return str.value(); - } else if (this instanceof ConfigValue.NumberValue number) { - return number.value().toString(); - } else if (this instanceof ConfigValue.BooleanValue booleanValue) { - return booleanValue.value() ? "true" : "false"; - } else { - throw ConfigValueExtractionException.unexpectedValueType(this, ConfigValue.StringValue.class); - } + return switch (this) { + case ConfigValue.StringValue str -> str.value(); + case ConfigValue.NumberValue number -> number.value().toString(); + case ConfigValue.BooleanValue booleanValue -> booleanValue.value() ? "true" : "false"; + default -> throw ConfigValueException.unexpectedValueType(this, StringValue.class); + }; } default Number asNumber() { @@ -39,12 +36,12 @@ default Number asNumber() { try { return new BigDecimal(str.value()); } catch (NumberFormatException e) { - throw ConfigValueExtractionException.parsingError(this, e); + throw ConfigValueException.parsingError(this, e); } } else if (this instanceof ConfigValue.NumberValue number) { return number.value(); } else { - throw ConfigValueExtractionException.unexpectedValueType(this, ConfigValue.NumberValue.class); + throw ConfigValueException.unexpectedValueType(this, ConfigValue.NumberValue.class); } } @@ -52,14 +49,14 @@ default ArrayValue asArray() { if (this instanceof ArrayValue arrayValue) { return arrayValue; } - throw ConfigValueExtractionException.unexpectedValueType(this, ConfigValue.ArrayValue.class); + throw ConfigValueException.unexpectedValueType(this, ConfigValue.ArrayValue.class); } default ObjectValue asObject() { if (this instanceof ObjectValue object) { return object; } - throw ConfigValueExtractionException.unexpectedValueType(this, ConfigValue.ObjectValue.class); + throw ConfigValueException.unexpectedValueType(this, ConfigValue.ObjectValue.class); } default boolean asBoolean() { @@ -69,7 +66,7 @@ default boolean asBoolean() { if (this instanceof BooleanValue bv) { return bv.value; } - throw ConfigValueExtractionException.unexpectedValueType(this, ConfigValue.BooleanValue.class); + throw ConfigValueException.unexpectedValueType(this, ConfigValue.BooleanValue.class); } default boolean isNull() { diff --git a/config/config-common/src/main/java/io/koraframework/config/common/ConfigValuePath.java b/config/config-common/src/main/java/io/koraframework/config/common/ConfigValuePath.java index 0664cce9d..82486fb18 100644 --- a/config/config-common/src/main/java/io/koraframework/config/common/ConfigValuePath.java +++ b/config/config-common/src/main/java/io/koraframework/config/common/ConfigValuePath.java @@ -6,6 +6,7 @@ import java.util.regex.Pattern; public interface ConfigValuePath { + ConfigValuePath ROOT = new SimpleConfigValuePath(null, null); PathElement last(); @@ -49,5 +50,4 @@ static ConfigValuePath parse(String reference) { } return path; } - } diff --git a/config/config-common/src/main/java/io/koraframework/config/common/ConfigWatcher.java b/config/config-common/src/main/java/io/koraframework/config/common/ConfigWatcher.java index 40a41909b..a9b6c0c6d 100644 --- a/config/config-common/src/main/java/io/koraframework/config/common/ConfigWatcher.java +++ b/config/config-common/src/main/java/io/koraframework/config/common/ConfigWatcher.java @@ -22,12 +22,13 @@ public class ConfigWatcher implements Lifecycle { - private static final Logger log = LoggerFactory.getLogger(ConfigWatcher.class); + private static final Logger logger = LoggerFactory.getLogger(ConfigWatcher.class); private final RefreshableGraph graph; private final @Nullable Node applicationConfigNode; private final AtomicBoolean isStarted = new AtomicBoolean(false); private final int checkTime; + private volatile Thread thread; public ConfigWatcher(RefreshableGraph graph, @Nullable Node applicationConfigNode, int checkTime) { @@ -80,7 +81,7 @@ record State(Path configPath, Instant lastModifiedTime) {} var lastModifiedTime = Files.getLastModifiedTime(configPath).toInstant(); return new State(configPath, lastModifiedTime); } catch (IOException e) { - log.warn("Can't locate config file or ", e); + logger.warn("Can't locate config file or ", e); return null; } }; @@ -100,7 +101,7 @@ record State(Path configPath, Instant lastModifiedTime) {} for (var origin : origins) { var currentState = state.get(origin.path()); if (currentState == null) { - log.debug("New config origin {} no more present in graph", origin); + logger.debug("New config origin {} no more present in graph", origin); changed = true; var originalState = stateExtractor.apply(origin.path()); newStates.put(origin.path(), originalState); @@ -112,12 +113,12 @@ record State(Path configPath, Instant lastModifiedTime) {} var newState = newStates.get(oldPath); if (newState == null) { changed = true; - log.debug("Config origin {} no more present in graph", entry.getKey()); + logger.debug("Config origin {} no more present in graph", entry.getKey()); } else if (!newState.configPath.equals(oldState.configPath)) { - log.debug("New config symlink target"); + logger.debug("New config symlink target"); changed = true; } else if (newState.lastModifiedTime.isAfter(oldState.lastModifiedTime)) { - log.debug("Config modified"); + logger.debug("Config modified"); changed = true; } } @@ -125,11 +126,11 @@ record State(Path configPath, Instant lastModifiedTime) {} if (changed) { try { this.graph.refresh(this.applicationConfigNode); - log.info("Config refreshed"); + logger.info("Config refreshed"); Thread.sleep(this.checkTime); } catch (InterruptedException ignore) { } catch (Exception e) { - log.warn("Error on checking config for changes", e); + logger.warn("Error on checking config for changes", e); try { Thread.sleep(this.checkTime); } catch (InterruptedException ignore) { @@ -147,7 +148,7 @@ record State(Path configPath, Instant lastModifiedTime) {} continue; } if (entry.getValue() == null) { - log.debug("New config symlink target"); + logger.debug("New config symlink target"); changed.put(entry.getKey(), newState); continue; } @@ -156,23 +157,23 @@ record State(Path configPath, Instant lastModifiedTime) {} var currentConfigPath = newState.configPath; var currentLastModifiedTime = newState.lastModifiedTime; if (!currentConfigPath.equals(configPath)) { - log.debug("New config symlink target"); + logger.debug("New config symlink target"); changed.put(entry.getKey(), newState); } else if (currentLastModifiedTime.isAfter(lastModifiedTime)) { - log.debug("Config modified"); + logger.debug("Config modified"); changed.put(entry.getKey(), newState); } } try { if (!changed.isEmpty()) { this.graph.refresh(this.applicationConfigNode); - log.info("Config refreshed"); + logger.info("Config refreshed"); state.putAll(changed); } Thread.sleep(this.checkTime); } catch (InterruptedException ignore) { } catch (Exception e) { - log.warn("Error on checking config for changes", e); + logger.warn("Error on checking config for changes", e); try { Thread.sleep(this.checkTime); } catch (InterruptedException ignore) { diff --git a/config/config-common/src/main/java/io/koraframework/config/common/PathElement.java b/config/config-common/src/main/java/io/koraframework/config/common/PathElement.java index e350004fb..a08123daa 100644 --- a/config/config-common/src/main/java/io/koraframework/config/common/PathElement.java +++ b/config/config-common/src/main/java/io/koraframework/config/common/PathElement.java @@ -5,6 +5,7 @@ import java.util.List; public sealed interface PathElement { + static PathElement.Index get(int index) { return new Index(index); } diff --git a/config/config-common/src/main/java/io/koraframework/config/common/annotation/ConfigValueExtractor.java b/config/config-common/src/main/java/io/koraframework/config/common/annotation/ConfigMapper.java similarity index 70% rename from config/config-common/src/main/java/io/koraframework/config/common/annotation/ConfigValueExtractor.java rename to config/config-common/src/main/java/io/koraframework/config/common/annotation/ConfigMapper.java index 6948ec379..a6af79f90 100644 --- a/config/config-common/src/main/java/io/koraframework/config/common/annotation/ConfigValueExtractor.java +++ b/config/config-common/src/main/java/io/koraframework/config/common/annotation/ConfigMapper.java @@ -6,7 +6,8 @@ import java.lang.annotation.Target; /** - * Русский: Аннотация для создания классов отображения конфигурации в рамках внешних библиотек. + * Русский: Аннотация для создания Extractor'ов отображения конфигурации без указанного пути. + * Можно использовать затем для создания Extractor для конфигураций в рамках внешних библиотек. * Впоследствии интерфейс может быть использован для внедрения как зависимость. *
* English: Annotation for creating configuration reflection classes within external libraries. @@ -16,7 +17,7 @@ * Пример / Example: *
  *  {@code
- * @ConfigValueExtractor
+ * @ConfigMapper
  * public interface MyConfig {
  *
  *     @Nullable
@@ -29,9 +30,9 @@
  *
  * public interface MyModule {
  *
- *     default MyConfig myConfig(Config config, ConfigValueExtractor ext) {
+ *     default MyConfig myConfig(Config config, ConfigValueMapper ext) {
  *         var value = config.get("path.to.config");
- *         return ext.extract(value);
+ *         return ext.map(value);
  *     }
  * }
  *  }
@@ -39,7 +40,7 @@
  */
 @Retention(RetentionPolicy.RUNTIME)
 @Target(ElementType.TYPE)
-public @interface ConfigValueExtractor {
+public @interface ConfigMapper {
 
     boolean mapNullAsEmptyObject() default true;
 }
diff --git a/config/config-common/src/main/java/io/koraframework/config/common/annotation/Environment.java b/config/config-common/src/main/java/io/koraframework/config/common/annotation/EnvironmentConfig.java
similarity index 85%
rename from config/config-common/src/main/java/io/koraframework/config/common/annotation/Environment.java
rename to config/config-common/src/main/java/io/koraframework/config/common/annotation/EnvironmentConfig.java
index ee935bfc1..754143aa5 100644
--- a/config/config-common/src/main/java/io/koraframework/config/common/annotation/Environment.java
+++ b/config/config-common/src/main/java/io/koraframework/config/common/annotation/EnvironmentConfig.java
@@ -7,5 +7,5 @@
  * 
* English: A special {@link Tag} tag that is used to enforce variable environment configuration. */ -@Tag(Environment.class) -public @interface Environment {} +@Tag(EnvironmentConfig.class) +public @interface EnvironmentConfig {} diff --git a/config/config-common/src/main/java/io/koraframework/config/common/annotation/SystemProperties.java b/config/config-common/src/main/java/io/koraframework/config/common/annotation/SystemPropertiesConfig.java similarity index 84% rename from config/config-common/src/main/java/io/koraframework/config/common/annotation/SystemProperties.java rename to config/config-common/src/main/java/io/koraframework/config/common/annotation/SystemPropertiesConfig.java index 594e99960..8af43d342 100644 --- a/config/config-common/src/main/java/io/koraframework/config/common/annotation/SystemProperties.java +++ b/config/config-common/src/main/java/io/koraframework/config/common/annotation/SystemPropertiesConfig.java @@ -7,5 +7,5 @@ *
* English: A special {@link Tag} that is used to enforce the configuration of system properties. */ -@Tag(SystemProperties.class) -public @interface SystemProperties {} +@Tag(SystemPropertiesConfig.class) +public @interface SystemPropertiesConfig {} diff --git a/config/config-common/src/main/java/io/koraframework/config/common/extractor/ConfigValueExtractionException.java b/config/config-common/src/main/java/io/koraframework/config/common/exception/ConfigValueException.java similarity index 59% rename from config/config-common/src/main/java/io/koraframework/config/common/extractor/ConfigValueExtractionException.java rename to config/config-common/src/main/java/io/koraframework/config/common/exception/ConfigValueException.java index 67076ddf0..c2a626a98 100644 --- a/config/config-common/src/main/java/io/koraframework/config/common/extractor/ConfigValueExtractionException.java +++ b/config/config-common/src/main/java/io/koraframework/config/common/exception/ConfigValueException.java @@ -1,19 +1,20 @@ -package io.koraframework.config.common.extractor; +package io.koraframework.config.common.exception; import io.koraframework.config.common.ConfigValue; import io.koraframework.config.common.origin.ConfigOrigin; import java.util.function.Function; -public class ConfigValueExtractionException extends RuntimeException { +public class ConfigValueException extends RuntimeException { + private final ConfigOrigin origin; - public ConfigValueExtractionException(ConfigOrigin origin, String message) { + public ConfigValueException(ConfigOrigin origin, String message) { super(message); this.origin = origin; } - public ConfigValueExtractionException(ConfigOrigin origin, String message, Throwable cause) { + public ConfigValueException(ConfigOrigin origin, String message, Throwable cause) { super(message, cause); this.origin = origin; } @@ -25,14 +26,14 @@ public ConfigOrigin getOrigin() { public static T handle(ConfigValue value, Function, T> thunk) { try { return thunk.apply(value); - } catch (ConfigValueExtractionException e) { + } catch (ConfigValueException e) { throw e; } catch (Exception e) { - throw ConfigValueExtractionException.parsingError(value, e); + throw ConfigValueException.parsingError(value, e); } } - public static ConfigValueExtractionException unexpectedValueType(ConfigValue value, Class> expectedType) { + public static ConfigValueException unexpectedValueType(ConfigValue value, Class> expectedType) { var message = String.format( "Config expected value with type '%s' but received type '%s' and value '%s' at path '%s' for origin '%s'", expectedType.getSimpleName(), @@ -42,10 +43,10 @@ public static ConfigValueExtractionException unexpectedValueType(ConfigValue value.origin().config().description() ); - return new ConfigValueExtractionException(value.origin().config(), message, null); + return new ConfigValueException(value.origin().config(), message, null); } - public static ConfigValueExtractionException parsingError(ConfigValue value, Exception error) { + public static ConfigValueException parsingError(ConfigValue value, Exception error) { var message = String.format( "Config value parsing failed with '%s' for value '%s' at path: '%s' for origin '%s'", error.getMessage(), @@ -54,26 +55,26 @@ public static ConfigValueExtractionException parsingError(ConfigValue value, value.origin().config().description() ); - return new ConfigValueExtractionException(value.origin().config(), message, error); + return new ConfigValueException(value.origin().config(), message, error); } - public static ConfigValueExtractionException missingValue(ConfigValue value) { + public static ConfigValueException missingValue(ConfigValue value) { var message = String.format( "Config expected value, but got null at path: '%s' for origin '%s'", value.origin().path(), value.origin().config().description() ); - return new ConfigValueExtractionException(value.origin().config(), message, null); + return new ConfigValueException(value.origin().config(), message, null); } - public static ConfigValueExtractionException missingValueAfterParse(ConfigValue value) { + public static ConfigValueException missingValueAfterParse(ConfigValue value) { var message = String.format( "Config expected value, but got null after parsing at path: '%s' for origin '%s'", value.origin().path(), value.origin().config().description() ); - return new ConfigValueExtractionException(value.origin().config(), message, null); + return new ConfigValueException(value.origin().config(), message, null); } } diff --git a/config/config-common/src/main/java/io/koraframework/config/common/extractor/ConfigValueExtractorMapping.java b/config/config-common/src/main/java/io/koraframework/config/common/extractor/ConfigValueExtractorMapping.java deleted file mode 100644 index 9e115b2e6..000000000 --- a/config/config-common/src/main/java/io/koraframework/config/common/extractor/ConfigValueExtractorMapping.java +++ /dev/null @@ -1,21 +0,0 @@ -package io.koraframework.config.common.extractor; - -import io.koraframework.config.common.ConfigValue; - -import java.util.function.Function; - -public final class ConfigValueExtractorMapping implements ConfigValueExtractor { - - private final ConfigValueExtractor baseExtractor; - private final Function mapping; - - public ConfigValueExtractorMapping(ConfigValueExtractor baseExtractor, Function mapping) { - this.baseExtractor = baseExtractor; - this.mapping = mapping; - } - - @Override - public U extract(ConfigValue value) { - return mapping.apply(baseExtractor.extract(value)); - } -} diff --git a/config/config-common/src/main/java/io/koraframework/config/common/extractor/ConfigValueExtractorModule.java b/config/config-common/src/main/java/io/koraframework/config/common/extractor/ConfigValueExtractorModule.java deleted file mode 100644 index 2362dc296..000000000 --- a/config/config-common/src/main/java/io/koraframework/config/common/extractor/ConfigValueExtractorModule.java +++ /dev/null @@ -1,156 +0,0 @@ -package io.koraframework.config.common.extractor; - -import io.koraframework.application.graph.TypeRef; -import io.koraframework.common.annotation.DefaultComponent; -import io.koraframework.config.common.ConfigValue; -import io.koraframework.common.Either; -import io.koraframework.common.util.Size; - -import java.math.BigDecimal; -import java.math.BigInteger; -import java.time.*; -import java.util.*; -import java.util.regex.Pattern; - -public interface ConfigValueExtractorModule { - - @DefaultComponent - default ConfigValueExtractor> listConfigValueExtractor(ConfigValueExtractor elementValueExtractor) { - return new ListConfigValueExtractor<>(elementValueExtractor); - } - - @DefaultComponent - default ConfigValueExtractor> setConfigValueExtractor(ConfigValueExtractor elementValueExtractor) { - return new SetConfigValueExtractor<>(elementValueExtractor); - } - - @DefaultComponent - default ConfigValueExtractor> mapConfigValueExtractor(ConfigValueExtractor keyExtractor, ConfigValueExtractor valueExtractor) { - return new MapConfigKeyValueExtractor<>(keyExtractor, valueExtractor); - } - - @DefaultComponent - default OptionalConfigValueExtractor optionalConfigValueExtractor(ConfigValueExtractor extractor) { - return new OptionalConfigValueExtractor<>(extractor); - } - - @DefaultComponent - default > EnumConfigValueExtractor enumConfigValueExtractor(TypeRef typeRef) { - return new EnumConfigValueExtractor<>(typeRef.getRawType()); - } - - @DefaultComponent - default ConfigValueExtractor stringConfigValueExtractor() { - return new StringConfigValueExtractor(); - } - - @DefaultComponent - default ConfigValueExtractor integerConfigValueExtractor() { - return new NumberConfigValueExtractor().map(BigDecimal::intValueExact); - } - - @DefaultComponent - default ConfigValueExtractor longConfigValueExtractor() { - return new NumberConfigValueExtractor().map(BigDecimal::longValueExact); - } - - @DefaultComponent - default ConfigValueExtractor bigIntegerConfigValueExtractor() { - return new NumberConfigValueExtractor().map(BigDecimal::toBigInteger); - } - - @DefaultComponent - default ConfigValueExtractor floatConfigValueExtractor() { - return new NumberConfigValueExtractor().map(BigDecimal::floatValue); - } - - @DefaultComponent - default ConfigValueExtractor doubleConfigValueExtractor() { - return new NumberConfigValueExtractor().map(BigDecimal::doubleValue); - } - - @DefaultComponent - default ConfigValueExtractor bigDecimalConfigValueExtractor() { - return new NumberConfigValueExtractor(); - } - - @DefaultComponent - default ConfigValueExtractor booleanConfigValueExtractor() { - return new BooleanConfigValueExtractor(); - } - - @DefaultComponent - default ConfigValueExtractor subconfigConfigValueExtractor() { - return ConfigValue::asObject; - } - - @DefaultComponent - default ConfigValueExtractor durationConfigValueExtractor() { - return new DurationConfigValueExtractor(); - } - - @DefaultComponent - default ConfigValueExtractor periodConfigValueExtractor() { - return new PeriodConfigValueExtractor(); - } - - @DefaultComponent - default ConfigValueExtractor propertiesConfigValueExtractor() { - return new PropertiesConfigValueExtractor(); - } - - @DefaultComponent - default ConfigValueExtractor patternConfigValueExtractor() { - return new PatternConfigValueExtractor(); - } - - @DefaultComponent - default ConfigValueExtractor> eitherConfigValueExtractor(ConfigValueExtractor left, ConfigValueExtractor right) { - return new EitherConfigExtractor<>(left, right); - } - - @DefaultComponent - default ConfigValueExtractor uuidConfigValueExtractor() { - return new UUIDConfigValueExtractor(); - } - - @DefaultComponent - default ConfigValueExtractor doubleArrayConfigValueExtractor(ConfigValueExtractor doubleExtractor) { - return new DoubleArrayConfigValueExtractor(doubleExtractor); - } - - @DefaultComponent - default ConfigValueExtractor durationArrayConfigValueExtractor(ConfigValueExtractor durationExtractor) { - return new DurationArrayConfigValueExtractor(durationExtractor); - } - - @DefaultComponent - default ConfigValueExtractor sizeConfigValueExtractor() { - return new SizeConfigValueExtractor(); - } - - @DefaultComponent - default ConfigValueExtractor localDateConfigValueExtractor() { - return new LocalDateConfigValueExtractor(); - } - - @DefaultComponent - default ConfigValueExtractor localTimeConfigValueExtractor() { - return new LocalTimeConfigValueExtractor(); - } - - @DefaultComponent - default ConfigValueExtractor localDateTimeConfigValueExtractor() { - return new LocalDateTimeConfigValueExtractor(); - } - - @DefaultComponent - default ConfigValueExtractor offsetTimeConfigValueExtractor() { - return new OffsetTimeConfigValueExtractor(); - } - - @DefaultComponent - default ConfigValueExtractor offsetDateTimeConfigValueExtractor() { - return new OffsetDateTimeConfigValueExtractor(); - } -} diff --git a/config/config-common/src/main/java/io/koraframework/config/common/extractor/DoubleArrayConfigValueExtractor.java b/config/config-common/src/main/java/io/koraframework/config/common/extractor/DoubleArrayConfigValueExtractor.java deleted file mode 100644 index f534dcac6..000000000 --- a/config/config-common/src/main/java/io/koraframework/config/common/extractor/DoubleArrayConfigValueExtractor.java +++ /dev/null @@ -1,33 +0,0 @@ -package io.koraframework.config.common.extractor; - -import org.jspecify.annotations.Nullable; -import io.koraframework.config.common.ConfigValue; - -import java.util.Objects; - -public class DoubleArrayConfigValueExtractor implements ConfigValueExtractor { - - private final ConfigValueExtractor doubleConfigValueExtractor; - - public DoubleArrayConfigValueExtractor(ConfigValueExtractor doubleConfigValueExtractor) { - this.doubleConfigValueExtractor = doubleConfigValueExtractor; - } - - @Override - public double @Nullable [] extract(ConfigValue value) { - if (value.isNull()) { - return null; - } - - var array = value.asArray(); - var result = new double[array.value().size()]; - for (int i = 0; i < result.length; i++) { - var item = array.value().get(i); - if (item.isNull()) { - throw ConfigValueExtractionException.unexpectedValueType(item, ConfigValue.NumberValue.class); - } - result[i] = Objects.requireNonNull(this.doubleConfigValueExtractor.extract(item)); - } - return result; - } -} diff --git a/config/config-common/src/main/java/io/koraframework/config/common/extractor/DurationArrayConfigValueExtractor.java b/config/config-common/src/main/java/io/koraframework/config/common/extractor/DurationArrayConfigValueExtractor.java deleted file mode 100644 index a9e02e7e1..000000000 --- a/config/config-common/src/main/java/io/koraframework/config/common/extractor/DurationArrayConfigValueExtractor.java +++ /dev/null @@ -1,34 +0,0 @@ -package io.koraframework.config.common.extractor; - -import org.jspecify.annotations.Nullable; -import io.koraframework.config.common.ConfigValue; - -import java.time.Duration; -import java.util.Objects; - -public class DurationArrayConfigValueExtractor implements ConfigValueExtractor { - - private final ConfigValueExtractor durationConfigValueExtractor; - - public DurationArrayConfigValueExtractor(ConfigValueExtractor doubleConfigValueExtractor) { - this.durationConfigValueExtractor = doubleConfigValueExtractor; - } - - @Override - public Duration @Nullable [] extract(ConfigValue value) { - if (value.isNull()) { - return null; - } - - var array = value.asArray(); - var result = new Duration[array.value().size()]; - for (int i = 0; i < result.length; i++) { - var item = array.value().get(i); - if (item.isNull()) { - throw ConfigValueExtractionException.unexpectedValueType(item, ConfigValue.NumberValue.class); - } - result[i] = Objects.requireNonNull(this.durationConfigValueExtractor.extract(item)); - } - return result; - } -} diff --git a/config/config-common/src/main/java/io/koraframework/config/common/extractor/EitherConfigExtractor.java b/config/config-common/src/main/java/io/koraframework/config/common/extractor/EitherConfigExtractor.java deleted file mode 100644 index 399168bde..000000000 --- a/config/config-common/src/main/java/io/koraframework/config/common/extractor/EitherConfigExtractor.java +++ /dev/null @@ -1,24 +0,0 @@ -package io.koraframework.config.common.extractor; - -import io.koraframework.common.Either; -import io.koraframework.config.common.ConfigValue; - -public class EitherConfigExtractor implements ConfigValueExtractor> { - - private final ConfigValueExtractor leftExtractor; - private final ConfigValueExtractor rightExtractor; - - public EitherConfigExtractor(ConfigValueExtractor leftExtractor, ConfigValueExtractor rightExtractor) { - this.leftExtractor = leftExtractor; - this.rightExtractor = rightExtractor; - } - - @Override - public Either extract(ConfigValue value) { - try { - return Either.left(leftExtractor.extract(value)); - } catch (Exception e) { - return Either.right(rightExtractor.extract(value)); - } - } -} diff --git a/config/config-common/src/main/java/io/koraframework/config/common/extractor/ListConfigValueExtractor.java b/config/config-common/src/main/java/io/koraframework/config/common/extractor/ListConfigValueExtractor.java deleted file mode 100644 index 0a031b471..000000000 --- a/config/config-common/src/main/java/io/koraframework/config/common/extractor/ListConfigValueExtractor.java +++ /dev/null @@ -1,16 +0,0 @@ -package io.koraframework.config.common.extractor; - -import java.util.ArrayList; -import java.util.List; - -public final class ListConfigValueExtractor extends CollectionConfigValueExtractor> { - - public ListConfigValueExtractor(ConfigValueExtractor elementValueExtractor) { - super(elementValueExtractor); - } - - @Override - protected List newCollection(int size) { - return new ArrayList<>(); - } -} diff --git a/config/config-common/src/main/java/io/koraframework/config/common/extractor/MapConfigKeyValueExtractor.java b/config/config-common/src/main/java/io/koraframework/config/common/extractor/MapConfigKeyValueExtractor.java deleted file mode 100644 index 923ce2d57..000000000 --- a/config/config-common/src/main/java/io/koraframework/config/common/extractor/MapConfigKeyValueExtractor.java +++ /dev/null @@ -1,36 +0,0 @@ -package io.koraframework.config.common.extractor; - -import org.jspecify.annotations.Nullable; -import io.koraframework.config.common.ConfigValue; - -import java.util.LinkedHashMap; -import java.util.Map; - -import static io.koraframework.config.common.ConfigValue.ObjectValue; - -public final class MapConfigKeyValueExtractor implements ConfigValueExtractor> { - - private final ConfigValueExtractor mapKeyExtractor; - private final ConfigValueExtractor mapValueExtractor; - - public MapConfigKeyValueExtractor(ConfigValueExtractor mapKeyExtractor, - ConfigValueExtractor mapValueExtractor) { - this.mapKeyExtractor = mapKeyExtractor; - this.mapValueExtractor = mapValueExtractor; - } - - @Override - public Map extract(ConfigValue configValue) { - if (configValue instanceof ObjectValue objectValue) { - var result = new LinkedHashMap(objectValue.value().size()); - for (var entry : objectValue) { - K key = mapKeyExtractor.extract(new ConfigValue.StringValue(entry.getValue().origin(), entry.getKey())); - V value = mapValueExtractor.extract(entry.getValue()); - result.put(key, value); - } - - return result; - } - throw ConfigValueExtractionException.unexpectedValueType(configValue, ObjectValue.class); - } -} diff --git a/config/config-common/src/main/java/io/koraframework/config/common/extractor/MapConfigValueExtractor.java b/config/config-common/src/main/java/io/koraframework/config/common/extractor/MapConfigValueExtractor.java deleted file mode 100644 index 9bd54d96e..000000000 --- a/config/config-common/src/main/java/io/koraframework/config/common/extractor/MapConfigValueExtractor.java +++ /dev/null @@ -1,35 +0,0 @@ -package io.koraframework.config.common.extractor; - -import org.jspecify.annotations.Nullable; -import io.koraframework.config.common.ConfigValue; - -import java.util.LinkedHashMap; -import java.util.Map; - -import static io.koraframework.config.common.ConfigValue.ObjectValue; - -public final class MapConfigValueExtractor implements ConfigValueExtractor> { - private final ConfigValueExtractor mapValueExtractor; - - public MapConfigValueExtractor(ConfigValueExtractor mapValueExtractor) { - this.mapValueExtractor = mapValueExtractor; - } - - @Nullable - @Override - public Map extract(ConfigValue value) { - if (value.isNull()) { - return null; - } - - if (value instanceof ObjectValue objectValue) { - var result = new LinkedHashMap(objectValue.value().size()); - for (var entry : objectValue) { - result.put(entry.getKey(), mapValueExtractor.extract(entry.getValue())); - } - - return result; - } - throw ConfigValueExtractionException.unexpectedValueType(value, ObjectValue.class); - } -} diff --git a/config/config-common/src/main/java/io/koraframework/config/common/extractor/OptionalConfigValueExtractor.java b/config/config-common/src/main/java/io/koraframework/config/common/extractor/OptionalConfigValueExtractor.java deleted file mode 100644 index 07f5dba23..000000000 --- a/config/config-common/src/main/java/io/koraframework/config/common/extractor/OptionalConfigValueExtractor.java +++ /dev/null @@ -1,23 +0,0 @@ -package io.koraframework.config.common.extractor; - -import io.koraframework.config.common.ConfigValue; - -import java.util.Optional; - -public final class OptionalConfigValueExtractor implements ConfigValueExtractor> { - - private final ConfigValueExtractor delegate; - - public OptionalConfigValueExtractor(ConfigValueExtractor delegate) { - this.delegate = delegate; - } - - @Override - public Optional extract(ConfigValue value) { - if (value.isNull()) { - return Optional.empty(); - } - var parsed = this.delegate.extract(value); - return Optional.ofNullable(parsed); - } -} diff --git a/config/config-common/src/main/java/io/koraframework/config/common/extractor/SetConfigValueExtractor.java b/config/config-common/src/main/java/io/koraframework/config/common/extractor/SetConfigValueExtractor.java deleted file mode 100644 index 17f5b4e3b..000000000 --- a/config/config-common/src/main/java/io/koraframework/config/common/extractor/SetConfigValueExtractor.java +++ /dev/null @@ -1,16 +0,0 @@ -package io.koraframework.config.common.extractor; - -import java.util.LinkedHashSet; -import java.util.Set; - -public final class SetConfigValueExtractor extends CollectionConfigValueExtractor> { - - public SetConfigValueExtractor(ConfigValueExtractor elementValueExtractor) { - super(elementValueExtractor); - } - - @Override - protected Set newCollection(int size) { - return new LinkedHashSet<>(); - } -} diff --git a/config/config-common/src/main/java/io/koraframework/config/common/extractor/BooleanConfigValueExtractor.java b/config/config-common/src/main/java/io/koraframework/config/common/mapper/BooleanConfigValueMapper.java similarity index 64% rename from config/config-common/src/main/java/io/koraframework/config/common/extractor/BooleanConfigValueExtractor.java rename to config/config-common/src/main/java/io/koraframework/config/common/mapper/BooleanConfigValueMapper.java index 71afdaac3..ec6e09ba3 100644 --- a/config/config-common/src/main/java/io/koraframework/config/common/extractor/BooleanConfigValueExtractor.java +++ b/config/config-common/src/main/java/io/koraframework/config/common/mapper/BooleanConfigValueMapper.java @@ -1,12 +1,14 @@ -package io.koraframework.config.common.extractor; +package io.koraframework.config.common.mapper; import io.koraframework.config.common.ConfigValue; +import io.koraframework.config.common.exception.ConfigValueException; import org.jspecify.annotations.Nullable; -public final class BooleanConfigValueExtractor implements ConfigValueExtractor { +public final class BooleanConfigValueMapper implements ConfigValueMapper { + @Nullable @Override - public Boolean extract(ConfigValue value) { + public Boolean map(ConfigValue value) { if (value.isNull()) { return null; } @@ -22,6 +24,6 @@ public Boolean extract(ConfigValue value) { return Boolean.FALSE; } } - throw ConfigValueExtractionException.unexpectedValueType(value, ConfigValue.BooleanValue.class); + throw ConfigValueException.unexpectedValueType(value, ConfigValue.BooleanValue.class); } } diff --git a/config/config-common/src/main/java/io/koraframework/config/common/extractor/CollectionConfigValueExtractor.java b/config/config-common/src/main/java/io/koraframework/config/common/mapper/CollectionConfigValueMapper.java similarity index 58% rename from config/config-common/src/main/java/io/koraframework/config/common/extractor/CollectionConfigValueExtractor.java rename to config/config-common/src/main/java/io/koraframework/config/common/mapper/CollectionConfigValueMapper.java index 89535d9d1..fd4748a8f 100644 --- a/config/config-common/src/main/java/io/koraframework/config/common/extractor/CollectionConfigValueExtractor.java +++ b/config/config-common/src/main/java/io/koraframework/config/common/mapper/CollectionConfigValueMapper.java @@ -1,22 +1,23 @@ -package io.koraframework.config.common.extractor; +package io.koraframework.config.common.mapper; import io.koraframework.config.common.ConfigValue; +import io.koraframework.config.common.exception.ConfigValueException; import org.jspecify.annotations.Nullable; import java.util.Collection; -public abstract class CollectionConfigValueExtractor> implements ConfigValueExtractor { +public abstract class CollectionConfigValueMapper> implements ConfigValueMapper { - private final ConfigValueExtractor elementValueExtractor; + private final ConfigValueMapper elementValueMapper; - protected CollectionConfigValueExtractor(ConfigValueExtractor elementValueExtractor) { - this.elementValueExtractor = elementValueExtractor; + protected CollectionConfigValueMapper(ConfigValueMapper elementValueMapper) { + this.elementValueMapper = elementValueMapper; } @Nullable @Override - public C extract(ConfigValue value) { + public C map(ConfigValue value) { if (value.isNull()) { return null; } @@ -30,17 +31,17 @@ public C extract(ConfigValue value) { var result = newCollection(values.length); for (var stringValue : values) { var listValue = new ConfigValue.StringValue(origin, stringValue.trim()); - result.add(elementValueExtractor.extract(listValue)); + result.add(elementValueMapper.map(listValue)); } return result; } else if (value instanceof ConfigValue.ArrayValue array) { var result = newCollection(array.value().size()); for (var element : array) { - result.add(elementValueExtractor.extract(element)); + result.add(elementValueMapper.map(element)); } return result; } else { - throw ConfigValueExtractionException.unexpectedValueType(value, ConfigValue.ArrayValue.class); + throw ConfigValueException.unexpectedValueType(value, ConfigValue.ArrayValue.class); } } diff --git a/config/config-common/src/main/java/io/koraframework/config/common/extractor/ConfigValueExtractor.java b/config/config-common/src/main/java/io/koraframework/config/common/mapper/ConfigValueMapper.java similarity index 57% rename from config/config-common/src/main/java/io/koraframework/config/common/extractor/ConfigValueExtractor.java rename to config/config-common/src/main/java/io/koraframework/config/common/mapper/ConfigValueMapper.java index 6fafcf109..08464046f 100644 --- a/config/config-common/src/main/java/io/koraframework/config/common/extractor/ConfigValueExtractor.java +++ b/config/config-common/src/main/java/io/koraframework/config/common/mapper/ConfigValueMapper.java @@ -1,7 +1,9 @@ -package io.koraframework.config.common.extractor; +package io.koraframework.config.common.mapper; import io.koraframework.common.annotation.Mapping; import io.koraframework.config.common.ConfigValue; +import io.koraframework.config.common.annotation.ConfigMapper; +import io.koraframework.config.common.exception.ConfigValueException; import org.jspecify.annotations.Nullable; import java.util.function.Function; @@ -13,23 +15,23 @@ * English: Contract to extract configuration mapping classes within external libraries. * Subsequently, the interface can be used for deployment as a dependency. * - * @see io.koraframework.config.common.annotation.ConfigValueExtractor + * @see ConfigMapper */ @FunctionalInterface -public interface ConfigValueExtractor extends Mapping.MappingFunction { +public interface ConfigValueMapper extends Mapping.MappingFunction { @Nullable - T extract(ConfigValue value); + T map(ConfigValue value); - default T extractOrThrow(ConfigValue value) { - var config = extract(value); + default T mapOrThrow(ConfigValue value) { + var config = map(value); if (config == null) { - throw ConfigValueExtractionException.missingValueAfterParse(value); + throw ConfigValueException.missingValueAfterParse(value); } return config; } - default ConfigValueExtractor map(Function f) { - return new ConfigValueExtractorMapping<>(this, f); + default ConfigValueMapper andThen(Function<@Nullable T, U> function) { + return value -> function.apply(this.map(value)); } } diff --git a/config/config-common/src/main/java/io/koraframework/config/common/mapper/ConfigValueMapperModule.java b/config/config-common/src/main/java/io/koraframework/config/common/mapper/ConfigValueMapperModule.java new file mode 100644 index 000000000..b4687544a --- /dev/null +++ b/config/config-common/src/main/java/io/koraframework/config/common/mapper/ConfigValueMapperModule.java @@ -0,0 +1,156 @@ +package io.koraframework.config.common.mapper; + +import io.koraframework.application.graph.TypeRef; +import io.koraframework.common.annotation.DefaultComponent; +import io.koraframework.config.common.ConfigValue; +import io.koraframework.common.Either; +import io.koraframework.common.util.Size; + +import java.math.BigDecimal; +import java.math.BigInteger; +import java.time.*; +import java.util.*; +import java.util.regex.Pattern; + +public interface ConfigValueMapperModule { + + @DefaultComponent + default ConfigValueMapper> listConfigValueMapper(ConfigValueMapper elementValueMapper) { + return new ListConfigValueMapper<>(elementValueMapper); + } + + @DefaultComponent + default ConfigValueMapper> setConfigValueMapper(ConfigValueMapper elementValueMapper) { + return new SetConfigValueMapper<>(elementValueMapper); + } + + @DefaultComponent + default ConfigValueMapper> mapConfigValueMapper(ConfigValueMapper keyExtractor, ConfigValueMapper valueExtractor) { + return new MapConfigKeyValueMapper<>(keyExtractor, valueExtractor); + } + + @DefaultComponent + default OptionalConfigValueMapper optionalConfigValueMapper(ConfigValueMapper mapper) { + return new OptionalConfigValueMapper<>(mapper); + } + + @DefaultComponent + default > EnumConfigValueMapper enumConfigValueMapper(TypeRef typeRef) { + return new EnumConfigValueMapper<>(typeRef.getRawType()); + } + + @DefaultComponent + default ConfigValueMapper stringConfigValueMapper() { + return new StringConfigValueMapper(); + } + + @DefaultComponent + default ConfigValueMapper integerConfigValueMapper() { + return new NumberConfigValueMapper().andThen(BigDecimal::intValueExact); + } + + @DefaultComponent + default ConfigValueMapper longConfigValueMapper() { + return new NumberConfigValueMapper().andThen(BigDecimal::longValueExact); + } + + @DefaultComponent + default ConfigValueMapper bigIntegerConfigValueMapper() { + return new NumberConfigValueMapper().andThen(BigDecimal::toBigInteger); + } + + @DefaultComponent + default ConfigValueMapper floatConfigValueMapper() { + return new NumberConfigValueMapper().andThen(BigDecimal::floatValue); + } + + @DefaultComponent + default ConfigValueMapper doubleConfigValueMapper() { + return new NumberConfigValueMapper().andThen(BigDecimal::doubleValue); + } + + @DefaultComponent + default ConfigValueMapper bigDecimalConfigValueMapper() { + return new NumberConfigValueMapper(); + } + + @DefaultComponent + default ConfigValueMapper booleanConfigValueMapper() { + return new BooleanConfigValueMapper(); + } + + @DefaultComponent + default ConfigValueMapper subconfigConfigValueMapper() { + return ConfigValue::asObject; + } + + @DefaultComponent + default ConfigValueMapper durationConfigValueMapper() { + return new DurationConfigValueMapper(); + } + + @DefaultComponent + default ConfigValueMapper periodConfigValueMapper() { + return new PeriodConfigValueMapper(); + } + + @DefaultComponent + default ConfigValueMapper propertiesConfigValueMapper() { + return new PropertiesConfigValueMapper(); + } + + @DefaultComponent + default ConfigValueMapper patternConfigValueMapper() { + return new PatternConfigValueMapper(); + } + + @DefaultComponent + default ConfigValueMapper> eitherConfigValueMapper(ConfigValueMapper left, ConfigValueMapper right) { + return new EitherConfigMapper<>(left, right); + } + + @DefaultComponent + default ConfigValueMapper uuidConfigValueMapper() { + return new UUIDConfigValueMapper(); + } + + @DefaultComponent + default ConfigValueMapper doubleArrayConfigValueMapper(ConfigValueMapper doubleExtractor) { + return new DoubleArrayConfigValueMapper(doubleExtractor); + } + + @DefaultComponent + default ConfigValueMapper durationArrayConfigValueMapper(ConfigValueMapper durationExtractor) { + return new DurationArrayConfigValueMapper(durationExtractor); + } + + @DefaultComponent + default ConfigValueMapper sizeConfigValueMapper() { + return new SizeConfigValueMapper(); + } + + @DefaultComponent + default ConfigValueMapper localDateConfigValueMapper() { + return new LocalDateConfigValueMapper(); + } + + @DefaultComponent + default ConfigValueMapper localTimeConfigValueMapper() { + return new LocalTimeConfigValueMapper(); + } + + @DefaultComponent + default ConfigValueMapper localDateTimeConfigValueMapper() { + return new LocalDateTimeConfigValueMapper(); + } + + @DefaultComponent + default ConfigValueMapper offsetTimeConfigValueMapper() { + return new OffsetTimeConfigValueMapper(); + } + + @DefaultComponent + default ConfigValueMapper offsetDateTimeConfigValueMapper() { + return new OffsetDateTimeConfigValueMapper(); + } +} diff --git a/config/config-common/src/main/java/io/koraframework/config/common/mapper/DoubleArrayConfigValueMapper.java b/config/config-common/src/main/java/io/koraframework/config/common/mapper/DoubleArrayConfigValueMapper.java new file mode 100644 index 000000000..8d7d0a333 --- /dev/null +++ b/config/config-common/src/main/java/io/koraframework/config/common/mapper/DoubleArrayConfigValueMapper.java @@ -0,0 +1,34 @@ +package io.koraframework.config.common.mapper; + +import io.koraframework.config.common.exception.ConfigValueException; +import org.jspecify.annotations.Nullable; +import io.koraframework.config.common.ConfigValue; + +import java.util.Objects; + +public class DoubleArrayConfigValueMapper implements ConfigValueMapper { + + private final ConfigValueMapper doubleConfigValueMapper; + + public DoubleArrayConfigValueMapper(ConfigValueMapper doubleConfigValueMapper) { + this.doubleConfigValueMapper = doubleConfigValueMapper; + } + + @Override + public double @Nullable [] map(ConfigValue value) { + if (value.isNull()) { + return null; + } + + var array = value.asArray(); + var result = new double[array.value().size()]; + for (int i = 0; i < result.length; i++) { + var item = array.value().get(i); + if (item.isNull()) { + throw ConfigValueException.unexpectedValueType(item, ConfigValue.NumberValue.class); + } + result[i] = Objects.requireNonNull(this.doubleConfigValueMapper.map(item)); + } + return result; + } +} diff --git a/config/config-common/src/main/java/io/koraframework/config/common/mapper/DurationArrayConfigValueMapper.java b/config/config-common/src/main/java/io/koraframework/config/common/mapper/DurationArrayConfigValueMapper.java new file mode 100644 index 000000000..be3c9bfef --- /dev/null +++ b/config/config-common/src/main/java/io/koraframework/config/common/mapper/DurationArrayConfigValueMapper.java @@ -0,0 +1,35 @@ +package io.koraframework.config.common.mapper; + +import io.koraframework.config.common.exception.ConfigValueException; +import org.jspecify.annotations.Nullable; +import io.koraframework.config.common.ConfigValue; + +import java.time.Duration; +import java.util.Objects; + +public class DurationArrayConfigValueMapper implements ConfigValueMapper { + + private final ConfigValueMapper durationConfigValueMapper; + + public DurationArrayConfigValueMapper(ConfigValueMapper doubleConfigValueMapper) { + this.durationConfigValueMapper = doubleConfigValueMapper; + } + + @Override + public Duration @Nullable [] map(ConfigValue value) { + if (value.isNull()) { + return null; + } + + var array = value.asArray(); + var result = new Duration[array.value().size()]; + for (int i = 0; i < result.length; i++) { + var item = array.value().get(i); + if (item.isNull()) { + throw ConfigValueException.unexpectedValueType(item, ConfigValue.NumberValue.class); + } + result[i] = Objects.requireNonNull(this.durationConfigValueMapper.map(item)); + } + return result; + } +} diff --git a/config/config-common/src/main/java/io/koraframework/config/common/extractor/DurationConfigValueExtractor.java b/config/config-common/src/main/java/io/koraframework/config/common/mapper/DurationConfigValueMapper.java similarity index 69% rename from config/config-common/src/main/java/io/koraframework/config/common/extractor/DurationConfigValueExtractor.java rename to config/config-common/src/main/java/io/koraframework/config/common/mapper/DurationConfigValueMapper.java index a9c8c4cb7..67577d9ff 100644 --- a/config/config-common/src/main/java/io/koraframework/config/common/extractor/DurationConfigValueExtractor.java +++ b/config/config-common/src/main/java/io/koraframework/config/common/mapper/DurationConfigValueMapper.java @@ -1,21 +1,18 @@ -package io.koraframework.config.common.extractor; +package io.koraframework.config.common.mapper; +import io.koraframework.config.common.exception.ConfigValueException; +import io.koraframework.config.common.util.ConfigValueMapperUtils; import org.jspecify.annotations.Nullable; import io.koraframework.config.common.ConfigValue; import java.time.Duration; import java.util.concurrent.TimeUnit; -public class DurationConfigValueExtractor implements ConfigValueExtractor { +public class DurationConfigValueMapper implements ConfigValueMapper { @Nullable @Override - public Duration extract(ConfigValue value) { - return extractFromValue(value); - } - - @Nullable - public static Duration extractFromValue(ConfigValue value) { + public Duration map(ConfigValue value) { if (value.isNull()) { return null; } @@ -23,16 +20,16 @@ public static Duration extractFromValue(ConfigValue value) { return Duration.ofMillis(number.value().longValue()); } if (!(value instanceof ConfigValue.StringValue str)) { - throw ConfigValueExtractionException.unexpectedValueType(value, ConfigValue.StringValue.class); + throw ConfigValueException.unexpectedValueType(value, ConfigValue.StringValue.class); } try { return parseString(str); } catch (Exception e) { - throw ConfigValueExtractionException.parsingError(value, e); + throw ConfigValueException.parsingError(value, e); } } - public static Duration parseString(ConfigValue configValue) { + private static Duration parseString(ConfigValue configValue) { try { return Duration.parse(configValue.value()); } catch (Exception e) { @@ -45,22 +42,22 @@ public static Duration parseString(ConfigValue configValue) { } } - public static Duration parseHoconStyle(ConfigValue configValue) { + private static Duration parseHoconStyle(ConfigValue configValue) { var nanos = parseDuration(configValue); return Duration.ofNanos(nanos); } - public static long parseDuration(ConfigValue configValue) { - var s = ExtractorUtils.unicodeTrim(configValue.value()); + private static long parseDuration(ConfigValue configValue) { + var s = ConfigValueMapperUtils.unicodeTrim(configValue.value()); var originalUnitString = getUnits(s); var unitString = originalUnitString; - var numberString = ExtractorUtils.unicodeTrim(s.substring(0, s.length() + var numberString = ConfigValueMapperUtils.unicodeTrim(s.substring(0, s.length() - unitString.length())); // this would be caught later anyway, but the error message // is more helpful if we check it here. if (numberString.length() == 0) - throw new ConfigValueExtractionException(configValue.origin().config(), "No number in duration value " + configValue.origin().path(), null); + throw new ConfigValueException(configValue.origin().config(), "No number in duration value " + configValue.origin().path(), null); if (unitString.length() > 2 && !unitString.endsWith("s")) unitString = unitString + "s"; @@ -74,7 +71,7 @@ public static long parseDuration(ConfigValue configValue) { case "h", "hours" -> TimeUnit.HOURS; case "s", "seconds" -> TimeUnit.SECONDS; case "m", "minutes" -> TimeUnit.MINUTES; - default -> throw new ConfigValueExtractionException( + default -> throw new ConfigValueException( configValue.origin().config(), "Could not parse time unit '%s' (try ns, us, ms, s, m, h, d) in %s".formatted(originalUnitString, configValue.origin().path()), null @@ -92,7 +89,7 @@ public static long parseDuration(ConfigValue configValue) { return (long) (Double.parseDouble(numberString) * nanosInUnit); } } catch (NumberFormatException e) { - throw new ConfigValueExtractionException(configValue.origin().config(), "Could not parse duration number %s in %s".formatted(numberString, configValue.origin().path()), null); + throw new ConfigValueException(configValue.origin().config(), "Could not parse duration number %s in %s".formatted(numberString, configValue.origin().path()), null); } } diff --git a/config/config-common/src/main/java/io/koraframework/config/common/mapper/EitherConfigMapper.java b/config/config-common/src/main/java/io/koraframework/config/common/mapper/EitherConfigMapper.java new file mode 100644 index 000000000..6a38a1851 --- /dev/null +++ b/config/config-common/src/main/java/io/koraframework/config/common/mapper/EitherConfigMapper.java @@ -0,0 +1,24 @@ +package io.koraframework.config.common.mapper; + +import io.koraframework.common.Either; +import io.koraframework.config.common.ConfigValue; + +public class EitherConfigMapper implements ConfigValueMapper> { + + private final ConfigValueMapper leftExtractor; + private final ConfigValueMapper rightExtractor; + + public EitherConfigMapper(ConfigValueMapper leftExtractor, ConfigValueMapper rightExtractor) { + this.leftExtractor = leftExtractor; + this.rightExtractor = rightExtractor; + } + + @Override + public Either map(ConfigValue value) { + try { + return Either.left(leftExtractor.map(value)); + } catch (Exception e) { + return Either.right(rightExtractor.map(value)); + } + } +} diff --git a/config/config-common/src/main/java/io/koraframework/config/common/extractor/EnumConfigValueExtractor.java b/config/config-common/src/main/java/io/koraframework/config/common/mapper/EnumConfigValueMapper.java similarity index 55% rename from config/config-common/src/main/java/io/koraframework/config/common/extractor/EnumConfigValueExtractor.java rename to config/config-common/src/main/java/io/koraframework/config/common/mapper/EnumConfigValueMapper.java index 71f1d991e..d9e14d081 100644 --- a/config/config-common/src/main/java/io/koraframework/config/common/extractor/EnumConfigValueExtractor.java +++ b/config/config-common/src/main/java/io/koraframework/config/common/mapper/EnumConfigValueMapper.java @@ -1,15 +1,16 @@ -package io.koraframework.config.common.extractor; +package io.koraframework.config.common.mapper; +import io.koraframework.config.common.exception.ConfigValueException; import org.jspecify.annotations.Nullable; import io.koraframework.config.common.ConfigValue; import java.util.HashMap; -public class EnumConfigValueExtractor> implements ConfigValueExtractor { +public class EnumConfigValueMapper> implements ConfigValueMapper { private final HashMap map; - public EnumConfigValueExtractor(Class type) { + public EnumConfigValueMapper(Class type) { this.map = new HashMap<>(); for (T enumConstant : type.getEnumConstants()) { this.map.put(enumConstant.toString(), enumConstant); @@ -18,7 +19,7 @@ public EnumConfigValueExtractor(Class type) { @Nullable @Override - public T extract(ConfigValue value) { + public T map(ConfigValue value) { if (value.isNull()) { return null; } @@ -27,10 +28,10 @@ public T extract(ConfigValue value) { var str = stringValue.value(); var enumValue = this.map.get(str); if (enumValue == null) { - throw ConfigValueExtractionException.parsingError(value, new IllegalArgumentException("Unknown enum value: " + str + " when expected one of " + map.keySet())); + throw ConfigValueException.parsingError(value, new IllegalArgumentException("Unknown enum value: " + str + " when expected one of " + map.keySet())); } return enumValue; } - throw ConfigValueExtractionException.unexpectedValueType(value, ConfigValue.StringValue.class); + throw ConfigValueException.unexpectedValueType(value, ConfigValue.StringValue.class); } } diff --git a/config/config-common/src/main/java/io/koraframework/config/common/mapper/ListConfigValueMapper.java b/config/config-common/src/main/java/io/koraframework/config/common/mapper/ListConfigValueMapper.java new file mode 100644 index 000000000..50f28f885 --- /dev/null +++ b/config/config-common/src/main/java/io/koraframework/config/common/mapper/ListConfigValueMapper.java @@ -0,0 +1,16 @@ +package io.koraframework.config.common.mapper; + +import java.util.ArrayList; +import java.util.List; + +public final class ListConfigValueMapper extends CollectionConfigValueMapper> { + + public ListConfigValueMapper(ConfigValueMapper elementValueMapper) { + super(elementValueMapper); + } + + @Override + protected List newCollection(int size) { + return new ArrayList<>(); + } +} diff --git a/config/config-common/src/main/java/io/koraframework/config/common/extractor/LocalDateConfigValueExtractor.java b/config/config-common/src/main/java/io/koraframework/config/common/mapper/LocalDateConfigValueMapper.java similarity index 59% rename from config/config-common/src/main/java/io/koraframework/config/common/extractor/LocalDateConfigValueExtractor.java rename to config/config-common/src/main/java/io/koraframework/config/common/mapper/LocalDateConfigValueMapper.java index d6297745c..c26eb9c86 100644 --- a/config/config-common/src/main/java/io/koraframework/config/common/extractor/LocalDateConfigValueExtractor.java +++ b/config/config-common/src/main/java/io/koraframework/config/common/mapper/LocalDateConfigValueMapper.java @@ -1,15 +1,15 @@ -package io.koraframework.config.common.extractor; +package io.koraframework.config.common.mapper; import org.jspecify.annotations.Nullable; import io.koraframework.config.common.ConfigValue; import java.time.LocalDate; -public class LocalDateConfigValueExtractor implements ConfigValueExtractor { +public class LocalDateConfigValueMapper implements ConfigValueMapper { @Nullable @Override - public LocalDate extract(ConfigValue value) { + public LocalDate map(ConfigValue value) { if (value.isNull()) { return null; } diff --git a/config/config-common/src/main/java/io/koraframework/config/common/extractor/LocalDateTimeConfigValueExtractor.java b/config/config-common/src/main/java/io/koraframework/config/common/mapper/LocalDateTimeConfigValueMapper.java similarity index 58% rename from config/config-common/src/main/java/io/koraframework/config/common/extractor/LocalDateTimeConfigValueExtractor.java rename to config/config-common/src/main/java/io/koraframework/config/common/mapper/LocalDateTimeConfigValueMapper.java index ba52aaccf..2706e514d 100644 --- a/config/config-common/src/main/java/io/koraframework/config/common/extractor/LocalDateTimeConfigValueExtractor.java +++ b/config/config-common/src/main/java/io/koraframework/config/common/mapper/LocalDateTimeConfigValueMapper.java @@ -1,15 +1,15 @@ -package io.koraframework.config.common.extractor; +package io.koraframework.config.common.mapper; import org.jspecify.annotations.Nullable; import io.koraframework.config.common.ConfigValue; import java.time.LocalDateTime; -public class LocalDateTimeConfigValueExtractor implements ConfigValueExtractor { +public class LocalDateTimeConfigValueMapper implements ConfigValueMapper { @Nullable @Override - public LocalDateTime extract(ConfigValue value) { + public LocalDateTime map(ConfigValue value) { if (value.isNull()) { return null; } diff --git a/config/config-common/src/main/java/io/koraframework/config/common/extractor/LocalTimeConfigValueExtractor.java b/config/config-common/src/main/java/io/koraframework/config/common/mapper/LocalTimeConfigValueMapper.java similarity index 59% rename from config/config-common/src/main/java/io/koraframework/config/common/extractor/LocalTimeConfigValueExtractor.java rename to config/config-common/src/main/java/io/koraframework/config/common/mapper/LocalTimeConfigValueMapper.java index 7f4f188a6..6f5189dac 100644 --- a/config/config-common/src/main/java/io/koraframework/config/common/extractor/LocalTimeConfigValueExtractor.java +++ b/config/config-common/src/main/java/io/koraframework/config/common/mapper/LocalTimeConfigValueMapper.java @@ -1,15 +1,15 @@ -package io.koraframework.config.common.extractor; +package io.koraframework.config.common.mapper; import org.jspecify.annotations.Nullable; import io.koraframework.config.common.ConfigValue; import java.time.LocalTime; -public class LocalTimeConfigValueExtractor implements ConfigValueExtractor { +public class LocalTimeConfigValueMapper implements ConfigValueMapper { @Nullable @Override - public LocalTime extract(ConfigValue value) { + public LocalTime map(ConfigValue value) { if (value.isNull()) { return null; } diff --git a/config/config-common/src/main/java/io/koraframework/config/common/mapper/MapConfigKeyValueMapper.java b/config/config-common/src/main/java/io/koraframework/config/common/mapper/MapConfigKeyValueMapper.java new file mode 100644 index 000000000..3217e28ec --- /dev/null +++ b/config/config-common/src/main/java/io/koraframework/config/common/mapper/MapConfigKeyValueMapper.java @@ -0,0 +1,37 @@ +package io.koraframework.config.common.mapper; + +import io.koraframework.config.common.exception.ConfigValueException; +import org.jspecify.annotations.Nullable; +import io.koraframework.config.common.ConfigValue; + +import java.util.LinkedHashMap; +import java.util.Map; + +import static io.koraframework.config.common.ConfigValue.ObjectValue; + +public final class MapConfigKeyValueMapper implements ConfigValueMapper> { + + private final ConfigValueMapper mapKeyExtractor; + private final ConfigValueMapper mapValueMapper; + + public MapConfigKeyValueMapper(ConfigValueMapper mapKeyExtractor, + ConfigValueMapper mapValueMapper) { + this.mapKeyExtractor = mapKeyExtractor; + this.mapValueMapper = mapValueMapper; + } + + @Override + public Map map(ConfigValue configValue) { + if (configValue instanceof ObjectValue objectValue) { + var result = new LinkedHashMap(objectValue.value().size()); + for (var entry : objectValue) { + K key = mapKeyExtractor.map(new ConfigValue.StringValue(entry.getValue().origin(), entry.getKey())); + V value = mapValueMapper.map(entry.getValue()); + result.put(key, value); + } + + return result; + } + throw ConfigValueException.unexpectedValueType(configValue, ObjectValue.class); + } +} diff --git a/config/config-common/src/main/java/io/koraframework/config/common/mapper/MapConfigValueMapper.java b/config/config-common/src/main/java/io/koraframework/config/common/mapper/MapConfigValueMapper.java new file mode 100644 index 000000000..f18376925 --- /dev/null +++ b/config/config-common/src/main/java/io/koraframework/config/common/mapper/MapConfigValueMapper.java @@ -0,0 +1,36 @@ +package io.koraframework.config.common.mapper; + +import io.koraframework.config.common.exception.ConfigValueException; +import org.jspecify.annotations.Nullable; +import io.koraframework.config.common.ConfigValue; + +import java.util.LinkedHashMap; +import java.util.Map; + +import static io.koraframework.config.common.ConfigValue.ObjectValue; + +public final class MapConfigValueMapper implements ConfigValueMapper> { + private final ConfigValueMapper mapValueMapper; + + public MapConfigValueMapper(ConfigValueMapper mapValueMapper) { + this.mapValueMapper = mapValueMapper; + } + + @Nullable + @Override + public Map map(ConfigValue value) { + if (value.isNull()) { + return null; + } + + if (value instanceof ObjectValue objectValue) { + var result = new LinkedHashMap(objectValue.value().size()); + for (var entry : objectValue) { + result.put(entry.getKey(), mapValueMapper.map(entry.getValue())); + } + + return result; + } + throw ConfigValueException.unexpectedValueType(value, ObjectValue.class); + } +} diff --git a/config/config-common/src/main/java/io/koraframework/config/common/extractor/NumberConfigValueExtractor.java b/config/config-common/src/main/java/io/koraframework/config/common/mapper/NumberConfigValueMapper.java similarity index 64% rename from config/config-common/src/main/java/io/koraframework/config/common/extractor/NumberConfigValueExtractor.java rename to config/config-common/src/main/java/io/koraframework/config/common/mapper/NumberConfigValueMapper.java index 733ca3f36..ad2f82043 100644 --- a/config/config-common/src/main/java/io/koraframework/config/common/extractor/NumberConfigValueExtractor.java +++ b/config/config-common/src/main/java/io/koraframework/config/common/mapper/NumberConfigValueMapper.java @@ -1,15 +1,16 @@ -package io.koraframework.config.common.extractor; +package io.koraframework.config.common.mapper; import io.koraframework.config.common.ConfigValue; +import io.koraframework.config.common.exception.ConfigValueException; import org.jspecify.annotations.Nullable; import java.math.BigDecimal; -public final class NumberConfigValueExtractor implements ConfigValueExtractor { +public final class NumberConfigValueMapper implements ConfigValueMapper { @Nullable @Override - public BigDecimal extract(ConfigValue value) { + public BigDecimal map(ConfigValue value) { if (value.isNull()) { return null; } @@ -23,6 +24,6 @@ public BigDecimal extract(ConfigValue value) { //fallback to unexpectedValueType } } - throw ConfigValueExtractionException.unexpectedValueType(value, ConfigValue.NumberValue.class); + throw ConfigValueException.unexpectedValueType(value, ConfigValue.NumberValue.class); } } diff --git a/config/config-common/src/main/java/io/koraframework/config/common/extractor/OffsetDateTimeConfigValueExtractor.java b/config/config-common/src/main/java/io/koraframework/config/common/mapper/OffsetDateTimeConfigValueMapper.java similarity index 58% rename from config/config-common/src/main/java/io/koraframework/config/common/extractor/OffsetDateTimeConfigValueExtractor.java rename to config/config-common/src/main/java/io/koraframework/config/common/mapper/OffsetDateTimeConfigValueMapper.java index f623029de..e1afad904 100644 --- a/config/config-common/src/main/java/io/koraframework/config/common/extractor/OffsetDateTimeConfigValueExtractor.java +++ b/config/config-common/src/main/java/io/koraframework/config/common/mapper/OffsetDateTimeConfigValueMapper.java @@ -1,15 +1,15 @@ -package io.koraframework.config.common.extractor; +package io.koraframework.config.common.mapper; import org.jspecify.annotations.Nullable; import io.koraframework.config.common.ConfigValue; import java.time.OffsetDateTime; -public class OffsetDateTimeConfigValueExtractor implements ConfigValueExtractor { +public class OffsetDateTimeConfigValueMapper implements ConfigValueMapper { @Nullable @Override - public OffsetDateTime extract(ConfigValue value) { + public OffsetDateTime map(ConfigValue value) { if (value.isNull()) { return null; } diff --git a/config/config-common/src/main/java/io/koraframework/config/common/extractor/OffsetTimeConfigValueExtractor.java b/config/config-common/src/main/java/io/koraframework/config/common/mapper/OffsetTimeConfigValueMapper.java similarity index 58% rename from config/config-common/src/main/java/io/koraframework/config/common/extractor/OffsetTimeConfigValueExtractor.java rename to config/config-common/src/main/java/io/koraframework/config/common/mapper/OffsetTimeConfigValueMapper.java index e12a993c5..b99ae9a81 100644 --- a/config/config-common/src/main/java/io/koraframework/config/common/extractor/OffsetTimeConfigValueExtractor.java +++ b/config/config-common/src/main/java/io/koraframework/config/common/mapper/OffsetTimeConfigValueMapper.java @@ -1,15 +1,15 @@ -package io.koraframework.config.common.extractor; +package io.koraframework.config.common.mapper; import org.jspecify.annotations.Nullable; import io.koraframework.config.common.ConfigValue; import java.time.OffsetTime; -public class OffsetTimeConfigValueExtractor implements ConfigValueExtractor { +public class OffsetTimeConfigValueMapper implements ConfigValueMapper { @Nullable @Override - public OffsetTime extract(ConfigValue value) { + public OffsetTime map(ConfigValue value) { if (value.isNull()) { return null; } diff --git a/config/config-common/src/main/java/io/koraframework/config/common/mapper/OptionalConfigValueMapper.java b/config/config-common/src/main/java/io/koraframework/config/common/mapper/OptionalConfigValueMapper.java new file mode 100644 index 000000000..c9c83b544 --- /dev/null +++ b/config/config-common/src/main/java/io/koraframework/config/common/mapper/OptionalConfigValueMapper.java @@ -0,0 +1,23 @@ +package io.koraframework.config.common.mapper; + +import io.koraframework.config.common.ConfigValue; + +import java.util.Optional; + +public final class OptionalConfigValueMapper implements ConfigValueMapper> { + + private final ConfigValueMapper delegate; + + public OptionalConfigValueMapper(ConfigValueMapper delegate) { + this.delegate = delegate; + } + + @Override + public Optional map(ConfigValue value) { + if (value.isNull()) { + return Optional.empty(); + } + var parsed = this.delegate.map(value); + return Optional.ofNullable(parsed); + } +} diff --git a/config/config-common/src/main/java/io/koraframework/config/common/extractor/PatternConfigValueExtractor.java b/config/config-common/src/main/java/io/koraframework/config/common/mapper/PatternConfigValueMapper.java similarity index 52% rename from config/config-common/src/main/java/io/koraframework/config/common/extractor/PatternConfigValueExtractor.java rename to config/config-common/src/main/java/io/koraframework/config/common/mapper/PatternConfigValueMapper.java index 1134cea8e..01f847849 100644 --- a/config/config-common/src/main/java/io/koraframework/config/common/extractor/PatternConfigValueExtractor.java +++ b/config/config-common/src/main/java/io/koraframework/config/common/mapper/PatternConfigValueMapper.java @@ -1,15 +1,16 @@ -package io.koraframework.config.common.extractor; +package io.koraframework.config.common.mapper; +import io.koraframework.config.common.exception.ConfigValueException; import org.jspecify.annotations.Nullable; import io.koraframework.config.common.ConfigValue; import java.util.regex.Pattern; -public class PatternConfigValueExtractor implements ConfigValueExtractor { +public class PatternConfigValueMapper implements ConfigValueMapper { @Nullable @Override - public Pattern extract(ConfigValue value) { + public Pattern map(ConfigValue value) { if (value.isNull()) { return null; } @@ -17,7 +18,7 @@ public Pattern extract(ConfigValue value) { if (value instanceof ConfigValue.StringValue stringValue) { return Pattern.compile(stringValue.value()); } else { - throw ConfigValueExtractionException.unexpectedValueType(value, ConfigValue.StringValue.class); + throw ConfigValueException.unexpectedValueType(value, ConfigValue.StringValue.class); } } } diff --git a/config/config-common/src/main/java/io/koraframework/config/common/extractor/PeriodConfigValueExtractor.java b/config/config-common/src/main/java/io/koraframework/config/common/mapper/PeriodConfigValueMapper.java similarity index 71% rename from config/config-common/src/main/java/io/koraframework/config/common/extractor/PeriodConfigValueExtractor.java rename to config/config-common/src/main/java/io/koraframework/config/common/mapper/PeriodConfigValueMapper.java index 7070f4793..4d72f9c1c 100644 --- a/config/config-common/src/main/java/io/koraframework/config/common/extractor/PeriodConfigValueExtractor.java +++ b/config/config-common/src/main/java/io/koraframework/config/common/mapper/PeriodConfigValueMapper.java @@ -1,5 +1,7 @@ -package io.koraframework.config.common.extractor; +package io.koraframework.config.common.mapper; +import io.koraframework.config.common.exception.ConfigValueException; +import io.koraframework.config.common.util.ConfigValueMapperUtils; import org.jspecify.annotations.Nullable; import io.koraframework.config.common.ConfigValue; @@ -7,11 +9,11 @@ import java.time.Period; import java.time.temporal.ChronoUnit; -public class PeriodConfigValueExtractor implements ConfigValueExtractor { +public class PeriodConfigValueMapper implements ConfigValueMapper { @Nullable @Override - public Period extract(ConfigValue value) { + public Period map(ConfigValue value) { if (value.isNull()) { return null; } @@ -19,26 +21,26 @@ public Period extract(ConfigValue value) { return Period.ofDays(number.value().intValue()); } if (!(value instanceof ConfigValue.StringValue str)) { - throw ConfigValueExtractionException.unexpectedValueType(value, ConfigValue.StringValue.class); + throw ConfigValueException.unexpectedValueType(value, ConfigValue.StringValue.class); } try { return parsePeriod(str); } catch (Exception e) { - throw ConfigValueExtractionException.parsingError(value, e); + throw ConfigValueException.parsingError(value, e); } } public static Period parsePeriod(ConfigValue configValue) { - var s = ExtractorUtils.unicodeTrim(configValue.value()); + var s = ConfigValueMapperUtils.unicodeTrim(configValue.value()); var originalUnitString = getUnits(s); var unitString = originalUnitString; - var numberString = ExtractorUtils.unicodeTrim(s.substring(0, s.length() - unitString.length())); + var numberString = ConfigValueMapperUtils.unicodeTrim(s.substring(0, s.length() - unitString.length())); // this would be caught later anyway, but the error message // is more helpful if we check it here. if (numberString.isEmpty()) - throw new ConfigValueExtractionException(configValue.origin().config(), "No number in period value " + configValue.origin().path(), null); + throw new ConfigValueException(configValue.origin().config(), "No number in period value " + configValue.origin().path(), null); if (unitString.length() > 2 && !unitString.endsWith("s")) unitString = unitString + "s"; @@ -50,7 +52,7 @@ public static Period parsePeriod(ConfigValue configValue) { case "m", "mo", "months" -> ChronoUnit.MONTHS; case "y", "years" -> ChronoUnit.YEARS; - default -> throw new ConfigValueExtractionException( + default -> throw new ConfigValueException( configValue.origin().config(), "Could not parse time unit '%s' (try d, w, mo, y) in %s".formatted(originalUnitString, configValue.origin().path()), null @@ -60,7 +62,7 @@ public static Period parsePeriod(ConfigValue configValue) { try { return periodOf(Integer.parseInt(numberString), units); } catch (NumberFormatException e) { - throw new ConfigValueExtractionException(configValue.origin().config(), "Could not parse period number %s in %s".formatted(numberString, configValue.origin().path()), null); + throw new ConfigValueException(configValue.origin().config(), "Could not parse period number %s in %s".formatted(numberString, configValue.origin().path()), null); } } diff --git a/config/config-common/src/main/java/io/koraframework/config/common/extractor/PropertiesConfigValueExtractor.java b/config/config-common/src/main/java/io/koraframework/config/common/mapper/PropertiesConfigValueMapper.java similarity index 80% rename from config/config-common/src/main/java/io/koraframework/config/common/extractor/PropertiesConfigValueExtractor.java rename to config/config-common/src/main/java/io/koraframework/config/common/mapper/PropertiesConfigValueMapper.java index f5d0fcea8..babe7fee9 100644 --- a/config/config-common/src/main/java/io/koraframework/config/common/extractor/PropertiesConfigValueExtractor.java +++ b/config/config-common/src/main/java/io/koraframework/config/common/mapper/PropertiesConfigValueMapper.java @@ -1,21 +1,22 @@ -package io.koraframework.config.common.extractor; +package io.koraframework.config.common.mapper; +import io.koraframework.config.common.exception.ConfigValueException; import org.jspecify.annotations.Nullable; import io.koraframework.config.common.ConfigValue; import java.util.ArrayList; import java.util.Properties; -public class PropertiesConfigValueExtractor implements ConfigValueExtractor { +public class PropertiesConfigValueMapper implements ConfigValueMapper { @Nullable @Override - public Properties extract(ConfigValue value) { + public Properties map(ConfigValue value) { if (value.isNull()) { return null; } if (!(value instanceof ConfigValue.ObjectValue objectValue)) { - throw ConfigValueExtractionException.unexpectedValueType(value, ConfigValue.ObjectValue.class); + throw ConfigValueException.unexpectedValueType(value, ConfigValue.ObjectValue.class); } var accumulator = new Properties(); diff --git a/config/config-common/src/main/java/io/koraframework/config/common/mapper/SetConfigValueMapper.java b/config/config-common/src/main/java/io/koraframework/config/common/mapper/SetConfigValueMapper.java new file mode 100644 index 000000000..d2c2ce0ef --- /dev/null +++ b/config/config-common/src/main/java/io/koraframework/config/common/mapper/SetConfigValueMapper.java @@ -0,0 +1,16 @@ +package io.koraframework.config.common.mapper; + +import java.util.LinkedHashSet; +import java.util.Set; + +public final class SetConfigValueMapper extends CollectionConfigValueMapper> { + + public SetConfigValueMapper(ConfigValueMapper elementValueMapper) { + super(elementValueMapper); + } + + @Override + protected Set newCollection(int size) { + return new LinkedHashSet<>(); + } +} diff --git a/config/config-common/src/main/java/io/koraframework/config/common/extractor/SizeConfigValueExtractor.java b/config/config-common/src/main/java/io/koraframework/config/common/mapper/SizeConfigValueMapper.java similarity index 56% rename from config/config-common/src/main/java/io/koraframework/config/common/extractor/SizeConfigValueExtractor.java rename to config/config-common/src/main/java/io/koraframework/config/common/mapper/SizeConfigValueMapper.java index 58f08a855..9f13a95ec 100644 --- a/config/config-common/src/main/java/io/koraframework/config/common/extractor/SizeConfigValueExtractor.java +++ b/config/config-common/src/main/java/io/koraframework/config/common/mapper/SizeConfigValueMapper.java @@ -1,14 +1,15 @@ -package io.koraframework.config.common.extractor; +package io.koraframework.config.common.mapper; +import io.koraframework.config.common.exception.ConfigValueException; import org.jspecify.annotations.Nullable; import io.koraframework.common.util.Size; import io.koraframework.config.common.ConfigValue; -public final class SizeConfigValueExtractor implements ConfigValueExtractor { +public final class SizeConfigValueMapper implements ConfigValueMapper { @Nullable @Override - public Size extract(ConfigValue value) { + public Size map(ConfigValue value) { if (value.isNull()) { return null; } @@ -16,7 +17,7 @@ public Size extract(ConfigValue value) { return switch (value) { case ConfigValue.NumberValue number -> Size.ofBytesBinary(number.value().longValue()); case ConfigValue.StringValue string -> Size.parse(string.value()); - default -> throw ConfigValueExtractionException.unexpectedValueType(value, ConfigValue.StringValue.class); + default -> throw ConfigValueException.unexpectedValueType(value, ConfigValue.StringValue.class); }; } } diff --git a/config/config-common/src/main/java/io/koraframework/config/common/extractor/StringConfigValueExtractor.java b/config/config-common/src/main/java/io/koraframework/config/common/mapper/StringConfigValueMapper.java similarity index 58% rename from config/config-common/src/main/java/io/koraframework/config/common/extractor/StringConfigValueExtractor.java rename to config/config-common/src/main/java/io/koraframework/config/common/mapper/StringConfigValueMapper.java index 41a0f2cd8..dbcd8b8f7 100644 --- a/config/config-common/src/main/java/io/koraframework/config/common/extractor/StringConfigValueExtractor.java +++ b/config/config-common/src/main/java/io/koraframework/config/common/mapper/StringConfigValueMapper.java @@ -1,12 +1,13 @@ -package io.koraframework.config.common.extractor; +package io.koraframework.config.common.mapper; +import io.koraframework.config.common.exception.ConfigValueException; import org.jspecify.annotations.Nullable; import io.koraframework.config.common.ConfigValue; -public final class StringConfigValueExtractor implements ConfigValueExtractor { +public final class StringConfigValueMapper implements ConfigValueMapper { @Nullable @Override - public String extract(ConfigValue value) { + public String map(ConfigValue value) { if (value.isNull()) { return null; } @@ -15,7 +16,7 @@ public String extract(ConfigValue value) { case ConfigValue.NumberValue numberValue -> numberValue.value().toString(); case ConfigValue.BooleanValue booleanValue -> booleanValue.value().toString(); case ConfigValue.StringValue stringValue -> stringValue.value(); - default -> throw ConfigValueExtractionException.unexpectedValueType(value, ConfigValue.StringValue.class); + default -> throw ConfigValueException.unexpectedValueType(value, ConfigValue.StringValue.class); }; } } diff --git a/config/config-common/src/main/java/io/koraframework/config/common/extractor/UUIDConfigValueExtractor.java b/config/config-common/src/main/java/io/koraframework/config/common/mapper/UUIDConfigValueMapper.java similarity index 53% rename from config/config-common/src/main/java/io/koraframework/config/common/extractor/UUIDConfigValueExtractor.java rename to config/config-common/src/main/java/io/koraframework/config/common/mapper/UUIDConfigValueMapper.java index 6693157b1..315b3572c 100644 --- a/config/config-common/src/main/java/io/koraframework/config/common/extractor/UUIDConfigValueExtractor.java +++ b/config/config-common/src/main/java/io/koraframework/config/common/mapper/UUIDConfigValueMapper.java @@ -1,15 +1,16 @@ -package io.koraframework.config.common.extractor; +package io.koraframework.config.common.mapper; +import io.koraframework.config.common.exception.ConfigValueException; import org.jspecify.annotations.Nullable; import io.koraframework.config.common.ConfigValue; import java.util.UUID; -public class UUIDConfigValueExtractor implements ConfigValueExtractor { +public class UUIDConfigValueMapper implements ConfigValueMapper { @Nullable @Override - public UUID extract(ConfigValue value) { + public UUID map(ConfigValue value) { if (value.isNull()) { return null; } @@ -17,7 +18,7 @@ public UUID extract(ConfigValue value) { if (value instanceof ConfigValue.StringValue stringValue) { return UUID.fromString(stringValue.value()); } else { - throw ConfigValueExtractionException.unexpectedValueType(value, ConfigValue.StringValue.class); + throw ConfigValueException.unexpectedValueType(value, ConfigValue.StringValue.class); } } } diff --git a/config/config-common/src/main/java/io/koraframework/config/common/factory/MapConfigFactory.java b/config/config-common/src/main/java/io/koraframework/config/common/util/ConfigMappingUtils.java similarity index 94% rename from config/config-common/src/main/java/io/koraframework/config/common/factory/MapConfigFactory.java rename to config/config-common/src/main/java/io/koraframework/config/common/util/ConfigMappingUtils.java index dd3ca650b..3e927e705 100644 --- a/config/config-common/src/main/java/io/koraframework/config/common/factory/MapConfigFactory.java +++ b/config/config-common/src/main/java/io/koraframework/config/common/util/ConfigMappingUtils.java @@ -1,10 +1,10 @@ -package io.koraframework.config.common.factory; +package io.koraframework.config.common.util; import io.koraframework.config.common.Config; import io.koraframework.config.common.ConfigValue; import io.koraframework.config.common.ConfigValuePath; import io.koraframework.config.common.PathElement; -import io.koraframework.config.common.extractor.ConfigValueExtractionException; +import io.koraframework.config.common.exception.ConfigValueException; import io.koraframework.config.common.impl.SimpleConfig; import io.koraframework.config.common.impl.SimpleConfigValueOrigin; import io.koraframework.config.common.origin.ConfigOrigin; @@ -12,9 +12,9 @@ import java.util.*; -public final class MapConfigFactory { +public final class ConfigMappingUtils { - private MapConfigFactory() {} + private ConfigMappingUtils() {} public static Config fromMap(Map map) { return fromMap("Map@" + System.identityHashCode(map), map); @@ -139,21 +139,18 @@ public static Config fromProperties(ConfigOrigin origin, Properties properties) return fromMap(origin, map); } + @SuppressWarnings("unchecked") private static ConfigValue toValue(ConfigOrigin origin, Object object, ConfigValuePath path) { return switch (object) { case ConfigValue configValue -> configValue; case Config configValue -> configValue.root(); - case Map _ -> { - @SuppressWarnings("unchecked") - var map = (Map) object; - yield toObject(origin, map, path); - } + case Map _ -> toObject(origin, (Map) object, path); case List list -> toList(origin, list, path); case Number number -> new ConfigValue.NumberValue(new SimpleConfigValueOrigin(origin, path), number); case String string -> new ConfigValue.StringValue(new SimpleConfigValueOrigin(origin, path), string); case Boolean bool -> new ConfigValue.BooleanValue(new SimpleConfigValueOrigin(origin, path), bool); case Enum e -> new ConfigValue.StringValue(new SimpleConfigValueOrigin(origin, path), e.name()); - case null, default -> throw new ConfigValueExtractionException(origin, + case null, default -> throw new ConfigValueException(origin, "Unexpected object type with path %s: %s. Supported types are Map, List, String, Number, Boolean and Enum".formatted(path, object.getClass()) ); }; @@ -182,5 +179,4 @@ private static ConfigValue.ArrayValue toList(ConfigOrigin origin, List list, } return new ConfigValue.ArrayValue(new SimpleConfigValueOrigin(origin, path), Collections.unmodifiableList(result)); } - } diff --git a/config/config-common/src/main/java/io/koraframework/config/common/factory/MergeConfigFactory.java b/config/config-common/src/main/java/io/koraframework/config/common/util/ConfigMergingUtils.java similarity index 93% rename from config/config-common/src/main/java/io/koraframework/config/common/factory/MergeConfigFactory.java rename to config/config-common/src/main/java/io/koraframework/config/common/util/ConfigMergingUtils.java index e9e62c5b2..6463ce734 100644 --- a/config/config-common/src/main/java/io/koraframework/config/common/factory/MergeConfigFactory.java +++ b/config/config-common/src/main/java/io/koraframework/config/common/util/ConfigMergingUtils.java @@ -1,4 +1,4 @@ -package io.koraframework.config.common.factory; +package io.koraframework.config.common.util; import org.jspecify.annotations.Nullable; import io.koraframework.config.common.Config; @@ -11,9 +11,9 @@ import java.util.LinkedHashMap; -public final class MergeConfigFactory { +public final class ConfigMergingUtils { - private MergeConfigFactory() { } + private ConfigMergingUtils() { } public static Config merge(Config config, Config fallback) { var root1 = config.root(); @@ -30,10 +30,10 @@ public static Config merge(Config config, Config fallback) { private static ConfigValue merge(ConfigOrigin origin, ConfigValuePath path, @Nullable ConfigValue value1, @Nullable ConfigValue value2) { if (value1 == null) { return value2; - } - if (value2 == null) { + } else if (value2 == null) { return value1; } + if (value1 instanceof ConfigValue.ObjectValue object1 && value2 instanceof ConfigValue.ObjectValue object2) { return mergeObjects(origin, path, object1, object2); } else { diff --git a/config/config-common/src/main/java/io/koraframework/config/common/impl/ConfigResolver.java b/config/config-common/src/main/java/io/koraframework/config/common/util/ConfigResolverUtils.java similarity index 97% rename from config/config-common/src/main/java/io/koraframework/config/common/impl/ConfigResolver.java rename to config/config-common/src/main/java/io/koraframework/config/common/util/ConfigResolverUtils.java index 13de9a5b3..8467e7524 100644 --- a/config/config-common/src/main/java/io/koraframework/config/common/impl/ConfigResolver.java +++ b/config/config-common/src/main/java/io/koraframework/config/common/util/ConfigResolverUtils.java @@ -1,8 +1,9 @@ -package io.koraframework.config.common.impl; +package io.koraframework.config.common.util; import io.koraframework.config.common.Config; import io.koraframework.config.common.ConfigValue; import io.koraframework.config.common.ConfigValuePath; +import io.koraframework.config.common.impl.SimpleConfig; import io.koraframework.config.common.origin.EnvironmentOrigin; import io.koraframework.config.common.origin.SystemPropertiesOrigin; @@ -10,7 +11,9 @@ import java.util.ArrayList; import java.util.LinkedHashMap; -public final class ConfigResolver { +public final class ConfigResolverUtils { + + private ConfigResolverUtils() { } private record ResolveContext(Config root, ArrayDeque chain, boolean resolveProperties) {} diff --git a/config/config-common/src/main/java/io/koraframework/config/common/impl/ConfigUtils.java b/config/config-common/src/main/java/io/koraframework/config/common/util/ConfigValueExtractorUtils.java similarity index 79% rename from config/config-common/src/main/java/io/koraframework/config/common/impl/ConfigUtils.java rename to config/config-common/src/main/java/io/koraframework/config/common/util/ConfigValueExtractorUtils.java index b696208b7..aa8b6e474 100644 --- a/config/config-common/src/main/java/io/koraframework/config/common/impl/ConfigUtils.java +++ b/config/config-common/src/main/java/io/koraframework/config/common/util/ConfigValueExtractorUtils.java @@ -1,18 +1,18 @@ -package io.koraframework.config.common.impl; +package io.koraframework.config.common.util; import io.koraframework.config.common.Config; import io.koraframework.config.common.ConfigValue; import io.koraframework.config.common.ConfigValuePath; import io.koraframework.config.common.PathElement; -import io.koraframework.config.common.extractor.ConfigValueExtractionException; +import io.koraframework.config.common.exception.ConfigValueException; import java.util.LinkedList; -public final class ConfigUtils { +public final class ConfigValueExtractorUtils { - private ConfigUtils() { } + private ConfigValueExtractorUtils() { } - public static ConfigValue get(Config config, ConfigValuePath path) { + public static ConfigValue extract(Config config, ConfigValuePath path) { var value = (ConfigValue) config.root(); var parts = new LinkedList(); while (path != null) { @@ -36,7 +36,7 @@ public static ConfigValue get(Config config, ConfigValuePath path) { return new ConfigValue.NullValue(origin); } } else { - throw ConfigValueExtractionException.unexpectedValueType(value, ConfigValue.ArrayValue.class); + throw ConfigValueException.unexpectedValueType(value, ConfigValue.ArrayValue.class); } } else if (part instanceof PathElement.Key f) { if (value instanceof ConfigValue.ObjectValue objectValue) { @@ -50,7 +50,7 @@ public static ConfigValue get(Config config, ConfigValuePath path) { return new ConfigValue.NullValue(origin); } } else { - throw ConfigValueExtractionException.unexpectedValueType(value, ConfigValue.ArrayValue.class); + throw ConfigValueException.unexpectedValueType(value, ConfigValue.ArrayValue.class); } } else { throw new IllegalStateException(); diff --git a/config/config-common/src/main/java/io/koraframework/config/common/extractor/ExtractorUtils.java b/config/config-common/src/main/java/io/koraframework/config/common/util/ConfigValueMapperUtils.java similarity index 93% rename from config/config-common/src/main/java/io/koraframework/config/common/extractor/ExtractorUtils.java rename to config/config-common/src/main/java/io/koraframework/config/common/util/ConfigValueMapperUtils.java index 66820efd6..5d8d0a692 100644 --- a/config/config-common/src/main/java/io/koraframework/config/common/extractor/ExtractorUtils.java +++ b/config/config-common/src/main/java/io/koraframework/config/common/util/ConfigValueMapperUtils.java @@ -1,8 +1,8 @@ -package io.koraframework.config.common.extractor; +package io.koraframework.config.common.util; -public final class ExtractorUtils { +public final class ConfigValueMapperUtils { - private ExtractorUtils() { } + private ConfigValueMapperUtils() { } public static String unicodeTrim(String s) { // this is dumb because it looks like there aren't any whitespace diff --git a/config/config-common/src/main/java/module-info.java b/config/config-common/src/main/java/module-info.java index 58b85ce45..620cdf921 100644 --- a/config/config-common/src/main/java/module-info.java +++ b/config/config-common/src/main/java/module-info.java @@ -7,8 +7,9 @@ exports io.koraframework.config.common; exports io.koraframework.config.common.annotation; - exports io.koraframework.config.common.extractor; - exports io.koraframework.config.common.factory; + exports io.koraframework.config.common.mapper; exports io.koraframework.config.common.origin; exports io.koraframework.config.common.impl; + exports io.koraframework.config.common.util; + exports io.koraframework.config.common.exception; } diff --git a/config/config-common/src/test/java/io/koraframework/config/common/CommonConfigModuleTest.java b/config/config-common/src/test/java/io/koraframework/config/common/ConfigModuleTest.java similarity index 58% rename from config/config-common/src/test/java/io/koraframework/config/common/CommonConfigModuleTest.java rename to config/config-common/src/test/java/io/koraframework/config/common/ConfigModuleTest.java index 351420980..27fa181f4 100644 --- a/config/config-common/src/test/java/io/koraframework/config/common/CommonConfigModuleTest.java +++ b/config/config-common/src/test/java/io/koraframework/config/common/ConfigModuleTest.java @@ -4,9 +4,9 @@ import org.junit.jupiter.api.Test; -class CommonConfigModuleTest { +class ConfigModuleTest { @Test void testSystemProperties() { - Assertions.assertNotNull(new CommonConfigModule() {}.systemPropertiesConfig()); + Assertions.assertNotNull(new ConfigModule() {}.systemPropertiesConfig()); } } diff --git a/config/config-common/src/test/java/io/koraframework/config/common/ConfigWatcherTest.java b/config/config-common/src/test/java/io/koraframework/config/common/ConfigWatcherTest.java index 60633dc7e..9648ee5bc 100644 --- a/config/config-common/src/test/java/io/koraframework/config/common/ConfigWatcherTest.java +++ b/config/config-common/src/test/java/io/koraframework/config/common/ConfigWatcherTest.java @@ -5,7 +5,7 @@ import io.koraframework.application.graph.ApplicationGraphDraw; import io.koraframework.application.graph.InitializedGraph; import io.koraframework.application.graph.ValueOf; -import io.koraframework.config.common.factory.MapConfigFactory; +import io.koraframework.config.common.util.ConfigMappingUtils; import io.koraframework.config.common.origin.ConfigOrigin; import io.koraframework.config.common.origin.ContainerConfigOrigin; import io.koraframework.config.common.origin.FileConfigOrigin; @@ -170,6 +170,6 @@ private Config load(ContainerConfigOrigin origin) throws IOException { try (var is = Files.newInputStream(ConfigWatcherTest.this.configFile)) { properties.load(is); } - return MapConfigFactory.fromProperties(origin, properties); + return ConfigMappingUtils.fromProperties(origin, properties); } } diff --git a/config/config-common/src/test/java/io/koraframework/config/common/PropertiesExtractorTest.java b/config/config-common/src/test/java/io/koraframework/config/common/PropertiesExtractorTest.java index a67d8451b..565f3e152 100644 --- a/config/config-common/src/test/java/io/koraframework/config/common/PropertiesExtractorTest.java +++ b/config/config-common/src/test/java/io/koraframework/config/common/PropertiesExtractorTest.java @@ -1,15 +1,15 @@ package io.koraframework.config.common; import org.junit.jupiter.api.Test; -import io.koraframework.config.common.extractor.PropertiesConfigValueExtractor; -import io.koraframework.config.common.factory.MapConfigFactory; +import io.koraframework.config.common.mapper.PropertiesConfigValueMapper; +import io.koraframework.config.common.util.ConfigMappingUtils; import java.util.Map; import static org.assertj.core.api.AssertionsForClassTypes.assertThat; public class PropertiesExtractorTest { - private final Config config = MapConfigFactory.fromMap(Map.of( + private final Config config = ConfigMappingUtils.fromMap(Map.of( "properties", Map.of( "bootstrap.servers", "localhost:9092", "password", "test_password" @@ -18,8 +18,8 @@ public class PropertiesExtractorTest { @Test void testPropertiesExtractor() { - var propertiesExtractor = new PropertiesConfigValueExtractor(); - var properties = propertiesExtractor.extract(config.get(ConfigValuePath.root().child("properties"))); + var propertiesExtractor = new PropertiesConfigValueMapper(); + var properties = propertiesExtractor.map(config.get(ConfigValuePath.root().child("properties"))); assertThat(properties.get("password")).isEqualTo("test_password"); assertThat(properties.getProperty("bootstrap.servers")).isEqualTo("localhost:9092"); } diff --git a/config/config-common/src/test/java/io/koraframework/config/common/RelaxedNamesTest.java b/config/config-common/src/test/java/io/koraframework/config/common/RelaxedNamesTest.java index 47d414f27..b157301c2 100644 --- a/config/config-common/src/test/java/io/koraframework/config/common/RelaxedNamesTest.java +++ b/config/config-common/src/test/java/io/koraframework/config/common/RelaxedNamesTest.java @@ -5,7 +5,7 @@ import java.util.Map; import static org.assertj.core.api.Assertions.assertThat; -import static io.koraframework.config.common.factory.MapConfigFactory.fromMap; +import static io.koraframework.config.common.util.ConfigMappingUtils.fromMap; public class RelaxedNamesTest { @Test diff --git a/config/config-common/src/test/java/io/koraframework/config/common/factory/MapConfigFactoryTest.java b/config/config-common/src/test/java/io/koraframework/config/common/factory/ConfigMappingUtilsTest.java similarity index 94% rename from config/config-common/src/test/java/io/koraframework/config/common/factory/MapConfigFactoryTest.java rename to config/config-common/src/test/java/io/koraframework/config/common/factory/ConfigMappingUtilsTest.java index 9f1ed6e01..3845b7f05 100644 --- a/config/config-common/src/test/java/io/koraframework/config/common/factory/MapConfigFactoryTest.java +++ b/config/config-common/src/test/java/io/koraframework/config/common/factory/ConfigMappingUtilsTest.java @@ -1,5 +1,6 @@ package io.koraframework.config.common.factory; +import io.koraframework.config.common.util.ConfigMappingUtils; import org.assertj.core.api.Condition; import org.assertj.core.api.InstanceOfAssertFactories; import org.assertj.core.data.Index; @@ -14,10 +15,10 @@ import static org.assertj.core.api.Assertions.assertThat; -class MapConfigFactoryTest { +class ConfigMappingUtilsTest { @Test void testFromMap() { - var config = MapConfigFactory.fromMap(Map.of( + var config = ConfigMappingUtils.fromMap(Map.of( "field1", "value1", "field2", 2, "field3", List.of(1, "2"), @@ -60,7 +61,7 @@ void testFromProperties() { properties.setProperty("object2.field1[4].field1", "7"); properties.setProperty("object3", "6"); - var config = MapConfigFactory.fromProperties(properties); + var config = ConfigMappingUtils.fromProperties(properties); assertThat(config.get("object1.field1")) diff --git a/config/config-common/src/test/java/io/koraframework/config/common/factory/MergeConfigFactoryTest.java b/config/config-common/src/test/java/io/koraframework/config/common/factory/ConfigMergingUtilsTest.java similarity index 74% rename from config/config-common/src/test/java/io/koraframework/config/common/factory/MergeConfigFactoryTest.java rename to config/config-common/src/test/java/io/koraframework/config/common/factory/ConfigMergingUtilsTest.java index 756b1b2ef..cdc6e72f1 100644 --- a/config/config-common/src/test/java/io/koraframework/config/common/factory/MergeConfigFactoryTest.java +++ b/config/config-common/src/test/java/io/koraframework/config/common/factory/ConfigMergingUtilsTest.java @@ -1,5 +1,7 @@ package io.koraframework.config.common.factory; +import io.koraframework.config.common.util.ConfigMappingUtils; +import io.koraframework.config.common.util.ConfigMergingUtils; import org.junit.jupiter.api.Test; import io.koraframework.config.common.ConfigValue; import io.koraframework.config.common.ConfigValuePath; @@ -8,17 +10,17 @@ import static org.assertj.core.api.Assertions.assertThat; -class MergeConfigFactoryTest { +class ConfigMergingUtilsTest { @Test void testMergeRoots() { - var config1 = MapConfigFactory.fromMap(Map.of( + var config1 = ConfigMappingUtils.fromMap(Map.of( "field1", "value1" )); - var config2 = MapConfigFactory.fromMap(Map.of( + var config2 = ConfigMappingUtils.fromMap(Map.of( "field2", "value2" )); - var config = MergeConfigFactory.merge(config1, config2); + var config = ConfigMergingUtils.merge(config1, config2); assertThat(config.get(ConfigValuePath.root().child("field1"))) .isInstanceOf(ConfigValue.StringValue.class) @@ -30,14 +32,14 @@ void testMergeRoots() { @Test void testFirstConfigFieldWins() { - var config1 = MapConfigFactory.fromMap(Map.of( + var config1 = ConfigMappingUtils.fromMap(Map.of( "field1", "value1" )); - var config2 = MapConfigFactory.fromMap(Map.of( + var config2 = ConfigMappingUtils.fromMap(Map.of( "field1", "value2" )); - var config = MergeConfigFactory.merge(config1, config2); + var config = ConfigMergingUtils.merge(config1, config2); assertThat(config.get(ConfigValuePath.root().child("field1"))) .isInstanceOf(ConfigValue.StringValue.class) @@ -46,20 +48,20 @@ void testFirstConfigFieldWins() { @Test void testSubobjectsMerge() { - var config1 = MapConfigFactory.fromMap(Map.of( + var config1 = ConfigMappingUtils.fromMap(Map.of( "field1", Map.of( "f1", "v1", "f2", "v2" ) )); - var config2 = MapConfigFactory.fromMap(Map.of( + var config2 = ConfigMappingUtils.fromMap(Map.of( "field1", Map.of( "f2", "v3", "f3", "v4" ) )); - var config = MergeConfigFactory.merge(config1, config2); + var config = ConfigMergingUtils.merge(config1, config2); assertThat(config.get(ConfigValuePath.root().child("field1").child("f1"))) .isInstanceOf(ConfigValue.StringValue.class) diff --git a/config/config-common/src/test/java/io/koraframework/config/common/impl/ConfigResolverTest.java b/config/config-common/src/test/java/io/koraframework/config/common/impl/ConfigResolverUtilsTest.java similarity index 93% rename from config/config-common/src/test/java/io/koraframework/config/common/impl/ConfigResolverTest.java rename to config/config-common/src/test/java/io/koraframework/config/common/impl/ConfigResolverUtilsTest.java index ad88dc262..b7c3e2eef 100644 --- a/config/config-common/src/test/java/io/koraframework/config/common/impl/ConfigResolverTest.java +++ b/config/config-common/src/test/java/io/koraframework/config/common/impl/ConfigResolverUtilsTest.java @@ -7,9 +7,9 @@ import java.util.Map; import static org.assertj.core.api.Assertions.assertThat; -import static io.koraframework.config.common.factory.MapConfigFactory.fromMap; +import static io.koraframework.config.common.util.ConfigMappingUtils.fromMap; -class ConfigResolverTest { +class ConfigResolverUtilsTest { @Test void testResolveReference() { var config = fromMap(Map.of( diff --git a/config/config-hocon/src/main/java/io/koraframework/config/hocon/HoconConfigModule.java b/config/config-hocon/src/main/java/io/koraframework/config/hocon/HoconConfigModule.java index ccdc943b1..606bb3ceb 100644 --- a/config/config-hocon/src/main/java/io/koraframework/config/hocon/HoconConfigModule.java +++ b/config/config-hocon/src/main/java/io/koraframework/config/hocon/HoconConfigModule.java @@ -3,7 +3,7 @@ import com.typesafe.config.ConfigFactory; import com.typesafe.config.ConfigResolveOptions; import com.typesafe.config.impl.ConfigImpl; -import io.koraframework.config.common.CommonConfigModule; +import io.koraframework.config.common.ConfigModule; import io.koraframework.config.common.Config; import io.koraframework.config.common.annotation.ApplicationConfig; import io.koraframework.config.common.origin.ConfigOrigin; @@ -17,7 +17,7 @@ import java.nio.file.Files; import java.nio.file.Path; -public interface HoconConfigModule extends CommonConfigModule { +public interface HoconConfigModule extends ConfigModule { @ApplicationConfig default ConfigOrigin applicationConfigOrigin() throws URISyntaxException { diff --git a/config/config-symbol-processor/src/main/kotlin/io/koraframework/config/ksp/ConfigClassNames.kt b/config/config-symbol-processor/src/main/kotlin/io/koraframework/config/ksp/ConfigClassNames.kt index ed116be9f..267bbfd4c 100644 --- a/config/config-symbol-processor/src/main/kotlin/io/koraframework/config/ksp/ConfigClassNames.kt +++ b/config/config-symbol-processor/src/main/kotlin/io/koraframework/config/ksp/ConfigClassNames.kt @@ -6,12 +6,12 @@ import io.koraframework.ksp.common.CommonClassNames object ConfigClassNames { val config = CommonClassNames.config val configSourceAnnotation = ClassName("io.koraframework.config.common.annotation", "ConfigSource") - val configValueExtractorAnnotation = ClassName("io.koraframework.config.common.annotation", "ConfigValueExtractor") + val configValueMapperAnnotation = ClassName("io.koraframework.config.common.annotation", "ConfigMapper") val configValue = ClassName("io.koraframework.config.common", "ConfigValue") val pathElement = ClassName("io.koraframework.config.common", "PathElement") val pathElementKey = pathElement.nestedClass("Key") - val configValueExtractor = CommonClassNames.configValueExtractor - val configValueExtractionException = ClassName("io.koraframework.config.common.extractor", "ConfigValueExtractionException") + val configValueMapper = CommonClassNames.configValueMapper + val configValueException = ClassName("io.koraframework.config.common.exception", "ConfigValueException") val objectValue = ClassName("io.koraframework.config.common", "ConfigValue", "ObjectValue") } diff --git a/config/config-symbol-processor/src/main/kotlin/io/koraframework/config/ksp/ConfigParserGenerator.kt b/config/config-symbol-processor/src/main/kotlin/io/koraframework/config/ksp/ConfigParserGenerator.kt index 250e47d39..c1a54d725 100644 --- a/config/config-symbol-processor/src/main/kotlin/io/koraframework/config/ksp/ConfigParserGenerator.kt +++ b/config/config-symbol-processor/src/main/kotlin/io/koraframework/config/ksp/ConfigParserGenerator.kt @@ -32,9 +32,9 @@ class ConfigParserGenerator(private val resolver: Resolver) { } f as Either.Left - val typeName = element.generatedClassName(ConfigClassNames.configValueExtractor.simpleName) + val typeName = element.generatedClassName(ConfigClassNames.configValueMapper.simpleName) val typeBuilder = TypeSpec.classBuilder(typeName) - .addSuperinterface(ConfigClassNames.configValueExtractor.parameterizedBy(targetType.toTypeName())) + .addSuperinterface(ConfigClassNames.configValueMapper.parameterizedBy(targetType.toTypeName())) .generated(ConfigParserGenerator::class) .addOriginatingKSFile(element) @@ -102,9 +102,9 @@ class ConfigParserGenerator(private val resolver: Resolver) { return Either.right(f.value) } f as Either.Left - val typeName: String = element.generatedClassName(ConfigClassNames.configValueExtractor.simpleName) + val typeName: String = element.generatedClassName(ConfigClassNames.configValueMapper.simpleName) val typeBuilder = TypeSpec.classBuilder(typeName) - .addSuperinterface(ConfigClassNames.configValueExtractor.parameterizedBy(targetType.toTypeName().copy(false))) + .addSuperinterface(ConfigClassNames.configValueMapper.parameterizedBy(targetType.toTypeName().copy(false))) .generated(ConfigParserGenerator::class) .addOriginatingKSFile(element) val fields = f.value @@ -144,9 +144,9 @@ class ConfigParserGenerator(private val resolver: Resolver) { } f as Either.Left - val typeName = decl.generatedClassName(ConfigClassNames.configValueExtractor.simpleName) + val typeName = decl.generatedClassName(ConfigClassNames.configValueMapper.simpleName) val typeBuilder = TypeSpec.classBuilder(typeName) - .addSuperinterface(ConfigClassNames.configValueExtractor.parameterizedBy(targetType.toTypeName().copy(false))) + .addSuperinterface(ConfigClassNames.configValueMapper.parameterizedBy(targetType.toTypeName().copy(false))) .generated(ConfigParserGenerator::class) .addOriginatingKSFile(decl) val fields = f.value @@ -198,9 +198,9 @@ class ConfigParserGenerator(private val resolver: Resolver) { } f as Either.Left - val typeName = decl.generatedClassName(ConfigClassNames.configValueExtractor.simpleName) + val typeName = decl.generatedClassName(ConfigClassNames.configValueMapper.simpleName) val typeBuilder = TypeSpec.classBuilder(typeName) - .addSuperinterface(ConfigClassNames.configValueExtractor.parameterizedBy(targetType.toTypeName().copy(false))) + .addSuperinterface(ConfigClassNames.configValueMapper.parameterizedBy(targetType.toTypeName().copy(false))) .generated(ConfigParserGenerator::class) .addOriginatingKSFile(targetType.declaration) val fields = f.value @@ -269,7 +269,7 @@ class ConfigParserGenerator(private val resolver: Resolver) { if (isSupported) { continue } - val fieldParserType = ConfigClassNames.configValueExtractor.parameterizedBy(field.typeName.copy(false)) + val fieldParserType = ConfigClassNames.configValueMapper.parameterizedBy(field.typeName.copy(false)) val constructorParameterName = fieldFactory.add(field.mapping, fieldParserType) val fieldParserName: String = field.name + "_parser" parser.addProperty( @@ -282,11 +282,11 @@ class ConfigParserGenerator(private val resolver: Resolver) { } private fun buildExtractMethod(typeDecl: KSClassDeclaration, typeName: TypeName, implClassName: ClassName, fields: List): FunSpec { - val rootParse = FunSpec.builder("extract") + val rootParse = FunSpec.builder("map") .addModifiers(KModifier.OVERRIDE) .returns(typeName.copy(false)) rootParse.addParameter("_sourceValue", ConfigClassNames.configValue.parameterizedBy(WildcardTypeName.producerOf(ANY))) - val mapNullAsEmptyObject = typeDecl.findAnnotation(ConfigClassNames.configValueExtractorAnnotation) + val mapNullAsEmptyObject = typeDecl.findAnnotation(ConfigClassNames.configValueMapperAnnotation) ?.findValueNoDefault("mapNullAsEmptyObject") ?: true @@ -378,7 +378,7 @@ class ConfigParserGenerator(private val resolver: Resolver) { } else if (field.isNullable) { addStatement("return null") } else { - addStatement("throw %T.missingValue(value)", ConfigClassNames.configValueExtractionException) + addStatement("throw %T.missingValue(value)", ConfigClassNames.configValueException) } }.build() @@ -392,16 +392,16 @@ class ConfigParserGenerator(private val resolver: Resolver) { parse.controlFlow("if (value is %T.NullValue)", ConfigClassNames.configValue) { addCode(returnDefaultOrThrow) } - parse.addStatement("return %N.extract(value)", "${field.name}_parser") + parse.addStatement("return %N.map(value)", "${field.name}_parser") } else { if (field.hasDefault) { parse.controlFlow("if (value is %T.NullValue)", ConfigClassNames.configValue) { addCode(returnDefaultOrThrow) } } - parse.addStatement("val parsed = %N.extract(value)", "${field.name}_parser") + parse.addStatement("val parsed = %N.map(value)", "${field.name}_parser") parse.controlFlow("if (parsed == null)") { - addStatement("throw %T.missingValueAfterParse(value)", ConfigClassNames.configValueExtractionException) + addStatement("throw %T.missingValueAfterParse(value)", ConfigClassNames.configValueException) } parse.addStatement("return parsed") } diff --git a/config/config-symbol-processor/src/main/kotlin/io/koraframework/config/ksp/ConfigUtils.kt b/config/config-symbol-processor/src/main/kotlin/io/koraframework/config/ksp/ConfigUtils.kt index 53c137713..6bd506831 100644 --- a/config/config-symbol-processor/src/main/kotlin/io/koraframework/config/ksp/ConfigUtils.kt +++ b/config/config-symbol-processor/src/main/kotlin/io/koraframework/config/ksp/ConfigUtils.kt @@ -27,7 +27,7 @@ object ConfigUtils { val name = recordComponent.simpleName.asString() if (seen.add(name)) { val isNullable = recordComponentType.isMarkedNullable - val mapping = recordComponent.parseMappingData().getMapping(ConfigClassNames.configValueExtractor) + val mapping = recordComponent.parseMappingData().getMapping(ConfigClassNames.configValueMapper) fields.add( ConfigField( name, recordComponentType.toTypeName(), isNullable, false, false, mapping @@ -82,7 +82,7 @@ object ConfigUtils { val fieldType = it.asMemberOf(type) if (seen.add(it.simpleName.asString())) { val isNullable = fieldType.isMarkedNullable - val mapping = it.parseMappingData().getMapping(ConfigClassNames.configValueExtractor) + val mapping = it.parseMappingData().getMapping(ConfigClassNames.configValueMapper) fields.add(ConfigField(it.simpleName.asString(), fieldType.toTypeName(), isNullable, true, false, mapping)) } } @@ -100,7 +100,7 @@ object ConfigUtils { val name = parameter.name!!.asString() val fieldType = parameter.type.resolve() val isNullable = fieldType.isMarkedNullable - val mapping = parameter.parseMappingData().getMapping(ConfigClassNames.configValueExtractor) + val mapping = parameter.parseMappingData().getMapping(ConfigClassNames.configValueMapper) fields.add(ConfigField(name, fieldType.toTypeName(), isNullable, parameter.hasDefault, false, mapping)) } } @@ -111,7 +111,7 @@ object ConfigUtils { val name = property.simpleName.asString() val propertyType = property.type.resolve() val isNullable = propertyType.nullability == Nullability.NULLABLE - val mapping = property.parseMappingData().getMapping(ConfigClassNames.configValueExtractor) + val mapping = property.parseMappingData().getMapping(ConfigClassNames.configValueMapper) fields.add( ConfigField( name, propertyType.toTypeName().copy(isNullable), isNullable, false, true, mapping @@ -163,7 +163,7 @@ object ConfigUtils { val name = function.simpleName.asString() if (seen.add(name)) { val isNullable = functionType.returnType!!.nullability == Nullability.NULLABLE || function.isAnnotationPresent { it.simpleName == "Nullable" } - val mapping = function.parseMappingData().getMapping(ConfigClassNames.configValueExtractor) + val mapping = function.parseMappingData().getMapping(ConfigClassNames.configValueMapper) fields.add( ConfigField( name, functionType.returnType!!.toTypeName().copy(isNullable), isNullable, !function.isAbstract, false, mapping diff --git a/config/config-symbol-processor/src/main/kotlin/io/koraframework/config/ksp/extension/ConfigKoraExtension.kt b/config/config-symbol-processor/src/main/kotlin/io/koraframework/config/ksp/extension/ConfigKoraExtension.kt index a83fe30a9..468bfe9e9 100644 --- a/config/config-symbol-processor/src/main/kotlin/io/koraframework/config/ksp/extension/ConfigKoraExtension.kt +++ b/config/config-symbol-processor/src/main/kotlin/io/koraframework/config/ksp/extension/ConfigKoraExtension.kt @@ -17,10 +17,10 @@ class ConfigKoraExtension() : KoraExtension { if (tag != null) return null val actualType = if (type.nullability == Nullability.PLATFORM) type.makeNotNullable() else type actualType.toTypeName().let { - if (it is ParameterizedTypeName && it.rawType == CommonClassNames.configValueExtractor) { + if (it is ParameterizedTypeName && it.rawType == CommonClassNames.configValueMapper) { val configTypeDecl = actualType.arguments.first().type?.resolve()?.declaration - if (configTypeDecl?.isAnnotationPresent(ConfigClassNames.configSourceAnnotation) == true || configTypeDecl?.isAnnotationPresent(ConfigClassNames.configValueExtractorAnnotation) == true) { - return generatedByProcessor(resolver, configTypeDecl as KSClassDeclaration, ConfigClassNames.configValueExtractor.simpleName) + if (configTypeDecl?.isAnnotationPresent(ConfigClassNames.configSourceAnnotation) == true || configTypeDecl?.isAnnotationPresent(ConfigClassNames.configValueMapperAnnotation) == true) { + return generatedByProcessor(resolver, configTypeDecl as KSClassDeclaration, ConfigClassNames.configValueMapper.simpleName) } } } diff --git a/config/config-symbol-processor/src/main/kotlin/io/koraframework/config/ksp/extension/ConfigLinkerExtensionFactory.kt b/config/config-symbol-processor/src/main/kotlin/io/koraframework/config/ksp/extension/ConfigLinkerExtensionFactory.kt index 07cf6ed6f..e79617df4 100644 --- a/config/config-symbol-processor/src/main/kotlin/io/koraframework/config/ksp/extension/ConfigLinkerExtensionFactory.kt +++ b/config/config-symbol-processor/src/main/kotlin/io/koraframework/config/ksp/extension/ConfigLinkerExtensionFactory.kt @@ -10,7 +10,7 @@ import io.koraframework.kora.app.ksp.extension.KoraExtension class ConfigLinkerExtensionFactory : ExtensionFactory { override fun create(resolver: Resolver, kspLogger: KSPLogger, codeGenerator: CodeGenerator): KoraExtension? { - val configValueExtractor = resolver.getClassDeclarationByName(ConfigClassNames.configValueExtractor.canonicalName) - return configValueExtractor?.let { ConfigKoraExtension() } + val configValueMapper = resolver.getClassDeclarationByName(ConfigClassNames.configValueMapper.canonicalName) + return configValueMapper?.let { ConfigKoraExtension() } } } diff --git a/config/config-symbol-processor/src/main/kotlin/io/koraframework/config/ksp/processor/ConfigParserSymbolProcessor.kt b/config/config-symbol-processor/src/main/kotlin/io/koraframework/config/ksp/processor/ConfigParserSymbolProcessor.kt index 575530d22..cd366b9f9 100644 --- a/config/config-symbol-processor/src/main/kotlin/io/koraframework/config/ksp/processor/ConfigParserSymbolProcessor.kt +++ b/config/config-symbol-processor/src/main/kotlin/io/koraframework/config/ksp/processor/ConfigParserSymbolProcessor.kt @@ -17,7 +17,7 @@ class ConfigParserSymbolProcessor(val environment: SymbolProcessorEnvironment) : override fun process(resolver: Resolver): List { val configParserGenerator = ConfigParserGenerator(resolver) val seen = HashSet() - val elements = resolver.getSymbolsWithAnnotation(ConfigClassNames.configValueExtractorAnnotation.canonicalName) + val elements = resolver.getSymbolsWithAnnotation(ConfigClassNames.configValueMapperAnnotation.canonicalName) .plus(resolver.getSymbolsWithAnnotation(ConfigClassNames.configSourceAnnotation.canonicalName)) .filterIsInstance() @@ -42,7 +42,7 @@ class ConfigParserSymbolProcessor(val environment: SymbolProcessorEnvironment) : } } } else { - environment.logger.error("@${ConfigClassNames.configValueExtractorAnnotation.simpleName} is applicable only to data classes or interfaces") + environment.logger.error("@${ConfigClassNames.configValueMapperAnnotation.simpleName} is applicable only to data classes or interfaces") } } return emptyList() diff --git a/config/config-symbol-processor/src/main/kotlin/io/koraframework/config/ksp/processor/ConfigSourceSymbolProcessor.kt b/config/config-symbol-processor/src/main/kotlin/io/koraframework/config/ksp/processor/ConfigSourceSymbolProcessor.kt index 7136bdbb6..6a5472ed7 100644 --- a/config/config-symbol-processor/src/main/kotlin/io/koraframework/config/ksp/processor/ConfigSourceSymbolProcessor.kt +++ b/config/config-symbol-processor/src/main/kotlin/io/koraframework/config/ksp/processor/ConfigSourceSymbolProcessor.kt @@ -45,10 +45,10 @@ class ConfigSourceSymbolProcessor( .addModifiers(KModifier.PUBLIC) .addParameter("config", ConfigClassNames.config) .addParameter( - "extractor", - ConfigClassNames.configValueExtractor.parameterizedBy(config.toClassName()) + "mapper", + ConfigClassNames.configValueMapper.parameterizedBy(config.toClassName()) ) - .addStatement("return extractor.extractOrThrow(config.get(%S))", path) + .addStatement("return mapper.mapOrThrow(config.get(%S))", path) val type = typeBuilder.addFunction(function.build()) .addAnnotation(CommonClassNames.module) .generated(ConfigSourceSymbolProcessor::class) diff --git a/config/config-symbol-processor/src/test/kotlin/io/koraframework/config/symbol/processor/AbstractConfigTest.kt b/config/config-symbol-processor/src/test/kotlin/io/koraframework/config/symbol/processor/AbstractConfigTest.kt index 6ba1e88aa..c4ff48c16 100644 --- a/config/config-symbol-processor/src/test/kotlin/io/koraframework/config/symbol/processor/AbstractConfigTest.kt +++ b/config/config-symbol-processor/src/test/kotlin/io/koraframework/config/symbol/processor/AbstractConfigTest.kt @@ -1,6 +1,6 @@ package io.koraframework.config.symbol.processor -import io.koraframework.config.common.extractor.ConfigValueExtractor +import io.koraframework.config.common.mapper.ConfigValueMapper import io.koraframework.config.ksp.processor.ConfigParserSymbolProcessorProvider import io.koraframework.config.ksp.processor.ConfigSourceSymbolProcessorProvider import io.koraframework.ksp.common.AbstractSymbolProcessorTest @@ -13,11 +13,11 @@ abstract class AbstractConfigTest : AbstractSymbolProcessorTest() { """.trimIndent() } - protected open fun compileConfig(arguments: List<*>, @Language("kotlin") vararg sources: String): ConfigValueExtractor { + protected open fun compileConfig(arguments: List<*>, @Language("kotlin") vararg sources: String): ConfigValueMapper { super.compile0(listOf(ConfigSourceSymbolProcessorProvider(), ConfigParserSymbolProcessorProvider()), *sources) compileResult.assertSuccess() - return loadClass("\$TestConfig_ConfigValueExtractor") + return loadClass("\$TestConfig_ConfigValueMapper") .constructors[0] - .newInstance(*arguments.map { if (it is GeneratedObject<*>) it() else it }.toTypedArray()) as ConfigValueExtractor + .newInstance(*arguments.map { if (it is GeneratedObject<*>) it() else it }.toTypedArray()) as ConfigValueMapper } } diff --git a/config/config-symbol-processor/src/test/kotlin/io/koraframework/config/symbol/processor/AnnotationConfigTest.kt b/config/config-symbol-processor/src/test/kotlin/io/koraframework/config/symbol/processor/AnnotationConfigTest.kt index 1a00531f2..06b9674ca 100644 --- a/config/config-symbol-processor/src/test/kotlin/io/koraframework/config/symbol/processor/AnnotationConfigTest.kt +++ b/config/config-symbol-processor/src/test/kotlin/io/koraframework/config/symbol/processor/AnnotationConfigTest.kt @@ -2,9 +2,9 @@ package io.koraframework.config.symbol.processor import io.koraframework.config.common.ConfigValue.NullValue import io.koraframework.config.common.ConfigValue.StringValue -import io.koraframework.config.common.extractor.ConfigValueExtractionException -import io.koraframework.config.common.extractor.ConfigValueExtractor -import io.koraframework.config.common.factory.MapConfigFactory +import io.koraframework.config.common.exception.ConfigValueException +import io.koraframework.config.common.mapper.ConfigValueMapper +import io.koraframework.config.common.util.ConfigMappingUtils import org.assertj.core.api.Assertions.assertThat import org.assertj.core.api.Assertions.assertThatThrownBy import org.junit.jupiter.api.Test @@ -18,131 +18,131 @@ import java.time.Duration class AnnotationConfigTest : AbstractConfigTest() { @Test fun testIntSupported() { - val extractor = compileConfig( + val mapper = compileConfig( listOf(), """ - @ConfigValueExtractor + @ConfigMapper interface TestConfig { fun value() : Int } """.trimIndent() ) - assertThat(extractor.extract(MapConfigFactory.fromMap(mapOf("value" to 42)).root())) - .isEqualTo(new("\$TestConfig_ConfigValueExtractor\$TestConfig_Impl", 42)) + assertThat(mapper.map(ConfigMappingUtils.fromMap(mapOf("value" to 42)).root())) + .isEqualTo(new("\$TestConfig_ConfigValueMapper\$TestConfig_Impl", 42)) } @Test fun testValSupported() { - val extractor = compileConfig( + val mapper = compileConfig( listOf(), """ - @ConfigValueExtractor + @ConfigMapper interface TestConfig { val value: Int } """.trimIndent() ) - assertThat(extractor.extract(MapConfigFactory.fromMap(mapOf("value" to 42)).root())) - .isEqualTo(new("\$TestConfig_ConfigValueExtractor\$TestConfig_Impl", 42)) + assertThat(mapper.map(ConfigMappingUtils.fromMap(mapOf("value" to 42)).root())) + .isEqualTo(new("\$TestConfig_ConfigValueMapper\$TestConfig_Impl", 42)) } @Test fun testNullableIntSupported() { - val extractor = compileConfig( + val mapper = compileConfig( listOf(), """ - @ConfigValueExtractor + @ConfigMapper interface TestConfig { fun value() : Int? } """.trimIndent() ) - assertThat(extractor.extract(MapConfigFactory.fromMap(mapOf("value" to 42)).root())) - .isEqualTo(new("\$TestConfig_ConfigValueExtractor\$TestConfig_Impl", 42)) - assertThat(extractor.extract(MapConfigFactory.fromMap(mapOf()).root())) - .isEqualTo(new("\$TestConfig_ConfigValueExtractor\$TestConfig_Impl", null)) + assertThat(mapper.map(ConfigMappingUtils.fromMap(mapOf("value" to 42)).root())) + .isEqualTo(new("\$TestConfig_ConfigValueMapper\$TestConfig_Impl", 42)) + assertThat(mapper.map(ConfigMappingUtils.fromMap(mapOf()).root())) + .isEqualTo(new("\$TestConfig_ConfigValueMapper\$TestConfig_Impl", null)) } @Test fun testStringSupported() { - val extractor = compileConfig( + val mapper = compileConfig( listOf(), """ - @ConfigValueExtractor + @ConfigMapper interface TestConfig { fun value(): String } """.trimIndent() ) - assertThat(extractor.extract(MapConfigFactory.fromMap(mapOf("value" to "test")).root())) - .isEqualTo(new("\$TestConfig_ConfigValueExtractor\$TestConfig_Impl", "test")) + assertThat(mapper.map(ConfigMappingUtils.fromMap(mapOf("value" to "test")).root())) + .isEqualTo(new("\$TestConfig_ConfigValueMapper\$TestConfig_Impl", "test")) - assertThatThrownBy { extractor.extract(MapConfigFactory.fromMap(mapOf()).root()) } - .isInstanceOf(ConfigValueExtractionException::class.java) + assertThatThrownBy { mapper.map(ConfigMappingUtils.fromMap(mapOf()).root()) } + .isInstanceOf(ConfigValueException::class.java) .hasMessageStartingWith("Config expected value, but got null at path: 'ROOT.value' for origin"); } @Test fun testBooleanSupported() { - val extractor = compileConfig( + val mapper = compileConfig( listOf(), """ - @ConfigValueExtractor + @ConfigMapper interface TestConfig { fun value(): Boolean } """.trimIndent() ) - assertThat(extractor.extract(MapConfigFactory.fromMap(mapOf("value" to true)).root())) - .isEqualTo(new("\$TestConfig_ConfigValueExtractor\$TestConfig_Impl", true)) + assertThat(mapper.map(ConfigMappingUtils.fromMap(mapOf("value" to true)).root())) + .isEqualTo(new("\$TestConfig_ConfigValueMapper\$TestConfig_Impl", true)) - assertThatThrownBy { extractor.extract(MapConfigFactory.fromMap(mapOf()).root()) } - .isInstanceOf(ConfigValueExtractionException::class.java) + assertThatThrownBy { mapper.map(ConfigMappingUtils.fromMap(mapOf()).root()) } + .isInstanceOf(ConfigValueException::class.java) .hasMessageStartingWith("Config expected value, but got null at path: 'ROOT.value' for origin"); } @Test fun testLongSupported() { - val extractor = compileConfig( + val mapper = compileConfig( listOf(), """ - @ConfigValueExtractor + @ConfigMapper interface TestConfig { fun value(): Long } """.trimIndent() ) - assertThat(extractor.extract(MapConfigFactory.fromMap(mapOf("value" to 42L)).root())) - .isEqualTo(new("\$TestConfig_ConfigValueExtractor\$TestConfig_Impl", 42L)) + assertThat(mapper.map(ConfigMappingUtils.fromMap(mapOf("value" to 42L)).root())) + .isEqualTo(new("\$TestConfig_ConfigValueMapper\$TestConfig_Impl", 42L)) - assertThatThrownBy { extractor.extract(MapConfigFactory.fromMap(mapOf()).root()) } - .isInstanceOf(ConfigValueExtractionException::class.java) + assertThatThrownBy { mapper.map(ConfigMappingUtils.fromMap(mapOf()).root()) } + .isInstanceOf(ConfigValueException::class.java) .hasMessageStartingWith("Config expected value, but got null at path: 'ROOT.value' for origin"); } @Test fun testDoubleSupported() { - val extractor = compileConfig( + val mapper = compileConfig( listOf(), """ - @ConfigValueExtractor + @ConfigMapper interface TestConfig { fun value(): Double } """.trimIndent() ) - assertThat(extractor.extract(MapConfigFactory.fromMap(mapOf("value" to 1.0)).root())) - .isEqualTo(new("\$TestConfig_ConfigValueExtractor\$TestConfig_Impl", 1.0)) + assertThat(mapper.map(ConfigMappingUtils.fromMap(mapOf("value" to 1.0)).root())) + .isEqualTo(new("\$TestConfig_ConfigValueMapper\$TestConfig_Impl", 1.0)) - assertThatThrownBy { extractor.extract(MapConfigFactory.fromMap(mapOf()).root()) } - .isInstanceOf(ConfigValueExtractionException::class.java) + assertThatThrownBy { mapper.map(ConfigMappingUtils.fromMap(mapOf()).root()) } + .isInstanceOf(ConfigValueException::class.java) .hasMessageStartingWith("Config expected value, but got null at path: 'ROOT.value' for origin"); } @Test fun testDefaultValues() { - val extractor = compileConfig( + val mapper = compileConfig( listOf(), """ - @ConfigValueExtractor + @ConfigMapper interface TestConfig { fun value() = "default-value" } @@ -150,18 +150,18 @@ class AnnotationConfigTest : AbstractConfigTest() { """.trimIndent() ) - assertThat(extractor.extract(MapConfigFactory.fromMap(mapOf("value" to "test")).root())) - .isEqualTo(new("\$TestConfig_ConfigValueExtractor\$TestConfig_Impl", "test")) + assertThat(mapper.map(ConfigMappingUtils.fromMap(mapOf("value" to "test")).root())) + .isEqualTo(new("\$TestConfig_ConfigValueMapper\$TestConfig_Impl", "test")) - assertThat(extractor.extract(MapConfigFactory.fromMap(mapOf()).root())) - .isEqualTo(new("\$TestConfig_ConfigValueExtractor\$TestConfig_Impl", "default-value")) + assertThat(mapper.map(ConfigMappingUtils.fromMap(mapOf()).root())) + .isEqualTo(new("\$TestConfig_ConfigValueMapper\$TestConfig_Impl", "default-value")) } @Test fun testDefaultAndNullable() { - val extractor = compileConfig( + val mapper = compileConfig( listOf(), """ - @ConfigValueExtractor + @ConfigMapper interface TestConfig { fun value1() = "default-value" @@ -171,21 +171,21 @@ class AnnotationConfigTest : AbstractConfigTest() { """.trimIndent() ) - assertThat(extractor.extract(MapConfigFactory.fromMap(mapOf("value1" to "test")).root())) - .isEqualTo(new("\$TestConfig_ConfigValueExtractor\$TestConfig_Impl", "test", null)) - assertThat(extractor.extract(MapConfigFactory.fromMap(mapOf()).root())) - .isEqualTo(new("\$TestConfig_ConfigValueExtractor\$TestConfig_Impl", "default-value", null)) + assertThat(mapper.map(ConfigMappingUtils.fromMap(mapOf("value1" to "test")).root())) + .isEqualTo(new("\$TestConfig_ConfigValueMapper\$TestConfig_Impl", "test", null)) + assertThat(mapper.map(ConfigMappingUtils.fromMap(mapOf()).root())) + .isEqualTo(new("\$TestConfig_ConfigValueMapper\$TestConfig_Impl", "default-value", null)) } @Test fun testInterfaceWithUnknownType() { - val mapper = Mockito.mock(ConfigValueExtractor::class.java) - whenever(mapper.extract(ArgumentMatchers.isA(StringValue::class.java))).thenReturn(Duration.ofDays(3000)) - whenever(mapper.extract(ArgumentMatchers.isA(NullValue::class.java))).thenThrow(IllegalArgumentException()) + val mockMapper = Mockito.mock(ConfigValueMapper::class.java) + whenever(mockMapper.map(ArgumentMatchers.isA(StringValue::class.java))).thenReturn(Duration.ofDays(3000)) + whenever(mockMapper.map(ArgumentMatchers.isA(NullValue::class.java))).thenThrow(IllegalArgumentException()) - val extractor = compileConfig( - listOf(mapper), """ - @ConfigValueExtractor + val mapper = compileConfig( + listOf(mockMapper), """ + @ConfigMapper interface TestConfig { fun value1(): java.time.Duration fun value2(): java.time.Duration? @@ -194,20 +194,20 @@ class AnnotationConfigTest : AbstractConfigTest() { """.trimIndent() ) - assertThat(extractor.extract(MapConfigFactory.fromMap(mapOf("value1" to "test")).root())) - .isEqualTo(new("\$TestConfig_ConfigValueExtractor\$TestConfig_Impl", Duration.ofDays(3000), null)) - verify(mapper).extract(ArgumentMatchers.any()) + assertThat(mapper.map(ConfigMappingUtils.fromMap(mapOf("value1" to "test")).root())) + .isEqualTo(new("\$TestConfig_ConfigValueMapper\$TestConfig_Impl", Duration.ofDays(3000), null)) + verify(mockMapper).map(ArgumentMatchers.any()) } @Test fun testInterfaceWithDefaultUnknownType() { - val mapper = Mockito.mock(ConfigValueExtractor::class.java) - whenever(mapper.extract(ArgumentMatchers.isA(StringValue::class.java))).thenReturn(Duration.ofDays(3000)) - whenever(mapper.extract(ArgumentMatchers.isA(NullValue::class.java))).thenThrow(IllegalArgumentException()) + val mockMapper = Mockito.mock(ConfigValueMapper::class.java) + whenever(mockMapper.map(ArgumentMatchers.isA(StringValue::class.java))).thenReturn(Duration.ofDays(3000)) + whenever(mockMapper.map(ArgumentMatchers.isA(NullValue::class.java))).thenThrow(IllegalArgumentException()) - val extractor = compileConfig( - listOf(mapper), """ - @ConfigValueExtractor + val mapper = compileConfig( + listOf(mockMapper), """ + @ConfigMapper interface TestConfig { fun value(): java.time.Duration = java.time.Duration.ofDays(1) } @@ -215,21 +215,21 @@ class AnnotationConfigTest : AbstractConfigTest() { """.trimIndent() ) - assertThat(extractor.extract(MapConfigFactory.fromMap(mapOf("value" to "test")).root())) - .isEqualTo(new("\$TestConfig_ConfigValueExtractor\$TestConfig_Impl", Duration.ofDays(3000))) - assertThat(extractor.extract(MapConfigFactory.fromMap(mapOf()).root())) - .isEqualTo(new("\$TestConfig_ConfigValueExtractor\$TestConfig_Impl", Duration.ofDays(1))) + assertThat(mapper.map(ConfigMappingUtils.fromMap(mapOf("value" to "test")).root())) + .isEqualTo(new("\$TestConfig_ConfigValueMapper\$TestConfig_Impl", Duration.ofDays(3000))) + assertThat(mapper.map(ConfigMappingUtils.fromMap(mapOf()).root())) + .isEqualTo(new("\$TestConfig_ConfigValueMapper\$TestConfig_Impl", Duration.ofDays(1))) } @Test fun testInterfaceWithDefaultAndRequiredUnknownType() { - val mapper = Mockito.mock(ConfigValueExtractor::class.java) - whenever(mapper.extract(ArgumentMatchers.isA(StringValue::class.java))).thenReturn(Duration.ofDays(3000)) - whenever(mapper.extract(ArgumentMatchers.isA(NullValue::class.java))).thenThrow(IllegalArgumentException()) + val mockMapper = Mockito.mock(ConfigValueMapper::class.java) + whenever(mockMapper.map(ArgumentMatchers.isA(StringValue::class.java))).thenReturn(Duration.ofDays(3000)) + whenever(mockMapper.map(ArgumentMatchers.isA(NullValue::class.java))).thenThrow(IllegalArgumentException()) - val extractor = compileConfig( - listOf(mapper), """ - @ConfigValueExtractor + val mapper = compileConfig( + listOf(mockMapper), """ + @ConfigMapper interface TestConfig { fun value1(): java.time.Duration fun value2(): java.time.Duration = java.time.Duration.ofDays(1) @@ -238,40 +238,40 @@ class AnnotationConfigTest : AbstractConfigTest() { """.trimIndent() ) - assertThat(extractor.extract(MapConfigFactory.fromMap(mapOf("value1" to "test", "value2" to "test")).root())) - .isEqualTo(new("\$TestConfig_ConfigValueExtractor\$TestConfig_Impl", Duration.ofDays(3000), Duration.ofDays(3000))) - assertThat(extractor.extract(MapConfigFactory.fromMap(mapOf("value1" to "test")).root())) - .isEqualTo(new("\$TestConfig_ConfigValueExtractor\$TestConfig_Impl", Duration.ofDays(3000), Duration.ofDays(1))) + assertThat(mapper.map(ConfigMappingUtils.fromMap(mapOf("value1" to "test", "value2" to "test")).root())) + .isEqualTo(new("\$TestConfig_ConfigValueMapper\$TestConfig_Impl", Duration.ofDays(3000), Duration.ofDays(3000))) + assertThat(mapper.map(ConfigMappingUtils.fromMap(mapOf("value1" to "test")).root())) + .isEqualTo(new("\$TestConfig_ConfigValueMapper\$TestConfig_Impl", Duration.ofDays(3000), Duration.ofDays(1))) } @Test fun testDataClassWithDefaultUnknownType() { - val mapper = Mockito.mock(ConfigValueExtractor::class.java) - whenever(mapper.extract(ArgumentMatchers.isA(StringValue::class.java))).thenReturn(Duration.ofDays(3000)) - whenever(mapper.extract(ArgumentMatchers.isA(NullValue::class.java))).thenThrow(IllegalArgumentException()) + val mockMapper = Mockito.mock(ConfigValueMapper::class.java) + whenever(mockMapper.map(ArgumentMatchers.isA(StringValue::class.java))).thenReturn(Duration.ofDays(3000)) + whenever(mockMapper.map(ArgumentMatchers.isA(NullValue::class.java))).thenThrow(IllegalArgumentException()) - val extractor = compileConfig( - listOf(mapper), """ - @ConfigValueExtractor + val mapper = compileConfig( + listOf(mockMapper), """ + @ConfigMapper data class TestConfig(val value1: String, val value2: java.time.Duration = java.time.Duration.ofDays(1)) """.trimIndent() ) - assertThat(extractor.extract(MapConfigFactory.fromMap(mapOf("value1" to "test1", "value2" to "test2")).root())) + assertThat(mapper.map(ConfigMappingUtils.fromMap(mapOf("value1" to "test1", "value2" to "test2")).root())) .isEqualTo(new("TestConfig", "test1", Duration.ofDays(3000))) - assertThat(extractor.extract(MapConfigFactory.fromMap(mapOf("value1" to "test1")).root())) + assertThat(mapper.map(ConfigMappingUtils.fromMap(mapOf("value1" to "test1")).root())) .isEqualTo(new("TestConfig", "test1", Duration.ofDays(1))) } @Test fun testInterfaceWithNullableDefaultUnknownType() { - val mapper = Mockito.mock(ConfigValueExtractor::class.java) - whenever(mapper.extract(ArgumentMatchers.isA(StringValue::class.java))).thenReturn(Duration.ofDays(3000)) - whenever(mapper.extract(ArgumentMatchers.isA(NullValue::class.java))).thenThrow(IllegalArgumentException()) + val mockMapper = Mockito.mock(ConfigValueMapper::class.java) + whenever(mockMapper.map(ArgumentMatchers.isA(StringValue::class.java))).thenReturn(Duration.ofDays(3000)) + whenever(mockMapper.map(ArgumentMatchers.isA(NullValue::class.java))).thenThrow(IllegalArgumentException()) - val extractor = compileConfig( - listOf(mapper), """ - @ConfigValueExtractor + val mapper = compileConfig( + listOf(mockMapper), """ + @ConfigMapper interface TestConfig { fun value(): java.time.Duration? = java.time.Duration.ofDays(1) } @@ -279,21 +279,21 @@ class AnnotationConfigTest : AbstractConfigTest() { """.trimIndent() ) - assertThat(extractor.extract(MapConfigFactory.fromMap(mapOf("value" to "test")).root())) - .isEqualTo(new("\$TestConfig_ConfigValueExtractor\$TestConfig_Impl", Duration.ofDays(3000))) - assertThat(extractor.extract(MapConfigFactory.fromMap(mapOf()).root())) - .isEqualTo(new("\$TestConfig_ConfigValueExtractor\$TestConfig_Impl", Duration.ofDays(1))) + assertThat(mapper.map(ConfigMappingUtils.fromMap(mapOf("value" to "test")).root())) + .isEqualTo(new("\$TestConfig_ConfigValueMapper\$TestConfig_Impl", Duration.ofDays(3000))) + assertThat(mapper.map(ConfigMappingUtils.fromMap(mapOf()).root())) + .isEqualTo(new("\$TestConfig_ConfigValueMapper\$TestConfig_Impl", Duration.ofDays(1))) } @Test fun testInterfaceWithSuperDefaultUnknownType() { - val mapper = Mockito.mock(ConfigValueExtractor::class.java) - whenever(mapper.extract(ArgumentMatchers.isA(StringValue::class.java))).thenReturn(Duration.ofDays(3000)) - whenever(mapper.extract(ArgumentMatchers.isA(NullValue::class.java))).thenThrow(IllegalArgumentException()) + val mockMapper = Mockito.mock(ConfigValueMapper::class.java) + whenever(mockMapper.map(ArgumentMatchers.isA(StringValue::class.java))).thenReturn(Duration.ofDays(3000)) + whenever(mockMapper.map(ArgumentMatchers.isA(NullValue::class.java))).thenThrow(IllegalArgumentException()) - val extractor = compileConfig( - listOf(mapper), """ - @ConfigValueExtractor + val mapper = compileConfig( + listOf(mockMapper), """ + @ConfigMapper interface TestConfig : SuperTestConfig { fun value1(): String } @@ -306,17 +306,17 @@ class AnnotationConfigTest : AbstractConfigTest() { """.trimIndent() ) - assertThat(extractor.extract(MapConfigFactory.fromMap(mapOf("value1" to "test1", "value2" to "test2")).root())) - .isEqualTo(new("\$TestConfig_ConfigValueExtractor\$TestConfig_Impl", "test1", Duration.ofDays(3000))) - assertThat(extractor.extract(MapConfigFactory.fromMap(mapOf("value1" to "test1")).root())) - .isEqualTo(new("\$TestConfig_ConfigValueExtractor\$TestConfig_Impl", "test1", Duration.ofDays(1))) + assertThat(mapper.map(ConfigMappingUtils.fromMap(mapOf("value1" to "test1", "value2" to "test2")).root())) + .isEqualTo(new("\$TestConfig_ConfigValueMapper\$TestConfig_Impl", "test1", Duration.ofDays(3000))) + assertThat(mapper.map(ConfigMappingUtils.fromMap(mapOf("value1" to "test1")).root())) + .isEqualTo(new("\$TestConfig_ConfigValueMapper\$TestConfig_Impl", "test1", Duration.ofDays(1))) } @Test fun testInterfaceWithSuper() { - val extractor = compileConfig( + val mapper = compileConfig( listOf(), """ - @ConfigValueExtractor + @ConfigMapper interface TestConfig : SuperTestConfig { fun value1(): String } @@ -329,21 +329,21 @@ class AnnotationConfigTest : AbstractConfigTest() { """.trimIndent() ) - assertThat(extractor.extract(MapConfigFactory.fromMap(mapOf("value1" to "test1", "value2" to "test2")).root())) - .isEqualTo(new("\$TestConfig_ConfigValueExtractor\$TestConfig_Impl", "test1", "test2")) + assertThat(mapper.map(ConfigMappingUtils.fromMap(mapOf("value1" to "test1", "value2" to "test2")).root())) + .isEqualTo(new("\$TestConfig_ConfigValueMapper\$TestConfig_Impl", "test1", "test2")) } @Test fun testInterfaceWithArray() { - val mapper = Mockito.mock( - ConfigValueExtractor::class.java + val mockMapper = Mockito.mock( + ConfigValueMapper::class.java ) - whenever(mapper.extract(ArgumentMatchers.any())) + whenever(mockMapper.map(ArgumentMatchers.any())) .thenAnswer { invocation: InvocationOnMock? -> intArrayOf(1, 2, 3) } - val extractor = compileConfig( - listOf(mapper), """ - @ConfigValueExtractor + val mapper = compileConfig( + listOf(mockMapper), """ + @ConfigMapper interface TestConfig { fun value(): IntArray } @@ -351,225 +351,217 @@ class AnnotationConfigTest : AbstractConfigTest() { """.trimIndent() ) - assertThat(extractor.extract(MapConfigFactory.fromMap(mapOf("value" to "test")).root())) - .isEqualTo(new("\$TestConfig_ConfigValueExtractor\$TestConfig_Impl", intArrayOf(1, 2, 3) as Any)) - verify(mapper).extract(ArgumentMatchers.any()) + assertThat(mapper.map(ConfigMappingUtils.fromMap(mapOf("value" to "test")).root())) + .isEqualTo(new("\$TestConfig_ConfigValueMapper\$TestConfig_Impl", intArrayOf(1, 2, 3) as Any)) + verify(mockMapper).map(ArgumentMatchers.any()) } @Test fun testDataClass() { - val extractor = compileConfig( + val mapper = compileConfig( listOf(), """ - @ConfigValueExtractor + @ConfigMapper data class TestConfig(val value: String) """.trimIndent() ) - assertThat(extractor.extract(MapConfigFactory.fromMap(mapOf("value" to "test")).root())) + assertThat(mapper.map(ConfigMappingUtils.fromMap(mapOf("value" to "test")).root())) .isEqualTo(new("TestConfig", "test")) } @Test fun testDataClassAllNullable() { - val extractor = compileConfig( + val mapper = compileConfig( listOf(), """ - @ConfigValueExtractor + @ConfigMapper data class TestConfig(val value: String?) """.trimIndent() ) - assertThat(extractor.extract(MapConfigFactory.fromMap(mapOf("value" to "test")).root())) + assertThat(mapper.map(ConfigMappingUtils.fromMap(mapOf("value" to "test")).root())) .isEqualTo(new("TestConfig", "test")) } @Test fun testDataClassWithUnknownType() { - val mapper = Mockito.mock(ConfigValueExtractor::class.java) - whenever(mapper.extract(ArgumentMatchers.isA(StringValue::class.java))).thenReturn(Duration.ofDays(3000)) - whenever(mapper.extract(ArgumentMatchers.isA(NullValue::class.java))).thenThrow(IllegalArgumentException()) + val mockMapper = Mockito.mock(ConfigValueMapper::class.java) + whenever(mockMapper.map(ArgumentMatchers.isA(StringValue::class.java))).thenReturn(Duration.ofDays(3000)) + whenever(mockMapper.map(ArgumentMatchers.isA(NullValue::class.java))).thenThrow(IllegalArgumentException()) - val extractor = compileConfig( - listOf(mapper), """ - @ConfigValueExtractor + val mapper = compileConfig( + listOf(mockMapper), """ + @ConfigMapper data class TestConfig(val value1: java.time.Duration, val value2: java.time.Duration?) """.trimIndent() ) - assertThat(extractor.extract(MapConfigFactory.fromMap(mapOf("value1" to "test")).root())) + assertThat(mapper.map(ConfigMappingUtils.fromMap(mapOf("value1" to "test")).root())) .isEqualTo(new("TestConfig", Duration.ofDays(3000), null)) - verify(mapper).extract(ArgumentMatchers.any()) + verify(mockMapper).map(ArgumentMatchers.any()) } @Test fun testDataClassWithUnknownTypeAndMapping() { - val extractor = compileConfig( + val mapper = compileConfig( listOf(newGenerated("TestOpenExtractor")), """ - @ConfigValueExtractor + @ConfigMapper data class TestConfig(@Mapping(TestOpenExtractor::class) @Tag(TestOpenExtractor::class) val value1: java.time.Duration, @Mapping(TestExtractor::class) val value2: java.time.Duration?) """.trimIndent(), """ import io.koraframework.config.common.ConfigValue - open class TestOpenExtractor : io.koraframework.config.common.extractor.ConfigValueExtractor { - override fun extract(value: ConfigValue<*>): java.time.Duration? { - if (value is ConfigValue.NullValue) - return null - else - return java.time.Duration.ofDays(3000) + open class TestOpenExtractor : io.koraframework.config.common.mapper.ConfigValueMapper { + override fun map(value: ConfigValue<*>): java.time.Duration? { + return if (value is ConfigValue.NullValue) null else java.time.Duration.ofDays(3000) } - } """.trimIndent(), """ import io.koraframework.config.common.ConfigValue - - class TestExtractor : io.koraframework.config.common.extractor.ConfigValueExtractor { - override fun extract(value: ConfigValue<*>): java.time.Duration? { - if (value is ConfigValue.NullValue) - return null - else - return java.time.Duration.ofDays(3000) + class TestExtractor : io.koraframework.config.common.mapper.ConfigValueMapper { + override fun map(value: ConfigValue<*>): java.time.Duration? { + return if (value is ConfigValue.NullValue) null else java.time.Duration.ofDays(3000) } } """.trimIndent() ) - assertThat(extractor.extract(MapConfigFactory.fromMap(mapOf("value1" to "test")).root())) + assertThat(mapper.map(ConfigMappingUtils.fromMap(mapOf("value1" to "test")).root())) .isEqualTo(new("TestConfig", Duration.ofDays(3000), null)) } @Test fun testDataClassWithDefaultValue() { - val extractor = compileConfig( + val mapper = compileConfig( listOf(), """ - @ConfigValueExtractor + @ConfigMapper data class TestConfig(val value1: String, val value2: String = "default-value") """.trimIndent() ) - assertThat(extractor.extract(MapConfigFactory.fromMap(mapOf("value1" to "test1", "value2" to "test2")).root())) + assertThat(mapper.map(ConfigMappingUtils.fromMap(mapOf("value1" to "test1", "value2" to "test2")).root())) .isEqualTo(new("TestConfig", "test1", "test2")) - assertThat(extractor.extract(MapConfigFactory.fromMap(mapOf("value1" to "test1")).root())) + assertThat(mapper.map(ConfigMappingUtils.fromMap(mapOf("value1" to "test1")).root())) .isEqualTo(new("TestConfig", "test1", "default-value")) } @Test fun testDataClassWithAllDefaults() { - val extractor = compileConfig( + val mapper = compileConfig( listOf(), """ - @ConfigValueExtractor + @ConfigMapper data class TestConfig(val value1: String = "default1", val value2: Int = 42) """.trimIndent() ) - assertThat(extractor.extract(MapConfigFactory.fromMap(mapOf("value1" to "test1", "value2" to 100)).root()).toString()) + assertThat(mapper.map(ConfigMappingUtils.fromMap(mapOf("value1" to "test1", "value2" to 100)).root()).toString()) .isEqualTo("TestConfig(value1=test1, value2=100)") - assertThat(extractor.extract(MapConfigFactory.fromMap(mapOf("value1" to "test1")).root()).toString()) + assertThat(mapper.map(ConfigMappingUtils.fromMap(mapOf("value1" to "test1")).root()).toString()) .isEqualTo("TestConfig(value1=test1, value2=42)") - assertThat(extractor.extract(MapConfigFactory.fromMap(mapOf("value2" to 100)).root()).toString()) + assertThat(mapper.map(ConfigMappingUtils.fromMap(mapOf("value2" to 100)).root()).toString()) .isEqualTo("TestConfig(value1=default1, value2=100)") - assertThat(extractor.extract(MapConfigFactory.fromMap(mapOf()).root()).toString()) + assertThat(mapper.map(ConfigMappingUtils.fromMap(mapOf()).root()).toString()) .isEqualTo("TestConfig(value1=default1, value2=42)") } @Test fun testDataClassWithDefaultAndNullable() { - val extractor = compileConfig( + val mapper = compileConfig( listOf(), """ - @ConfigValueExtractor + @ConfigMapper data class TestConfig(val value1: String, val value2: String? = "default-value") """.trimIndent() ) - assertThat(extractor.extract(MapConfigFactory.fromMap(mapOf("value1" to "test1", "value2" to "test2")).root())) + assertThat(mapper.map(ConfigMappingUtils.fromMap(mapOf("value1" to "test1", "value2" to "test2")).root())) .isEqualTo(new("TestConfig", "test1", "test2")) - assertThat(extractor.extract(MapConfigFactory.fromMap(mapOf("value1" to "test1")).root())) + assertThat(mapper.map(ConfigMappingUtils.fromMap(mapOf("value1" to "test1")).root())) .isEqualTo(new("TestConfig", "test1", "default-value")) } @Test fun testDataClassWithMultipleDefaults() { - val extractor = compileConfig( + val mapper = compileConfig( listOf(), """ - @ConfigValueExtractor + @ConfigMapper data class TestConfig(val value1: String, val value2: String = "default2", val value3: Int = 42, val value4: Boolean = true) """.trimIndent() ) - assertThat(extractor.extract(MapConfigFactory.fromMap(mapOf("value1" to "test1")).root())) + assertThat(mapper.map(ConfigMappingUtils.fromMap(mapOf("value1" to "test1")).root())) .isEqualTo(new("TestConfig", "test1", "default2", 42, true)) - assertThat(extractor.extract(MapConfigFactory.fromMap(mapOf("value1" to "test1", "value2" to "v2", "value3" to 100, "value4" to false)).root())) + assertThat(mapper.map(ConfigMappingUtils.fromMap(mapOf("value1" to "test1", "value2" to "v2", "value3" to 100, "value4" to false)).root())) .isEqualTo(new("TestConfig", "test1", "v2", 100, false)) - assertThat(extractor.extract(MapConfigFactory.fromMap(mapOf("value1" to "test1", "value3" to 100)).root())) + assertThat(mapper.map(ConfigMappingUtils.fromMap(mapOf("value1" to "test1", "value3" to 100)).root())) .isEqualTo(new("TestConfig", "test1", "default2", 100, true)) } @Test fun testDataClassWithAllDefaultUnknownTypes() { - val mapper = Mockito.mock(ConfigValueExtractor::class.java) - whenever(mapper.extract(ArgumentMatchers.isA(StringValue::class.java))).thenReturn(Duration.ofDays(3000)) - whenever(mapper.extract(ArgumentMatchers.isA(NullValue::class.java))).thenThrow(IllegalArgumentException()) + val mockMapper = Mockito.mock(ConfigValueMapper::class.java) + whenever(mockMapper.map(ArgumentMatchers.isA(StringValue::class.java))).thenReturn(Duration.ofDays(3000)) + whenever(mockMapper.map(ArgumentMatchers.isA(NullValue::class.java))).thenThrow(IllegalArgumentException()) - val extractor = compileConfig( - listOf(mapper), """ - @ConfigValueExtractor + val mapper = compileConfig( + listOf(mockMapper), """ + @ConfigMapper data class TestConfig(val value1: java.time.Duration = java.time.Duration.ofDays(1), val value2: java.time.Duration = java.time.Duration.ofDays(2)) """.trimIndent() ) - assertThat(extractor.extract(MapConfigFactory.fromMap(mapOf("value1" to "test", "value2" to "test")).root()).toString()) + assertThat(mapper.map(ConfigMappingUtils.fromMap(mapOf("value1" to "test", "value2" to "test")).root()).toString()) .isEqualTo("TestConfig(value1=PT72000H, value2=PT72000H)") - assertThat(extractor.extract(MapConfigFactory.fromMap(mapOf("value1" to "test")).root()).toString()) + assertThat(mapper.map(ConfigMappingUtils.fromMap(mapOf("value1" to "test")).root()).toString()) .isEqualTo("TestConfig(value1=PT72000H, value2=PT48H)") - assertThat(extractor.extract(MapConfigFactory.fromMap(mapOf()).root()).toString()) + assertThat(mapper.map(ConfigMappingUtils.fromMap(mapOf()).root()).toString()) .isEqualTo("TestConfig(value1=PT24H, value2=PT48H)") } @Test fun testDataClassWithNullableDefaultUnknownType() { - val mapper = Mockito.mock(ConfigValueExtractor::class.java) - whenever(mapper.extract(ArgumentMatchers.isA(StringValue::class.java))).thenReturn(Duration.ofDays(3000)) - whenever(mapper.extract(ArgumentMatchers.isA(NullValue::class.java))).thenThrow(IllegalArgumentException()) + val mockMapper = Mockito.mock(ConfigValueMapper::class.java) + whenever(mockMapper.map(ArgumentMatchers.isA(StringValue::class.java))).thenReturn(Duration.ofDays(3000)) + whenever(mockMapper.map(ArgumentMatchers.isA(NullValue::class.java))).thenThrow(IllegalArgumentException()) - val extractor = compileConfig( - listOf(mapper), """ - @ConfigValueExtractor + val mapper = compileConfig( + listOf(mockMapper), """ + @ConfigMapper data class TestConfig(val value1: String, val value2: java.time.Duration? = java.time.Duration.ofDays(1)) """.trimIndent() ) - assertThat(extractor.extract(MapConfigFactory.fromMap(mapOf("value1" to "test1", "value2" to "test2")).root())) + assertThat(mapper.map(ConfigMappingUtils.fromMap(mapOf("value1" to "test1", "value2" to "test2")).root())) .isEqualTo(new("TestConfig", "test1", Duration.ofDays(3000))) - assertThat(extractor.extract(MapConfigFactory.fromMap(mapOf("value1" to "test1")).root())) + assertThat(mapper.map(ConfigMappingUtils.fromMap(mapOf("value1" to "test1")).root())) .isEqualTo(new("TestConfig", "test1", Duration.ofDays(1))) } @Test fun testDataClassWithDefaultAndCustomType() { - val mapper = Mockito.mock(ConfigValueExtractor::class.java) - whenever(mapper.extract(ArgumentMatchers.isA(StringValue::class.java))).thenReturn(Duration.ofDays(3000)) + val mockMapper = Mockito.mock(ConfigValueMapper::class.java) + whenever(mockMapper.map(ArgumentMatchers.isA(StringValue::class.java))).thenReturn(Duration.ofDays(3000)) - val extractor = compileConfig( - listOf(mapper), """ - @ConfigValueExtractor + val mapper = compileConfig( + listOf(mockMapper), """ + @ConfigMapper data class TestConfig(val value1: java.time.Duration, val value2: String = "default-value") """.trimIndent() ) - assertThat(extractor.extract(MapConfigFactory.fromMap(mapOf("value1" to "test")).root()).toString()) + assertThat(mapper.map(ConfigMappingUtils.fromMap(mapOf("value1" to "test")).root()).toString()) .isEqualTo("TestConfig(value1=PT72000H, value2=default-value)") - assertThat(extractor.extract(MapConfigFactory.fromMap(mapOf("value1" to "test", "value2" to "custom")).root()).toString()) + assertThat(mapper.map(ConfigMappingUtils.fromMap(mapOf("value1" to "test", "value2" to "custom")).root()).toString()) .isEqualTo("TestConfig(value1=PT72000H, value2=custom)") } @Test fun testEmptyConfig() { - val extractor = compileConfig( + val mapper = compileConfig( listOf(), """ - @ConfigValueExtractor + @ConfigMapper interface TestConfig """.trimIndent() ) - val instance1 = extractor.extract(MapConfigFactory.fromMap(mapOf("value" to 42)).root()) - val instance2 = extractor.extract(MapConfigFactory.fromMap(mapOf()).root()) + val instance1 = mapper.map(ConfigMappingUtils.fromMap(mapOf("value" to 42)).root()) + val instance2 = mapper.map(ConfigMappingUtils.fromMap(mapOf()).root()) assertThat(instance1) .isNotNull() .isEqualTo(instance2) diff --git a/config/config-symbol-processor/src/test/kotlin/io/koraframework/config/symbol/processor/ConfigSourceAnnotationTest.kt b/config/config-symbol-processor/src/test/kotlin/io/koraframework/config/symbol/processor/ConfigSourceAnnotationTest.kt index 2c99fbb9c..139b97586 100644 --- a/config/config-symbol-processor/src/test/kotlin/io/koraframework/config/symbol/processor/ConfigSourceAnnotationTest.kt +++ b/config/config-symbol-processor/src/test/kotlin/io/koraframework/config/symbol/processor/ConfigSourceAnnotationTest.kt @@ -3,13 +3,13 @@ package io.koraframework.config.symbol.processor import org.assertj.core.api.Assertions.assertThat import org.junit.jupiter.api.Test import io.koraframework.config.common.Config -import io.koraframework.config.common.extractor.ConfigValueExtractor -import io.koraframework.config.common.factory.MapConfigFactory +import io.koraframework.config.common.mapper.ConfigValueMapper +import io.koraframework.config.common.util.ConfigMappingUtils class ConfigSourceAnnotationTest : AbstractConfigTest() { @Test fun testConfigSourceGeneratesConfigExtractor() { - val extractor = compileConfig( + val mapper = compileConfig( listOf(), """ @ConfigSource("test.path") interface TestConfig { @@ -18,8 +18,8 @@ class ConfigSourceAnnotationTest : AbstractConfigTest() { """.trimIndent() ) - assertThat(extractor.extract(MapConfigFactory.fromMap(mapOf("value" to 42)).root())) - .isEqualTo(new($$"$TestConfig_ConfigValueExtractor$TestConfig_Impl", 42)) + assertThat(mapper.map(ConfigMappingUtils.fromMap(mapOf("value" to 42)).root())) + .isEqualTo(new($$"$TestConfig_ConfigValueMapper$TestConfig_Impl", 42)) } @Test @@ -39,7 +39,7 @@ class ConfigSourceAnnotationTest : AbstractConfigTest() { .isInterface() .hasMethods("testConfig") - val method = moduleClass.getMethod("testConfig", Config::class.java, ConfigValueExtractor::class.java) + val method = moduleClass.getMethod("testConfig", Config::class.java, ConfigValueMapper::class.java) assertThat(method).isNotNull() assertThat(method.returnType).isEqualTo(loadClass("TestConfig")) assertThat(method.isDefault).isTrue() diff --git a/config/config-symbol-processor/src/test/kotlin/io/koraframework/config/symbol/processor/ConfigExtractorGeneratorExtensionTest.kt b/config/config-symbol-processor/src/test/kotlin/io/koraframework/config/symbol/processor/ConfigValueMapperGeneratorExtensionTest.kt similarity index 78% rename from config/config-symbol-processor/src/test/kotlin/io/koraframework/config/symbol/processor/ConfigExtractorGeneratorExtensionTest.kt rename to config/config-symbol-processor/src/test/kotlin/io/koraframework/config/symbol/processor/ConfigValueMapperGeneratorExtensionTest.kt index b4ffbde2b..451d25cb0 100644 --- a/config/config-symbol-processor/src/test/kotlin/io/koraframework/config/symbol/processor/ConfigExtractorGeneratorExtensionTest.kt +++ b/config/config-symbol-processor/src/test/kotlin/io/koraframework/config/symbol/processor/ConfigValueMapperGeneratorExtensionTest.kt @@ -8,7 +8,7 @@ import io.koraframework.kora.app.ksp.KoraAppProcessorProvider import io.koraframework.ksp.common.AbstractSymbolProcessorTest import io.koraframework.ksp.common.GraphUtil.toGraph -class ConfigExtractorGeneratorExtensionTest : AbstractSymbolProcessorTest() { +class ConfigValueMapperGeneratorExtensionTest : AbstractSymbolProcessorTest() { @Test fun testExtensionAnnotatedDataClass() { compile0(listOf(KoraAppProcessorProvider(), ConfigSourceSymbolProcessorProvider(), ConfigParserSymbolProcessorProvider()), @@ -16,11 +16,11 @@ class ConfigExtractorGeneratorExtensionTest : AbstractSymbolProcessorTest() { @KoraApp interface TestApp { @Root - fun root(extractor: io.koraframework.config.common.extractor.ConfigValueExtractor) = "" + fun root(mapper: io.koraframework.config.common.mapper.ConfigValueMapper) = "" } """.trimIndent(), """ - @io.koraframework.config.common.annotation.ConfigValueExtractor + @io.koraframework.config.common.annotation.ConfigMapper data class TestConfig(val value: String) """.trimIndent() @@ -39,11 +39,11 @@ class ConfigExtractorGeneratorExtensionTest : AbstractSymbolProcessorTest() { @KoraApp interface TestApp { @Root - fun root(extractor: io.koraframework.config.common.extractor.ConfigValueExtractor) = "" + fun root(mapper: io.koraframework.config.common.mapper.ConfigValueMapper) = "" } """.trimIndent(), """ - @io.koraframework.config.common.annotation.ConfigValueExtractor + @io.koraframework.config.common.annotation.ConfigMapper interface TestConfig { fun value(): String } diff --git a/config/config-yaml/src/main/java/io/koraframework/config/yaml/YamlConfigFactory.java b/config/config-yaml/src/main/java/io/koraframework/config/yaml/YamlConfigFactory.java index 0bd10d6f6..4412b44e8 100644 --- a/config/config-yaml/src/main/java/io/koraframework/config/yaml/YamlConfigFactory.java +++ b/config/config-yaml/src/main/java/io/koraframework/config/yaml/YamlConfigFactory.java @@ -5,7 +5,7 @@ import io.koraframework.config.common.Config; import io.koraframework.config.common.ConfigValue; import io.koraframework.config.common.ConfigValuePath; -import io.koraframework.config.common.factory.MapConfigFactory; +import io.koraframework.config.common.util.ConfigMappingUtils; import io.koraframework.config.common.impl.SimpleConfig; import io.koraframework.config.common.impl.SimpleConfigValueOrigin; import io.koraframework.config.common.origin.ConfigOrigin; @@ -27,7 +27,7 @@ public static Config fromYaml(ConfigOrigin origin, InputStream is) { var path = ConfigValuePath.root(); if (document == null) { - return MapConfigFactory.fromMap(origin, Map.of()); + return ConfigMappingUtils.fromMap(origin, Map.of()); } var root = toObject(origin, path, document); return new SimpleConfig(origin, root); diff --git a/config/config-yaml/src/main/java/io/koraframework/config/yaml/YamlConfigModule.java b/config/config-yaml/src/main/java/io/koraframework/config/yaml/YamlConfigModule.java index c365411d6..ba83a79e8 100644 --- a/config/config-yaml/src/main/java/io/koraframework/config/yaml/YamlConfigModule.java +++ b/config/config-yaml/src/main/java/io/koraframework/config/yaml/YamlConfigModule.java @@ -1,11 +1,11 @@ package io.koraframework.config.yaml; import io.koraframework.common.annotation.Tag; -import io.koraframework.config.common.CommonConfigModule; +import io.koraframework.config.common.ConfigModule; import io.koraframework.config.common.Config; import io.koraframework.config.common.annotation.ApplicationConfig; -import io.koraframework.config.common.factory.MapConfigFactory; -import io.koraframework.config.common.factory.MergeConfigFactory; +import io.koraframework.config.common.util.ConfigMappingUtils; +import io.koraframework.config.common.util.ConfigMergingUtils; import io.koraframework.config.common.origin.ConfigOrigin; import io.koraframework.config.common.origin.FileConfigOrigin; import io.koraframework.config.common.origin.ResourceConfigOrigin; @@ -17,7 +17,7 @@ import java.nio.file.StandardOpenOption; import java.util.Map; -public interface YamlConfigModule extends CommonConfigModule { +public interface YamlConfigModule extends ConfigModule { @ApplicationConfig default ConfigOrigin applicationConfigOrigin() throws URISyntaxException { @@ -55,7 +55,7 @@ default ConfigOrigin applicationConfigOrigin() throws URISyntaxException { @Tag(YamlConfigModule.class) default Config applicationConfigYamlReference() throws Exception { var references = Thread.currentThread().getContextClassLoader().getResources("reference.yaml"); - var config = MapConfigFactory.fromMap("empty", Map.of()); + var config = ConfigMappingUtils.fromMap("empty", Map.of()); while (references.hasMoreElements()) { var referenceUrl = references.nextElement(); var origin = new ResourceConfigOrigin(referenceUrl); @@ -67,7 +67,7 @@ default Config applicationConfigYamlReference() throws Exception { } catch (Exception e) { throw new RuntimeException("Reference config must be resolvable without external configs", e); } - config = MergeConfigFactory.merge(yamlConfig, config); + config = ConfigMergingUtils.merge(yamlConfig, config); } finally { if (connection instanceof AutoCloseable closeable) { closeable.close(); @@ -82,14 +82,14 @@ default Config applicationConfig(@ApplicationConfig ConfigOrigin configOrigin, @ if (configOrigin instanceof FileConfigOrigin fileConfigOrigin) { try (var is = Files.newInputStream(fileConfigOrigin.path(), StandardOpenOption.READ)) { var config = YamlConfigFactory.fromYaml(configOrigin, is); - return MergeConfigFactory.merge(config, reference); + return ConfigMergingUtils.merge(config, reference); } } else if (configOrigin instanceof ResourceConfigOrigin resourceConfigOrigin) { var connection = resourceConfigOrigin.url().openConnection(); connection.connect(); try (var is = connection.getInputStream()) { var config = YamlConfigFactory.fromYaml(configOrigin, is); - return MergeConfigFactory.merge(config, reference); + return ConfigMergingUtils.merge(config, reference); } finally { if (connection instanceof AutoCloseable closeable) { closeable.close(); diff --git a/core/annotation-processor-common/src/main/java/io/koraframework/annotation/processor/common/CommonClassNames.java b/core/annotation-processor-common/src/main/java/io/koraframework/annotation/processor/common/CommonClassNames.java index 9c83105e2..a8fde71d6 100644 --- a/core/annotation-processor-common/src/main/java/io/koraframework/annotation/processor/common/CommonClassNames.java +++ b/core/annotation-processor-common/src/main/java/io/koraframework/annotation/processor/common/CommonClassNames.java @@ -61,10 +61,10 @@ public class CommonClassNames { public static final ClassName list = ClassName.get(List.class); public static final ClassName config = ClassName.get("io.koraframework.config.common", "Config"); - public static final ClassName configValueExtractor = ClassName.get("io.koraframework.config.common.extractor", "ConfigValueExtractor"); - public static final ClassName configValueExtractorAnnotation = ClassName.get("io.koraframework.config.common.annotation", "ConfigValueExtractor"); + public static final ClassName configValueMapper = ClassName.get("io.koraframework.config.common.mapper", "ConfigValueMapper"); + public static final ClassName configMapperAnnotation = ClassName.get("io.koraframework.config.common.annotation", "ConfigMapper"); public static final ClassName configValue = ClassName.get("io.koraframework.config.common", "ConfigValue"); - public static final ClassName configValueExtractionException = ClassName.get("io.koraframework.config.common.extractor", "ConfigValueExtractionException"); + public static final ClassName configValueException = ClassName.get("io.koraframework.config.common.exception", "ConfigValueException"); public static final ClassName telemetryConfig = ClassName.get("io.koraframework.telemetry.common", "TelemetryConfig"); public static final ClassName meterRegistry = ClassName.get("io.micrometer.core.instrument", "MeterRegistry"); diff --git a/core/kora-app-annotation-processor/src/test/java/io/koraframework/kora/app/annotation/processor/app/AppWithFactories12.java b/core/kora-app-annotation-processor/src/test/java/io/koraframework/kora/app/annotation/processor/app/AppWithFactories12.java index 05f60c1ac..e0ed9969a 100644 --- a/core/kora-app-annotation-processor/src/test/java/io/koraframework/kora/app/annotation/processor/app/AppWithFactories12.java +++ b/core/kora-app-annotation-processor/src/test/java/io/koraframework/kora/app/annotation/processor/app/AppWithFactories12.java @@ -6,21 +6,21 @@ @KoraApp public interface AppWithFactories12 { @Root - default Object mock1(ConfigValueExtractor object) { + default Object mock1(ConfigValueMapper object) { return new Object(); } - default > EnumConfigValueExtractor enumConfigValueExtractor() { - return new EnumConfigValueExtractor<>(); + default > EnumConfigValueMapper enumConfigValueMapper() { + return new EnumConfigValueMapper<>(); } enum TestEnum {} - interface ConfigValueExtractor { + interface ConfigValueMapper { T extract(Object value); } - class EnumConfigValueExtractor> implements ConfigValueExtractor { + class EnumConfigValueMapper> implements ConfigValueMapper { @Override public T extract(Object value) { return null; diff --git a/core/kora-app-annotation-processor/src/test/java/io/koraframework/kora/app/annotation/processor/app/AppWithFactories13.java b/core/kora-app-annotation-processor/src/test/java/io/koraframework/kora/app/annotation/processor/app/AppWithFactories13.java index 7f9e1f6e4..9bdfea04f 100644 --- a/core/kora-app-annotation-processor/src/test/java/io/koraframework/kora/app/annotation/processor/app/AppWithFactories13.java +++ b/core/kora-app-annotation-processor/src/test/java/io/koraframework/kora/app/annotation/processor/app/AppWithFactories13.java @@ -8,15 +8,15 @@ public interface AppWithFactories13 { @Root - default Object target(ConfigValueExtractor object) { + default Object target(ConfigValueMapper object) { return new Object(); } - default & MarkerOne> ConfigValueExtractor extractor1(TypeRef ref) { + default & MarkerOne> ConfigValueMapper extractor1(TypeRef ref) { return value -> null; } - default & MarkerTwo> ConfigValueExtractor extractor2(TypeRef ref) { + default & MarkerTwo> ConfigValueMapper extractor2(TypeRef ref) { return value -> null; } @@ -26,7 +26,7 @@ interface MarkerOne { } interface MarkerTwo { } - interface ConfigValueExtractor { + interface ConfigValueMapper { T extract(Object value); } diff --git a/core/kora-app-symbol-processor/src/test/kotlin/io/koraframework/kora/app/ksp/app/AppWithFactories13.kt b/core/kora-app-symbol-processor/src/test/kotlin/io/koraframework/kora/app/ksp/app/AppWithFactories13.kt index 766caaa69..6493823da 100644 --- a/core/kora-app-symbol-processor/src/test/kotlin/io/koraframework/kora/app/ksp/app/AppWithFactories13.kt +++ b/core/kora-app-symbol-processor/src/test/kotlin/io/koraframework/kora/app/ksp/app/AppWithFactories13.kt @@ -8,16 +8,16 @@ import io.koraframework.common.annotation.Root interface AppWithFactories13 { @Root - fun target(cl: ConfigValueExtractor): Any = Any() + fun target(cl: ConfigValueMapper): Any = Any() - fun extractor1(ref: TypeRef): ConfigValueExtractor where T : Enum, T : MarkerOne { - return object : ConfigValueExtractor { + fun extractor1(ref: TypeRef): ConfigValueMapper where T : Enum, T : MarkerOne { + return object : ConfigValueMapper { override fun extract(value: Any?): T? = null } } - fun extractor2(ref: TypeRef): ConfigValueExtractor where T : Enum, T : MarkerTwo { - return object : ConfigValueExtractor { + fun extractor2(ref: TypeRef): ConfigValueMapper where T : Enum, T : MarkerTwo { + return object : ConfigValueMapper { override fun extract(value: Any?): T? = null } } @@ -28,7 +28,7 @@ interface AppWithFactories13 { interface MarkerTwo - interface ConfigValueExtractor { + interface ConfigValueMapper { fun extract(value: Any?): T? } diff --git a/core/symbol-processor-common/src/main/kotlin/io/koraframework/ksp/common/CommonClassNames.kt b/core/symbol-processor-common/src/main/kotlin/io/koraframework/ksp/common/CommonClassNames.kt index a0b2cb547..93c37627b 100644 --- a/core/symbol-processor-common/src/main/kotlin/io/koraframework/ksp/common/CommonClassNames.kt +++ b/core/symbol-processor-common/src/main/kotlin/io/koraframework/ksp/common/CommonClassNames.kt @@ -58,10 +58,10 @@ object CommonClassNames { val generated = ClassName("io.koraframework.common.annotation", "Generated") val config = ClassName("io.koraframework.config.common", "Config") - val configValueExtractionException = ClassName("io.koraframework.config.common.extractor", "ConfigValueExtractionException") + val configValueException = ClassName("io.koraframework.config.common.exception", "ConfigValueException") val configValue = ClassName("io.koraframework.config.common", "ConfigValue") - val configValueExtractor = ClassName("io.koraframework.config.common.extractor", "ConfigValueExtractor") - val configValueExtractorAnnotation = ClassName("io.koraframework.config.common.annotation", "ConfigValueExtractor"); + val configValueMapper = ClassName("io.koraframework.config.common.mapper", "ConfigValueMapper") + val configMapperAnnotation = ClassName("io.koraframework.config.common.annotation", "ConfigMapper"); val isNotEmpty = MemberName("kotlin.collections", "isNotEmpty") diff --git a/database/database-cassandra/src/main/java/io/koraframework/database/cassandra/CassandraConfig.java b/database/database-cassandra/src/main/java/io/koraframework/database/cassandra/CassandraConfig.java index 7766c7e7a..10b9f54bd 100644 --- a/database/database-cassandra/src/main/java/io/koraframework/database/cassandra/CassandraConfig.java +++ b/database/database-cassandra/src/main/java/io/koraframework/database/cassandra/CassandraConfig.java @@ -2,7 +2,7 @@ import com.datastax.oss.driver.api.core.metrics.DefaultNodeMetric; import com.datastax.oss.driver.api.core.metrics.DefaultSessionMetric; -import io.koraframework.config.common.annotation.ConfigValueExtractor; +import io.koraframework.config.common.annotation.ConfigMapper; import io.koraframework.database.cassandra.annotation.CassandraProfile; import io.koraframework.database.common.telemetry.DatabaseTelemetryConfig; import io.koraframework.telemetry.common.TelemetryConfig; @@ -19,7 +19,7 @@ * * @see CassandraRepository */ -@ConfigValueExtractor +@ConfigMapper public interface CassandraConfig { /** @@ -37,16 +37,16 @@ public interface CassandraConfig { DatabaseTelemetryConfig telemetry(); - @ConfigValueExtractor + @ConfigMapper interface CassandraCredentials { String login(); String password(); } - @ConfigValueExtractor + @ConfigMapper interface Profile { - @ConfigValueExtractor + @ConfigMapper interface ProfileBasic extends Basic { @Override @Nullable @@ -61,7 +61,7 @@ default List contactPoints() { Advanced advanced(); } - @ConfigValueExtractor + @ConfigMapper interface Basic { @Nullable BasicRequestConfig request(); @@ -83,7 +83,7 @@ interface Basic { @Nullable CloudConfig cloud(); - @ConfigValueExtractor + @ConfigMapper interface BasicRequestConfig { @Nullable Duration timeout(); @@ -101,20 +101,20 @@ interface BasicRequestConfig { Boolean defaultIdempotence(); } - @ConfigValueExtractor + @ConfigMapper interface LoadBalancingPolicyConfig { @Nullable Boolean slowReplicaAvoidance(); } - @ConfigValueExtractor + @ConfigMapper interface CloudConfig { @Nullable String secureConnectBundle(); } } - @ConfigValueExtractor + @ConfigMapper interface Advanced { @Nullable SessionLeakConfig sessionLeak(); @@ -172,18 +172,18 @@ interface Advanced { @Nullable ThrottlerConfig throttler(); - @ConfigValueExtractor + @ConfigMapper interface SessionLeakConfig { @Nullable Integer threshold(); } - @ConfigValueExtractor + @ConfigMapper interface AdvancedLoadBalancingPolicyConfig { @Nullable DcFailover dcFailover(); - @ConfigValueExtractor + @ConfigMapper interface DcFailover { @Nullable Integer maxNodesPerRemoveDc(); @@ -193,7 +193,7 @@ interface DcFailover { } } - @ConfigValueExtractor + @ConfigMapper interface ConnectionConfig { @Nullable Duration connectTimeout(); @@ -216,7 +216,7 @@ interface ConnectionConfig { @Nullable PoolConfig pool(); - @ConfigValueExtractor + @ConfigMapper interface PoolConfig { @Nullable Integer localSize(); @@ -226,7 +226,7 @@ interface PoolConfig { } } - @ConfigValueExtractor + @ConfigMapper interface ReconnectionPolicyConfig { @Nullable Duration baseDelay(); @@ -235,7 +235,7 @@ interface ReconnectionPolicyConfig { Duration maxDelay(); } - @ConfigValueExtractor + @ConfigMapper interface SslEngineFactoryConfig { @Nullable List cipherSuites(); @@ -256,7 +256,7 @@ interface SslEngineFactoryConfig { String truststorePassword(); } - @ConfigValueExtractor + @ConfigMapper interface TimestampGeneratorConfig { @Nullable Boolean forceJavaClock(); @@ -264,7 +264,7 @@ interface TimestampGeneratorConfig { @Nullable DriftWarningConfig driftWarning(); - @ConfigValueExtractor + @ConfigMapper interface DriftWarningConfig { @Nullable Duration threshold(); @@ -274,7 +274,7 @@ interface DriftWarningConfig { } } - @ConfigValueExtractor + @ConfigMapper interface ProtocolConfig { @Nullable String version(); @@ -286,7 +286,7 @@ interface ProtocolConfig { Long maxFrameLength(); } - @ConfigValueExtractor + @ConfigMapper interface AdvancedRequestConfig { @Nullable Boolean warnIfSetKeyspace(); @@ -297,7 +297,7 @@ interface AdvancedRequestConfig { @Nullable Boolean logWarnings(); - @ConfigValueExtractor + @ConfigMapper interface TraceConfig { @Nullable Integer attempts(); @@ -310,7 +310,7 @@ interface TraceConfig { } } - @ConfigValueExtractor + @ConfigMapper interface MetricsConfig { IdGenerator idGenerator(); @@ -325,7 +325,7 @@ default boolean publishPercentileHistogram() { return false; } - @ConfigValueExtractor + @ConfigMapper interface IdGenerator { default String name() { @@ -336,7 +336,7 @@ default String name() { String prefix(); } - @ConfigValueExtractor + @ConfigMapper interface NodeConfig { /** @@ -357,7 +357,7 @@ default List enabled() { Config cqlMessages(); } - @ConfigValueExtractor + @ConfigMapper interface SessionConfig { /** @@ -379,7 +379,7 @@ default List enabled() { Config throttlingDelay(); } - @ConfigValueExtractor + @ConfigMapper interface Config { default Duration lowestLatency() { @@ -402,7 +402,7 @@ default Duration[] slo() { } } - @ConfigValueExtractor + @ConfigMapper interface SocketConfig { @Nullable Boolean tcpNoDelay(); @@ -423,7 +423,7 @@ interface SocketConfig { Integer sendBufferSize(); } - @ConfigValueExtractor + @ConfigMapper interface HeartBeatConfig { @Nullable Duration interval(); @@ -432,7 +432,7 @@ interface HeartBeatConfig { Duration timeout(); } - @ConfigValueExtractor + @ConfigMapper interface MetadataConfig { @Nullable SchemaConfig schema(); @@ -443,7 +443,7 @@ interface MetadataConfig { @Nullable Boolean tokenMapEnabled(); - @ConfigValueExtractor + @ConfigMapper interface SchemaConfig { @Nullable Boolean enabled(); @@ -460,7 +460,7 @@ interface SchemaConfig { @Nullable DebouncerConfig debouncer(); - @ConfigValueExtractor + @ConfigMapper interface DebouncerConfig { @Nullable Duration window(); @@ -470,7 +470,7 @@ interface DebouncerConfig { } } - @ConfigValueExtractor + @ConfigMapper interface TopologyConfig { @Nullable Duration window(); @@ -480,7 +480,7 @@ interface TopologyConfig { } } - @ConfigValueExtractor + @ConfigMapper interface ControlConnectionConfig { @Nullable Duration timeout(); @@ -488,7 +488,7 @@ interface ControlConnectionConfig { @Nullable SchemaAgreementConfig schemaAgreement(); - @ConfigValueExtractor + @ConfigMapper interface SchemaAgreementConfig { @Nullable Duration interval(); @@ -501,7 +501,7 @@ interface SchemaAgreementConfig { } } - @ConfigValueExtractor + @ConfigMapper interface PreparedStatementsConfig { @Nullable Boolean prepareOnAllNodes(); @@ -512,7 +512,7 @@ interface PreparedStatementsConfig { @Nullable PreparedCacheConfig preparedCache(); - @ConfigValueExtractor + @ConfigMapper interface ReprepareConfig { @Nullable Boolean enabled(); @@ -530,14 +530,14 @@ interface ReprepareConfig { Duration timeout(); } - @ConfigValueExtractor + @ConfigMapper interface PreparedCacheConfig { @Nullable Boolean weakValues(); } } - @ConfigValueExtractor + @ConfigMapper interface NettyConfig { @Nullable IoGroupConfig ioGroup(); @@ -551,7 +551,7 @@ interface NettyConfig { @Nullable Boolean daemon(); - @ConfigValueExtractor + @ConfigMapper interface IoGroupConfig { @Nullable Integer size(); @@ -560,7 +560,7 @@ interface IoGroupConfig { ShutdownConfig shutdown(); } - @ConfigValueExtractor + @ConfigMapper interface AdminGroupConfig { @Nullable Integer size(); @@ -569,7 +569,7 @@ interface AdminGroupConfig { ShutdownConfig shutdown(); } - @ConfigValueExtractor + @ConfigMapper interface ShutdownConfig { @Nullable Integer quietPeriod(); @@ -581,7 +581,7 @@ interface ShutdownConfig { String unit(); } - @ConfigValueExtractor + @ConfigMapper interface TimerConfig { @Nullable Duration tickDuration(); @@ -591,13 +591,13 @@ interface TimerConfig { } } - @ConfigValueExtractor + @ConfigMapper interface CoalescerConfig { @Nullable Duration rescheduleInterval(); } - @ConfigValueExtractor + @ConfigMapper interface ThrottlerConfig { @Nullable String throttlerClass(); diff --git a/database/database-cassandra/src/main/java/io/koraframework/database/cassandra/CassandraDatabaseModule.java b/database/database-cassandra/src/main/java/io/koraframework/database/cassandra/CassandraDatabaseModule.java index 26c84fb5a..eb7337a37 100644 --- a/database/database-cassandra/src/main/java/io/koraframework/database/cassandra/CassandraDatabaseModule.java +++ b/database/database-cassandra/src/main/java/io/koraframework/database/cassandra/CassandraDatabaseModule.java @@ -4,14 +4,14 @@ import com.datastax.oss.driver.api.core.config.ProgrammaticDriverConfigLoaderBuilder; import io.koraframework.common.Configurer; import io.koraframework.config.common.Config; -import io.koraframework.config.common.extractor.ConfigValueExtractor; +import io.koraframework.config.common.mapper.ConfigValueMapper; import io.koraframework.database.common.telemetry.DatabaseTelemetryFactory; import org.jspecify.annotations.Nullable; public interface CassandraDatabaseModule extends CassandraModule { - default CassandraConfig cassandraConfig(Config config, ConfigValueExtractor extractor) { - return extractor.extractOrThrow(config.get("cassandra")); + default CassandraConfig cassandraConfig(Config config, ConfigValueMapper mapper) { + return mapper.mapOrThrow(config.get("cassandra")); } default CassandraDatabase cassandraDatabase(CassandraConfig config, DatabaseTelemetryFactory telemetryFactory, @Nullable Configurer loaderConfigurer, @Nullable Configurer sessionBuilderConfigurer) { diff --git a/database/database-cassandra/src/test/java/io/koraframework/database/cassandra/CassandraDatabaseTest.java b/database/database-cassandra/src/test/java/io/koraframework/database/cassandra/CassandraDatabaseTest.java index 89510a372..9eeb84097 100644 --- a/database/database-cassandra/src/test/java/io/koraframework/database/cassandra/CassandraDatabaseTest.java +++ b/database/database-cassandra/src/test/java/io/koraframework/database/cassandra/CassandraDatabaseTest.java @@ -25,9 +25,9 @@ private static CassandraDatabase createCassandraDatabase(CassandraParams params) var profiles = new HashMap(); profiles.put( "profile", - new $CassandraConfig_Profile_ConfigValueExtractor.Profile_Impl(new $CassandraConfig_Profile_ProfileBasic_ConfigValueExtractor.ProfileBasic_Impl( + new $CassandraConfig_Profile_ConfigValueMapper.Profile_Impl(new $CassandraConfig_Profile_ProfileBasic_ConfigValueMapper.ProfileBasic_Impl( List.of(), - new $CassandraConfig_Basic_BasicRequestConfig_ConfigValueExtractor.BasicRequestConfig_Impl(Duration.ofSeconds(10), null, null, null, null), + new $CassandraConfig_Basic_BasicRequestConfig_ConfigValueMapper.BasicRequestConfig_Impl(Duration.ofSeconds(10), null, null, null, null), null, null, null, @@ -35,9 +35,9 @@ private static CassandraDatabase createCassandraDatabase(CassandraParams params) null ), null) ); - var config = new $CassandraConfig_ConfigValueExtractor.CassandraConfig_Impl( + var config = new $CassandraConfig_ConfigValueMapper.CassandraConfig_Impl( profiles, - new $CassandraConfig_Basic_ConfigValueExtractor.Basic_Impl( + new $CassandraConfig_Basic_ConfigValueMapper.Basic_Impl( null, null, List.of(params.host() + ":" + params.port()), @@ -46,22 +46,22 @@ private static CassandraDatabase createCassandraDatabase(CassandraParams params) null, null ), - new $CassandraConfig_Advanced_ConfigValueExtractor.Advanced_Impl( + new $CassandraConfig_Advanced_ConfigValueMapper.Advanced_Impl( null, null, null, null, null, null, null, null, null, - new $CassandraConfig_Advanced_MetricsConfig_ConfigValueExtractor.MetricsConfig_Impl( - new $CassandraConfig_Advanced_MetricsConfig_IdGenerator_ConfigValueExtractor.IdGenerator_Defaults(), + new $CassandraConfig_Advanced_MetricsConfig_ConfigValueMapper.MetricsConfig_Impl( + new $CassandraConfig_Advanced_MetricsConfig_IdGenerator_ConfigValueMapper.IdGenerator_Defaults(), null, null, false ), null, null, null, null, null, null, null, null, null ), - params.username() == null ? null : new $CassandraConfig_CassandraCredentials_ConfigValueExtractor.CassandraCredentials_Impl( + params.username() == null ? null : new $CassandraConfig_CassandraCredentials_ConfigValueMapper.CassandraCredentials_Impl( params.username(), params.password() ), - new $DatabaseTelemetryConfig_ConfigValueExtractor.DatabaseTelemetryConfig_Impl( - new $DatabaseTelemetryConfig_DatabaseLoggingConfig_ConfigValueExtractor.DatabaseLoggingConfig_Impl(true), - new $DatabaseTelemetryConfig_DatabaseMetricsConfig_ConfigValueExtractor.DatabaseMetricsConfig_Impl(true, true, new Duration[0], Map.of()), - new $DatabaseTelemetryConfig_DatabaseTracingConfig_ConfigValueExtractor.DatabaseTracingConfig_Impl(true, Map.of()) + new $DatabaseTelemetryConfig_ConfigValueMapper.DatabaseTelemetryConfig_Impl( + new $DatabaseTelemetryConfig_DatabaseLoggingConfig_ConfigValueMapper.DatabaseLoggingConfig_Impl(true), + new $DatabaseTelemetryConfig_DatabaseMetricsConfig_ConfigValueMapper.DatabaseMetricsConfig_Impl(true, true, new Duration[0], Map.of()), + new $DatabaseTelemetryConfig_DatabaseTracingConfig_ConfigValueMapper.DatabaseTracingConfig_Impl(true, Map.of()) ) ); return new CassandraDatabase(config, null, null, new DefaultDatabaseTelemetryFactory(TracerProvider.noop().get(""), new CompositeMeterRegistry(), NoopDatabaseLoggerFactory.INSTANCE, NoopDatabaseMetricsFactory.INSTANCE)); diff --git a/database/database-common/src/main/java/io/koraframework/database/common/telemetry/DatabaseTelemetryConfig.java b/database/database-common/src/main/java/io/koraframework/database/common/telemetry/DatabaseTelemetryConfig.java index b847602ba..68539a6c8 100644 --- a/database/database-common/src/main/java/io/koraframework/database/common/telemetry/DatabaseTelemetryConfig.java +++ b/database/database-common/src/main/java/io/koraframework/database/common/telemetry/DatabaseTelemetryConfig.java @@ -1,9 +1,9 @@ package io.koraframework.database.common.telemetry; -import io.koraframework.config.common.annotation.ConfigValueExtractor; +import io.koraframework.config.common.annotation.ConfigMapper; import io.koraframework.telemetry.common.TelemetryConfig; -@ConfigValueExtractor +@ConfigMapper public interface DatabaseTelemetryConfig extends TelemetryConfig { DatabaseLoggingConfig logging(); @@ -12,10 +12,10 @@ public interface DatabaseTelemetryConfig extends TelemetryConfig { DatabaseTracingConfig tracing(); - @ConfigValueExtractor + @ConfigMapper interface DatabaseLoggingConfig extends LoggingConfig {} - @ConfigValueExtractor + @ConfigMapper interface DatabaseMetricsConfig extends MetricsConfig { default boolean driverMetrics() { @@ -23,6 +23,6 @@ default boolean driverMetrics() { } } - @ConfigValueExtractor + @ConfigMapper interface DatabaseTracingConfig extends TracingConfig {} } diff --git a/database/database-common/src/main/java/io/koraframework/database/common/telemetry/impl/DefaultDatabaseTelemetry.java b/database/database-common/src/main/java/io/koraframework/database/common/telemetry/impl/DefaultDatabaseTelemetry.java index 060b3116b..260752724 100644 --- a/database/database-common/src/main/java/io/koraframework/database/common/telemetry/impl/DefaultDatabaseTelemetry.java +++ b/database/database-common/src/main/java/io/koraframework/database/common/telemetry/impl/DefaultDatabaseTelemetry.java @@ -20,10 +20,10 @@ public record TelemetryContext(DatabaseTelemetryConfig config, Tracer tracer) { public static final TelemetryContext EMPTY = new TelemetryContext( - new $DatabaseTelemetryConfig_ConfigValueExtractor.DatabaseTelemetryConfig_Impl( - new $DatabaseTelemetryConfig_DatabaseLoggingConfig_ConfigValueExtractor.DatabaseLoggingConfig_Defaults(), - new $DatabaseTelemetryConfig_DatabaseMetricsConfig_ConfigValueExtractor.DatabaseMetricsConfig_Defaults(), - new $DatabaseTelemetryConfig_DatabaseTracingConfig_ConfigValueExtractor.DatabaseTracingConfig_Defaults() + new $DatabaseTelemetryConfig_ConfigValueMapper.DatabaseTelemetryConfig_Impl( + new $DatabaseTelemetryConfig_DatabaseLoggingConfig_ConfigValueMapper.DatabaseLoggingConfig_Defaults(), + new $DatabaseTelemetryConfig_DatabaseMetricsConfig_ConfigValueMapper.DatabaseMetricsConfig_Defaults(), + new $DatabaseTelemetryConfig_DatabaseTracingConfig_ConfigValueMapper.DatabaseTracingConfig_Defaults() ), "none", "none", diff --git a/database/database-flyway/src/main/java/io/koraframework/database/flyway/FlywayConfig.java b/database/database-flyway/src/main/java/io/koraframework/database/flyway/FlywayConfig.java index 6e5fff340..7db6ad2c1 100644 --- a/database/database-flyway/src/main/java/io/koraframework/database/flyway/FlywayConfig.java +++ b/database/database-flyway/src/main/java/io/koraframework/database/flyway/FlywayConfig.java @@ -1,11 +1,11 @@ package io.koraframework.database.flyway; -import io.koraframework.config.common.annotation.ConfigValueExtractor; +import io.koraframework.config.common.annotation.ConfigMapper; import java.util.List; import java.util.Map; -@ConfigValueExtractor +@ConfigMapper public interface FlywayConfig { default boolean enabled() { diff --git a/database/database-flyway/src/main/java/io/koraframework/database/flyway/FlywayJdbcDatabaseModule.java b/database/database-flyway/src/main/java/io/koraframework/database/flyway/FlywayJdbcDatabaseModule.java index 7a72f6846..22690b5d3 100644 --- a/database/database-flyway/src/main/java/io/koraframework/database/flyway/FlywayJdbcDatabaseModule.java +++ b/database/database-flyway/src/main/java/io/koraframework/database/flyway/FlywayJdbcDatabaseModule.java @@ -1,12 +1,12 @@ package io.koraframework.database.flyway; import io.koraframework.config.common.Config; -import io.koraframework.config.common.extractor.ConfigValueExtractor; +import io.koraframework.config.common.mapper.ConfigValueMapper; public interface FlywayJdbcDatabaseModule { - default FlywayConfig flywayConfig(Config config, ConfigValueExtractor extractor) { - return extractor.extractOrThrow(config.get("flyway")); + default FlywayConfig flywayConfig(Config config, ConfigValueMapper mapper) { + return mapper.mapOrThrow(config.get("flyway")); } default FlywayJdbcDatabaseInterceptor flywayJdbcDatabaseInterceptor(FlywayConfig flywayConfig) { diff --git a/database/database-flyway/src/test/java/io/koraframework/database/flyway/FlywayJdbcDatabaseInterceptorTest.java b/database/database-flyway/src/test/java/io/koraframework/database/flyway/FlywayJdbcDatabaseInterceptorTest.java index 7b14540b7..458a4058e 100644 --- a/database/database-flyway/src/test/java/io/koraframework/database/flyway/FlywayJdbcDatabaseInterceptorTest.java +++ b/database/database-flyway/src/test/java/io/koraframework/database/flyway/FlywayJdbcDatabaseInterceptorTest.java @@ -2,6 +2,7 @@ import io.koraframework.database.common.telemetry.impl.NoopDatabaseLoggerFactory; import io.koraframework.database.common.telemetry.impl.NoopDatabaseMetricsFactory; +import io.koraframework.database.jdbc.$JdbcDatabaseConfig_ConfigValueMapper; import io.micrometer.core.instrument.composite.CompositeMeterRegistry; import io.opentelemetry.api.trace.TracerProvider; import org.junit.jupiter.api.Assertions; @@ -9,7 +10,6 @@ import org.junit.jupiter.api.extension.ExtendWith; import io.koraframework.database.common.telemetry.*; import io.koraframework.database.common.telemetry.impl.DefaultDatabaseTelemetryFactory; -import io.koraframework.database.jdbc.$JdbcDatabaseConfig_ConfigValueExtractor; import io.koraframework.database.jdbc.JdbcDatabase; import io.koraframework.test.postgres.PostgresParams; import io.koraframework.test.postgres.PostgresTestContainer; @@ -25,7 +25,7 @@ public class FlywayJdbcDatabaseInterceptorTest { @Test public void testFlywayInterceptor(PostgresParams params) throws SQLException { - var config = new $JdbcDatabaseConfig_ConfigValueExtractor.JdbcDatabaseConfig_Impl( + var config = new $JdbcDatabaseConfig_ConfigValueMapper.JdbcDatabaseConfig_Impl( params.user(), params.password(), params.jdbcUrl(), @@ -41,10 +41,10 @@ public void testFlywayInterceptor(PostgresParams params) throws SQLException { Duration.ofMillis(1000L), false, new Properties(), - new $DatabaseTelemetryConfig_ConfigValueExtractor.DatabaseTelemetryConfig_Impl( - new $DatabaseTelemetryConfig_DatabaseLoggingConfig_ConfigValueExtractor.DatabaseLoggingConfig_Impl(true), - new $DatabaseTelemetryConfig_DatabaseMetricsConfig_ConfigValueExtractor.DatabaseMetricsConfig_Impl(true, true, new Duration[0], Map.of()), - new $DatabaseTelemetryConfig_DatabaseTracingConfig_ConfigValueExtractor.DatabaseTracingConfig_Impl(true, Map.of()) + new $DatabaseTelemetryConfig_ConfigValueMapper.DatabaseTelemetryConfig_Impl( + new $DatabaseTelemetryConfig_DatabaseLoggingConfig_ConfigValueMapper.DatabaseLoggingConfig_Impl(true), + new $DatabaseTelemetryConfig_DatabaseMetricsConfig_ConfigValueMapper.DatabaseMetricsConfig_Impl(true, true, new Duration[0], Map.of()), + new $DatabaseTelemetryConfig_DatabaseTracingConfig_ConfigValueMapper.DatabaseTracingConfig_Impl(true, Map.of()) ) ); var database = new JdbcDatabase(config, new DefaultDatabaseTelemetryFactory(TracerProvider.noop().get(""), new CompositeMeterRegistry(), NoopDatabaseLoggerFactory.INSTANCE, NoopDatabaseMetricsFactory.INSTANCE), null); diff --git a/database/database-jdbc/src/main/java/io/koraframework/database/jdbc/JdbcDatabaseConfig.java b/database/database-jdbc/src/main/java/io/koraframework/database/jdbc/JdbcDatabaseConfig.java index efc1e1599..e74d5649c 100644 --- a/database/database-jdbc/src/main/java/io/koraframework/database/jdbc/JdbcDatabaseConfig.java +++ b/database/database-jdbc/src/main/java/io/koraframework/database/jdbc/JdbcDatabaseConfig.java @@ -3,7 +3,7 @@ import com.zaxxer.hikari.HikariConfig; import org.jspecify.annotations.Nullable; import io.koraframework.common.Configurer; -import io.koraframework.config.common.annotation.ConfigValueExtractor; +import io.koraframework.config.common.annotation.ConfigMapper; import io.koraframework.database.common.telemetry.DatabaseTelemetryConfig; import java.time.Duration; @@ -16,7 +16,7 @@ * * @see JdbcRepository */ -@ConfigValueExtractor +@ConfigMapper public interface JdbcDatabaseConfig { String username(); diff --git a/database/database-jdbc/src/main/java/io/koraframework/database/jdbc/JdbcDatabaseModule.java b/database/database-jdbc/src/main/java/io/koraframework/database/jdbc/JdbcDatabaseModule.java index 0d5fd1fd2..ddeb58ba1 100644 --- a/database/database-jdbc/src/main/java/io/koraframework/database/jdbc/JdbcDatabaseModule.java +++ b/database/database-jdbc/src/main/java/io/koraframework/database/jdbc/JdbcDatabaseModule.java @@ -4,13 +4,13 @@ import org.jspecify.annotations.Nullable; import io.koraframework.common.Configurer; import io.koraframework.config.common.Config; -import io.koraframework.config.common.extractor.ConfigValueExtractor; +import io.koraframework.config.common.mapper.ConfigValueMapper; import io.koraframework.database.common.telemetry.DatabaseTelemetryFactory; public interface JdbcDatabaseModule extends JdbcMapperModule { - default JdbcDatabaseConfig jdbcDatabaseConfig(Config config, ConfigValueExtractor extractor) { - return extractor.extractOrThrow(config.get("db")); + default JdbcDatabaseConfig jdbcDatabaseConfig(Config config, ConfigValueMapper mapper) { + return mapper.mapOrThrow(config.get("db")); } default JdbcDatabase jdbcDatabase(JdbcDatabaseConfig config, DatabaseTelemetryFactory telemetryFactory, @Nullable Configurer configurer) { diff --git a/database/database-jdbc/src/test/java/io/koraframework/database/jdbc/JdbcDatabaseTest.java b/database/database-jdbc/src/test/java/io/koraframework/database/jdbc/JdbcDatabaseTest.java index 522130f36..14c7090a1 100644 --- a/database/database-jdbc/src/test/java/io/koraframework/database/jdbc/JdbcDatabaseTest.java +++ b/database/database-jdbc/src/test/java/io/koraframework/database/jdbc/JdbcDatabaseTest.java @@ -36,7 +36,7 @@ class JdbcDatabaseTest { } private static void withDb(PostgresParams params, Consumer consumer) throws SQLException { - var config = new $JdbcDatabaseConfig_ConfigValueExtractor.JdbcDatabaseConfig_Impl( + var config = new $JdbcDatabaseConfig_ConfigValueMapper.JdbcDatabaseConfig_Impl( params.user(), params.password(), params.jdbcUrl(), @@ -52,10 +52,10 @@ private static void withDb(PostgresParams params, Consumer consume Duration.ofMillis(1000L), false, new Properties(), - new $DatabaseTelemetryConfig_ConfigValueExtractor.DatabaseTelemetryConfig_Impl( - new $DatabaseTelemetryConfig_DatabaseLoggingConfig_ConfigValueExtractor.DatabaseLoggingConfig_Impl(true), - new $DatabaseTelemetryConfig_DatabaseMetricsConfig_ConfigValueExtractor.DatabaseMetricsConfig_Impl(true, true, new Duration[0], Map.of()), - new $DatabaseTelemetryConfig_DatabaseTracingConfig_ConfigValueExtractor.DatabaseTracingConfig_Impl(true, Map.of()) + new $DatabaseTelemetryConfig_ConfigValueMapper.DatabaseTelemetryConfig_Impl( + new $DatabaseTelemetryConfig_DatabaseLoggingConfig_ConfigValueMapper.DatabaseLoggingConfig_Impl(true), + new $DatabaseTelemetryConfig_DatabaseMetricsConfig_ConfigValueMapper.DatabaseMetricsConfig_Impl(true, true, new Duration[0], Map.of()), + new $DatabaseTelemetryConfig_DatabaseTracingConfig_ConfigValueMapper.DatabaseTracingConfig_Impl(true, Map.of()) ) ); var db = new JdbcDatabase(config, new DefaultDatabaseTelemetryFactory(TracerProvider.noop().get(""), new CompositeMeterRegistry(), NoopDatabaseLoggerFactory.INSTANCE, NoopDatabaseMetricsFactory.INSTANCE), null); diff --git a/database/database-liquibase/src/main/java/io/koraframework/database/liquibase/LiquibaseConfig.java b/database/database-liquibase/src/main/java/io/koraframework/database/liquibase/LiquibaseConfig.java index 2a63d8d3b..09749dd2c 100644 --- a/database/database-liquibase/src/main/java/io/koraframework/database/liquibase/LiquibaseConfig.java +++ b/database/database-liquibase/src/main/java/io/koraframework/database/liquibase/LiquibaseConfig.java @@ -1,9 +1,9 @@ package io.koraframework.database.liquibase; -import io.koraframework.config.common.annotation.ConfigValueExtractor; +import io.koraframework.config.common.annotation.ConfigMapper; -@ConfigValueExtractor +@ConfigMapper public interface LiquibaseConfig { default String changelog() { diff --git a/database/database-liquibase/src/main/java/io/koraframework/database/liquibase/LiquibaseJdbcDatabaseModule.java b/database/database-liquibase/src/main/java/io/koraframework/database/liquibase/LiquibaseJdbcDatabaseModule.java index f2f7994bb..eed8cbb4f 100644 --- a/database/database-liquibase/src/main/java/io/koraframework/database/liquibase/LiquibaseJdbcDatabaseModule.java +++ b/database/database-liquibase/src/main/java/io/koraframework/database/liquibase/LiquibaseJdbcDatabaseModule.java @@ -1,12 +1,12 @@ package io.koraframework.database.liquibase; import io.koraframework.config.common.Config; -import io.koraframework.config.common.extractor.ConfigValueExtractor; +import io.koraframework.config.common.mapper.ConfigValueMapper; public interface LiquibaseJdbcDatabaseModule { - default LiquibaseConfig liquibaseConfig(Config config, ConfigValueExtractor extractor) { - return extractor.extractOrThrow(config.get("liquibase")); + default LiquibaseConfig liquibaseConfig(Config config, ConfigValueMapper mapper) { + return mapper.mapOrThrow(config.get("liquibase")); } default LiquibaseJdbcDatabaseInterceptor liquibaseJdbcDatabaseInterceptor(LiquibaseConfig liquibaseConfig) { diff --git a/database/database-liquibase/src/test/java/io.koraframework.database.liquibase/LiquibaseJdbcDatabaseInterceptorTest.java b/database/database-liquibase/src/test/java/io.koraframework.database.liquibase/LiquibaseJdbcDatabaseInterceptorTest.java index 6b7cc3c55..e3859ef08 100644 --- a/database/database-liquibase/src/test/java/io.koraframework.database.liquibase/LiquibaseJdbcDatabaseInterceptorTest.java +++ b/database/database-liquibase/src/test/java/io.koraframework.database.liquibase/LiquibaseJdbcDatabaseInterceptorTest.java @@ -4,12 +4,12 @@ import io.koraframework.database.common.telemetry.impl.DefaultDatabaseTelemetryFactory; import io.koraframework.database.common.telemetry.impl.NoopDatabaseLoggerFactory; import io.koraframework.database.common.telemetry.impl.NoopDatabaseMetricsFactory; +import io.koraframework.database.jdbc.$JdbcDatabaseConfig_ConfigValueMapper; import io.micrometer.core.instrument.composite.CompositeMeterRegistry; import io.opentelemetry.api.trace.TracerProvider; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; -import io.koraframework.database.jdbc.$JdbcDatabaseConfig_ConfigValueExtractor; import io.koraframework.database.jdbc.JdbcDatabase; import io.koraframework.test.postgres.PostgresParams; import io.koraframework.test.postgres.PostgresTestContainer; @@ -25,7 +25,7 @@ public class LiquibaseJdbcDatabaseInterceptorTest { @Test public void testLiquibaseInterceptor(PostgresParams params) throws SQLException { - var config = new $JdbcDatabaseConfig_ConfigValueExtractor.JdbcDatabaseConfig_Impl( + var config = new $JdbcDatabaseConfig_ConfigValueMapper.JdbcDatabaseConfig_Impl( params.user(), params.password(), params.jdbcUrl(), @@ -41,10 +41,10 @@ public void testLiquibaseInterceptor(PostgresParams params) throws SQLException Duration.ofMillis(1000L), false, new Properties(), - new $DatabaseTelemetryConfig_ConfigValueExtractor.DatabaseTelemetryConfig_Impl( - new $DatabaseTelemetryConfig_DatabaseLoggingConfig_ConfigValueExtractor.DatabaseLoggingConfig_Impl(true), - new $DatabaseTelemetryConfig_DatabaseMetricsConfig_ConfigValueExtractor.DatabaseMetricsConfig_Impl(true, true, new Duration[0], Map.of()), - new $DatabaseTelemetryConfig_DatabaseTracingConfig_ConfigValueExtractor.DatabaseTracingConfig_Impl(true, Map.of()) + new $DatabaseTelemetryConfig_ConfigValueMapper.DatabaseTelemetryConfig_Impl( + new $DatabaseTelemetryConfig_DatabaseLoggingConfig_ConfigValueMapper.DatabaseLoggingConfig_Impl(true), + new $DatabaseTelemetryConfig_DatabaseMetricsConfig_ConfigValueMapper.DatabaseMetricsConfig_Impl(true, true, new Duration[0], Map.of()), + new $DatabaseTelemetryConfig_DatabaseTracingConfig_ConfigValueMapper.DatabaseTracingConfig_Impl(true, Map.of()) ) ); diff --git a/database/database-symbol-processor/src/test/kotlin/io/koraframework/database/symbol/processor/jdbc/JdbcAopTest.kt b/database/database-symbol-processor/src/test/kotlin/io/koraframework/database/symbol/processor/jdbc/JdbcAopTest.kt index 5f0c69fcd..0fae9bb89 100644 --- a/database/database-symbol-processor/src/test/kotlin/io/koraframework/database/symbol/processor/jdbc/JdbcAopTest.kt +++ b/database/database-symbol-processor/src/test/kotlin/io/koraframework/database/symbol/processor/jdbc/JdbcAopTest.kt @@ -16,7 +16,7 @@ class JdbcAopTest : AbstractJdbcRepositoryTest() { import java.sql.*; import io.koraframework.config.common.Config - import io.koraframework.config.common.factory.MapConfigFactory + import io.koraframework.config.common.util.ConfigMappingUtils import io.koraframework.logging.common.annotation.Log """.trimIndent() } @@ -25,9 +25,9 @@ class JdbcAopTest : AbstractJdbcRepositoryTest() { val classAsStrs = mutableListOf( """ @io.koraframework.common.annotation.Module - interface ConfigModule : io.koraframework.database.jdbc.JdbcDatabaseModule, io.koraframework.config.common.extractor.ConfigValueExtractorModule, io.koraframework.logging.logback.LogbackModule { + interface ConfigModule : io.koraframework.database.jdbc.JdbcDatabaseModule, io.koraframework.config.common.mapper.ConfigValueMapperModule, io.koraframework.logging.logback.LogbackModule { fun config(): Config { - return MapConfigFactory.fromMap( + return ConfigMappingUtils.fromMap( mapOf( "test" to "" ) diff --git a/database/database-symbol-processor/src/test/kotlin/io/koraframework/database/symbol/processor/jdbc/JdbcParametersTest.kt b/database/database-symbol-processor/src/test/kotlin/io/koraframework/database/symbol/processor/jdbc/JdbcParametersTest.kt index 190b9fa4a..2c28f47aa 100644 --- a/database/database-symbol-processor/src/test/kotlin/io/koraframework/database/symbol/processor/jdbc/JdbcParametersTest.kt +++ b/database/database-symbol-processor/src/test/kotlin/io/koraframework/database/symbol/processor/jdbc/JdbcParametersTest.kt @@ -1,11 +1,11 @@ package io.koraframework.database.symbol.processor.jdbc import io.koraframework.common.annotation.Tag -import io.koraframework.database.common.telemetry.`$DatabaseTelemetryConfig_ConfigValueExtractor` -import io.koraframework.database.common.telemetry.`$DatabaseTelemetryConfig_DatabaseLoggingConfig_ConfigValueExtractor` -import io.koraframework.database.common.telemetry.`$DatabaseTelemetryConfig_DatabaseMetricsConfig_ConfigValueExtractor` -import io.koraframework.database.common.telemetry.`$DatabaseTelemetryConfig_DatabaseTracingConfig_ConfigValueExtractor` -import io.koraframework.database.jdbc.`$JdbcDatabaseConfig_ConfigValueExtractor`.JdbcDatabaseConfig_Impl +import io.koraframework.database.common.telemetry.`$DatabaseTelemetryConfig_ConfigValueMapper` +import io.koraframework.database.common.telemetry.`$DatabaseTelemetryConfig_DatabaseLoggingConfig_ConfigValueMapper` +import io.koraframework.database.common.telemetry.`$DatabaseTelemetryConfig_DatabaseMetricsConfig_ConfigValueMapper` +import io.koraframework.database.common.telemetry.`$DatabaseTelemetryConfig_DatabaseTracingConfig_ConfigValueMapper` +import io.koraframework.database.jdbc.`$JdbcDatabaseConfig_ConfigValueMapper`.JdbcDatabaseConfig_Impl import io.koraframework.database.jdbc.mapper.parameter.JdbcParameterColumnMapper import io.koraframework.database.symbol.processor.entity.TestEntity import org.assertj.core.api.Assertions @@ -54,10 +54,10 @@ class JdbcParametersTest : AbstractJdbcRepositoryTest() { Duration.ofMillis(1000L), false, Properties(), - `$DatabaseTelemetryConfig_ConfigValueExtractor`.DatabaseTelemetryConfig_Impl( - `$DatabaseTelemetryConfig_DatabaseLoggingConfig_ConfigValueExtractor`.DatabaseLoggingConfig_Impl(true), - `$DatabaseTelemetryConfig_DatabaseMetricsConfig_ConfigValueExtractor`.DatabaseMetricsConfig_Impl(true, true, arrayOf(), mapOf()), - `$DatabaseTelemetryConfig_DatabaseTracingConfig_ConfigValueExtractor`.DatabaseTracingConfig_Impl(true, mapOf()) + `$DatabaseTelemetryConfig_ConfigValueMapper`.DatabaseTelemetryConfig_Impl( + `$DatabaseTelemetryConfig_DatabaseLoggingConfig_ConfigValueMapper`.DatabaseLoggingConfig_Impl(true), + `$DatabaseTelemetryConfig_DatabaseMetricsConfig_ConfigValueMapper`.DatabaseMetricsConfig_Impl(true, true, arrayOf(), mapOf()), + `$DatabaseTelemetryConfig_DatabaseTracingConfig_ConfigValueMapper`.DatabaseTracingConfig_Impl(true, mapOf()) ) ) val repository = compileForArgs( diff --git a/experimental/camunda-engine-bpmn/src/main/java/io/koraframework/camunda/engine/bpmn/CamundaEngineBpmnConfig.java b/experimental/camunda-engine-bpmn/src/main/java/io/koraframework/camunda/engine/bpmn/CamundaEngineBpmnConfig.java index e282a25f9..f1b365e09 100644 --- a/experimental/camunda-engine-bpmn/src/main/java/io/koraframework/camunda/engine/bpmn/CamundaEngineBpmnConfig.java +++ b/experimental/camunda-engine-bpmn/src/main/java/io/koraframework/camunda/engine/bpmn/CamundaEngineBpmnConfig.java @@ -1,13 +1,13 @@ package io.koraframework.camunda.engine.bpmn; import io.koraframework.camunda.engine.bpmn.telemetry.CamundaEngineTelemetryConfig; -import io.koraframework.config.common.annotation.ConfigValueExtractor; +import io.koraframework.config.common.annotation.ConfigMapper; import org.jspecify.annotations.Nullable; import java.time.Duration; import java.util.List; -@ConfigValueExtractor +@ConfigMapper public interface CamundaEngineBpmnConfig { ParallelInitConfig parallelInitialization(); @@ -22,7 +22,7 @@ public interface CamundaEngineBpmnConfig { CamundaEngineTelemetryConfig telemetry(); - @ConfigValueExtractor + @ConfigMapper interface ParallelInitConfig { default boolean enabled() { @@ -34,7 +34,7 @@ default boolean validateIncompleteStatements() { } } - @ConfigValueExtractor + @ConfigMapper interface AdminConfig { String id(); @@ -51,13 +51,13 @@ interface AdminConfig { String email(); } - @ConfigValueExtractor + @ConfigMapper interface FilterConfig { String create(); } - @ConfigValueExtractor + @ConfigMapper interface DeploymentConfig { @Nullable @@ -77,7 +77,7 @@ default boolean deployChangedOnly() { Duration delay(); } - @ConfigValueExtractor + @ConfigMapper interface JobExecutorConfig { default Integer corePoolSize() { diff --git a/experimental/camunda-engine-bpmn/src/main/java/io/koraframework/camunda/engine/bpmn/CamundaEngineBpmnModule.java b/experimental/camunda-engine-bpmn/src/main/java/io/koraframework/camunda/engine/bpmn/CamundaEngineBpmnModule.java index d91de6a0d..f6fadbe87 100644 --- a/experimental/camunda-engine-bpmn/src/main/java/io/koraframework/camunda/engine/bpmn/CamundaEngineBpmnModule.java +++ b/experimental/camunda-engine-bpmn/src/main/java/io/koraframework/camunda/engine/bpmn/CamundaEngineBpmnModule.java @@ -18,7 +18,7 @@ import io.koraframework.common.readiness.ReadinessProbe; import io.koraframework.common.telemetry.Observation; import io.koraframework.config.common.Config; -import io.koraframework.config.common.extractor.ConfigValueExtractor; +import io.koraframework.config.common.mapper.ConfigValueMapper; import io.koraframework.logging.common.MDC; import io.micrometer.core.instrument.MeterRegistry; import io.opentelemetry.api.trace.Tracer; @@ -44,8 +44,8 @@ @Deprecated public interface CamundaEngineBpmnModule { - default CamundaEngineBpmnConfig camundaEngineBpmnConfig(Config config, ConfigValueExtractor extractor) { - return extractor.extractOrThrow(config.get("camunda.engine.bpmn")); + default CamundaEngineBpmnConfig camundaEngineBpmnConfig(Config config, ConfigValueMapper mapper) { + return mapper.mapOrThrow(config.get("camunda.engine.bpmn")); } @Tag(CamundaBpmn.class) diff --git a/experimental/camunda-engine-bpmn/src/main/java/io/koraframework/camunda/engine/bpmn/telemetry/CamundaEngineTelemetryConfig.java b/experimental/camunda-engine-bpmn/src/main/java/io/koraframework/camunda/engine/bpmn/telemetry/CamundaEngineTelemetryConfig.java index c3625bf0a..71f56c50f 100644 --- a/experimental/camunda-engine-bpmn/src/main/java/io/koraframework/camunda/engine/bpmn/telemetry/CamundaEngineTelemetryConfig.java +++ b/experimental/camunda-engine-bpmn/src/main/java/io/koraframework/camunda/engine/bpmn/telemetry/CamundaEngineTelemetryConfig.java @@ -1,9 +1,9 @@ package io.koraframework.camunda.engine.bpmn.telemetry; -import io.koraframework.config.common.annotation.ConfigValueExtractor; +import io.koraframework.config.common.annotation.ConfigMapper; import io.koraframework.telemetry.common.TelemetryConfig; -@ConfigValueExtractor +@ConfigMapper public interface CamundaEngineTelemetryConfig extends TelemetryConfig { @Override @@ -15,7 +15,7 @@ public interface CamundaEngineTelemetryConfig extends TelemetryConfig { @Override CamundaEngineTracingConfig tracing(); - @ConfigValueExtractor + @ConfigMapper interface CamundaEngineLoggingConfig extends LoggingConfig { default boolean stacktrace() { @@ -23,7 +23,7 @@ default boolean stacktrace() { } } - @ConfigValueExtractor + @ConfigMapper interface CamundaEngineMetricsConfig extends TelemetryConfig.MetricsConfig { default boolean engineMetrics() { @@ -31,6 +31,6 @@ default boolean engineMetrics() { } } - @ConfigValueExtractor + @ConfigMapper interface CamundaEngineTracingConfig extends TelemetryConfig.TracingConfig {} } diff --git a/experimental/camunda-engine-bpmn/src/test/java/io/koraframework/camunda/engine/bpmn/KoraProcessEngineTests.java b/experimental/camunda-engine-bpmn/src/test/java/io/koraframework/camunda/engine/bpmn/KoraProcessEngineTests.java index 4ebdd3529..afce5b9e5 100644 --- a/experimental/camunda-engine-bpmn/src/test/java/io/koraframework/camunda/engine/bpmn/KoraProcessEngineTests.java +++ b/experimental/camunda-engine-bpmn/src/test/java/io/koraframework/camunda/engine/bpmn/KoraProcessEngineTests.java @@ -1,18 +1,16 @@ package io.koraframework.camunda.engine.bpmn; import io.koraframework.application.graph.All; -import io.koraframework.camunda.engine.bpmn.telemetry.$CamundaEngineTelemetryConfig_CamundaEngineLoggingConfig_ConfigValueExtractor; -import io.koraframework.camunda.engine.bpmn.telemetry.$CamundaEngineTelemetryConfig_CamundaEngineMetricsConfig_ConfigValueExtractor; -import io.koraframework.camunda.engine.bpmn.telemetry.$CamundaEngineTelemetryConfig_CamundaEngineTracingConfig_ConfigValueExtractor; -import io.koraframework.camunda.engine.bpmn.telemetry.$CamundaEngineTelemetryConfig_ConfigValueExtractor; +import io.koraframework.camunda.engine.bpmn.telemetry.*; +import io.koraframework.camunda.engine.bpmn.telemetry.$CamundaEngineTelemetryConfig_CamundaEngineLoggingConfig_ConfigValueMapper; +import io.koraframework.camunda.engine.bpmn.telemetry.$CamundaEngineTelemetryConfig_ConfigValueMapper; import io.koraframework.camunda.engine.bpmn.transaction.CamundaTransactionManager; import io.koraframework.camunda.engine.bpmn.transaction.JdbcCamundaTransactionManager; -import io.koraframework.database.common.telemetry.$DatabaseTelemetryConfig_ConfigValueExtractor; -import io.koraframework.database.common.telemetry.$DatabaseTelemetryConfig_DatabaseLoggingConfig_ConfigValueExtractor; -import io.koraframework.database.common.telemetry.$DatabaseTelemetryConfig_DatabaseMetricsConfig_ConfigValueExtractor; -import io.koraframework.database.common.telemetry.$DatabaseTelemetryConfig_DatabaseTracingConfig_ConfigValueExtractor; +import io.koraframework.database.common.telemetry.*; +import io.koraframework.database.common.telemetry.$DatabaseTelemetryConfig_DatabaseLoggingConfig_ConfigValueMapper; +import io.koraframework.database.common.telemetry.$DatabaseTelemetryConfig_DatabaseTracingConfig_ConfigValueMapper; import io.koraframework.database.common.telemetry.impl.NoopDatabaseTelemetryFactory; -import io.koraframework.database.jdbc.$JdbcDatabaseConfig_ConfigValueExtractor; +import io.koraframework.database.jdbc.$JdbcDatabaseConfig_ConfigValueMapper; import io.koraframework.database.jdbc.JdbcDatabase; import io.koraframework.telemetry.common.TelemetryConfig; import io.koraframework.test.postgres.PostgresParams; @@ -36,15 +34,15 @@ public class KoraProcessEngineTests implements CamundaEngineBpmnModule { @Test void initTwoStage(PostgresParams params) { withDatabase(params, jdbc -> { - var config = new $CamundaEngineBpmnConfig_ConfigValueExtractor.CamundaEngineBpmnConfig_Impl( + var config = new $CamundaEngineBpmnConfig_ConfigValueMapper.CamundaEngineBpmnConfig_Impl( new CamundaEngineBpmnConfig.ParallelInitConfig() {}, - $CamundaEngineBpmnConfig_JobExecutorConfig_ConfigValueExtractor.DEFAULTS, - new $CamundaEngineBpmnConfig_DeploymentConfig_ConfigValueExtractor.DeploymentConfig_Impl(null, "MyDep", false, List.of("bpm"), null), - new $CamundaEngineBpmnConfig_AdminConfig_ConfigValueExtractor.AdminConfig_Impl("admin", "admin", null, null, null), - new $CamundaEngineTelemetryConfig_ConfigValueExtractor.CamundaEngineTelemetryConfig_Impl( - new $CamundaEngineTelemetryConfig_CamundaEngineLoggingConfig_ConfigValueExtractor.CamundaEngineLoggingConfig_Defaults(), - new $CamundaEngineTelemetryConfig_CamundaEngineMetricsConfig_ConfigValueExtractor.CamundaEngineMetricsConfig_Defaults(), - new $CamundaEngineTelemetryConfig_CamundaEngineTracingConfig_ConfigValueExtractor.CamundaEngineTracingConfig_Defaults() + $CamundaEngineBpmnConfig_JobExecutorConfig_ConfigValueMapper.DEFAULTS, + new $CamundaEngineBpmnConfig_DeploymentConfig_ConfigValueMapper.DeploymentConfig_Impl(null, "MyDep", false, List.of("bpm"), null), + new $CamundaEngineBpmnConfig_AdminConfig_ConfigValueMapper.AdminConfig_Impl("admin", "admin", null, null, null), + new $CamundaEngineTelemetryConfig_ConfigValueMapper.CamundaEngineTelemetryConfig_Impl( + new $CamundaEngineTelemetryConfig_CamundaEngineLoggingConfig_ConfigValueMapper.CamundaEngineLoggingConfig_Defaults(), + new $CamundaEngineTelemetryConfig_CamundaEngineMetricsConfig_ConfigValueMapper.CamundaEngineMetricsConfig_Defaults(), + new $CamundaEngineTelemetryConfig_CamundaEngineTracingConfig_ConfigValueMapper.CamundaEngineTracingConfig_Defaults() ) ); @@ -95,20 +93,20 @@ public DataSource dataSource() { @Test void initOneStage(PostgresParams params) { withDatabase(params, jdbc -> { - var config = new $CamundaEngineBpmnConfig_ConfigValueExtractor.CamundaEngineBpmnConfig_Impl( + var config = new $CamundaEngineBpmnConfig_ConfigValueMapper.CamundaEngineBpmnConfig_Impl( new CamundaEngineBpmnConfig.ParallelInitConfig() { @Override public boolean enabled() { return false; } }, - $CamundaEngineBpmnConfig_JobExecutorConfig_ConfigValueExtractor.DEFAULTS, - new $CamundaEngineBpmnConfig_DeploymentConfig_ConfigValueExtractor.DeploymentConfig_Impl(null, "MyDep", false, List.of("bpm"), null), - new $CamundaEngineBpmnConfig_AdminConfig_ConfigValueExtractor.AdminConfig_Impl("admin", "admin", null, null, null), - new $CamundaEngineTelemetryConfig_ConfigValueExtractor.CamundaEngineTelemetryConfig_Impl( - new $CamundaEngineTelemetryConfig_CamundaEngineLoggingConfig_ConfigValueExtractor.CamundaEngineLoggingConfig_Defaults(), - new $CamundaEngineTelemetryConfig_CamundaEngineMetricsConfig_ConfigValueExtractor.CamundaEngineMetricsConfig_Defaults(), - new $CamundaEngineTelemetryConfig_CamundaEngineTracingConfig_ConfigValueExtractor.CamundaEngineTracingConfig_Defaults() + $CamundaEngineBpmnConfig_JobExecutorConfig_ConfigValueMapper.DEFAULTS, + new $CamundaEngineBpmnConfig_DeploymentConfig_ConfigValueMapper.DeploymentConfig_Impl(null, "MyDep", false, List.of("bpm"), null), + new $CamundaEngineBpmnConfig_AdminConfig_ConfigValueMapper.AdminConfig_Impl("admin", "admin", null, null, null), + new $CamundaEngineTelemetryConfig_ConfigValueMapper.CamundaEngineTelemetryConfig_Impl( + new $CamundaEngineTelemetryConfig_CamundaEngineLoggingConfig_ConfigValueMapper.CamundaEngineLoggingConfig_Defaults(), + new $CamundaEngineTelemetryConfig_CamundaEngineMetricsConfig_ConfigValueMapper.CamundaEngineMetricsConfig_Defaults(), + new $CamundaEngineTelemetryConfig_CamundaEngineTracingConfig_ConfigValueMapper.CamundaEngineTracingConfig_Defaults() ) ); @@ -156,7 +154,7 @@ public DataSource dataSource() { } private static void withDatabase(PostgresParams params, Consumer consumer) { - var config = new $JdbcDatabaseConfig_ConfigValueExtractor.JdbcDatabaseConfig_Impl( + var config = new $JdbcDatabaseConfig_ConfigValueMapper.JdbcDatabaseConfig_Impl( params.user(), params.password(), params.jdbcUrl(), @@ -172,10 +170,10 @@ private static void withDatabase(PostgresParams params, Consumer c Duration.ofMillis(5000L), false, new Properties(), - new $DatabaseTelemetryConfig_ConfigValueExtractor.DatabaseTelemetryConfig_Impl( - new $DatabaseTelemetryConfig_DatabaseLoggingConfig_ConfigValueExtractor.DatabaseLoggingConfig_Impl(true), - new $DatabaseTelemetryConfig_DatabaseMetricsConfig_ConfigValueExtractor.DatabaseMetricsConfig_Impl(true, true, TelemetryConfig.MetricsConfig.DEFAULT_SLO, Map.of()), - new $DatabaseTelemetryConfig_DatabaseTracingConfig_ConfigValueExtractor.DatabaseTracingConfig_Impl(true, Map.of()) + new $DatabaseTelemetryConfig_ConfigValueMapper.DatabaseTelemetryConfig_Impl( + new $DatabaseTelemetryConfig_DatabaseLoggingConfig_ConfigValueMapper.DatabaseLoggingConfig_Impl(true), + new $DatabaseTelemetryConfig_DatabaseMetricsConfig_ConfigValueMapper.DatabaseMetricsConfig_Impl(true, true, TelemetryConfig.MetricsConfig.DEFAULT_SLO, Map.of()), + new $DatabaseTelemetryConfig_DatabaseTracingConfig_ConfigValueMapper.DatabaseTracingConfig_Impl(true, Map.of()) ) ); diff --git a/experimental/camunda-rest-undertow/src/main/java/io/koraframework/camunda/rest/CamundaRestConfig.java b/experimental/camunda-rest-undertow/src/main/java/io/koraframework/camunda/rest/CamundaRestConfig.java index 6e92778a8..bd56d3423 100644 --- a/experimental/camunda-rest-undertow/src/main/java/io/koraframework/camunda/rest/CamundaRestConfig.java +++ b/experimental/camunda-rest-undertow/src/main/java/io/koraframework/camunda/rest/CamundaRestConfig.java @@ -1,14 +1,14 @@ package io.koraframework.camunda.rest; import io.koraframework.camunda.rest.telemetry.CamundaRestTelemetryConfig; -import io.koraframework.config.common.annotation.ConfigValueExtractor; +import io.koraframework.config.common.annotation.ConfigMapper; import org.jspecify.annotations.Nullable; import java.time.Duration; import java.util.List; import java.util.Map; -@ConfigValueExtractor +@ConfigMapper public interface CamundaRestConfig { default boolean enabled() { @@ -33,7 +33,7 @@ default Duration shutdownWait() { CamundaCorsConfig cors(); - @ConfigValueExtractor + @ConfigMapper interface CamundaOpenApiConfig { default List files() { @@ -52,7 +52,7 @@ default String path() { RapidocConfig rapidoc(); - @ConfigValueExtractor + @ConfigMapper interface SwaggerUIConfig { default boolean enabled() { @@ -80,7 +80,7 @@ default Map options() { } } - @ConfigValueExtractor + @ConfigMapper interface RapidocConfig { default boolean enabled() { @@ -93,7 +93,7 @@ default String path() { } } - @ConfigValueExtractor + @ConfigMapper interface CamundaCorsConfig { default boolean enabled() { diff --git a/experimental/camunda-rest-undertow/src/main/java/io/koraframework/camunda/rest/CamundaRestModule.java b/experimental/camunda-rest-undertow/src/main/java/io/koraframework/camunda/rest/CamundaRestModule.java index a50af123e..e05100e28 100644 --- a/experimental/camunda-rest-undertow/src/main/java/io/koraframework/camunda/rest/CamundaRestModule.java +++ b/experimental/camunda-rest-undertow/src/main/java/io/koraframework/camunda/rest/CamundaRestModule.java @@ -7,7 +7,7 @@ import io.koraframework.common.annotation.DefaultComponent; import io.koraframework.common.annotation.Tag; import io.koraframework.config.common.Config; -import io.koraframework.config.common.extractor.ConfigValueExtractor; +import io.koraframework.config.common.mapper.ConfigValueMapper; import io.micrometer.core.instrument.MeterRegistry; import io.opentelemetry.api.trace.Tracer; import jakarta.ws.rs.core.Application; @@ -35,8 +35,8 @@ default CamundaRestTelemetryFactory camundaRestTelemetryFactory(@Nullable Tracer return new DefaultCamundaRestTelemetryFactory(tracer, meterRegistry, loggerFactory, metricsFactory); } - default CamundaRestConfig camundaRestConfig(Config config, ConfigValueExtractor extractor) { - return extractor.extractOrThrow(config.get("camunda.rest")); + default CamundaRestConfig camundaRestConfig(Config config, ConfigValueMapper mapper) { + return mapper.mapOrThrow(config.get("camunda.rest")); } @Tag(CamundaRest.class) diff --git a/experimental/camunda-rest-undertow/src/main/java/io/koraframework/camunda/rest/telemetry/CamundaRestTelemetryConfig.java b/experimental/camunda-rest-undertow/src/main/java/io/koraframework/camunda/rest/telemetry/CamundaRestTelemetryConfig.java index c0d676d38..1197005a9 100644 --- a/experimental/camunda-rest-undertow/src/main/java/io/koraframework/camunda/rest/telemetry/CamundaRestTelemetryConfig.java +++ b/experimental/camunda-rest-undertow/src/main/java/io/koraframework/camunda/rest/telemetry/CamundaRestTelemetryConfig.java @@ -1,13 +1,13 @@ package io.koraframework.camunda.rest.telemetry; -import io.koraframework.config.common.annotation.ConfigValueExtractor; +import io.koraframework.config.common.annotation.ConfigMapper; import io.koraframework.telemetry.common.TelemetryConfig; import org.jspecify.annotations.Nullable; import java.util.Collections; import java.util.Set; -@ConfigValueExtractor +@ConfigMapper public interface CamundaRestTelemetryConfig extends TelemetryConfig { @Override @@ -19,7 +19,7 @@ public interface CamundaRestTelemetryConfig extends TelemetryConfig { @Override CamundaRestTracingConfig tracing(); - @ConfigValueExtractor + @ConfigMapper interface CamundaRestLoggingConfig extends LoggingConfig { default boolean stacktrace() { @@ -42,9 +42,9 @@ default String mask() { Boolean pathFull(); } - @ConfigValueExtractor + @ConfigMapper interface CamundaRestMetricsConfig extends MetricsConfig {} - @ConfigValueExtractor + @ConfigMapper interface CamundaRestTracingConfig extends TracingConfig {} } diff --git a/experimental/camunda-zeebe-worker/src/main/java/io/koraframework/camunda/zeebe/worker/ZeebeClientConfig.java b/experimental/camunda-zeebe-worker/src/main/java/io/koraframework/camunda/zeebe/worker/ZeebeClientConfig.java index e7cc1b6ea..5d78de9df 100644 --- a/experimental/camunda-zeebe-worker/src/main/java/io/koraframework/camunda/zeebe/worker/ZeebeClientConfig.java +++ b/experimental/camunda-zeebe-worker/src/main/java/io/koraframework/camunda/zeebe/worker/ZeebeClientConfig.java @@ -2,7 +2,7 @@ import io.koraframework.camunda.zeebe.worker.telemetry.ZeebeWorkerTelemetryConfig; import io.koraframework.common.util.Size; -import io.koraframework.config.common.annotation.ConfigValueExtractor; +import io.koraframework.config.common.annotation.ConfigMapper; import io.koraframework.grpc.client.telemetry.GrpcClientTelemetryConfig; import org.jspecify.annotations.Nullable; @@ -10,7 +10,7 @@ import java.util.Collections; import java.util.List; -@ConfigValueExtractor +@ConfigMapper public interface ZeebeClientConfig { default int executionThreads() { @@ -36,13 +36,13 @@ default Duration keepAlive() { ZeebeWorkerTelemetryConfig telemetry(); - @ConfigValueExtractor + @ConfigMapper interface RestConfig { String url(); } - @ConfigValueExtractor + @ConfigMapper interface GrpcConfig { String url(); @@ -60,7 +60,7 @@ default Size maxMessageSize() { GrpcClientTelemetryConfig telemetry(); } - @ConfigValueExtractor + @ConfigMapper interface GrpcRetryConfig { default boolean enabled() { @@ -84,7 +84,7 @@ default Double step() { } } - @ConfigValueExtractor + @ConfigMapper interface DeploymentConfig { default Duration timeout() { diff --git a/experimental/camunda-zeebe-worker/src/main/java/io/koraframework/camunda/zeebe/worker/ZeebeWorkerConfig.java b/experimental/camunda-zeebe-worker/src/main/java/io/koraframework/camunda/zeebe/worker/ZeebeWorkerConfig.java index 5229a481b..fd7ebf1cd 100644 --- a/experimental/camunda-zeebe-worker/src/main/java/io/koraframework/camunda/zeebe/worker/ZeebeWorkerConfig.java +++ b/experimental/camunda-zeebe-worker/src/main/java/io/koraframework/camunda/zeebe/worker/ZeebeWorkerConfig.java @@ -2,13 +2,13 @@ import org.jspecify.annotations.NullMarked; import org.jspecify.annotations.Nullable; -import io.koraframework.config.common.annotation.ConfigValueExtractor; +import io.koraframework.config.common.annotation.ConfigMapper; import java.time.Duration; import java.util.List; import java.util.Map; -@ConfigValueExtractor +@ConfigMapper @NullMarked public interface ZeebeWorkerConfig { @@ -18,7 +18,7 @@ default Map job() { return Map.of(); } - @ConfigValueExtractor + @ConfigMapper interface JobConfig { default String name() { @@ -53,7 +53,7 @@ default String name() { Duration streamTimeout(); } - @ConfigValueExtractor + @ConfigMapper interface BackoffConfig { @Nullable @@ -69,11 +69,11 @@ interface BackoffConfig { Double jitter(); } - BackoffConfig DEFAULT_BACKOFF_CONFIG = new $ZeebeWorkerConfig_BackoffConfig_ConfigValueExtractor.BackoffConfig_Impl( + BackoffConfig DEFAULT_BACKOFF_CONFIG = new $ZeebeWorkerConfig_BackoffConfig_ConfigValueMapper.BackoffConfig_Impl( Duration.ofMillis(500), Duration.ofMillis(100), 1.0, 1.1 ); - JobConfig DEFAULT_JOB_CONFIG = new $ZeebeWorkerConfig_JobConfig_ConfigValueExtractor.JobConfig_Impl( + JobConfig DEFAULT_JOB_CONFIG = new $ZeebeWorkerConfig_JobConfig_ConfigValueMapper.JobConfig_Impl( "default", DEFAULT_BACKOFF_CONFIG, List.of(), Duration.ofMinutes(15), 32, Duration.ofSeconds(15), Duration.ofMillis(100), true, false, Duration.ofSeconds(15) ); @@ -99,7 +99,7 @@ private static JobConfig merge(@Nullable JobConfig targetConfig, JobConfig defau } final BackoffConfig backoff = merge(targetConfig.backoff(), defaultConfig.backoff()); - return new $ZeebeWorkerConfig_JobConfig_ConfigValueExtractor.JobConfig_Impl( + return new $ZeebeWorkerConfig_JobConfig_ConfigValueMapper.JobConfig_Impl( targetConfig.name() == null ? defaultConfig.name() : targetConfig.name(), backoff, targetConfig.tenantIds() == null ? defaultConfig.tenantIds() : targetConfig.tenantIds(), @@ -118,7 +118,7 @@ private static BackoffConfig merge(@Nullable BackoffConfig targetConfig, Backoff return defaultConfig; } - return new $ZeebeWorkerConfig_BackoffConfig_ConfigValueExtractor.BackoffConfig_Impl( + return new $ZeebeWorkerConfig_BackoffConfig_ConfigValueMapper.BackoffConfig_Impl( targetConfig.maxDelay() == null ? defaultConfig.maxDelay() : targetConfig.maxDelay(), targetConfig.minDelay() == null ? defaultConfig.minDelay() : targetConfig.minDelay(), targetConfig.factor() == null ? defaultConfig.factor() : targetConfig.factor(), diff --git a/experimental/camunda-zeebe-worker/src/main/java/io/koraframework/camunda/zeebe/worker/ZeebeWorkerModule.java b/experimental/camunda-zeebe-worker/src/main/java/io/koraframework/camunda/zeebe/worker/ZeebeWorkerModule.java index 1b18c9b31..6eba0ad11 100644 --- a/experimental/camunda-zeebe-worker/src/main/java/io/koraframework/camunda/zeebe/worker/ZeebeWorkerModule.java +++ b/experimental/camunda-zeebe-worker/src/main/java/io/koraframework/camunda/zeebe/worker/ZeebeWorkerModule.java @@ -20,7 +20,7 @@ import io.koraframework.common.annotation.Tag; import io.koraframework.common.annotation.Root; import io.koraframework.config.common.Config; -import io.koraframework.config.common.extractor.ConfigValueExtractor; +import io.koraframework.config.common.mapper.ConfigValueMapper; import io.koraframework.grpc.client.GrpcClientModule; import io.koraframework.grpc.client.channel.GrpcClientChannelFactory; import io.koraframework.grpc.client.telemetry.GrpcClientTelemetryFactory; @@ -34,12 +34,12 @@ public interface ZeebeWorkerModule extends GrpcClientModule, JsonModule { - default ZeebeWorkerConfig zeebeWorkerConfig(Config config, ConfigValueExtractor extractor) { - return extractor.extractOrThrow(config.get("zeebe.worker")); + default ZeebeWorkerConfig zeebeWorkerConfig(Config config, ConfigValueMapper mapper) { + return mapper.mapOrThrow(config.get("zeebe.worker")); } - default ZeebeClientConfig zeebeClientConfig(Config config, ConfigValueExtractor extractor) { - return extractor.extractOrThrow(config.get("zeebe.client")); + default ZeebeClientConfig zeebeClientConfig(Config config, ConfigValueMapper mapper) { + return mapper.mapOrThrow(config.get("zeebe.client")); } @DefaultComponent diff --git a/experimental/camunda-zeebe-worker/src/main/java/io/koraframework/camunda/zeebe/worker/telemetry/ZeebeWorkerTelemetryConfig.java b/experimental/camunda-zeebe-worker/src/main/java/io/koraframework/camunda/zeebe/worker/telemetry/ZeebeWorkerTelemetryConfig.java index 221787697..1208a6238 100644 --- a/experimental/camunda-zeebe-worker/src/main/java/io/koraframework/camunda/zeebe/worker/telemetry/ZeebeWorkerTelemetryConfig.java +++ b/experimental/camunda-zeebe-worker/src/main/java/io/koraframework/camunda/zeebe/worker/telemetry/ZeebeWorkerTelemetryConfig.java @@ -1,9 +1,9 @@ package io.koraframework.camunda.zeebe.worker.telemetry; -import io.koraframework.config.common.annotation.ConfigValueExtractor; +import io.koraframework.config.common.annotation.ConfigMapper; import io.koraframework.telemetry.common.TelemetryConfig; -@ConfigValueExtractor +@ConfigMapper public interface ZeebeWorkerTelemetryConfig extends TelemetryConfig { @Override @@ -15,12 +15,12 @@ public interface ZeebeWorkerTelemetryConfig extends TelemetryConfig { @Override ZeebeWorkerTracingConfig tracing(); - @ConfigValueExtractor + @ConfigMapper interface ZeebeWorkerLoggingConfig extends LoggingConfig { } - @ConfigValueExtractor + @ConfigMapper interface ZeebeWorkerMetricsConfig extends MetricsConfig { } - @ConfigValueExtractor + @ConfigMapper interface ZeebeWorkerTracingConfig extends TracingConfig { } } diff --git a/experimental/camunda-zeebe-worker/src/main/java/io/koraframework/camunda/zeebe/worker/telemetry/impl/DefaultZeebeWorkerTelemetry.java b/experimental/camunda-zeebe-worker/src/main/java/io/koraframework/camunda/zeebe/worker/telemetry/impl/DefaultZeebeWorkerTelemetry.java index d8ebf0902..666cb78c2 100644 --- a/experimental/camunda-zeebe-worker/src/main/java/io/koraframework/camunda/zeebe/worker/telemetry/impl/DefaultZeebeWorkerTelemetry.java +++ b/experimental/camunda-zeebe-worker/src/main/java/io/koraframework/camunda/zeebe/worker/telemetry/impl/DefaultZeebeWorkerTelemetry.java @@ -2,7 +2,6 @@ import io.camunda.client.api.response.ActivatedJob; import io.koraframework.camunda.zeebe.worker.telemetry.*; -import io.koraframework.telemetry.common.TelemetryConfig; import io.micrometer.core.instrument.MeterRegistry; import io.opentelemetry.api.trace.Span; import io.opentelemetry.api.trace.SpanKind; @@ -18,10 +17,10 @@ public record TelemetryContext(ZeebeWorkerTelemetryConfig config, Tracer tracer) { public static final TelemetryContext EMPTY = new TelemetryContext( - new $ZeebeWorkerTelemetryConfig_ConfigValueExtractor.ZeebeWorkerTelemetryConfig_Impl( - new $ZeebeWorkerTelemetryConfig_ZeebeWorkerLoggingConfig_ConfigValueExtractor.ZeebeWorkerLoggingConfig_Defaults(), - new $ZeebeWorkerTelemetryConfig_ZeebeWorkerMetricsConfig_ConfigValueExtractor.ZeebeWorkerMetricsConfig_Defaults(), - new $ZeebeWorkerTelemetryConfig_ZeebeWorkerTracingConfig_ConfigValueExtractor.ZeebeWorkerTracingConfig_Defaults() + new $ZeebeWorkerTelemetryConfig_ConfigValueMapper.ZeebeWorkerTelemetryConfig_Impl( + new $ZeebeWorkerTelemetryConfig_ZeebeWorkerLoggingConfig_ConfigValueMapper.ZeebeWorkerLoggingConfig_Defaults(), + new $ZeebeWorkerTelemetryConfig_ZeebeWorkerMetricsConfig_ConfigValueMapper.ZeebeWorkerMetricsConfig_Defaults(), + new $ZeebeWorkerTelemetryConfig_ZeebeWorkerTracingConfig_ConfigValueMapper.ZeebeWorkerTracingConfig_Defaults() ), "none", false, diff --git a/experimental/s3-client-annotation-processor/src/main/java/io/koraframework/s3/client/kora/annotation/processor/gen/ModuleGenerator.java b/experimental/s3-client-annotation-processor/src/main/java/io/koraframework/s3/client/kora/annotation/processor/gen/ModuleGenerator.java index 9afae52d3..c10b22671 100644 --- a/experimental/s3-client-annotation-processor/src/main/java/io/koraframework/s3/client/kora/annotation/processor/gen/ModuleGenerator.java +++ b/experimental/s3-client-annotation-processor/src/main/java/io/koraframework/s3/client/kora/annotation/processor/gen/ModuleGenerator.java @@ -58,8 +58,8 @@ public static TypeSpec generate(ProcessingEnvironment processingEnv, TypeElement .addModifiers(Modifier.PUBLIC, Modifier.DEFAULT) .returns(configType) .addParameter(CommonClassNames.config, "config") - .addParameter(ParameterizedTypeName.get(CommonClassNames.configValueExtractor, configType), "extractor") - .addStatement("return extractor.extractOrThrow(config.get($S))", s3ClientConfigPath) + .addParameter(ParameterizedTypeName.get(CommonClassNames.configValueMapper, configType), "mapper") + .addStatement("return mapper.mapOrThrow(config.get($S))", s3ClientConfigPath) .build()); var clientImpl = MethodSpec.methodBuilder("clientImpl") .addModifiers(Modifier.PUBLIC, Modifier.DEFAULT) diff --git a/experimental/s3-client-annotation-processor/src/test/java/io/koraframework/s3/client/kora/annotation/processor/S3DeleteTest.java b/experimental/s3-client-annotation-processor/src/test/java/io/koraframework/s3/client/kora/annotation/processor/S3DeleteTest.java index 8141dc273..e2c640178 100644 --- a/experimental/s3-client-annotation-processor/src/test/java/io/koraframework/s3/client/kora/annotation/processor/S3DeleteTest.java +++ b/experimental/s3-client-annotation-processor/src/test/java/io/koraframework/s3/client/kora/annotation/processor/S3DeleteTest.java @@ -2,7 +2,7 @@ import io.koraframework.s3.client.kora.S3Credentials; import org.junit.jupiter.api.Test; -import io.koraframework.config.common.factory.MapConfigFactory; +import io.koraframework.config.common.util.ConfigMappingUtils; import io.koraframework.s3.client.kora.model.request.DeleteObjectArgs; import java.util.Map; @@ -30,7 +30,7 @@ public interface Client { @Test public void testDeleteWithTemplateKeyAndArgs() throws Exception { - var bucketConfig = MapConfigFactory.fromMap(Map.of( + var bucketConfig = ConfigMappingUtils.fromMap(Map.of( "bucket", "bucket_value" )); var client = this.compile(""" @@ -51,7 +51,7 @@ public interface Client { @Test public void testDeleteWithAwsCredentials() throws Exception { - var bucketConfig = MapConfigFactory.fromMap(Map.of( + var bucketConfig = ConfigMappingUtils.fromMap(Map.of( "Client", Map.of( "bucket", "bucket_value" ) @@ -74,7 +74,7 @@ public interface Client { @Test public void testDeleteConstantKey() throws Exception { - var bucketConfig = MapConfigFactory.fromMap(Map.of( + var bucketConfig = ConfigMappingUtils.fromMap(Map.of( "bucket", "bucket_value" )); var client = this.compile(""" diff --git a/experimental/s3-client-annotation-processor/src/test/java/io/koraframework/s3/client/kora/annotation/processor/S3GetTest.java b/experimental/s3-client-annotation-processor/src/test/java/io/koraframework/s3/client/kora/annotation/processor/S3GetTest.java index 542098887..0a8297f7f 100644 --- a/experimental/s3-client-annotation-processor/src/test/java/io/koraframework/s3/client/kora/annotation/processor/S3GetTest.java +++ b/experimental/s3-client-annotation-processor/src/test/java/io/koraframework/s3/client/kora/annotation/processor/S3GetTest.java @@ -3,7 +3,7 @@ import io.koraframework.s3.client.kora.S3Credentials; import org.junit.jupiter.api.Test; -import io.koraframework.config.common.factory.MapConfigFactory; +import io.koraframework.config.common.util.ConfigMappingUtils; import io.koraframework.http.common.body.HttpBodyInput; import io.koraframework.s3.client.kora.model.request.GetObjectArgs; import io.koraframework.s3.client.kora.model.response.GetObjectResult; @@ -45,7 +45,7 @@ public interface Client { @Test public void testGetWithTemplateKeyAndArgs() throws Exception { - var bucketConfig = MapConfigFactory.fromMap(Map.of( + var bucketConfig = ConfigMappingUtils.fromMap(Map.of( "bucket", "bucket_value" )); var client = this.compile(""" @@ -72,7 +72,7 @@ public interface Client { @Test public void testGetWithAwsCredentials() throws Exception { - var bucketConfig = MapConfigFactory.fromMap(Map.of( + var bucketConfig = ConfigMappingUtils.fromMap(Map.of( "Client", Map.of( "bucket", "bucket_value" ) @@ -120,7 +120,7 @@ public interface Client { @Test public void testGetConstantKey() throws Exception { - var bucketConfig = MapConfigFactory.fromMap(Map.of( + var bucketConfig = ConfigMappingUtils.fromMap(Map.of( "bucket", "bucket_value" )); var client = this.compile(""" diff --git a/experimental/s3-client-annotation-processor/src/test/java/io/koraframework/s3/client/kora/annotation/processor/S3PutTest.java b/experimental/s3-client-annotation-processor/src/test/java/io/koraframework/s3/client/kora/annotation/processor/S3PutTest.java index e2cb5e0cd..7c704a677 100644 --- a/experimental/s3-client-annotation-processor/src/test/java/io/koraframework/s3/client/kora/annotation/processor/S3PutTest.java +++ b/experimental/s3-client-annotation-processor/src/test/java/io/koraframework/s3/client/kora/annotation/processor/S3PutTest.java @@ -1,8 +1,8 @@ package io.koraframework.s3.client.kora.annotation.processor; +import io.koraframework.s3.client.kora.$S3ClientConfig_UploadConfig_ConfigValueMapper; import org.junit.jupiter.api.Test; -import io.koraframework.s3.client.kora.$S3ClientConfig_UploadConfig_ConfigValueExtractor; import io.koraframework.s3.client.kora.S3Client; import io.koraframework.s3.client.kora.model.response.UploadedPart; @@ -99,7 +99,7 @@ public interface Client { when(s3Client.uploadPart(any(), eq("bucket"), eq("key"), eq("multipartid"), eq(1), any(), eq(0), eq(5 * 1024 * 1024))).thenReturn(part1); when(s3Client.uploadPart(any(), eq("bucket"), eq("key"), eq("multipartid"), eq(2), any(), eq(0), eq(3 * 1024 * 1024))).thenReturn(part2); when(s3Client.completeMultipartUpload(any(), eq("bucket"), eq("key"), eq("multipartid"), eq(List.of(part1, part2)), any())).thenReturn("etag-final"); - when(config.upload()).thenReturn(new $S3ClientConfig_UploadConfig_ConfigValueExtractor.UploadConfig_Defaults()); + when(config.upload()).thenReturn(new $S3ClientConfig_UploadConfig_ConfigValueMapper.UploadConfig_Defaults()); assertThat(client.invoke("put", "bucket", "key", is)).isEqualTo("etag-final"); diff --git a/experimental/s3-client-kora/src/main/java/io/koraframework/s3/client/kora/KoraS3ClientModule.java b/experimental/s3-client-kora/src/main/java/io/koraframework/s3/client/kora/KoraS3ClientModule.java index a5d0ac56b..4d02f997e 100644 --- a/experimental/s3-client-kora/src/main/java/io/koraframework/s3/client/kora/KoraS3ClientModule.java +++ b/experimental/s3-client-kora/src/main/java/io/koraframework/s3/client/kora/KoraS3ClientModule.java @@ -3,8 +3,8 @@ import io.koraframework.common.annotation.DefaultComponent; import io.koraframework.common.annotation.Tag; import io.koraframework.config.common.ConfigValue; -import io.koraframework.config.common.extractor.ConfigValueExtractionException; -import io.koraframework.config.common.extractor.ConfigValueExtractor; +import io.koraframework.config.common.exception.ConfigValueException; +import io.koraframework.config.common.mapper.ConfigValueMapper; import io.koraframework.http.client.common.HttpClient; import io.koraframework.s3.client.kora.impl.KoraS3Client; import io.koraframework.s3.client.kora.telemetry.S3ClientTelemetryFactory; @@ -49,7 +49,7 @@ public S3Client create(String configPath, Class clientImpl, S3ClientConfig co } @DefaultComponent - default ConfigValueExtractor koraS3CredentialsValueExtractor() { + default ConfigValueMapper koraS3CredentialsValueExtractor() { return src -> { if (src instanceof ConfigValue.NullValue) { return null; @@ -57,11 +57,11 @@ default ConfigValueExtractor koraS3CredentialsValueExtractor() { var configObject = src.asObject(); var accessKey = configObject.get("accessKey"); if (accessKey.isNull()) { - throw ConfigValueExtractionException.missingValue(accessKey); + throw ConfigValueException.missingValue(accessKey); } var secretKey = configObject.get("secretKey"); if (secretKey.isNull()) { - throw ConfigValueExtractionException.missingValue(secretKey); + throw ConfigValueException.missingValue(secretKey); } return S3Credentials.of(accessKey.asString(), secretKey.asString()); }; diff --git a/experimental/s3-client-kora/src/main/java/io/koraframework/s3/client/kora/S3ClientConfig.java b/experimental/s3-client-kora/src/main/java/io/koraframework/s3/client/kora/S3ClientConfig.java index a4b8d470b..e8efa8942 100644 --- a/experimental/s3-client-kora/src/main/java/io/koraframework/s3/client/kora/S3ClientConfig.java +++ b/experimental/s3-client-kora/src/main/java/io/koraframework/s3/client/kora/S3ClientConfig.java @@ -1,12 +1,12 @@ package io.koraframework.s3.client.kora; import io.koraframework.common.util.Size; -import io.koraframework.config.common.annotation.ConfigValueExtractor; +import io.koraframework.config.common.annotation.ConfigMapper; import io.koraframework.s3.client.kora.telemetry.S3ClientTelemetryConfig; import java.time.Duration; -@ConfigValueExtractor +@ConfigMapper public interface S3ClientConfig { String endpoint(); @@ -32,7 +32,7 @@ default Duration requestTimeout() { S3ClientTelemetryConfig telemetry(); - @ConfigValueExtractor + @ConfigMapper interface UploadConfig { /** diff --git a/experimental/s3-client-kora/src/main/java/io/koraframework/s3/client/kora/S3ClientConfigWithCredentials.java b/experimental/s3-client-kora/src/main/java/io/koraframework/s3/client/kora/S3ClientConfigWithCredentials.java index be0116d21..328a01f7d 100644 --- a/experimental/s3-client-kora/src/main/java/io/koraframework/s3/client/kora/S3ClientConfigWithCredentials.java +++ b/experimental/s3-client-kora/src/main/java/io/koraframework/s3/client/kora/S3ClientConfigWithCredentials.java @@ -1,8 +1,8 @@ package io.koraframework.s3.client.kora; -import io.koraframework.config.common.annotation.ConfigValueExtractor; +import io.koraframework.config.common.annotation.ConfigMapper; -@ConfigValueExtractor +@ConfigMapper public interface S3ClientConfigWithCredentials extends S3ClientConfig { S3Credentials credentials(); } diff --git a/experimental/s3-client-kora/src/main/java/io/koraframework/s3/client/kora/telemetry/S3ClientTelemetryConfig.java b/experimental/s3-client-kora/src/main/java/io/koraframework/s3/client/kora/telemetry/S3ClientTelemetryConfig.java index 53e6df81d..a41ffde3e 100644 --- a/experimental/s3-client-kora/src/main/java/io/koraframework/s3/client/kora/telemetry/S3ClientTelemetryConfig.java +++ b/experimental/s3-client-kora/src/main/java/io/koraframework/s3/client/kora/telemetry/S3ClientTelemetryConfig.java @@ -1,9 +1,9 @@ package io.koraframework.s3.client.kora.telemetry; -import io.koraframework.config.common.annotation.ConfigValueExtractor; +import io.koraframework.config.common.annotation.ConfigMapper; import io.koraframework.telemetry.common.TelemetryConfig; -@ConfigValueExtractor +@ConfigMapper public interface S3ClientTelemetryConfig extends TelemetryConfig { @Override @@ -15,12 +15,12 @@ public interface S3ClientTelemetryConfig extends TelemetryConfig { @Override S3ClientTracingConfig tracing(); - @ConfigValueExtractor + @ConfigMapper interface S3ClientLoggingConfig extends TelemetryConfig.LoggingConfig {} - @ConfigValueExtractor + @ConfigMapper interface S3ClientTracingConfig extends TelemetryConfig.TracingConfig {} - @ConfigValueExtractor + @ConfigMapper interface S3ClientMetricsConfig extends TelemetryConfig.MetricsConfig {} } diff --git a/experimental/s3-client-kora/src/main/java/io/koraframework/s3/client/kora/telemetry/impl/DefaultS3ClientTelemetry.java b/experimental/s3-client-kora/src/main/java/io/koraframework/s3/client/kora/telemetry/impl/DefaultS3ClientTelemetry.java index e2c14b45f..af0e5edec 100644 --- a/experimental/s3-client-kora/src/main/java/io/koraframework/s3/client/kora/telemetry/impl/DefaultS3ClientTelemetry.java +++ b/experimental/s3-client-kora/src/main/java/io/koraframework/s3/client/kora/telemetry/impl/DefaultS3ClientTelemetry.java @@ -21,10 +21,10 @@ public record TelemetryContext(S3ClientTelemetryConfig config, Tracer tracer) { public static final TelemetryContext EMPTY = new TelemetryContext( - new $S3ClientTelemetryConfig_ConfigValueExtractor.S3ClientTelemetryConfig_Impl( - new $S3ClientTelemetryConfig_S3ClientLoggingConfig_ConfigValueExtractor.S3ClientLoggingConfig_Defaults(), - new $S3ClientTelemetryConfig_S3ClientMetricsConfig_ConfigValueExtractor.S3ClientMetricsConfig_Defaults(), - new $S3ClientTelemetryConfig_S3ClientTracingConfig_ConfigValueExtractor.S3ClientTracingConfig_Defaults() + new $S3ClientTelemetryConfig_ConfigValueMapper.S3ClientTelemetryConfig_Impl( + new $S3ClientTelemetryConfig_S3ClientLoggingConfig_ConfigValueMapper.S3ClientLoggingConfig_Defaults(), + new $S3ClientTelemetryConfig_S3ClientMetricsConfig_ConfigValueMapper.S3ClientMetricsConfig_Defaults(), + new $S3ClientTelemetryConfig_S3ClientTracingConfig_ConfigValueMapper.S3ClientTracingConfig_Defaults() ), "none", "none", "none", false, false, DefaultS3ClientTelemetryFactory.NOOP_METER_REGISTRY, DefaultS3ClientTelemetryFactory.NOOP_TRACER); } diff --git a/experimental/s3-client-symbol-processor/src/main/kotlin/io/koraframework/s3/client/kora/symbol/processor/gen/ModuleGenerator.kt b/experimental/s3-client-symbol-processor/src/main/kotlin/io/koraframework/s3/client/kora/symbol/processor/gen/ModuleGenerator.kt index 27d04ac67..52a0ab207 100644 --- a/experimental/s3-client-symbol-processor/src/main/kotlin/io/koraframework/s3/client/kora/symbol/processor/gen/ModuleGenerator.kt +++ b/experimental/s3-client-symbol-processor/src/main/kotlin/io/koraframework/s3/client/kora/symbol/processor/gen/ModuleGenerator.kt @@ -54,8 +54,8 @@ object ModuleGenerator { FunSpec.builder("clientConfig") .returns(configType) .addParameter("config", CommonClassNames.config) - .addParameter("extractor", CommonClassNames.configValueExtractor.parameterizedBy(configType)) - .addStatement("return extractor.extractOrThrow(config.get(%S))", s3ClientConfigPath) + .addParameter("mapper", CommonClassNames.configValueMapper.parameterizedBy(configType)) + .addStatement("return mapper.mapOrThrow(config.get(%S))", s3ClientConfigPath) .build() ) val clientImpl = FunSpec.builder("clientImpl") diff --git a/experimental/s3-client-symbol-processor/src/test/kotlin/io/koraframework/s3/client/symbol/processor/S3DeleteTest.kt b/experimental/s3-client-symbol-processor/src/test/kotlin/io/koraframework/s3/client/symbol/processor/S3DeleteTest.kt index a609a1469..32869b556 100644 --- a/experimental/s3-client-symbol-processor/src/test/kotlin/io/koraframework/s3/client/symbol/processor/S3DeleteTest.kt +++ b/experimental/s3-client-symbol-processor/src/test/kotlin/io/koraframework/s3/client/symbol/processor/S3DeleteTest.kt @@ -2,7 +2,7 @@ package io.koraframework.s3.client.symbol.processor import org.junit.jupiter.api.Test import org.mockito.Mockito.* -import io.koraframework.config.common.factory.MapConfigFactory +import io.koraframework.config.common.util.ConfigMappingUtils import io.koraframework.s3.client.kora.S3Credentials import io.koraframework.s3.client.kora.model.request.DeleteObjectArgs import io.koraframework.s3.client.kora.symbol.processor.AbstractS3ClientTest @@ -30,7 +30,7 @@ internal class S3DeleteTest : AbstractS3ClientTest() { @Test fun testDeleteWithTemplateKeyAndArgs() { - val bucketConfig = MapConfigFactory.fromMap( + val bucketConfig = ConfigMappingUtils.fromMap( mapOf( "bucket" to "bucket_value" ) @@ -56,7 +56,7 @@ internal class S3DeleteTest : AbstractS3ClientTest() { @Test fun testDeleteWithS3Credentials() { - val bucketConfig = MapConfigFactory.fromMap( + val bucketConfig = ConfigMappingUtils.fromMap( mapOf( "Client" to mapOf( "bucket" to "bucket_value" @@ -84,7 +84,7 @@ internal class S3DeleteTest : AbstractS3ClientTest() { @Test fun testDeleteConstantKey() { - val bucketConfig = MapConfigFactory.fromMap( + val bucketConfig = ConfigMappingUtils.fromMap( mapOf( "bucket" to "bucket_value" ) diff --git a/experimental/s3-client-symbol-processor/src/test/kotlin/io/koraframework/s3/client/symbol/processor/S3GetTest.kt b/experimental/s3-client-symbol-processor/src/test/kotlin/io/koraframework/s3/client/symbol/processor/S3GetTest.kt index 6be281039..0ee079818 100644 --- a/experimental/s3-client-symbol-processor/src/test/kotlin/io/koraframework/s3/client/symbol/processor/S3GetTest.kt +++ b/experimental/s3-client-symbol-processor/src/test/kotlin/io/koraframework/s3/client/symbol/processor/S3GetTest.kt @@ -4,7 +4,7 @@ import org.assertj.core.api.Assertions.assertThat import org.junit.jupiter.api.Test import org.mockito.ArgumentMatchers.* import org.mockito.Mockito.* -import io.koraframework.config.common.factory.MapConfigFactory +import io.koraframework.config.common.util.ConfigMappingUtils import io.koraframework.http.common.body.HttpBodyInput import io.koraframework.s3.client.kora.S3Credentials import io.koraframework.s3.client.kora.model.request.GetObjectArgs @@ -60,7 +60,7 @@ internal class S3GetTest : AbstractS3ClientTest() { @Test fun testGetWithTemplateKeyAndArgs() { - val bucketConfig = MapConfigFactory.fromMap( + val bucketConfig = ConfigMappingUtils.fromMap( mapOf( "bucket" to "bucket_value" ) @@ -106,7 +106,7 @@ internal class S3GetTest : AbstractS3ClientTest() { @Test fun testGetWithS3Credentials() { - val bucketConfig = MapConfigFactory.fromMap( + val bucketConfig = ConfigMappingUtils.fromMap( mapOf( "Client" to mapOf( "bucket" to "bucket_value" @@ -188,7 +188,7 @@ internal class S3GetTest : AbstractS3ClientTest() { @Test fun testGetConstantKey() { - val bucketConfig = MapConfigFactory.fromMap( + val bucketConfig = ConfigMappingUtils.fromMap( mapOf( "bucket" to "bucket_value" ) diff --git a/experimental/s3-client-symbol-processor/src/test/kotlin/io/koraframework/s3/client/symbol/processor/S3PutTest.kt b/experimental/s3-client-symbol-processor/src/test/kotlin/io/koraframework/s3/client/symbol/processor/S3PutTest.kt index 984f01024..d95f45bc5 100644 --- a/experimental/s3-client-symbol-processor/src/test/kotlin/io/koraframework/s3/client/symbol/processor/S3PutTest.kt +++ b/experimental/s3-client-symbol-processor/src/test/kotlin/io/koraframework/s3/client/symbol/processor/S3PutTest.kt @@ -4,7 +4,7 @@ import org.assertj.core.api.Assertions.assertThat import org.junit.jupiter.api.Test import org.mockito.ArgumentMatchers.* import org.mockito.Mockito.* -import io.koraframework.s3.client.kora.`$S3ClientConfig_UploadConfig_ConfigValueExtractor` +import io.koraframework.s3.client.kora.`$S3ClientConfig_UploadConfig_ConfigValueMapper` import io.koraframework.s3.client.kora.S3Client import io.koraframework.s3.client.kora.model.response.UploadedPart import io.koraframework.s3.client.kora.symbol.processor.AbstractS3ClientTest @@ -198,7 +198,7 @@ internal class S3PutTest : AbstractS3ClientTest() { any() ) ).thenReturn("etag-final") - `when`(config.upload()).thenReturn(`$S3ClientConfig_UploadConfig_ConfigValueExtractor`.UploadConfig_Defaults()) + `when`(config.upload()).thenReturn(`$S3ClientConfig_UploadConfig_ConfigValueMapper`.UploadConfig_Defaults()) assertThat(client.invoke("put", "bucket", "key", `is`)).isEqualTo("etag-final") diff --git a/grpc/grpc-client-annotation-processor/src/test/java/io/koraframework/grpc/client/annotation/processor/GrpcClientExtensionTest.java b/grpc/grpc-client-annotation-processor/src/test/java/io/koraframework/grpc/client/annotation/processor/GrpcClientExtensionTest.java index b7b9ab25b..1e1963a2b 100644 --- a/grpc/grpc-client-annotation-processor/src/test/java/io/koraframework/grpc/client/annotation/processor/GrpcClientExtensionTest.java +++ b/grpc/grpc-client-annotation-processor/src/test/java/io/koraframework/grpc/client/annotation/processor/GrpcClientExtensionTest.java @@ -16,9 +16,9 @@ protected void compile(@Language("java") String... sources) throws Exception { var patchedSources = Arrays.copyOf(sources, sources.length + 1); patchedSources[sources.length] = """ @io.koraframework.common.annotation.Module - public interface ConfigModule extends io.koraframework.grpc.client.GrpcClientModule, io.koraframework.config.common.extractor.ConfigValueExtractorModule { + public interface ConfigModule extends io.koraframework.grpc.client.GrpcClientModule, io.koraframework.config.common.mapper.ConfigValueMapperModule { default io.koraframework.config.common.Config config() { - return io.koraframework.config.common.factory.MapConfigFactory.fromMap(java.util.Map.of( + return io.koraframework.config.common.util.ConfigMappingUtils.fromMap(java.util.Map.of( "grpcClient", java.util.Map.of( "Events", java.util.Map.of( "url", "http://localhost:8080", diff --git a/grpc/grpc-client-symbol-processor/src/test/kotlin/io/koraframework/grpc/client/ksp/GrpcClientExtensionTest.kt b/grpc/grpc-client-symbol-processor/src/test/kotlin/io/koraframework/grpc/client/ksp/GrpcClientExtensionTest.kt index b697ba43f..f6888cd44 100644 --- a/grpc/grpc-client-symbol-processor/src/test/kotlin/io/koraframework/grpc/client/ksp/GrpcClientExtensionTest.kt +++ b/grpc/grpc-client-symbol-processor/src/test/kotlin/io/koraframework/grpc/client/ksp/GrpcClientExtensionTest.kt @@ -13,9 +13,9 @@ class GrpcClientExtensionTest : AbstractSymbolProcessorTest() { val patchedSources = Arrays.copyOf(sources, sources.size + 1) patchedSources[sources.size] = """ @io.koraframework.common.annotation.Module - interface ConfigModule : io.koraframework.grpc.client.GrpcClientModule, io.koraframework.config.common.extractor.ConfigValueExtractorModule { + interface ConfigModule : io.koraframework.grpc.client.GrpcClientModule, io.koraframework.config.common.mapper.ConfigValueMapperModule { fun config(): io.koraframework.config.common.Config { - return io.koraframework.config.common.factory.MapConfigFactory.fromMap(java.util.Map.of( + return io.koraframework.config.common.util.ConfigMappingUtils.fromMap(java.util.Map.of( "grpcClient", java.util.Map.of( "Events", java.util.Map.of( "url", "http://localhost:8080", diff --git a/grpc/grpc-client/src/main/java/io/koraframework/grpc/client/GrpcClientConfig.java b/grpc/grpc-client/src/main/java/io/koraframework/grpc/client/GrpcClientConfig.java index 400f52baf..523806bf2 100644 --- a/grpc/grpc-client/src/main/java/io/koraframework/grpc/client/GrpcClientConfig.java +++ b/grpc/grpc-client/src/main/java/io/koraframework/grpc/client/GrpcClientConfig.java @@ -1,15 +1,15 @@ package io.koraframework.grpc.client; import io.koraframework.config.common.Config; -import io.koraframework.config.common.annotation.ConfigValueExtractor; +import io.koraframework.config.common.annotation.ConfigMapper; +import io.koraframework.config.common.mapper.ConfigValueMapper; import io.koraframework.grpc.client.config.DefaultServiceConfig; import io.koraframework.grpc.client.telemetry.GrpcClientTelemetryConfig; import org.jspecify.annotations.Nullable; import java.time.Duration; -import java.util.Objects; -@ConfigValueExtractor +@ConfigMapper public interface GrpcClientConfig { String url(); @@ -31,12 +31,12 @@ public interface GrpcClientConfig { @Nullable String loadBalancingPolicy(); - static GrpcClientConfig defaultConfig(Config config, io.koraframework.config.common.extractor.ConfigValueExtractor extractor, String serviceName) { + static GrpcClientConfig defaultConfig(Config config, ConfigValueMapper mapper, String serviceName) { var packageEnding = serviceName.lastIndexOf('.'); var serviceSimpleName = (packageEnding == -1) ? serviceName : serviceName.substring(packageEnding + 1); - return extractor.extractOrThrow(config.get("grpcClient." + serviceSimpleName)); + return mapper.mapOrThrow(config.get("grpcClient." + serviceSimpleName)); } } diff --git a/grpc/grpc-client/src/main/java/io/koraframework/grpc/client/GrpcClientModule.java b/grpc/grpc-client/src/main/java/io/koraframework/grpc/client/GrpcClientModule.java index f6ce45b89..e0805fbb6 100644 --- a/grpc/grpc-client/src/main/java/io/koraframework/grpc/client/GrpcClientModule.java +++ b/grpc/grpc-client/src/main/java/io/koraframework/grpc/client/GrpcClientModule.java @@ -1,7 +1,7 @@ package io.koraframework.grpc.client; import io.grpc.ManagedChannelBuilder; -import io.koraframework.config.common.extractor.ConfigValueExtractor; +import io.koraframework.config.common.mapper.ConfigValueMapper; import io.koraframework.grpc.client.channel.GrpcClientChannelFactory; import io.koraframework.grpc.client.channel.GrpcOkHttpClientChannelFactory; import io.koraframework.grpc.client.config.DefaultServiceConfig; @@ -9,7 +9,7 @@ import io.micrometer.core.instrument.MeterRegistry; import io.opentelemetry.api.trace.Tracer; import org.jspecify.annotations.Nullable; -import io.koraframework.grpc.client.config.DefaultServiceConfigConfigValueExtractor; +import io.koraframework.grpc.client.config.DefaultServiceConfigConfigValueMapper; import io.koraframework.grpc.client.telemetry.impl.DefaultGrpcClientLoggerFactory; import io.koraframework.grpc.client.telemetry.impl.DefaultGrpcClientMetricsFactory; import io.koraframework.grpc.client.telemetry.impl.DefaultGrpcClientTelemetryFactory; @@ -19,8 +19,8 @@ public interface GrpcClientModule { @DefaultComponent - default ConfigValueExtractor defaultServiceConfigConfigValueExtractor() { - return new DefaultServiceConfigConfigValueExtractor(); + default ConfigValueMapper defaultServiceConfigConfigValueMapper() { + return new DefaultServiceConfigConfigValueMapper(); } @DefaultComponent diff --git a/grpc/grpc-client/src/main/java/io/koraframework/grpc/client/config/DefaultServiceConfigConfigValueExtractor.java b/grpc/grpc-client/src/main/java/io/koraframework/grpc/client/config/DefaultServiceConfigConfigValueMapper.java similarity index 87% rename from grpc/grpc-client/src/main/java/io/koraframework/grpc/client/config/DefaultServiceConfigConfigValueExtractor.java rename to grpc/grpc-client/src/main/java/io/koraframework/grpc/client/config/DefaultServiceConfigConfigValueMapper.java index 7d90708d3..da04df40e 100644 --- a/grpc/grpc-client/src/main/java/io/koraframework/grpc/client/config/DefaultServiceConfigConfigValueExtractor.java +++ b/grpc/grpc-client/src/main/java/io/koraframework/grpc/client/config/DefaultServiceConfigConfigValueMapper.java @@ -1,18 +1,18 @@ package io.koraframework.grpc.client.config; import io.koraframework.config.common.ConfigValue; -import io.koraframework.config.common.extractor.ConfigValueExtractor; +import io.koraframework.config.common.mapper.ConfigValueMapper; import org.jspecify.annotations.Nullable; import java.util.ArrayList; import java.util.HashMap; import java.util.Map; -public final class DefaultServiceConfigConfigValueExtractor implements ConfigValueExtractor { +public final class DefaultServiceConfigConfigValueMapper implements ConfigValueMapper { @Nullable @Override - public DefaultServiceConfig extract(ConfigValue value) { + public DefaultServiceConfig map(ConfigValue value) { if (value.isNull()) { return null; } diff --git a/grpc/grpc-client/src/main/java/io/koraframework/grpc/client/telemetry/GrpcClientTelemetryConfig.java b/grpc/grpc-client/src/main/java/io/koraframework/grpc/client/telemetry/GrpcClientTelemetryConfig.java index a5e077c80..4c782df88 100644 --- a/grpc/grpc-client/src/main/java/io/koraframework/grpc/client/telemetry/GrpcClientTelemetryConfig.java +++ b/grpc/grpc-client/src/main/java/io/koraframework/grpc/client/telemetry/GrpcClientTelemetryConfig.java @@ -1,9 +1,9 @@ package io.koraframework.grpc.client.telemetry; -import io.koraframework.config.common.annotation.ConfigValueExtractor; +import io.koraframework.config.common.annotation.ConfigMapper; import io.koraframework.telemetry.common.TelemetryConfig; -@ConfigValueExtractor +@ConfigMapper public interface GrpcClientTelemetryConfig extends TelemetryConfig { @Override @@ -15,12 +15,12 @@ public interface GrpcClientTelemetryConfig extends TelemetryConfig { @Override GrpcClientTracingConfig tracing(); - @ConfigValueExtractor + @ConfigMapper interface GrpcClientLoggingConfig extends LoggingConfig { } - @ConfigValueExtractor + @ConfigMapper interface GrpcClientMetricsConfig extends TelemetryConfig.MetricsConfig { } - @ConfigValueExtractor + @ConfigMapper interface GrpcClientTracingConfig extends TelemetryConfig.TracingConfig { } } diff --git a/grpc/grpc-client/src/main/java/io/koraframework/grpc/client/telemetry/impl/DefaultGrpcClientTelemetry.java b/grpc/grpc-client/src/main/java/io/koraframework/grpc/client/telemetry/impl/DefaultGrpcClientTelemetry.java index 77b05aebd..1e55fce78 100644 --- a/grpc/grpc-client/src/main/java/io/koraframework/grpc/client/telemetry/impl/DefaultGrpcClientTelemetry.java +++ b/grpc/grpc-client/src/main/java/io/koraframework/grpc/client/telemetry/impl/DefaultGrpcClientTelemetry.java @@ -25,10 +25,10 @@ public record TelemetryContext(GrpcClientTelemetryConfig config, Tracer tracer) { public static final TelemetryContext EMPTY = new TelemetryContext( - new $GrpcClientTelemetryConfig_ConfigValueExtractor.GrpcClientTelemetryConfig_Impl( - new $GrpcClientTelemetryConfig_GrpcClientLoggingConfig_ConfigValueExtractor.GrpcClientLoggingConfig_Defaults(), - new $GrpcClientTelemetryConfig_GrpcClientMetricsConfig_ConfigValueExtractor.GrpcClientMetricsConfig_Defaults(), - new $GrpcClientTelemetryConfig_GrpcClientTracingConfig_ConfigValueExtractor.GrpcClientTracingConfig_Defaults() + new $GrpcClientTelemetryConfig_ConfigValueMapper.GrpcClientTelemetryConfig_Impl( + new $GrpcClientTelemetryConfig_GrpcClientLoggingConfig_ConfigValueMapper.GrpcClientLoggingConfig_Defaults(), + new $GrpcClientTelemetryConfig_GrpcClientMetricsConfig_ConfigValueMapper.GrpcClientMetricsConfig_Defaults(), + new $GrpcClientTelemetryConfig_GrpcClientTracingConfig_ConfigValueMapper.GrpcClientTracingConfig_Defaults() ), new ServiceDescriptor("none"), URI.create("http://localhost"), diff --git a/grpc/grpc-server/src/main/java/io/koraframework/grpc/server/GrpcServerConfig.java b/grpc/grpc-server/src/main/java/io/koraframework/grpc/server/GrpcServerConfig.java index ab2c06380..8a65ca0ec 100644 --- a/grpc/grpc-server/src/main/java/io/koraframework/grpc/server/GrpcServerConfig.java +++ b/grpc/grpc-server/src/main/java/io/koraframework/grpc/server/GrpcServerConfig.java @@ -2,12 +2,12 @@ import org.jspecify.annotations.Nullable; import io.koraframework.common.util.Size; -import io.koraframework.config.common.annotation.ConfigValueExtractor; +import io.koraframework.config.common.annotation.ConfigMapper; import io.koraframework.grpc.server.telemetry.GrpcServerTelemetryConfig; import java.time.Duration; -@ConfigValueExtractor +@ConfigMapper public interface GrpcServerConfig { default int port() { diff --git a/grpc/grpc-server/src/main/java/io/koraframework/grpc/server/GrpcServerModule.java b/grpc/grpc-server/src/main/java/io/koraframework/grpc/server/GrpcServerModule.java index c426eabba..c56fd7bec 100644 --- a/grpc/grpc-server/src/main/java/io/koraframework/grpc/server/GrpcServerModule.java +++ b/grpc/grpc-server/src/main/java/io/koraframework/grpc/server/GrpcServerModule.java @@ -10,7 +10,7 @@ import io.koraframework.common.annotation.Root; import io.koraframework.common.Configurer; import io.koraframework.config.common.Config; -import io.koraframework.config.common.extractor.ConfigValueExtractor; +import io.koraframework.config.common.mapper.ConfigValueMapper; import io.koraframework.grpc.server.handler.DynamicBindableService; import io.koraframework.grpc.server.handler.VirtualThreadExecutorTransportFilter; import io.koraframework.grpc.server.interceptors.DynamicServerInterceptor; @@ -29,8 +29,8 @@ public interface GrpcServerModule { - default GrpcServerConfig grpcServerConfig(Config config, ConfigValueExtractor configValueExtractor) { - return configValueExtractor.extract(config.get("grpcServer")); + default GrpcServerConfig grpcServerConfig(Config config, ConfigValueMapper mapper) { + return mapper.map(config.get("grpcServer")); } @Root diff --git a/grpc/grpc-server/src/main/java/io/koraframework/grpc/server/telemetry/GrpcServerTelemetryConfig.java b/grpc/grpc-server/src/main/java/io/koraframework/grpc/server/telemetry/GrpcServerTelemetryConfig.java index 7c07d3b4d..6b5d0e79b 100644 --- a/grpc/grpc-server/src/main/java/io/koraframework/grpc/server/telemetry/GrpcServerTelemetryConfig.java +++ b/grpc/grpc-server/src/main/java/io/koraframework/grpc/server/telemetry/GrpcServerTelemetryConfig.java @@ -1,9 +1,9 @@ package io.koraframework.grpc.server.telemetry; -import io.koraframework.config.common.annotation.ConfigValueExtractor; +import io.koraframework.config.common.annotation.ConfigMapper; import io.koraframework.telemetry.common.TelemetryConfig; -@ConfigValueExtractor +@ConfigMapper public interface GrpcServerTelemetryConfig extends TelemetryConfig { @Override @@ -15,12 +15,12 @@ public interface GrpcServerTelemetryConfig extends TelemetryConfig { @Override GrpcServerTracingConfig tracing(); - @ConfigValueExtractor + @ConfigMapper interface GrpcServerLoggingConfig extends TelemetryConfig.LoggingConfig {} - @ConfigValueExtractor + @ConfigMapper interface GrpcServerMetricsConfig extends TelemetryConfig.MetricsConfig {} - @ConfigValueExtractor + @ConfigMapper interface GrpcServerTracingConfig extends TelemetryConfig.TracingConfig {} } diff --git a/grpc/grpc-server/src/main/java/io/koraframework/grpc/server/telemetry/impl/DefaultGrpcServerTelemetry.java b/grpc/grpc-server/src/main/java/io/koraframework/grpc/server/telemetry/impl/DefaultGrpcServerTelemetry.java index 9619f7bf2..2dc171240 100644 --- a/grpc/grpc-server/src/main/java/io/koraframework/grpc/server/telemetry/impl/DefaultGrpcServerTelemetry.java +++ b/grpc/grpc-server/src/main/java/io/koraframework/grpc/server/telemetry/impl/DefaultGrpcServerTelemetry.java @@ -23,10 +23,10 @@ public record TelemetryContext(GrpcServerTelemetryConfig config, Tracer tracer) { public static final TelemetryContext EMPTY = new TelemetryContext( - new $GrpcServerTelemetryConfig_ConfigValueExtractor.GrpcServerTelemetryConfig_Impl( - new $GrpcServerTelemetryConfig_GrpcServerLoggingConfig_ConfigValueExtractor.GrpcServerLoggingConfig_Defaults(), - new $GrpcServerTelemetryConfig_GrpcServerMetricsConfig_ConfigValueExtractor.GrpcServerMetricsConfig_Defaults(), - new $GrpcServerTelemetryConfig_GrpcServerTracingConfig_ConfigValueExtractor.GrpcServerTracingConfig_Defaults() + new $GrpcServerTelemetryConfig_ConfigValueMapper.GrpcServerTelemetryConfig_Impl( + new $GrpcServerTelemetryConfig_GrpcServerLoggingConfig_ConfigValueMapper.GrpcServerLoggingConfig_Defaults(), + new $GrpcServerTelemetryConfig_GrpcServerMetricsConfig_ConfigValueMapper.GrpcServerMetricsConfig_Defaults(), + new $GrpcServerTelemetryConfig_GrpcServerTracingConfig_ConfigValueMapper.GrpcServerTracingConfig_Defaults() ), false, false, diff --git a/http/http-client-annotation-processor/src/main/java/io/koraframework/http/client/annotation/processor/ConfigClassGenerator.java b/http/http-client-annotation-processor/src/main/java/io/koraframework/http/client/annotation/processor/ConfigClassGenerator.java index b749029a1..16e2562de 100644 --- a/http/http-client-annotation-processor/src/main/java/io/koraframework/http/client/annotation/processor/ConfigClassGenerator.java +++ b/http/http-client-annotation-processor/src/main/java/io/koraframework/http/client/annotation/processor/ConfigClassGenerator.java @@ -29,7 +29,7 @@ public TypeSpec generate(TypeElement element) { .addAnnotation(AnnotationUtils.generated(ConfigClassGenerator.class)) .addModifiers(Modifier.PUBLIC) .addSuperinterface(declarativeHttpClientConfig) - .addAnnotation(CommonClassNames.configValueExtractorAnnotation); + .addAnnotation(CommonClassNames.configMapperAnnotation); b.addMethod(MethodSpec.methodBuilder("telemetry") .addAnnotation(Override.class) diff --git a/http/http-client-annotation-processor/src/main/java/io/koraframework/http/client/annotation/processor/ConfigModuleGenerator.java b/http/http-client-annotation-processor/src/main/java/io/koraframework/http/client/annotation/processor/ConfigModuleGenerator.java index a85971452..78296ffac 100644 --- a/http/http-client-annotation-processor/src/main/java/io/koraframework/http/client/annotation/processor/ConfigModuleGenerator.java +++ b/http/http-client-annotation-processor/src/main/java/io/koraframework/http/client/annotation/processor/ConfigModuleGenerator.java @@ -8,7 +8,6 @@ import javax.lang.model.element.Modifier; import javax.lang.model.element.TypeElement; import javax.lang.model.util.Elements; -import java.util.Optional; import static io.koraframework.http.client.annotation.processor.HttpClientClassNames.httpClientAnnotation; @@ -32,7 +31,7 @@ public JavaFile generate(TypeElement element) { var configName = HttpClientUtils.configName(element); var moduleName = HttpClientUtils.moduleName(element); var configClass = ClassName.get(packageName, configName); - var extractorClass = ParameterizedTypeName.get(CommonClassNames.configValueExtractor, configClass); + var extractorClass = ParameterizedTypeName.get(CommonClassNames.configValueMapper, configClass); var type = TypeSpec.interfaceBuilder(moduleName) .addOriginatingElement(element) @@ -43,8 +42,8 @@ public JavaFile generate(TypeElement element) { .addModifiers(Modifier.PUBLIC, Modifier.DEFAULT) .returns(configClass) .addParameter(ParameterSpec.builder(CommonClassNames.config, "config").build()) - .addParameter(ParameterSpec.builder(extractorClass, "extractor").build()) - .addStatement("return extractor.extractOrThrow(config.get($S))", configPath) + .addParameter(ParameterSpec.builder(extractorClass, "mapper").build()) + .addStatement("return mapper.mapOrThrow(config.get($S))", configPath) .build()); return JavaFile.builder(packageName, type.build()).build(); diff --git a/http/http-client-annotation-processor/src/test/java/io/koraframework/http/client/annotation/processor/AbstractHttpClientTest.java b/http/http-client-annotation-processor/src/test/java/io/koraframework/http/client/annotation/processor/AbstractHttpClientTest.java index f9943edcd..78fbb8df3 100644 --- a/http/http-client-annotation-processor/src/test/java/io/koraframework/http/client/annotation/processor/AbstractHttpClientTest.java +++ b/http/http-client-annotation-processor/src/test/java/io/koraframework/http/client/annotation/processor/AbstractHttpClientTest.java @@ -2,8 +2,8 @@ import io.koraframework.annotation.processor.common.AbstractAnnotationProcessorTest; import io.koraframework.config.annotation.processor.processor.ConfigParserAnnotationProcessor; -import io.koraframework.config.common.extractor.*; -import io.koraframework.config.common.factory.MapConfigFactory; +import io.koraframework.config.common.mapper.*; +import io.koraframework.config.common.util.ConfigMappingUtils; import io.koraframework.http.client.common.HttpClient; import io.koraframework.http.client.common.declarative.*; import io.koraframework.http.client.common.request.HttpClientRequest; @@ -64,21 +64,21 @@ protected TestObject compileClient(List arguments, @Language("java") Str compileResult.warnings().forEach(System.out::println); var clientClass = compileResult.loadClass("$TestClient_ClientImpl"); - var durationCVE = new DurationConfigValueExtractor(); - var telemetryCVE = new $HttpClientTelemetryConfig_ConfigValueExtractor( - new $HttpClientTelemetryConfig_HttpClientLoggingConfig_ConfigValueExtractor(new SetConfigValueExtractor<>(new StringConfigValueExtractor()), new SizeConfigValueExtractor()), - new $HttpClientTelemetryConfig_HttpClientMetricsConfig_ConfigValueExtractor(new DurationArrayConfigValueExtractor(new DurationConfigValueExtractor()), new MapConfigValueExtractor<>(new StringConfigValueExtractor())), - new $HttpClientTelemetryConfig_HttpClientTracingConfig_ConfigValueExtractor(new MapConfigValueExtractor<>(new StringConfigValueExtractor())) + var durationCVE = new DurationConfigValueMapper(); + var telemetryCVE = new $HttpClientTelemetryConfig_ConfigValueMapper( + new $HttpClientTelemetryConfig_HttpClientLoggingConfig_ConfigValueMapper(new SetConfigValueMapper<>(new StringConfigValueMapper()), new SizeConfigValueMapper()), + new $HttpClientTelemetryConfig_HttpClientMetricsConfig_ConfigValueMapper(new DurationArrayConfigValueMapper(new DurationConfigValueMapper()), new MapConfigValueMapper<>(new StringConfigValueMapper())), + new $HttpClientTelemetryConfig_HttpClientTracingConfig_ConfigValueMapper(new MapConfigValueMapper<>(new StringConfigValueMapper())) ); - var operationTelemetryCVE = new $HttpClientOperationConfig_OperationTelemetryConfig_ConfigValueExtractor( - new $HttpClientOperationConfig_OperationTelemetryConfig_LoggingConfig_ConfigValueExtractor(new SetConfigValueExtractor<>(new StringConfigValueExtractor()), new SizeConfigValueExtractor()), - new $HttpClientOperationConfig_OperationTelemetryConfig_TracingConfig_ConfigValueExtractor(new MapConfigValueExtractor<>(new StringConfigValueExtractor())), - new $HttpClientOperationConfig_OperationTelemetryConfig_MetricsConfig_ConfigValueExtractor(new DurationArrayConfigValueExtractor(new DurationConfigValueExtractor()), new MapConfigValueExtractor<>(new StringConfigValueExtractor())) + var operationTelemetryCVE = new $HttpClientOperationConfig_OperationTelemetryConfig_ConfigValueMapper( + new $HttpClientOperationConfig_OperationTelemetryConfig_LoggingConfig_ConfigValueMapper(new SetConfigValueMapper<>(new StringConfigValueMapper()), new SizeConfigValueMapper()), + new $HttpClientOperationConfig_OperationTelemetryConfig_TracingConfig_ConfigValueMapper(new MapConfigValueMapper<>(new StringConfigValueMapper())), + new $HttpClientOperationConfig_OperationTelemetryConfig_MetricsConfig_ConfigValueMapper(new DurationArrayConfigValueMapper(new DurationConfigValueMapper()), new MapConfigValueMapper<>(new StringConfigValueMapper())) ); - var operationConfigCVE = new $HttpClientOperationConfig_ConfigValueExtractor(durationCVE, operationTelemetryCVE); + var operationConfigCVE = new $HttpClientOperationConfig_ConfigValueMapper(durationCVE, operationTelemetryCVE); - var configValueExtractor = (ConfigValueExtractor) newObject("$TestClient_Config_ConfigValueExtractor", telemetryCVE, operationConfigCVE, durationCVE); - var config = configValueExtractor.extract(MapConfigFactory.fromMap(Map.of( + var configValueExtractor = (ConfigValueMapper) newObject("$TestClient_Config_ConfigValueMapper", telemetryCVE, operationConfigCVE, durationCVE); + var config = configValueExtractor.map(ConfigMappingUtils.fromMap(Map.of( "url", "http://test-url:8080" )).root()); diff --git a/http/http-client-annotation-processor/src/test/java/io/koraframework/http/client/annotation/processor/BlockingApiTest.java b/http/http-client-annotation-processor/src/test/java/io/koraframework/http/client/annotation/processor/BlockingApiTest.java index e54db9a7c..7b4640238 100644 --- a/http/http-client-annotation-processor/src/test/java/io/koraframework/http/client/annotation/processor/BlockingApiTest.java +++ b/http/http-client-annotation-processor/src/test/java/io/koraframework/http/client/annotation/processor/BlockingApiTest.java @@ -373,8 +373,8 @@ public interface TestClient { @Test public void testBlockingRequestBody() throws Exception { - var mapper = Mockito.mock(HttpClientRequestMapper.class); - var client = compileClient(List.of(mapper), """ + var mockMapper = Mockito.mock(HttpClientRequestMapper.class); + var client = compileClient(List.of(mockMapper), """ @HttpClient public interface TestClient { @HttpRoute(method = "POST", path = "/test") @@ -382,17 +382,17 @@ public interface TestClient { } """); - when(mapper.apply(any())).thenAnswer(invocation -> HttpBody.plaintext("test-value")); + when(mockMapper.apply(any())).thenAnswer(invocation -> HttpBody.plaintext("test-value")); onRequest("POST", "http://test-url:8080/test", rs -> rs.withCode(200)); client.invoke("request", "test-value"); - verify(mapper).apply(eq("test-value")); + verify(mockMapper).apply(eq("test-value")); - reset(httpClient, mapper); - when(mapper.apply(any())) + reset(httpClient, mockMapper); + when(mockMapper.apply(any())) .thenThrow(RuntimeException.class); onRequest("POST", "http://test-url:8080/test", rs -> rs.withCode(200)); assertThatThrownBy(() -> client.invoke("request", "test-value")).isInstanceOf(HttpClientEncoderException.class); - verify(mapper).apply(eq("test-value")); + verify(mockMapper).apply(eq("test-value")); } @Test diff --git a/http/http-client-annotation-processor/src/test/java/io/koraframework/http/client/annotation/processor/HttpClientExtensionTest.java b/http/http-client-annotation-processor/src/test/java/io/koraframework/http/client/annotation/processor/HttpClientExtensionTest.java index 79be55bde..f78603587 100644 --- a/http/http-client-annotation-processor/src/test/java/io/koraframework/http/client/annotation/processor/HttpClientExtensionTest.java +++ b/http/http-client-annotation-processor/src/test/java/io/koraframework/http/client/annotation/processor/HttpClientExtensionTest.java @@ -26,7 +26,7 @@ public interface TestApp { default io.koraframework.http.client.common.HttpClient client() { return org.mockito.Mockito.mock(io.koraframework.http.client.common.HttpClient.class) ;} default io.koraframework.http.client.common.telemetry.HttpClientTelemetryFactory telemetry() { return org.mockito.Mockito.mock(io.koraframework.http.client.common.telemetry.HttpClientTelemetryFactory.class) ;} default io.koraframework.config.common.Config config() { return org.mockito.Mockito.mock(io.koraframework.config.common.Config.class) ;} - default io.koraframework.config.common.extractor.ConfigValueExtractor<$TestClient_Config> extractor() { return org.mockito.Mockito.mock(io.koraframework.config.common.extractor.ConfigValueExtractor.class) ;} + default io.koraframework.config.common.mapper.ConfigValueMapper<$TestClient_Config> extractor() { return org.mockito.Mockito.mock(io.koraframework.config.common.mapper.ConfigValueMapper.class) ;} @Root default String root(TestClient extractor) { return ""; } diff --git a/http/http-client-apache/src/main/java/io/koraframework/http/client/apache/ApacheHttpClientConfig.java b/http/http-client-apache/src/main/java/io/koraframework/http/client/apache/ApacheHttpClientConfig.java index 9deeeefe8..a8de1983d 100644 --- a/http/http-client-apache/src/main/java/io/koraframework/http/client/apache/ApacheHttpClientConfig.java +++ b/http/http-client-apache/src/main/java/io/koraframework/http/client/apache/ApacheHttpClientConfig.java @@ -1,9 +1,9 @@ package io.koraframework.http.client.apache; -import io.koraframework.config.common.annotation.ConfigValueExtractor; +import io.koraframework.config.common.annotation.ConfigMapper; import io.koraframework.http.client.common.HttpClientConfig; -@ConfigValueExtractor +@ConfigMapper public interface ApacheHttpClientConfig extends HttpClientConfig { default boolean followRedirects() { diff --git a/http/http-client-apache/src/main/java/io/koraframework/http/client/apache/ApacheHttpClientModule.java b/http/http-client-apache/src/main/java/io/koraframework/http/client/apache/ApacheHttpClientModule.java index d2bf44170..69c66fe53 100644 --- a/http/http-client-apache/src/main/java/io/koraframework/http/client/apache/ApacheHttpClientModule.java +++ b/http/http-client-apache/src/main/java/io/koraframework/http/client/apache/ApacheHttpClientModule.java @@ -3,7 +3,7 @@ import io.koraframework.common.annotation.DefaultComponent; import io.koraframework.common.Configurer; import io.koraframework.config.common.Config; -import io.koraframework.config.common.extractor.ConfigValueExtractor; +import io.koraframework.config.common.mapper.ConfigValueMapper; import io.koraframework.http.client.common.HttpClientConfig; import io.koraframework.http.client.common.HttpClientModule; import org.apache.hc.client5.http.classic.HttpClient; @@ -17,8 +17,8 @@ default ApacheHttpClient apacheHttpClient(HttpClient apacheHttpClient) { return new ApacheHttpClient(apacheHttpClient); } - default ApacheHttpClientConfig apacheHttpClientConfig(Config config, ConfigValueExtractor extractor) { - return extractor.extractOrThrow(config.get("httpClient.apache")); + default ApacheHttpClientConfig apacheHttpClientConfig(Config config, ConfigValueMapper mapper) { + return mapper.mapOrThrow(config.get("httpClient.apache")); } @DefaultComponent diff --git a/http/http-client-apache/src/main/java/io/koraframework/http/client/apache/ApacheHttpClientWrapper.java b/http/http-client-apache/src/main/java/io/koraframework/http/client/apache/ApacheHttpClientWrapper.java index 3b7ba2622..ad2405ec2 100644 --- a/http/http-client-apache/src/main/java/io/koraframework/http/client/apache/ApacheHttpClientWrapper.java +++ b/http/http-client-apache/src/main/java/io/koraframework/http/client/apache/ApacheHttpClientWrapper.java @@ -140,6 +140,6 @@ public void release() { @Override public org.apache.hc.client5.http.classic.HttpClient value() { - return null; + return this.httpClient; } } diff --git a/http/http-client-common/src/main/java/io/koraframework/http/client/common/HttpClientConfig.java b/http/http-client-common/src/main/java/io/koraframework/http/client/common/HttpClientConfig.java index 65c50313a..b898e5036 100644 --- a/http/http-client-common/src/main/java/io/koraframework/http/client/common/HttpClientConfig.java +++ b/http/http-client-common/src/main/java/io/koraframework/http/client/common/HttpClientConfig.java @@ -1,13 +1,13 @@ package io.koraframework.http.client.common; -import io.koraframework.config.common.annotation.ConfigValueExtractor; +import io.koraframework.config.common.annotation.ConfigMapper; import org.jspecify.annotations.Nullable; import java.net.URI; import java.time.Duration; import java.util.List; -@ConfigValueExtractor +@ConfigMapper public interface HttpClientConfig { default Duration connectTimeout() { @@ -25,7 +25,7 @@ default boolean useEnvProxy() { return false; } - @ConfigValueExtractor + @ConfigMapper interface HttpClientProxyConfig { String host(); @@ -71,7 +71,7 @@ static HttpClientProxyConfig fromEnv() { nonProxyHosts = List.of(noProxyString.split(",")); } - return new $HttpClientConfig_HttpClientProxyConfig_ConfigValueExtractor.HttpClientProxyConfig_Impl( + return new $HttpClientConfig_HttpClientProxyConfig_ConfigValueMapper.HttpClientProxyConfig_Impl( host, port, nonProxyHosts, user, password ); } diff --git a/http/http-client-common/src/main/java/io/koraframework/http/client/common/HttpClientModule.java b/http/http-client-common/src/main/java/io/koraframework/http/client/common/HttpClientModule.java index 025f4ee96..ff466eb43 100644 --- a/http/http-client-common/src/main/java/io/koraframework/http/client/common/HttpClientModule.java +++ b/http/http-client-common/src/main/java/io/koraframework/http/client/common/HttpClientModule.java @@ -2,7 +2,7 @@ import io.koraframework.common.annotation.DefaultComponent; import io.koraframework.config.common.Config; -import io.koraframework.config.common.extractor.ConfigValueExtractor; +import io.koraframework.config.common.mapper.ConfigValueMapper; import io.koraframework.http.client.common.request.mapper.HttpClientParameterWriterModule; import io.koraframework.http.client.common.request.mapper.HttpClientRequestMapperModule; import io.koraframework.http.client.common.response.HttpClientResponseMapperModule; @@ -17,9 +17,9 @@ public interface HttpClientModule extends HttpClientRequestMapperModule, HttpClientResponseMapperModule, HttpClientParameterWriterModule { - default HttpClientConfig httpClientConfig(Config config, ConfigValueExtractor configValueExtractor) { + default HttpClientConfig httpClientConfig(Config config, ConfigValueMapper mapper) { var configValue = config.get("httpClient"); - return configValueExtractor.extract(configValue); + return mapper.map(configValue); } @DefaultComponent diff --git a/http/http-client-common/src/main/java/io/koraframework/http/client/common/declarative/HttpClientOperationConfig.java b/http/http-client-common/src/main/java/io/koraframework/http/client/common/declarative/HttpClientOperationConfig.java index c8381f047..df02d61db 100644 --- a/http/http-client-common/src/main/java/io/koraframework/http/client/common/declarative/HttpClientOperationConfig.java +++ b/http/http-client-common/src/main/java/io/koraframework/http/client/common/declarative/HttpClientOperationConfig.java @@ -1,14 +1,14 @@ package io.koraframework.http.client.common.declarative; import io.koraframework.common.util.Size; -import io.koraframework.config.common.annotation.ConfigValueExtractor; +import io.koraframework.config.common.annotation.ConfigMapper; import org.jspecify.annotations.Nullable; import java.time.Duration; import java.util.Map; import java.util.Set; -@ConfigValueExtractor +@ConfigMapper public interface HttpClientOperationConfig { @Nullable @@ -16,7 +16,7 @@ public interface HttpClientOperationConfig { OperationTelemetryConfig telemetry(); - @ConfigValueExtractor + @ConfigMapper interface OperationTelemetryConfig { LoggingConfig logging(); @@ -25,7 +25,7 @@ interface OperationTelemetryConfig { MetricsConfig metrics(); - @ConfigValueExtractor + @ConfigMapper interface LoggingConfig { @Nullable Boolean enabled(); @@ -49,7 +49,7 @@ interface LoggingConfig { Size maxResponseBodyLogSize(); } - @ConfigValueExtractor + @ConfigMapper interface TracingConfig { @Nullable Boolean enabled(); @@ -61,7 +61,7 @@ interface TracingConfig { Boolean pathFull(); } - @ConfigValueExtractor + @ConfigMapper interface MetricsConfig { @Nullable Boolean enabled(); diff --git a/http/http-client-common/src/main/java/io/koraframework/http/client/common/telemetry/HttpClientTelemetryConfig.java b/http/http-client-common/src/main/java/io/koraframework/http/client/common/telemetry/HttpClientTelemetryConfig.java index 5f4549611..147ead065 100644 --- a/http/http-client-common/src/main/java/io/koraframework/http/client/common/telemetry/HttpClientTelemetryConfig.java +++ b/http/http-client-common/src/main/java/io/koraframework/http/client/common/telemetry/HttpClientTelemetryConfig.java @@ -1,14 +1,14 @@ package io.koraframework.http.client.common.telemetry; import io.koraframework.common.util.Size; -import io.koraframework.config.common.annotation.ConfigValueExtractor; +import io.koraframework.config.common.annotation.ConfigMapper; import io.koraframework.telemetry.common.TelemetryConfig; import org.jspecify.annotations.Nullable; import java.util.Collections; import java.util.Set; -@ConfigValueExtractor +@ConfigMapper public interface HttpClientTelemetryConfig extends TelemetryConfig { @Override @@ -20,7 +20,7 @@ public interface HttpClientTelemetryConfig extends TelemetryConfig { @Override HttpClientTracingConfig tracing(); - @ConfigValueExtractor + @ConfigMapper interface HttpClientLoggingConfig extends LoggingConfig { default Set maskQueries() { @@ -47,10 +47,10 @@ default Size maxResponseBodyLogSize() { } } - @ConfigValueExtractor + @ConfigMapper interface HttpClientMetricsConfig extends TelemetryConfig.MetricsConfig {} - @ConfigValueExtractor + @ConfigMapper interface HttpClientTracingConfig extends TelemetryConfig.TracingConfig { default boolean pathFull() { diff --git a/http/http-client-common/src/main/java/io/koraframework/http/client/common/telemetry/impl/DefaultHttpClientTelemetry.java b/http/http-client-common/src/main/java/io/koraframework/http/client/common/telemetry/impl/DefaultHttpClientTelemetry.java index 5cc53990a..157f97c61 100644 --- a/http/http-client-common/src/main/java/io/koraframework/http/client/common/telemetry/impl/DefaultHttpClientTelemetry.java +++ b/http/http-client-common/src/main/java/io/koraframework/http/client/common/telemetry/impl/DefaultHttpClientTelemetry.java @@ -27,10 +27,10 @@ public record TelemetryContext(HttpClientTelemetryConfig config, String clientCanonicalName, String clientSimpleName) { - public static final TelemetryContext EMPTY = new TelemetryContext(new $HttpClientTelemetryConfig_ConfigValueExtractor.HttpClientTelemetryConfig_Impl( - new $HttpClientTelemetryConfig_HttpClientLoggingConfig_ConfigValueExtractor.HttpClientLoggingConfig_Defaults(), - new $HttpClientTelemetryConfig_HttpClientMetricsConfig_ConfigValueExtractor.HttpClientMetricsConfig_Defaults(), - new $HttpClientTelemetryConfig_HttpClientTracingConfig_ConfigValueExtractor.HttpClientTracingConfig_Defaults() + public static final TelemetryContext EMPTY = new TelemetryContext(new $HttpClientTelemetryConfig_ConfigValueMapper.HttpClientTelemetryConfig_Impl( + new $HttpClientTelemetryConfig_HttpClientLoggingConfig_ConfigValueMapper.HttpClientLoggingConfig_Defaults(), + new $HttpClientTelemetryConfig_HttpClientMetricsConfig_ConfigValueMapper.HttpClientMetricsConfig_Defaults(), + new $HttpClientTelemetryConfig_HttpClientTracingConfig_ConfigValueMapper.HttpClientTracingConfig_Defaults() ), false, false, DefaultHttpClientTelemetryFactory.NOOP_METER_REGISTRY, DefaultHttpClientTelemetryFactory.NOOP_TRACER, new DefaultHttpClientBodyConverter(), "none", "none", "none"); } diff --git a/http/http-client-common/src/test/java/io/koraframework/http/client/common/telemetry/DefaultHttpClientLoggerTests.java b/http/http-client-common/src/test/java/io/koraframework/http/client/common/telemetry/DefaultHttpClientLoggerTests.java index f5cbb1a0b..019523502 100644 --- a/http/http-client-common/src/test/java/io/koraframework/http/client/common/telemetry/DefaultHttpClientLoggerTests.java +++ b/http/http-client-common/src/test/java/io/koraframework/http/client/common/telemetry/DefaultHttpClientLoggerTests.java @@ -59,12 +59,12 @@ public void logRequestTests(Level level, String queryParams, HttpHeaders headers requestLogger, responseLogger, MASKED_QUERY_PARAMS, MASKED_HEADERS, new DefaultHttpClientTelemetry.TelemetryContext( - new $HttpClientTelemetryConfig_ConfigValueExtractor.HttpClientTelemetryConfig_Impl( - new $HttpClientTelemetryConfig_HttpClientLoggingConfig_ConfigValueExtractor.HttpClientLoggingConfig_Impl( + new $HttpClientTelemetryConfig_ConfigValueMapper.HttpClientTelemetryConfig_Impl( + new $HttpClientTelemetryConfig_HttpClientLoggingConfig_ConfigValueMapper.HttpClientLoggingConfig_Impl( MASKED_QUERY_PARAMS, MASKED_HEADERS, "***", pathTemplate, Size.of(1, Size.Type.MB), Size.of(1, Size.Type.MB), true ), - new $HttpClientTelemetryConfig_HttpClientMetricsConfig_ConfigValueExtractor.HttpClientMetricsConfig_Defaults(), - new $HttpClientTelemetryConfig_HttpClientTracingConfig_ConfigValueExtractor.HttpClientTracingConfig_Defaults() + new $HttpClientTelemetryConfig_HttpClientMetricsConfig_ConfigValueMapper.HttpClientMetricsConfig_Defaults(), + new $HttpClientTelemetryConfig_HttpClientTracingConfig_ConfigValueMapper.HttpClientTracingConfig_Defaults() ), false, false, DefaultHttpClientTelemetryFactory.NOOP_METER_REGISTRY, DefaultHttpClientTelemetryFactory.NOOP_TRACER, new DefaultHttpClientBodyConverter(), "none", "none", "none" )); @@ -102,12 +102,12 @@ public void logResponseTests(Level level, HttpHeaders headers, String body, @Nul requestLogger, responseLogger, MASKED_QUERY_PARAMS, MASKED_HEADERS, new DefaultHttpClientTelemetry.TelemetryContext( - new $HttpClientTelemetryConfig_ConfigValueExtractor.HttpClientTelemetryConfig_Impl( - new $HttpClientTelemetryConfig_HttpClientLoggingConfig_ConfigValueExtractor.HttpClientLoggingConfig_Impl( + new $HttpClientTelemetryConfig_ConfigValueMapper.HttpClientTelemetryConfig_Impl( + new $HttpClientTelemetryConfig_HttpClientLoggingConfig_ConfigValueMapper.HttpClientLoggingConfig_Impl( MASKED_QUERY_PARAMS, MASKED_HEADERS, "***", pathTemplate, Size.of(1, Size.Type.MB), Size.of(1, Size.Type.MB), true ), - new $HttpClientTelemetryConfig_HttpClientMetricsConfig_ConfigValueExtractor.HttpClientMetricsConfig_Defaults(), - new $HttpClientTelemetryConfig_HttpClientTracingConfig_ConfigValueExtractor.HttpClientTracingConfig_Defaults() + new $HttpClientTelemetryConfig_HttpClientMetricsConfig_ConfigValueMapper.HttpClientMetricsConfig_Defaults(), + new $HttpClientTelemetryConfig_HttpClientTracingConfig_ConfigValueMapper.HttpClientTracingConfig_Defaults() ), false, false, DefaultHttpClientTelemetryFactory.NOOP_METER_REGISTRY, DefaultHttpClientTelemetryFactory.NOOP_TRACER, new DefaultHttpClientBodyConverter(), "none", "none", "none" )); diff --git a/http/http-client-common/src/test/java/io/koraframework/http/client/common/telemetry/DefaultHttpClientTelemetryTest.java b/http/http-client-common/src/test/java/io/koraframework/http/client/common/telemetry/DefaultHttpClientTelemetryTest.java index e9420cf88..7122abcfa 100644 --- a/http/http-client-common/src/test/java/io/koraframework/http/client/common/telemetry/DefaultHttpClientTelemetryTest.java +++ b/http/http-client-common/src/test/java/io/koraframework/http/client/common/telemetry/DefaultHttpClientTelemetryTest.java @@ -1,7 +1,7 @@ package io.koraframework.http.client.common.telemetry; import com.typesafe.config.ConfigFactory; -import io.koraframework.config.common.extractor.*; +import io.koraframework.config.common.mapper.*; import io.koraframework.config.common.origin.SimpleConfigOrigin; import io.koraframework.config.hocon.HoconConfigFactory; import io.koraframework.http.client.common.request.HttpClientRequest; @@ -37,12 +37,12 @@ class DefaultHttpClientTelemetryTest { private HttpClientTelemetryConfig config(String str) { var config = HoconConfigFactory.fromHocon(new SimpleConfigOrigin("test"), ConfigFactory.parseString(str)); - var extractor = new $HttpClientTelemetryConfig_ConfigValueExtractor( - new $HttpClientTelemetryConfig_HttpClientLoggingConfig_ConfigValueExtractor(new SetConfigValueExtractor<>(new StringConfigValueExtractor()), new SizeConfigValueExtractor()), - new $HttpClientTelemetryConfig_HttpClientMetricsConfig_ConfigValueExtractor(new DurationArrayConfigValueExtractor(new DurationConfigValueExtractor()), new MapConfigValueExtractor<>(new StringConfigValueExtractor())), - new $HttpClientTelemetryConfig_HttpClientTracingConfig_ConfigValueExtractor(new MapConfigValueExtractor<>(new StringConfigValueExtractor())) + var mapper = new $HttpClientTelemetryConfig_ConfigValueMapper( + new $HttpClientTelemetryConfig_HttpClientLoggingConfig_ConfigValueMapper(new SetConfigValueMapper<>(new StringConfigValueMapper()), new SizeConfigValueMapper()), + new $HttpClientTelemetryConfig_HttpClientMetricsConfig_ConfigValueMapper(new DurationArrayConfigValueMapper(new DurationConfigValueMapper()), new MapConfigValueMapper<>(new StringConfigValueMapper())), + new $HttpClientTelemetryConfig_HttpClientTracingConfig_ConfigValueMapper(new MapConfigValueMapper<>(new StringConfigValueMapper())) ); - return extractor.extract(config.root()); + return mapper.map(config.root()); } private Tracer tracer = Mockito.mock(Tracer.class); diff --git a/http/http-client-common/src/testFixtures/java/io/koraframework/http/client/common/HttpClientTest.java b/http/http-client-common/src/testFixtures/java/io/koraframework/http/client/common/HttpClientTest.java index dfdc35745..0458ff22d 100644 --- a/http/http-client-common/src/testFixtures/java/io/koraframework/http/client/common/HttpClientTest.java +++ b/http/http-client-common/src/testFixtures/java/io/koraframework/http/client/common/HttpClientTest.java @@ -178,7 +178,7 @@ protected void testConnectionError() throws Exception { .body(HttpBody.plaintext("test-request")) .build(); - var client = this.createClient(new $HttpClientConfig_ConfigValueExtractor.HttpClientConfig_Impl(Duration.ofMillis(100), Duration.ofMillis(100), null, false)); + var client = this.createClient(new $HttpClientConfig_ConfigValueMapper.HttpClientConfig_Impl(Duration.ofMillis(100), Duration.ofMillis(100), null, false)); try { diff --git a/http/http-client-common/src/testFixtures/java/io/koraframework/http/client/common/HttpClientTestBase.java b/http/http-client-common/src/testFixtures/java/io/koraframework/http/client/common/HttpClientTestBase.java index 9280c71dd..3367b93a5 100644 --- a/http/http-client-common/src/testFixtures/java/io/koraframework/http/client/common/HttpClientTestBase.java +++ b/http/http-client-common/src/testFixtures/java/io/koraframework/http/client/common/HttpClientTestBase.java @@ -64,7 +64,7 @@ public void interceptAfterEachMethod(Invocation invocation, ReflectiveInvo protected final ClientAndServer server = ClientAndServer.startClientAndServer(0); - private final HttpClient baseClient = this.createClient(new $HttpClientConfig_ConfigValueExtractor.HttpClientConfig_Impl(ofMillis(100), ofMillis(500000), null, false)); + private final HttpClient baseClient = this.createClient(new $HttpClientConfig_ConfigValueMapper.HttpClientConfig_Impl(ofMillis(100), ofMillis(500000), null, false)); private final HttpClient client = this.baseClient .with((chain, request) -> chain.process(HttpClientRequest.of( request.method(), diff --git a/http/http-client-jdk/src/main/java/io/koraframework/http/client/jdk/JdkHttpClientConfig.java b/http/http-client-jdk/src/main/java/io/koraframework/http/client/jdk/JdkHttpClientConfig.java index 899edd729..5af4dec51 100644 --- a/http/http-client-jdk/src/main/java/io/koraframework/http/client/jdk/JdkHttpClientConfig.java +++ b/http/http-client-jdk/src/main/java/io/koraframework/http/client/jdk/JdkHttpClientConfig.java @@ -1,10 +1,10 @@ package io.koraframework.http.client.jdk; -import io.koraframework.config.common.annotation.ConfigValueExtractor; +import io.koraframework.config.common.annotation.ConfigMapper; import java.net.http.HttpClient; -@ConfigValueExtractor +@ConfigMapper public interface JdkHttpClientConfig { default boolean followRedirects() { diff --git a/http/http-client-jdk/src/main/java/io/koraframework/http/client/jdk/JdkHttpClientModule.java b/http/http-client-jdk/src/main/java/io/koraframework/http/client/jdk/JdkHttpClientModule.java index f9add8407..3d5e81298 100644 --- a/http/http-client-jdk/src/main/java/io/koraframework/http/client/jdk/JdkHttpClientModule.java +++ b/http/http-client-jdk/src/main/java/io/koraframework/http/client/jdk/JdkHttpClientModule.java @@ -3,7 +3,7 @@ import io.koraframework.common.annotation.DefaultComponent; import io.koraframework.config.common.Config; import io.koraframework.config.common.ConfigValue; -import io.koraframework.config.common.extractor.ConfigValueExtractor; +import io.koraframework.config.common.mapper.ConfigValueMapper; import io.koraframework.http.client.common.HttpClientConfig; import io.koraframework.http.client.common.HttpClientModule; @@ -15,12 +15,12 @@ default JdkHttpClient jdkHttpClient(HttpClient client) { return new JdkHttpClient(client); } - default JdkHttpClientConfig jdkHttpClientConfig(Config config, ConfigValueExtractor extractor) { - return extractor.extractOrThrow(config.get("httpClient.jdk")); + default JdkHttpClientConfig jdkHttpClientConfig(Config config, ConfigValueMapper mapper) { + return mapper.mapOrThrow(config.get("httpClient.jdk")); } @DefaultComponent - default ConfigValueExtractor jdkHttpClientVersionExtractor() { + default ConfigValueMapper jdkHttpClientVersionExtractor() { return value -> { if (value instanceof ConfigValue.NullValue) { return null; diff --git a/http/http-client-ok/src/main/java/io/koraframework/http/client/ok/OkHttpClientConfig.java b/http/http-client-ok/src/main/java/io/koraframework/http/client/ok/OkHttpClientConfig.java index 76a603afc..32700109b 100644 --- a/http/http-client-ok/src/main/java/io/koraframework/http/client/ok/OkHttpClientConfig.java +++ b/http/http-client-ok/src/main/java/io/koraframework/http/client/ok/OkHttpClientConfig.java @@ -1,8 +1,8 @@ package io.koraframework.http.client.ok; -import io.koraframework.config.common.annotation.ConfigValueExtractor; +import io.koraframework.config.common.annotation.ConfigMapper; -@ConfigValueExtractor +@ConfigMapper public interface OkHttpClientConfig { default boolean followRedirects() { diff --git a/http/http-client-ok/src/main/java/io/koraframework/http/client/ok/OkHttpClientModule.java b/http/http-client-ok/src/main/java/io/koraframework/http/client/ok/OkHttpClientModule.java index 24e1c7f4c..3efcea82e 100644 --- a/http/http-client-ok/src/main/java/io/koraframework/http/client/ok/OkHttpClientModule.java +++ b/http/http-client-ok/src/main/java/io/koraframework/http/client/ok/OkHttpClientModule.java @@ -4,7 +4,7 @@ import io.koraframework.common.annotation.DefaultComponent; import io.koraframework.common.Configurer; import io.koraframework.config.common.Config; -import io.koraframework.config.common.extractor.ConfigValueExtractor; +import io.koraframework.config.common.mapper.ConfigValueMapper; import io.koraframework.http.client.common.HttpClientConfig; import io.koraframework.http.client.common.HttpClientModule; @@ -14,8 +14,8 @@ default OkHttpClient okHttpClient(okhttp3.OkHttpClient client) { return new OkHttpClient(client); } - default OkHttpClientConfig okHttpClientConfig(Config config, ConfigValueExtractor extractor) { - return extractor.extractOrThrow(config.get("httpClient.ok")); + default OkHttpClientConfig okHttpClientConfig(Config config, ConfigValueMapper mapper) { + return mapper.mapOrThrow(config.get("httpClient.ok")); } @DefaultComponent diff --git a/http/http-client-symbol-processor/src/main/kotlin/io/koraframework/http/client/symbol/processor/ConfigClassGenerator.kt b/http/http-client-symbol-processor/src/main/kotlin/io/koraframework/http/client/symbol/processor/ConfigClassGenerator.kt index 23324681a..d59fee4db 100644 --- a/http/http-client-symbol-processor/src/main/kotlin/io/koraframework/http/client/symbol/processor/ConfigClassGenerator.kt +++ b/http/http-client-symbol-processor/src/main/kotlin/io/koraframework/http/client/symbol/processor/ConfigClassGenerator.kt @@ -6,7 +6,7 @@ import com.squareup.kotlinpoet.KModifier import com.squareup.kotlinpoet.TypeSpec import io.koraframework.http.client.symbol.processor.HttpClientClassNames.declarativeHttpClientConfig import io.koraframework.http.client.symbol.processor.HttpClientClassNames.httpClientOperationConfig -import io.koraframework.ksp.common.CommonClassNames.configValueExtractorAnnotation +import io.koraframework.ksp.common.CommonClassNames.configMapperAnnotation import io.koraframework.ksp.common.KspCommonUtils.addOriginatingKSFile import io.koraframework.ksp.common.KspCommonUtils.generated @@ -22,7 +22,7 @@ class ConfigClassGenerator { .addOriginatingKSFile(declaration) .generated(HttpClientSymbolProcessor::class) .addSuperinterface(declarativeHttpClientConfig) - .addAnnotation(configValueExtractorAnnotation) + .addAnnotation(configMapperAnnotation) tb.addFunction(FunSpec.builder("telemetry") .addModifiers(KModifier.ABSTRACT, KModifier.OVERRIDE) diff --git a/http/http-client-symbol-processor/src/main/kotlin/io/koraframework/http/client/symbol/processor/ConfigModuleGenerator.kt b/http/http-client-symbol-processor/src/main/kotlin/io/koraframework/http/client/symbol/processor/ConfigModuleGenerator.kt index 4ec081075..5d98eae83 100644 --- a/http/http-client-symbol-processor/src/main/kotlin/io/koraframework/http/client/symbol/processor/ConfigModuleGenerator.kt +++ b/http/http-client-symbol-processor/src/main/kotlin/io/koraframework/http/client/symbol/processor/ConfigModuleGenerator.kt @@ -24,7 +24,7 @@ class ConfigModuleGenerator(val resolver: Resolver) { val configName = declaration.configName() val moduleName = declaration.moduleName() val configClass = ClassName(packageName, configName) - val extractorClass = CommonClassNames.configValueExtractor.parameterizedBy(configClass) + val extractorClass = CommonClassNames.configValueMapper.parameterizedBy(configClass) val type = TypeSpec.interfaceBuilder(moduleName) .generated(ConfigModuleGenerator::class) .addAnnotation(AnnotationSpec.builder(CommonClassNames.module).build()) @@ -33,8 +33,8 @@ class ConfigModuleGenerator(val resolver: Resolver) { FunSpec.builder(lowercaseName.toString() + "Config") .returns(configClass) .addParameter(ParameterSpec.builder("config", CommonClassNames.config).build()) - .addParameter(ParameterSpec.builder("extractor", extractorClass).build()) - .addStatement("return extractor.extractOrThrow(config.get(%S))", configPath) + .addParameter(ParameterSpec.builder("mapper", extractorClass).build()) + .addStatement("return mapper.mapOrThrow(config.get(%S))", configPath) .build() ) return FileSpec.builder(packageName, moduleName) diff --git a/http/http-client-symbol-processor/src/test/kotlin/io/koraframework/http/client/symbol/processor/AbstractHttpClientTest.kt b/http/http-client-symbol-processor/src/test/kotlin/io/koraframework/http/client/symbol/processor/AbstractHttpClientTest.kt index 3b2fe211c..48fb3a4b8 100644 --- a/http/http-client-symbol-processor/src/test/kotlin/io/koraframework/http/client/symbol/processor/AbstractHttpClientTest.kt +++ b/http/http-client-symbol-processor/src/test/kotlin/io/koraframework/http/client/symbol/processor/AbstractHttpClientTest.kt @@ -1,7 +1,7 @@ package io.koraframework.http.client.symbol.processor -import io.koraframework.config.common.extractor.* -import io.koraframework.config.common.factory.MapConfigFactory +import io.koraframework.config.common.mapper.* +import io.koraframework.config.common.util.ConfigMappingUtils import io.koraframework.config.ksp.processor.ConfigParserSymbolProcessorProvider import io.koraframework.config.ksp.processor.ConfigSourceSymbolProcessorProvider import io.koraframework.http.client.common.HttpClient @@ -66,36 +66,41 @@ abstract class AbstractHttpClientTest : AbstractSymbolProcessorTest() { .assertSuccess() val clientClass = loadClass("\$TestClient_ClientImpl") - val durationCVE = DurationConfigValueExtractor() - val telemetryCVE = `$HttpClientTelemetryConfig_ConfigValueExtractor`( - `$HttpClientTelemetryConfig_HttpClientLoggingConfig_ConfigValueExtractor`( - SetConfigValueExtractor( - StringConfigValueExtractor() - ), SizeConfigValueExtractor() + val durationCVE = DurationConfigValueMapper() + val telemetryCVE = `$HttpClientTelemetryConfig_ConfigValueMapper`( + `$HttpClientTelemetryConfig_HttpClientLoggingConfig_ConfigValueMapper`( + SetConfigValueMapper( + StringConfigValueMapper() + ), SizeConfigValueMapper() ), - `$HttpClientTelemetryConfig_HttpClientMetricsConfig_ConfigValueExtractor`( - DurationArrayConfigValueExtractor(DurationConfigValueExtractor()), - MapConfigValueExtractor(StringConfigValueExtractor()) + `$HttpClientTelemetryConfig_HttpClientMetricsConfig_ConfigValueMapper`( + DurationArrayConfigValueMapper(DurationConfigValueMapper()), + MapConfigValueMapper(StringConfigValueMapper()) ), - `$HttpClientTelemetryConfig_HttpClientTracingConfig_ConfigValueExtractor`( - MapConfigValueExtractor( - StringConfigValueExtractor() + `$HttpClientTelemetryConfig_HttpClientTracingConfig_ConfigValueMapper`( + MapConfigValueMapper( + StringConfigValueMapper() ) ) ) - val operationTelemetryCVE = `$HttpClientOperationConfig_OperationTelemetryConfig_ConfigValueExtractor`( - `$HttpClientOperationConfig_OperationTelemetryConfig_LoggingConfig_ConfigValueExtractor`(SetConfigValueExtractor(StringConfigValueExtractor()), SizeConfigValueExtractor()), - `$HttpClientOperationConfig_OperationTelemetryConfig_TracingConfig_ConfigValueExtractor`(MapConfigValueExtractor(StringConfigValueExtractor())), - `$HttpClientOperationConfig_OperationTelemetryConfig_MetricsConfig_ConfigValueExtractor`( - DurationArrayConfigValueExtractor(DurationConfigValueExtractor()), - MapConfigValueExtractor(StringConfigValueExtractor()) + val operationTelemetryCVE = `$HttpClientOperationConfig_OperationTelemetryConfig_ConfigValueMapper`( + `$HttpClientOperationConfig_OperationTelemetryConfig_LoggingConfig_ConfigValueMapper`( + SetConfigValueMapper(StringConfigValueMapper()), + SizeConfigValueMapper() + ), + `$HttpClientOperationConfig_OperationTelemetryConfig_TracingConfig_ConfigValueMapper`( + MapConfigValueMapper(StringConfigValueMapper()) + ), + `$HttpClientOperationConfig_OperationTelemetryConfig_MetricsConfig_ConfigValueMapper`( + DurationArrayConfigValueMapper(DurationConfigValueMapper()), + MapConfigValueMapper(StringConfigValueMapper()) ) ) - val operationConfigCVE = `$HttpClientOperationConfig_ConfigValueExtractor`(durationCVE, operationTelemetryCVE) + val operationConfigCVE = `$HttpClientOperationConfig_ConfigValueMapper`(durationCVE, operationTelemetryCVE) - val configValueExtractor = new("\$TestClient_Config_ConfigValueExtractor", telemetryCVE, operationConfigCVE, durationCVE) as ConfigValueExtractor<*> - val config = configValueExtractor.extract( - MapConfigFactory.fromMap( + val configValueMapper = new("\$TestClient_Config_ConfigValueMapper", telemetryCVE, operationConfigCVE, durationCVE) as ConfigValueMapper<*> + val config = configValueMapper.map( + ConfigMappingUtils.fromMap( mapOf( "url" to "http://test-url:8080" ) diff --git a/http/http-client-symbol-processor/src/test/kotlin/io/koraframework/http/client/symbol/processor/HttpClientKoraExtensionTest.kt b/http/http-client-symbol-processor/src/test/kotlin/io/koraframework/http/client/symbol/processor/HttpClientKoraExtensionTest.kt index 7542f7651..71dfa9815 100644 --- a/http/http-client-symbol-processor/src/test/kotlin/io/koraframework/http/client/symbol/processor/HttpClientKoraExtensionTest.kt +++ b/http/http-client-symbol-processor/src/test/kotlin/io/koraframework/http/client/symbol/processor/HttpClientKoraExtensionTest.kt @@ -9,7 +9,7 @@ import io.koraframework.ksp.common.GraphUtil.toGraphDraw class HttpClientKoraExtensionTest : AbstractSymbolProcessorTest() { override fun commonImports(): String { return super.commonImports() + """ - import io.koraframework.config.common.extractor.ConfigValueExtractor + import io.koraframework.config.common.mapper.ConfigValueMapper import io.koraframework.http.client.common.HttpClient import io.koraframework.http.client.common.telemetry.HttpClientTelemetryFactory import io.koraframework.http.client.common.response.HttpClientResponseMapper @@ -27,7 +27,7 @@ class HttpClientKoraExtensionTest : AbstractSymbolProcessorTest() { fun client(): HttpClient = org.mockito.Mockito.mock(HttpClient::class.java) fun telemetry(): HttpClientTelemetryFactory = org.mockito.Mockito.mock(HttpClientTelemetryFactory::class.java) fun config(): io.koraframework.config.common.Config = org.mockito.Mockito.mock(io.koraframework.config.common.Config::class.java) - fun extractor(): ConfigValueExtractor<`${'$'}TestClient_Config`> = org.mockito.Mockito.mock(ConfigValueExtractor::class.java) as ConfigValueExtractor<`${'$'}TestClient_Config`> + fun extractor(): ConfigValueMapper<`${'$'}TestClient_Config`> = org.mockito.Mockito.mock(ConfigValueMapper::class.java) as ConfigValueMapper<`${'$'}TestClient_Config`> @io.koraframework.common.annotation.Root fun root(m: TestClient) = "" diff --git a/http/http-server-common/src/main/java/io/koraframework/http/server/common/HttpServerConfig.java b/http/http-server-common/src/main/java/io/koraframework/http/server/common/HttpServerConfig.java index 6ab28f249..fd2547f90 100644 --- a/http/http-server-common/src/main/java/io/koraframework/http/server/common/HttpServerConfig.java +++ b/http/http-server-common/src/main/java/io/koraframework/http/server/common/HttpServerConfig.java @@ -1,12 +1,12 @@ package io.koraframework.http.server.common; import io.koraframework.common.util.Size; -import io.koraframework.config.common.annotation.ConfigValueExtractor; +import io.koraframework.config.common.annotation.ConfigMapper; import io.koraframework.http.server.common.telemetry.HttpServerTelemetryConfig; import java.time.Duration; -@ConfigValueExtractor +@ConfigMapper public interface HttpServerConfig { default int port() { diff --git a/http/http-server-common/src/main/java/io/koraframework/http/server/common/HttpServerModule.java b/http/http-server-common/src/main/java/io/koraframework/http/server/common/HttpServerModule.java index a16ac048e..86e4fdca6 100644 --- a/http/http-server-common/src/main/java/io/koraframework/http/server/common/HttpServerModule.java +++ b/http/http-server-common/src/main/java/io/koraframework/http/server/common/HttpServerModule.java @@ -8,7 +8,7 @@ import io.koraframework.common.liveness.LivenessProbe; import io.koraframework.common.readiness.ReadinessProbe; import io.koraframework.config.common.Config; -import io.koraframework.config.common.extractor.ConfigValueExtractor; +import io.koraframework.config.common.mapper.ConfigValueMapper; import io.koraframework.http.server.common.interceptor.HttpServerInterceptor; import io.koraframework.http.server.common.request.HttpServerRequestHandler; import io.koraframework.http.server.common.request.mapper.HttpServerParameterReaderModule; @@ -30,8 +30,8 @@ public interface HttpServerModule extends HttpServerParameterReaderModule, HttpServerRequestMapperModule, HttpServerResponseMapperModule { - default HttpServerConfig publicHttpServerConfig(Config config, ConfigValueExtractor extractor) { - return extractor.extractOrThrow(config.get("httpServer")); + default HttpServerConfig publicHttpServerConfig(Config config, ConfigValueMapper mapper) { + return mapper.mapOrThrow(config.get("httpServer")); } default HttpServerHandler publicHttpServerHandler(All handlers, @@ -50,8 +50,8 @@ default HttpServerTelemetryFactory defaultHttpServerTelemetryFactory(@Nullable M } @SystemApi - default HttpServerSystemConfig systemHttpServerConfig(Config config, ConfigValueExtractor extractor) { - return extractor.extractOrThrow(config.get("httpServer.system")); + default HttpServerSystemConfig systemHttpServerConfig(Config config, ConfigValueMapper mapper) { + return mapper.mapOrThrow(config.get("httpServer.system")); } @SystemApi diff --git a/http/http-server-common/src/main/java/io/koraframework/http/server/common/system/HttpServerSystemConfig.java b/http/http-server-common/src/main/java/io/koraframework/http/server/common/system/HttpServerSystemConfig.java index 34939f437..b52e36a16 100644 --- a/http/http-server-common/src/main/java/io/koraframework/http/server/common/system/HttpServerSystemConfig.java +++ b/http/http-server-common/src/main/java/io/koraframework/http/server/common/system/HttpServerSystemConfig.java @@ -1,9 +1,9 @@ package io.koraframework.http.server.common.system; -import io.koraframework.config.common.annotation.ConfigValueExtractor; +import io.koraframework.config.common.annotation.ConfigMapper; import io.koraframework.http.server.common.HttpServerConfig; -@ConfigValueExtractor +@ConfigMapper public interface HttpServerSystemConfig extends HttpServerConfig { default String metricsPath() { diff --git a/http/http-server-common/src/main/java/io/koraframework/http/server/common/telemetry/HttpServerTelemetryConfig.java b/http/http-server-common/src/main/java/io/koraframework/http/server/common/telemetry/HttpServerTelemetryConfig.java index a9f736b31..878327f3b 100644 --- a/http/http-server-common/src/main/java/io/koraframework/http/server/common/telemetry/HttpServerTelemetryConfig.java +++ b/http/http-server-common/src/main/java/io/koraframework/http/server/common/telemetry/HttpServerTelemetryConfig.java @@ -1,14 +1,14 @@ package io.koraframework.http.server.common.telemetry; import io.koraframework.common.util.Size; -import io.koraframework.config.common.annotation.ConfigValueExtractor; +import io.koraframework.config.common.annotation.ConfigMapper; import io.koraframework.telemetry.common.TelemetryConfig; import org.jspecify.annotations.Nullable; import java.util.Collections; import java.util.Set; -@ConfigValueExtractor +@ConfigMapper public interface HttpServerTelemetryConfig extends TelemetryConfig { @Override @@ -20,7 +20,7 @@ public interface HttpServerTelemetryConfig extends TelemetryConfig { @Override HttpServerTracingConfig tracing(); - @ConfigValueExtractor + @ConfigMapper interface HttpServerLoggingConfig extends LoggingConfig { default boolean stacktrace() { @@ -51,10 +51,10 @@ default Size maxResponseBodyLogSize() { } } - @ConfigValueExtractor + @ConfigMapper interface HttpServerMetricsConfig extends TelemetryConfig.MetricsConfig { } - @ConfigValueExtractor + @ConfigMapper interface HttpServerTracingConfig extends TelemetryConfig.TracingConfig { default boolean tracePathFull() { diff --git a/http/http-server-common/src/main/java/io/koraframework/http/server/common/telemetry/impl/DefaultHttpServerTelemetry.java b/http/http-server-common/src/main/java/io/koraframework/http/server/common/telemetry/impl/DefaultHttpServerTelemetry.java index 999880696..d6af51957 100644 --- a/http/http-server-common/src/main/java/io/koraframework/http/server/common/telemetry/impl/DefaultHttpServerTelemetry.java +++ b/http/http-server-common/src/main/java/io/koraframework/http/server/common/telemetry/impl/DefaultHttpServerTelemetry.java @@ -24,10 +24,10 @@ public record TelemetryContext(HttpServerTelemetryConfig config, DefaultHttpServerBodyConverter bodyLogger) { public static final TelemetryContext EMPTY = new TelemetryContext( - new $HttpServerTelemetryConfig_ConfigValueExtractor.HttpServerTelemetryConfig_Impl( - new $HttpServerTelemetryConfig_HttpServerLoggingConfig_ConfigValueExtractor.HttpServerLoggingConfig_Defaults(), - new $HttpServerTelemetryConfig_HttpServerMetricsConfig_ConfigValueExtractor.HttpServerMetricsConfig_Defaults(), - new $HttpServerTelemetryConfig_HttpServerTracingConfig_ConfigValueExtractor.HttpServerTracingConfig_Defaults() + new $HttpServerTelemetryConfig_ConfigValueMapper.HttpServerTelemetryConfig_Impl( + new $HttpServerTelemetryConfig_HttpServerLoggingConfig_ConfigValueMapper.HttpServerLoggingConfig_Defaults(), + new $HttpServerTelemetryConfig_HttpServerMetricsConfig_ConfigValueMapper.HttpServerMetricsConfig_Defaults(), + new $HttpServerTelemetryConfig_HttpServerTracingConfig_ConfigValueMapper.HttpServerTracingConfig_Defaults() ) , false, false, DefaultHttpServerTelemetryFactory.NOOP_METER_REGISTRY, DefaultHttpServerTelemetryFactory.NOOP_TRACER, new DefaultHttpServerBodyConverter()); } diff --git a/http/http-server-common/src/test/java/io/koraframework/http/server/common/router/HttpServerHandlerProcessTests.java b/http/http-server-common/src/test/java/io/koraframework/http/server/common/router/HttpServerHandlerProcessTests.java index b664191f4..b8e1f8fdc 100644 --- a/http/http-server-common/src/test/java/io/koraframework/http/server/common/router/HttpServerHandlerProcessTests.java +++ b/http/http-server-common/src/test/java/io/koraframework/http/server/common/router/HttpServerHandlerProcessTests.java @@ -5,7 +5,7 @@ import io.koraframework.http.common.body.HttpBody; import io.koraframework.http.common.body.HttpBodyInput; import io.koraframework.http.common.header.HttpHeaders; -import io.koraframework.http.server.common.$HttpServerConfig_ConfigValueExtractor.HttpServerConfig_Impl; +import io.koraframework.http.server.common.$HttpServerConfig_ConfigValueMapper.HttpServerConfig_Impl; import io.koraframework.http.server.common.HttpServerConfig; import io.koraframework.http.server.common.request.HttpServerRequestHandler; import io.koraframework.http.server.common.request.HttpServerRequestHandlerImpl; @@ -156,10 +156,10 @@ private HttpServerConfig config(boolean ignoreTrailingSlash) { true, Duration.ofMillis(100), Size.ofBytesBinary(1024), - new $HttpServerTelemetryConfig_ConfigValueExtractor.HttpServerTelemetryConfig_Impl( - new $HttpServerTelemetryConfig_HttpServerLoggingConfig_ConfigValueExtractor.HttpServerLoggingConfig_Defaults(), - new $HttpServerTelemetryConfig_HttpServerMetricsConfig_ConfigValueExtractor.HttpServerMetricsConfig_Defaults(), - new $HttpServerTelemetryConfig_HttpServerTracingConfig_ConfigValueExtractor.HttpServerTracingConfig_Defaults() + new $HttpServerTelemetryConfig_ConfigValueMapper.HttpServerTelemetryConfig_Impl( + new $HttpServerTelemetryConfig_HttpServerLoggingConfig_ConfigValueMapper.HttpServerLoggingConfig_Defaults(), + new $HttpServerTelemetryConfig_HttpServerMetricsConfig_ConfigValueMapper.HttpServerMetricsConfig_Defaults(), + new $HttpServerTelemetryConfig_HttpServerTracingConfig_ConfigValueMapper.HttpServerTracingConfig_Defaults() ) ); } diff --git a/http/http-server-common/src/test/java/io/koraframework/http/server/common/router/HttpServerHandlerTest.java b/http/http-server-common/src/test/java/io/koraframework/http/server/common/router/HttpServerHandlerTest.java index 5f4484329..481a7bd9a 100644 --- a/http/http-server-common/src/test/java/io/koraframework/http/server/common/router/HttpServerHandlerTest.java +++ b/http/http-server-common/src/test/java/io/koraframework/http/server/common/router/HttpServerHandlerTest.java @@ -1,7 +1,7 @@ package io.koraframework.http.server.common.router; import io.koraframework.common.util.Size; -import io.koraframework.http.server.common.$HttpServerConfig_ConfigValueExtractor; +import io.koraframework.http.server.common.$HttpServerConfig_ConfigValueMapper; import io.koraframework.http.server.common.HttpServerConfig; import io.koraframework.http.server.common.request.HttpServerRequestHandler; import io.koraframework.http.server.common.request.HttpServerRequestHandlerImpl; @@ -141,7 +141,7 @@ void sameMethodSameRouteTrailingSlashWhenIgnoreTrailingSlashFail() { } private HttpServerConfig config(boolean ignoreTrailingSlash) { - return new $HttpServerConfig_ConfigValueExtractor.HttpServerConfig_Impl( + return new $HttpServerConfig_ConfigValueMapper.HttpServerConfig_Impl( 0, ignoreTrailingSlash, Duration.ofSeconds(1), @@ -151,10 +151,10 @@ private HttpServerConfig config(boolean ignoreTrailingSlash) { true, Duration.ofMillis(1), Size.ofBytesBinary(1024), - new $HttpServerTelemetryConfig_ConfigValueExtractor.HttpServerTelemetryConfig_Impl( - new $HttpServerTelemetryConfig_HttpServerLoggingConfig_ConfigValueExtractor.HttpServerLoggingConfig_Defaults(), - new $HttpServerTelemetryConfig_HttpServerMetricsConfig_ConfigValueExtractor.HttpServerMetricsConfig_Defaults(), - new $HttpServerTelemetryConfig_HttpServerTracingConfig_ConfigValueExtractor.HttpServerTracingConfig_Defaults() + new $HttpServerTelemetryConfig_ConfigValueMapper.HttpServerTelemetryConfig_Impl( + new $HttpServerTelemetryConfig_HttpServerLoggingConfig_ConfigValueMapper.HttpServerLoggingConfig_Defaults(), + new $HttpServerTelemetryConfig_HttpServerMetricsConfig_ConfigValueMapper.HttpServerMetricsConfig_Defaults(), + new $HttpServerTelemetryConfig_HttpServerTracingConfig_ConfigValueMapper.HttpServerTracingConfig_Defaults() ) ); } diff --git a/http/http-server-common/src/test/java/io/koraframework/http/server/common/telemetry/DefaultHttpServerLoggerTests.java b/http/http-server-common/src/test/java/io/koraframework/http/server/common/telemetry/DefaultHttpServerLoggerTests.java index 37005b640..7c78d2e84 100644 --- a/http/http-server-common/src/test/java/io/koraframework/http/server/common/telemetry/DefaultHttpServerLoggerTests.java +++ b/http/http-server-common/src/test/java/io/koraframework/http/server/common/telemetry/DefaultHttpServerLoggerTests.java @@ -6,6 +6,7 @@ import ch.qos.logback.classic.spi.LoggingEvent; import ch.qos.logback.core.Appender; import com.typesafe.config.ConfigFactory; +import io.koraframework.config.common.mapper.*; import org.jspecify.annotations.Nullable; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.Arguments; @@ -13,10 +14,8 @@ import org.mockito.ArgumentCaptor; import org.mockito.Mockito; import org.slf4j.LoggerFactory; -import io.koraframework.config.common.extractor.ConfigValueExtractor; -import io.koraframework.config.common.extractor.SetConfigValueExtractor; -import io.koraframework.config.common.extractor.SizeConfigValueExtractor; -import io.koraframework.config.common.extractor.StringConfigValueExtractor; +import io.koraframework.config.common.mapper.ConfigValueMapper; +import io.koraframework.config.common.mapper.SizeConfigValueMapper; import io.koraframework.config.common.origin.SimpleConfigOrigin; import io.koraframework.config.hocon.HoconConfigFactory; import io.koraframework.http.common.HttpResultCode; @@ -57,9 +56,9 @@ public class DefaultHttpServerLoggerTests { @SuppressWarnings("unchecked") private final Appender mockAppender = mock(Appender.class); - private static final ConfigValueExtractor logConfigExtractor = new $HttpServerTelemetryConfig_HttpServerLoggingConfig_ConfigValueExtractor( - new SetConfigValueExtractor<>(new StringConfigValueExtractor()), - new SizeConfigValueExtractor() + private static final ConfigValueMapper logConfigExtractor = new $HttpServerTelemetryConfig_HttpServerLoggingConfig_ConfigValueMapper( + new SetConfigValueMapper<>(new StringConfigValueMapper()), + new SizeConfigValueMapper() ); private static HttpServerTelemetryConfig.HttpServerLoggingConfig config(String hocon) { @@ -68,7 +67,7 @@ private static HttpServerTelemetryConfig.HttpServerLoggingConfig config(String h maskHeaders = ["authorization"] mask = "" """ + hocon); - return logConfigExtractor.extract(HoconConfigFactory.fromHocon(new SimpleConfigOrigin("test"), config).root()); + return logConfigExtractor.map(HoconConfigFactory.fromHocon(new SimpleConfigOrigin("test"), config).root()); } private static Stream getLogStartTestsData() { @@ -226,10 +225,10 @@ private LoggingEvent getLoggedEvent() { private DefaultHttpServerTelemetry.TelemetryContext context(HttpServerTelemetryConfig.HttpServerLoggingConfig loggingConfig) { return new DefaultHttpServerTelemetry.TelemetryContext( - new $HttpServerTelemetryConfig_ConfigValueExtractor.HttpServerTelemetryConfig_Impl( + new $HttpServerTelemetryConfig_ConfigValueMapper.HttpServerTelemetryConfig_Impl( loggingConfig, - new $HttpServerTelemetryConfig_HttpServerMetricsConfig_ConfigValueExtractor.HttpServerMetricsConfig_Defaults(), - new $HttpServerTelemetryConfig_HttpServerTracingConfig_ConfigValueExtractor.HttpServerTracingConfig_Defaults() + new $HttpServerTelemetryConfig_HttpServerMetricsConfig_ConfigValueMapper.HttpServerMetricsConfig_Defaults(), + new $HttpServerTelemetryConfig_HttpServerTracingConfig_ConfigValueMapper.HttpServerTracingConfig_Defaults() ), false, false, diff --git a/http/http-server-common/src/testFixtures/java/io/koraframework/http/server/common/HttpServerTestKit.java b/http/http-server-common/src/testFixtures/java/io/koraframework/http/server/common/HttpServerTestKit.java index 40db6703e..364dfeb4a 100644 --- a/http/http-server-common/src/testFixtures/java/io/koraframework/http/server/common/HttpServerTestKit.java +++ b/http/http-server-common/src/testFixtures/java/io/koraframework/http/server/common/HttpServerTestKit.java @@ -12,7 +12,7 @@ import io.koraframework.http.common.body.HttpBodyOutput; import io.koraframework.http.common.header.HttpHeaders; import io.koraframework.http.common.header.MutableHttpHeaders; -import io.koraframework.http.server.common.$HttpServerConfig_ConfigValueExtractor.HttpServerConfig_Impl; +import io.koraframework.http.server.common.$HttpServerConfig_ConfigValueMapper.HttpServerConfig_Impl; import io.koraframework.http.server.common.interceptor.HttpServerInterceptor; import io.koraframework.http.server.common.request.HttpServerRequest; import io.koraframework.http.server.common.request.HttpServerRequestHandler; @@ -21,7 +21,7 @@ import io.koraframework.http.server.common.response.HttpServerResponse; import io.koraframework.http.server.common.response.HttpServerResponseException; import io.koraframework.http.server.common.router.HttpServerHandler; -import io.koraframework.http.server.common.system.$HttpServerSystemConfig_ConfigValueExtractor; +import io.koraframework.http.server.common.system.$HttpServerSystemConfig_ConfigValueMapper; import io.koraframework.http.server.common.system.LivenessHandler; import io.koraframework.http.server.common.system.MetricsHandler; import io.koraframework.http.server.common.system.ReadinessHandler; @@ -71,12 +71,12 @@ public abstract class HttpServerTestKit { private final HttpServerHandler privateApiHandler = new HttpServerHandler( List.of( - new LivenessHandler(valueOf($HttpServerSystemConfig_ConfigValueExtractor.DEFAULTS), All.of(livenessProbePromise)), - new ReadinessHandler(valueOf($HttpServerSystemConfig_ConfigValueExtractor.DEFAULTS), All.of(readinessProbePromise)), - new MetricsHandler(valueOf($HttpServerSystemConfig_ConfigValueExtractor.DEFAULTS), valueOf(Optional.of(registry))) + new LivenessHandler(valueOf($HttpServerSystemConfig_ConfigValueMapper.DEFAULTS), All.of(livenessProbePromise)), + new ReadinessHandler(valueOf($HttpServerSystemConfig_ConfigValueMapper.DEFAULTS), All.of(readinessProbePromise)), + new MetricsHandler(valueOf($HttpServerSystemConfig_ConfigValueMapper.DEFAULTS), valueOf(Optional.of(registry))) ), List.of(), - $HttpServerSystemConfig_ConfigValueExtractor.DEFAULTS + $HttpServerSystemConfig_ConfigValueMapper.DEFAULTS ); private volatile HttpServer httpServer = null; @@ -109,7 +109,7 @@ void testLivenessSuccess() throws Exception { when(livenessProbe.probe()).thenReturn(null); startSystemHttpServer(); - var request = privateApiRequest($HttpServerSystemConfig_ConfigValueExtractor.DEFAULTS.livenessPath()) + var request = privateApiRequest($HttpServerSystemConfig_ConfigValueMapper.DEFAULTS.livenessPath()) .get() .build(); @@ -125,7 +125,7 @@ void testLivenessFailure() throws Exception { when(livenessProbe.probe()).thenReturn(new LivenessProbeFailure("Failure")); startSystemHttpServer(); - var request = privateApiRequest($HttpServerSystemConfig_ConfigValueExtractor.DEFAULTS.livenessPath()) + var request = privateApiRequest($HttpServerSystemConfig_ConfigValueMapper.DEFAULTS.livenessPath()) .get() .build(); @@ -140,7 +140,7 @@ void testLivenessFailureOnUninitializedProbe() throws IOException { livenessProbePromise.setValue(null); startSystemHttpServer(); - var request = privateApiRequest($HttpServerSystemConfig_ConfigValueExtractor.DEFAULTS.livenessPath()) + var request = privateApiRequest($HttpServerSystemConfig_ConfigValueMapper.DEFAULTS.livenessPath()) .get() .build(); @@ -155,7 +155,7 @@ void testReadinessSuccess() throws Exception { when(readinessProbe.probe()).thenReturn(null); startSystemHttpServer(); - var request = privateApiRequest($HttpServerSystemConfig_ConfigValueExtractor.DEFAULTS.readinessPath()) + var request = privateApiRequest($HttpServerSystemConfig_ConfigValueMapper.DEFAULTS.readinessPath()) .get() .build(); @@ -170,7 +170,7 @@ void testReadinessFailure() throws Exception { when(readinessProbe.probe()).thenReturn(new ReadinessProbeFailure("Failed")); startSystemHttpServer(); - var request = privateApiRequest($HttpServerSystemConfig_ConfigValueExtractor.DEFAULTS.readinessPath()) + var request = privateApiRequest($HttpServerSystemConfig_ConfigValueMapper.DEFAULTS.readinessPath()) .get() .build(); @@ -185,7 +185,7 @@ void testReadinessFailureOnUninitializedProbe() throws IOException { readinessProbePromise.setValue(null); startSystemHttpServer(); - var request = privateApiRequest($HttpServerSystemConfig_ConfigValueExtractor.DEFAULTS.readinessPath()) + var request = privateApiRequest($HttpServerSystemConfig_ConfigValueMapper.DEFAULTS.readinessPath()) .get() .build(); @@ -975,10 +975,10 @@ protected void startServer(boolean ignoreTrailingSlash, List extractor) { - return extractor.extractOrThrow(config.get("httpServer.undertow")); + default UndertowConfig undertowHttpServerConfig(Config config, ConfigValueMapper mapper) { + return mapper.mapOrThrow(config.get("httpServer.undertow")); } @DefaultComponent diff --git a/http/soap-client-annotation-processor/src/main/java/io/koraframework/soap/client/annotation/processor/SoapClientImplGenerator.java b/http/soap-client-annotation-processor/src/main/java/io/koraframework/soap/client/annotation/processor/SoapClientImplGenerator.java index f796b757e..129d6cf08 100644 --- a/http/soap-client-annotation-processor/src/main/java/io/koraframework/soap/client/annotation/processor/SoapClientImplGenerator.java +++ b/http/soap-client-annotation-processor/src/main/java/io/koraframework/soap/client/annotation/processor/SoapClientImplGenerator.java @@ -45,7 +45,7 @@ public TypeSpec generateModule(Element element, SoapClasses soapClasses) { var configPath = "soapClient." + serviceName; var moduleName = NameUtils.generatedType(element, "SoapClientModule"); - var extractorClass = ParameterizedTypeName.get(CommonClassNames.configValueExtractor, SOAP_CONFIG); + var extractorClass = ParameterizedTypeName.get(CommonClassNames.configValueMapper, SOAP_CONFIG); var elementType = ClassName.get(element.asType()); var methodPrefix = serviceName.substring(0, 1).toLowerCase() + serviceName.substring(1); @@ -59,8 +59,8 @@ public TypeSpec generateModule(Element element, SoapClasses soapClasses) { .addModifiers(Modifier.PUBLIC, Modifier.DEFAULT).returns(SOAP_CONFIG) .addAnnotation(CommonClassNames.defaultComponent) .addParameter(ParameterSpec.builder(CommonClassNames.config, "config").build()) - .addParameter(ParameterSpec.builder(extractorClass, "extractor").build()) - .addStatement("return extractor.extractOrThrow(config.get($S))", configPath) + .addParameter(ParameterSpec.builder(extractorClass, "mapper").build()) + .addStatement("return mapper.mapOrThrow(config.get($S))", configPath) .build()) .addMethod(MethodSpec.methodBuilder(methodPrefix + "_SoapClientImpl") .addModifiers(Modifier.PUBLIC, Modifier.DEFAULT) diff --git a/http/soap-client-symbol-processor/src/main/kotlin/io/koraframework/soap/client/symbol/processor/SoapClientImplGenerator.kt b/http/soap-client-symbol-processor/src/main/kotlin/io/koraframework/soap/client/symbol/processor/SoapClientImplGenerator.kt index a03eaea2f..d25a4ab52 100644 --- a/http/soap-client-symbol-processor/src/main/kotlin/io/koraframework/soap/client/symbol/processor/SoapClientImplGenerator.kt +++ b/http/soap-client-symbol-processor/src/main/kotlin/io/koraframework/soap/client/symbol/processor/SoapClientImplGenerator.kt @@ -52,7 +52,7 @@ class SoapClientImplGenerator(private val resolver: Resolver) { val configPath = "soapClient.$serviceName" val moduleName = declaration.generatedClassName("SoapClientModule") - val extractorClass = CommonClassNames.configValueExtractor.parameterizedBy(soapConfig) + val extractorClass = CommonClassNames.configValueMapper.parameterizedBy(soapConfig) val elementType = declaration.toClassName() val methodPrefix = serviceName.substring(0, 1).lowercase(Locale.getDefault()) + serviceName.substring(1) @@ -67,8 +67,8 @@ class SoapClientImplGenerator(private val resolver: Resolver) { .addAnnotation(CommonClassNames.defaultComponent) .addTag(elementType.canonicalName) .addParameter(ParameterSpec.builder("config", CommonClassNames.config).build()) - .addParameter(ParameterSpec.builder("extractor", extractorClass).build()) - .addStatement("return extractor.extractOrThrow(config.get(%S))", configPath) + .addParameter(ParameterSpec.builder("mapper", extractorClass).build()) + .addStatement("return mapper.mapOrThrow(config.get(%S))", configPath) .build() ) .addFunction( diff --git a/http/soap-client/src/main/java/io/koraframework/soap/client/common/SoapServiceConfig.java b/http/soap-client/src/main/java/io/koraframework/soap/client/common/SoapServiceConfig.java index 5a99aee18..2c7975330 100644 --- a/http/soap-client/src/main/java/io/koraframework/soap/client/common/SoapServiceConfig.java +++ b/http/soap-client/src/main/java/io/koraframework/soap/client/common/SoapServiceConfig.java @@ -1,11 +1,11 @@ package io.koraframework.soap.client.common; -import io.koraframework.config.common.annotation.ConfigValueExtractor; +import io.koraframework.config.common.annotation.ConfigMapper; import io.koraframework.soap.client.common.telemetry.SoapClientTelemetryConfig; import java.time.Duration; -@ConfigValueExtractor +@ConfigMapper public interface SoapServiceConfig { String url(); diff --git a/http/soap-client/src/main/java/io/koraframework/soap/client/common/telemetry/SoapClientTelemetryConfig.java b/http/soap-client/src/main/java/io/koraframework/soap/client/common/telemetry/SoapClientTelemetryConfig.java index d42144aa4..c056fb981 100644 --- a/http/soap-client/src/main/java/io/koraframework/soap/client/common/telemetry/SoapClientTelemetryConfig.java +++ b/http/soap-client/src/main/java/io/koraframework/soap/client/common/telemetry/SoapClientTelemetryConfig.java @@ -1,9 +1,9 @@ package io.koraframework.soap.client.common.telemetry; -import io.koraframework.config.common.annotation.ConfigValueExtractor; +import io.koraframework.config.common.annotation.ConfigMapper; import io.koraframework.telemetry.common.TelemetryConfig; -@ConfigValueExtractor +@ConfigMapper public interface SoapClientTelemetryConfig extends TelemetryConfig { @Override @@ -15,12 +15,12 @@ public interface SoapClientTelemetryConfig extends TelemetryConfig { @Override SoapClientTracingConfig tracing(); - @ConfigValueExtractor + @ConfigMapper interface SoapClientLoggingConfig extends TelemetryConfig.LoggingConfig {} - @ConfigValueExtractor + @ConfigMapper interface SoapClientMetricsConfig extends TelemetryConfig.MetricsConfig {} - @ConfigValueExtractor + @ConfigMapper interface SoapClientTracingConfig extends TelemetryConfig.TracingConfig {} } diff --git a/http/soap-client/src/main/java/io/koraframework/soap/client/common/telemetry/impl/DefaultSoapClientTelemetry.java b/http/soap-client/src/main/java/io/koraframework/soap/client/common/telemetry/impl/DefaultSoapClientTelemetry.java index b377e066f..798ef715b 100644 --- a/http/soap-client/src/main/java/io/koraframework/soap/client/common/telemetry/impl/DefaultSoapClientTelemetry.java +++ b/http/soap-client/src/main/java/io/koraframework/soap/client/common/telemetry/impl/DefaultSoapClientTelemetry.java @@ -27,10 +27,10 @@ public record TelemetryContext(SoapClientTelemetryConfig config, String url) { public static final TelemetryContext EMPTY = new TelemetryContext( - new $SoapClientTelemetryConfig_ConfigValueExtractor.SoapClientTelemetryConfig_Impl( - new $SoapClientTelemetryConfig_SoapClientLoggingConfig_ConfigValueExtractor.SoapClientLoggingConfig_Defaults(), - new $SoapClientTelemetryConfig_SoapClientMetricsConfig_ConfigValueExtractor.SoapClientMetricsConfig_Defaults(), - new $SoapClientTelemetryConfig_SoapClientTracingConfig_ConfigValueExtractor.SoapClientTracingConfig_Defaults() + new $SoapClientTelemetryConfig_ConfigValueMapper.SoapClientTelemetryConfig_Impl( + new $SoapClientTelemetryConfig_SoapClientLoggingConfig_ConfigValueMapper.SoapClientLoggingConfig_Defaults(), + new $SoapClientTelemetryConfig_SoapClientMetricsConfig_ConfigValueMapper.SoapClientMetricsConfig_Defaults(), + new $SoapClientTelemetryConfig_SoapClientTracingConfig_ConfigValueMapper.SoapClientTracingConfig_Defaults() ), false, false, DefaultSoapClientTelemetryFactory.NOOP_METER_REGISTRY, DefaultSoapClientTelemetryFactory.NOOP_TRACER, "none", "none", "none", new SoapMethodDescriptor("none", "none", "none", null), "http://localhost"); } diff --git a/jms/src/main/java/io/koraframework/jms/JmsListenerContainerConfig.java b/jms/src/main/java/io/koraframework/jms/JmsListenerContainerConfig.java index 8f5726b03..bcdee7b1f 100644 --- a/jms/src/main/java/io/koraframework/jms/JmsListenerContainerConfig.java +++ b/jms/src/main/java/io/koraframework/jms/JmsListenerContainerConfig.java @@ -1,9 +1,9 @@ package io.koraframework.jms; -import io.koraframework.config.common.annotation.ConfigValueExtractor; +import io.koraframework.config.common.annotation.ConfigMapper; import io.koraframework.jms.telemetry.JmsConsumerTelemetryConfig; -@ConfigValueExtractor +@ConfigMapper public interface JmsListenerContainerConfig { String queueName(); diff --git a/jms/src/main/java/io/koraframework/jms/telemetry/JmsConsumerTelemetryConfig.java b/jms/src/main/java/io/koraframework/jms/telemetry/JmsConsumerTelemetryConfig.java index 546ea2f98..43ec74b3b 100644 --- a/jms/src/main/java/io/koraframework/jms/telemetry/JmsConsumerTelemetryConfig.java +++ b/jms/src/main/java/io/koraframework/jms/telemetry/JmsConsumerTelemetryConfig.java @@ -1,9 +1,9 @@ package io.koraframework.jms.telemetry; -import io.koraframework.config.common.annotation.ConfigValueExtractor; +import io.koraframework.config.common.annotation.ConfigMapper; import io.koraframework.telemetry.common.TelemetryConfig; -@ConfigValueExtractor +@ConfigMapper public interface JmsConsumerTelemetryConfig extends TelemetryConfig { @Override @@ -15,12 +15,12 @@ public interface JmsConsumerTelemetryConfig extends TelemetryConfig { @Override JmsConsumerTracingConfig tracing(); - @ConfigValueExtractor + @ConfigMapper interface JmsConsumerLoggingConfig extends TelemetryConfig.LoggingConfig { } - @ConfigValueExtractor + @ConfigMapper interface JmsConsumerMetricsConfig extends TelemetryConfig.MetricsConfig { } - @ConfigValueExtractor + @ConfigMapper interface JmsConsumerTracingConfig extends TelemetryConfig.TracingConfig { } } diff --git a/jms/src/main/java/io/koraframework/jms/telemetry/impl/DefaultJmsConsumerTelemetry.java b/jms/src/main/java/io/koraframework/jms/telemetry/impl/DefaultJmsConsumerTelemetry.java index 77f8c2537..16fa45459 100644 --- a/jms/src/main/java/io/koraframework/jms/telemetry/impl/DefaultJmsConsumerTelemetry.java +++ b/jms/src/main/java/io/koraframework/jms/telemetry/impl/DefaultJmsConsumerTelemetry.java @@ -1,12 +1,7 @@ package io.koraframework.jms.telemetry.impl; -import io.koraframework.jms.telemetry.JmsConsumerObservation; -import io.koraframework.jms.telemetry.JmsConsumerTelemetry; -import io.koraframework.jms.telemetry.JmsConsumerTelemetryConfig; -import io.koraframework.jms.telemetry.$JmsConsumerTelemetryConfig_ConfigValueExtractor; -import io.koraframework.jms.telemetry.$JmsConsumerTelemetryConfig_JmsConsumerLoggingConfig_ConfigValueExtractor; -import io.koraframework.jms.telemetry.$JmsConsumerTelemetryConfig_JmsConsumerMetricsConfig_ConfigValueExtractor; -import io.koraframework.jms.telemetry.$JmsConsumerTelemetryConfig_JmsConsumerTracingConfig_ConfigValueExtractor; +import io.koraframework.jms.telemetry.*; +import io.koraframework.jms.telemetry.$JmsConsumerTelemetryConfig_JmsConsumerTracingConfig_ConfigValueMapper; import io.micrometer.core.instrument.MeterRegistry; import io.opentelemetry.api.trace.Span; import io.opentelemetry.api.trace.SpanBuilder; @@ -35,10 +30,10 @@ public record TelemetryContext(String queueName, public static final TelemetryContext EMPTY = new TelemetryContext( "none", - new $JmsConsumerTelemetryConfig_ConfigValueExtractor.JmsConsumerTelemetryConfig_Impl( - new $JmsConsumerTelemetryConfig_JmsConsumerLoggingConfig_ConfigValueExtractor.JmsConsumerLoggingConfig_Defaults(), - new $JmsConsumerTelemetryConfig_JmsConsumerMetricsConfig_ConfigValueExtractor.JmsConsumerMetricsConfig_Defaults(), - new $JmsConsumerTelemetryConfig_JmsConsumerTracingConfig_ConfigValueExtractor.JmsConsumerTracingConfig_Defaults() + new $JmsConsumerTelemetryConfig_ConfigValueMapper.JmsConsumerTelemetryConfig_Impl( + new $JmsConsumerTelemetryConfig_JmsConsumerLoggingConfig_ConfigValueMapper.JmsConsumerLoggingConfig_Defaults(), + new $JmsConsumerTelemetryConfig_JmsConsumerMetricsConfig_ConfigValueMapper.JmsConsumerMetricsConfig_Defaults(), + new $JmsConsumerTelemetryConfig_JmsConsumerTracingConfig_ConfigValueMapper.JmsConsumerTracingConfig_Defaults() ), false, false, diff --git a/kafka/kafka-annotation-processor/src/main/java/io/koraframework/kafka/annotation/processor/consumer/KafkaConsumerConfigGenerator.java b/kafka/kafka-annotation-processor/src/main/java/io/koraframework/kafka/annotation/processor/consumer/KafkaConsumerConfigGenerator.java index f3b2d5477..65da2d1fa 100644 --- a/kafka/kafka-annotation-processor/src/main/java/io/koraframework/kafka/annotation/processor/consumer/KafkaConsumerConfigGenerator.java +++ b/kafka/kafka-annotation-processor/src/main/java/io/koraframework/kafka/annotation/processor/consumer/KafkaConsumerConfigGenerator.java @@ -37,8 +37,8 @@ public KafkaConfigData generate(Elements elements, ExecutableElement method, Ann var methodBuilder = MethodSpec.methodBuilder(prepareMethodName(method, "Config")) .returns(KafkaClassNames.kafkaConsumerConfig) .addParameter(CommonClassNames.config, "config") - .addParameter(ParameterizedTypeName.get(CommonClassNames.configValueExtractor, KafkaClassNames.kafkaConsumerConfig), "extractor") - .addStatement("return extractor.extractOrThrow(config.get($S))", configPath) + .addParameter(ParameterizedTypeName.get(CommonClassNames.configValueMapper, KafkaClassNames.kafkaConsumerConfig), "mapper") + .addStatement("return mapper.mapOrThrow(config.get($S))", configPath) .addModifiers(Modifier.PUBLIC, Modifier.DEFAULT) .addAnnotation(TagUtils.makeAnnotationSpec(targetTag)); diff --git a/kafka/kafka-annotation-processor/src/main/java/io/koraframework/kafka/annotation/processor/producer/KafkaPublisherGenerator.java b/kafka/kafka-annotation-processor/src/main/java/io/koraframework/kafka/annotation/processor/producer/KafkaPublisherGenerator.java index 768cf25a4..6c0e6256d 100644 --- a/kafka/kafka-annotation-processor/src/main/java/io/koraframework/kafka/annotation/processor/producer/KafkaPublisherGenerator.java +++ b/kafka/kafka-annotation-processor/src/main/java/io/koraframework/kafka/annotation/processor/producer/KafkaPublisherGenerator.java @@ -64,8 +64,8 @@ private MethodSpec buildProducerConfigMethod(TypeElement publisher, AnnotationMi .returns(KafkaClassNames.publisherConfig) .addAnnotation(TagUtils.makeAnnotationSpec(className)) .addParameter(CommonClassNames.config, "config") - .addParameter(ParameterizedTypeName.get(CommonClassNames.configValueExtractor, KafkaClassNames.publisherConfig), "extractor") - .addStatement("return extractor.extractOrThrow(config.get($S))", configPath) + .addParameter(ParameterizedTypeName.get(CommonClassNames.configValueMapper, KafkaClassNames.publisherConfig), "mapper") + .addStatement("return mapper.mapOrThrow(config.get($S))", configPath) .build(); } @@ -341,7 +341,7 @@ public MethodSpec buildTopicConfigMethod(TypeElement producer, List", configTypeName); @@ -357,7 +357,7 @@ public MethodSpec buildTopicConfigMethod(TypeElement producer, List 0) { m.addCode(",\n"); } - m.addCode("extractor.extractOrThrow(config.get($S))", path); + m.addCode("mapper.mapOrThrow(config.get($S))", path); } } m.addCode("$<\n);\n"); diff --git a/kafka/kafka-annotation-processor/src/main/java/io/koraframework/kafka/annotation/processor/producer/KafkaPublisherTransactionalGenerator.java b/kafka/kafka-annotation-processor/src/main/java/io/koraframework/kafka/annotation/processor/producer/KafkaPublisherTransactionalGenerator.java index 931a11f36..bd8cc607d 100644 --- a/kafka/kafka-annotation-processor/src/main/java/io/koraframework/kafka/annotation/processor/producer/KafkaPublisherTransactionalGenerator.java +++ b/kafka/kafka-annotation-processor/src/main/java/io/koraframework/kafka/annotation/processor/producer/KafkaPublisherTransactionalGenerator.java @@ -50,8 +50,8 @@ public void generatePublisherTransactionalModule(TypeElement typeElement, TypeEl .returns(KafkaClassNames.publisherTransactionalConfig) .addAnnotation(tag) .addParameter(CommonClassNames.config, "config") - .addParameter(ParameterizedTypeName.get(CommonClassNames.configValueExtractor, KafkaClassNames.publisherTransactionalConfig), "extractor") - .addStatement("return extractor.extractOrThrow(config.get($S))", configPath) + .addParameter(ParameterizedTypeName.get(CommonClassNames.configValueMapper, KafkaClassNames.publisherTransactionalConfig), "mapper") + .addStatement("return mapper.mapOrThrow(config.get($S))", configPath) .build(); var publisher = MethodSpec.methodBuilder(CommonUtils.decapitalize(typeElement.getSimpleName().toString()) + "_PublisherTransactional") .addModifiers(Modifier.DEFAULT, Modifier.PUBLIC) diff --git a/kafka/kafka-annotation-processor/src/test/java/io/koraframework/kafka/annotation/processor/consumer/AbstractKafkaListenerAnnotationProcessorTest.java b/kafka/kafka-annotation-processor/src/test/java/io/koraframework/kafka/annotation/processor/consumer/AbstractKafkaListenerAnnotationProcessorTest.java index 5a617d89b..d5ae9d021 100644 --- a/kafka/kafka-annotation-processor/src/test/java/io/koraframework/kafka/annotation/processor/consumer/AbstractKafkaListenerAnnotationProcessorTest.java +++ b/kafka/kafka-annotation-processor/src/test/java/io/koraframework/kafka/annotation/processor/consumer/AbstractKafkaListenerAnnotationProcessorTest.java @@ -6,7 +6,7 @@ import io.koraframework.application.graph.ValueOf; import io.koraframework.common.annotation.Tag; import io.koraframework.config.common.Config; -import io.koraframework.config.common.extractor.ConfigValueExtractor; +import io.koraframework.config.common.mapper.ConfigValueMapper; import io.koraframework.kafka.common.consumer.GeneratedListener; import io.koraframework.kafka.common.consumer.KafkaListenerConfig; import io.koraframework.kafka.common.consumer.containers.ConsumerRecordWrapper; @@ -224,7 +224,7 @@ public ListenerModuleAssertions verifyConfig() { var configMethod = Arrays.stream(moduleClass.getMethods()).filter(m -> m.getName().equals("kafkaListenerClassProcessConfig")).findFirst().orElseThrow(); assertThat(configMethod.getReturnType()).isEqualTo(KafkaListenerConfig.class); assertThat(configMethod.getParameters()[0].getType()).isEqualTo(Config.class); - assertThat(configMethod.getParameters()[1].getParameterizedType()).isEqualTo(TypeRef.of(ConfigValueExtractor.class, KafkaListenerConfig.class)); + assertThat(configMethod.getParameters()[1].getParameterizedType()).isEqualTo(TypeRef.of(ConfigValueMapper.class, KafkaListenerConfig.class)); assertThat(configMethod.getAnnotation(Tag.class).value()).isEqualTo(tagValue); return this; diff --git a/kafka/kafka-symbol-processor/src/main/kotlin/io/koraframework/kafka/symbol/processor/consumer/KafkaConsumerConfigGenerator.kt b/kafka/kafka-symbol-processor/src/main/kotlin/io/koraframework/kafka/symbol/processor/consumer/KafkaConsumerConfigGenerator.kt index f4c6d319a..e614c17ed 100644 --- a/kafka/kafka-symbol-processor/src/main/kotlin/io/koraframework/kafka/symbol/processor/consumer/KafkaConsumerConfigGenerator.kt +++ b/kafka/kafka-symbol-processor/src/main/kotlin/io/koraframework/kafka/symbol/processor/consumer/KafkaConsumerConfigGenerator.kt @@ -34,10 +34,10 @@ class KafkaConsumerConfigGenerator { .returns(kafkaConsumerConfig) .addParameter("config", CommonClassNames.config) .addParameter( - "extractor", - CommonClassNames.configValueExtractor.parameterizedBy(kafkaConsumerConfig) + "mapper", + CommonClassNames.configValueMapper.parameterizedBy(kafkaConsumerConfig) ) - .addStatement("return extractor.extractOrThrow(config.get(%S))!!", configPath) + .addStatement("return mapper.mapOrThrow(config.get(%S))!!", configPath) .addTag(targetTags) .build() return KafkaConfigData(tagBuilder, funBuilder) diff --git a/kafka/kafka-symbol-processor/src/main/kotlin/io/koraframework/kafka/symbol/processor/producer/KafkaPublisherGenerator.kt b/kafka/kafka-symbol-processor/src/main/kotlin/io/koraframework/kafka/symbol/processor/producer/KafkaPublisherGenerator.kt index f4c54fee9..ca09ddbe9 100644 --- a/kafka/kafka-symbol-processor/src/main/kotlin/io/koraframework/kafka/symbol/processor/producer/KafkaPublisherGenerator.kt +++ b/kafka/kafka-symbol-processor/src/main/kotlin/io/koraframework/kafka/symbol/processor/producer/KafkaPublisherGenerator.kt @@ -72,7 +72,7 @@ class KafkaPublisherGenerator(val env: SymbolProcessorEnvironment, val resolver: val m = FunSpec.builder(configName.substring(1).replaceFirstChar { it.lowercaseChar() }) .addModifiers(KModifier.PUBLIC) .addParameter("config", CommonClassNames.config) - .addParameter("extractor", CommonClassNames.configValueExtractor.parameterizedBy(KafkaClassNames.publisherTopicConfig)) + .addParameter("mapper", CommonClassNames.configValueMapper.parameterizedBy(KafkaClassNames.publisherTopicConfig)) .returns(configTypeName) val b = CodeBlock.builder() @@ -89,7 +89,7 @@ class KafkaPublisherGenerator(val env: SymbolProcessorEnvironment, val resolver: if (i > 0) { b.add(",\n") } - b.add("extractor.extractOrThrow(config.get(%S))!!", path) + b.add("mapper.mapOrThrow(config.get(%S))!!", path) } } b.unindent().add("\n)\n") @@ -104,8 +104,8 @@ class KafkaPublisherGenerator(val env: SymbolProcessorEnvironment, val resolver: .returns(KafkaClassNames.publisherConfig) .addAnnotation(propertiesTag) .addParameter("config", CommonClassNames.config) - .addParameter("extractor", CommonClassNames.configValueExtractor.parameterizedBy(KafkaClassNames.publisherConfig)) - .addStatement("return extractor.extractOrThrow(config.get(%S))!!", configPath) + .addParameter("mapper", CommonClassNames.configValueMapper.parameterizedBy(KafkaClassNames.publisherConfig)) + .addStatement("return mapper.mapOrThrow(config.get(%S))!!", configPath) .build() } diff --git a/kafka/kafka-symbol-processor/src/main/kotlin/io/koraframework/kafka/symbol/processor/producer/KafkaPublisherTransactionalGenerator.kt b/kafka/kafka-symbol-processor/src/main/kotlin/io/koraframework/kafka/symbol/processor/producer/KafkaPublisherTransactionalGenerator.kt index 7dec8a6a4..01ff16d2c 100644 --- a/kafka/kafka-symbol-processor/src/main/kotlin/io/koraframework/kafka/symbol/processor/producer/KafkaPublisherTransactionalGenerator.kt +++ b/kafka/kafka-symbol-processor/src/main/kotlin/io/koraframework/kafka/symbol/processor/producer/KafkaPublisherTransactionalGenerator.kt @@ -43,8 +43,8 @@ class KafkaPublisherTransactionalGenerator( .returns(KafkaClassNames.publisherTransactionalConfig) .addAnnotation(tag) .addParameter("config", CommonClassNames.config) - .addParameter("extractor", CommonClassNames.configValueExtractor.parameterizedBy(KafkaClassNames.publisherTransactionalConfig)) - .addStatement("return extractor.extractOrThrow(config.get(%S))!!", configPath) + .addParameter("mapper", CommonClassNames.configValueMapper.parameterizedBy(KafkaClassNames.publisherTransactionalConfig)) + .addStatement("return mapper.mapOrThrow(config.get(%S))!!", configPath) .build() val publisherFunc = FunSpec.builder(txPublisher.simpleName.asString().replaceFirstChar { it.lowercaseChar() } + "_PublisherTransactional") .addParameter("factory", Function::class.asClassName().parameterizedBy(Properties::class.asClassName(), publisherImplementationTypeName)) diff --git a/kafka/kafka/src/main/java/io/koraframework/kafka/common/consumer/KafkaListenerConfig.java b/kafka/kafka/src/main/java/io/koraframework/kafka/common/consumer/KafkaListenerConfig.java index 46089e15f..6e61a36fd 100644 --- a/kafka/kafka/src/main/java/io/koraframework/kafka/common/consumer/KafkaListenerConfig.java +++ b/kafka/kafka/src/main/java/io/koraframework/kafka/common/consumer/KafkaListenerConfig.java @@ -2,7 +2,7 @@ import org.jspecify.annotations.Nullable; import io.koraframework.common.Either; -import io.koraframework.config.common.annotation.ConfigValueExtractor; +import io.koraframework.config.common.annotation.ConfigMapper; import io.koraframework.kafka.common.consumer.telemetry.KafkaConsumerTelemetryConfig; import java.time.Duration; @@ -11,7 +11,7 @@ import java.util.Properties; import java.util.regex.Pattern; -@ConfigValueExtractor +@ConfigMapper public interface KafkaListenerConfig { Properties driverProperties(); @@ -66,7 +66,7 @@ default KafkaListenerConfig withDriverPropertiesOverrides(Map ov var props = new Properties(); props.putAll(driverProperties()); props.putAll(overrides); - return new $KafkaListenerConfig_ConfigValueExtractor.KafkaListenerConfig_Impl( + return new $KafkaListenerConfig_ConfigValueMapper.KafkaListenerConfig_Impl( props, topics(), topicsPattern(), diff --git a/kafka/kafka/src/main/java/io/koraframework/kafka/common/consumer/telemetry/KafkaConsumerTelemetryConfig.java b/kafka/kafka/src/main/java/io/koraframework/kafka/common/consumer/telemetry/KafkaConsumerTelemetryConfig.java index ed3964fb9..6fa7575b0 100644 --- a/kafka/kafka/src/main/java/io/koraframework/kafka/common/consumer/telemetry/KafkaConsumerTelemetryConfig.java +++ b/kafka/kafka/src/main/java/io/koraframework/kafka/common/consumer/telemetry/KafkaConsumerTelemetryConfig.java @@ -1,9 +1,9 @@ package io.koraframework.kafka.common.consumer.telemetry; -import io.koraframework.config.common.annotation.ConfigValueExtractor; +import io.koraframework.config.common.annotation.ConfigMapper; import io.koraframework.telemetry.common.TelemetryConfig; -@ConfigValueExtractor +@ConfigMapper public interface KafkaConsumerTelemetryConfig extends TelemetryConfig { @Override @@ -15,18 +15,18 @@ public interface KafkaConsumerTelemetryConfig extends TelemetryConfig { @Override KafkaConsumerTracingConfig tracing(); - @ConfigValueExtractor + @ConfigMapper interface KafkaConsumerLoggingConfig extends LoggingConfig { } - @ConfigValueExtractor + @ConfigMapper interface KafkaConsumerMetricsConfig extends TelemetryConfig.MetricsConfig { default boolean driverMetrics() { return false; } } - @ConfigValueExtractor + @ConfigMapper interface KafkaConsumerTracingConfig extends TelemetryConfig.TracingConfig { } diff --git a/kafka/kafka/src/main/java/io/koraframework/kafka/common/consumer/telemetry/impl/DefaultKafkaConsumerTelemetry.java b/kafka/kafka/src/main/java/io/koraframework/kafka/common/consumer/telemetry/impl/DefaultKafkaConsumerTelemetry.java index aae234fb3..6fb87042a 100644 --- a/kafka/kafka/src/main/java/io/koraframework/kafka/common/consumer/telemetry/impl/DefaultKafkaConsumerTelemetry.java +++ b/kafka/kafka/src/main/java/io/koraframework/kafka/common/consumer/telemetry/impl/DefaultKafkaConsumerTelemetry.java @@ -28,10 +28,10 @@ public record TelemetryContext(KafkaConsumerTelemetryConfig config, String groupId) { public static final TelemetryContext EMPTY = new TelemetryContext( - new $KafkaConsumerTelemetryConfig_ConfigValueExtractor.KafkaConsumerTelemetryConfig_Impl( - new $KafkaConsumerTelemetryConfig_KafkaConsumerLoggingConfig_ConfigValueExtractor.KafkaConsumerLoggingConfig_Defaults(), - new $KafkaConsumerTelemetryConfig_KafkaConsumerMetricsConfig_ConfigValueExtractor.KafkaConsumerMetricsConfig_Defaults(), - new $KafkaConsumerTelemetryConfig_KafkaConsumerTracingConfig_ConfigValueExtractor.KafkaConsumerTracingConfig_Defaults() + new $KafkaConsumerTelemetryConfig_ConfigValueMapper.KafkaConsumerTelemetryConfig_Impl( + new $KafkaConsumerTelemetryConfig_KafkaConsumerLoggingConfig_ConfigValueMapper.KafkaConsumerLoggingConfig_Defaults(), + new $KafkaConsumerTelemetryConfig_KafkaConsumerMetricsConfig_ConfigValueMapper.KafkaConsumerMetricsConfig_Defaults(), + new $KafkaConsumerTelemetryConfig_KafkaConsumerTracingConfig_ConfigValueMapper.KafkaConsumerTracingConfig_Defaults() ), false, false, DefaultKafkaConsumerTelemetryFactory.NOOP_METER_REGISTRY, DefaultKafkaConsumerTelemetryFactory.NOOP_TRACER, new Properties(), "none", "none", "none", "", ""); } diff --git a/kafka/kafka/src/main/java/io/koraframework/kafka/common/producer/KafkaPublisherConfig.java b/kafka/kafka/src/main/java/io/koraframework/kafka/common/producer/KafkaPublisherConfig.java index 33bea0e3c..d915a1312 100644 --- a/kafka/kafka/src/main/java/io/koraframework/kafka/common/producer/KafkaPublisherConfig.java +++ b/kafka/kafka/src/main/java/io/koraframework/kafka/common/producer/KafkaPublisherConfig.java @@ -1,20 +1,20 @@ package io.koraframework.kafka.common.producer; import org.jspecify.annotations.Nullable; -import io.koraframework.config.common.annotation.ConfigValueExtractor; +import io.koraframework.config.common.annotation.ConfigMapper; import io.koraframework.kafka.common.producer.telemetry.KafkaPublisherTelemetryConfig; import java.time.Duration; import java.util.Properties; -@ConfigValueExtractor +@ConfigMapper public interface KafkaPublisherConfig { Properties driverProperties(); KafkaPublisherTelemetryConfig telemetry(); - @ConfigValueExtractor + @ConfigMapper interface TransactionConfig { default String idPrefix() { @@ -30,7 +30,7 @@ default Duration maxWaitTime() { } } - @ConfigValueExtractor + @ConfigMapper interface TopicConfig { String topic(); diff --git a/kafka/kafka/src/main/java/io/koraframework/kafka/common/producer/telemetry/KafkaPublisherTelemetryConfig.java b/kafka/kafka/src/main/java/io/koraframework/kafka/common/producer/telemetry/KafkaPublisherTelemetryConfig.java index d6dd4ce17..291a82f64 100644 --- a/kafka/kafka/src/main/java/io/koraframework/kafka/common/producer/telemetry/KafkaPublisherTelemetryConfig.java +++ b/kafka/kafka/src/main/java/io/koraframework/kafka/common/producer/telemetry/KafkaPublisherTelemetryConfig.java @@ -1,9 +1,9 @@ package io.koraframework.kafka.common.producer.telemetry; -import io.koraframework.config.common.annotation.ConfigValueExtractor; +import io.koraframework.config.common.annotation.ConfigMapper; import io.koraframework.telemetry.common.TelemetryConfig; -@ConfigValueExtractor +@ConfigMapper public interface KafkaPublisherTelemetryConfig extends TelemetryConfig { @Override @@ -15,15 +15,15 @@ public interface KafkaPublisherTelemetryConfig extends TelemetryConfig { @Override KafkaProducerTracingConfig tracing(); - @ConfigValueExtractor + @ConfigMapper interface KafkaProducerLoggingConfig extends LoggingConfig { } - @ConfigValueExtractor + @ConfigMapper interface KafkaProducerTracingConfig extends TracingConfig { } - @ConfigValueExtractor + @ConfigMapper interface KafkaProducerMetricsConfig extends MetricsConfig { default boolean driverMetrics() { return false; diff --git a/kafka/kafka/src/main/java/io/koraframework/kafka/common/producer/telemetry/impl/DefaultKafkaPublisherTelemetry.java b/kafka/kafka/src/main/java/io/koraframework/kafka/common/producer/telemetry/impl/DefaultKafkaPublisherTelemetry.java index 63a1cc695..a29693c31 100644 --- a/kafka/kafka/src/main/java/io/koraframework/kafka/common/producer/telemetry/impl/DefaultKafkaPublisherTelemetry.java +++ b/kafka/kafka/src/main/java/io/koraframework/kafka/common/producer/telemetry/impl/DefaultKafkaPublisherTelemetry.java @@ -27,10 +27,10 @@ public record TelemetryContext(KafkaPublisherTelemetryConfig config, String clientId) { public static final TelemetryContext EMPTY = new TelemetryContext( - new $KafkaPublisherTelemetryConfig_ConfigValueExtractor.KafkaPublisherTelemetryConfig_Impl( - new $KafkaPublisherTelemetryConfig_KafkaProducerLoggingConfig_ConfigValueExtractor.KafkaProducerLoggingConfig_Defaults(), - new $KafkaPublisherTelemetryConfig_KafkaProducerMetricsConfig_ConfigValueExtractor.KafkaProducerMetricsConfig_Defaults(), - new $KafkaPublisherTelemetryConfig_KafkaProducerTracingConfig_ConfigValueExtractor.KafkaProducerTracingConfig_Defaults() + new $KafkaPublisherTelemetryConfig_ConfigValueMapper.KafkaPublisherTelemetryConfig_Impl( + new $KafkaPublisherTelemetryConfig_KafkaProducerLoggingConfig_ConfigValueMapper.KafkaProducerLoggingConfig_Defaults(), + new $KafkaPublisherTelemetryConfig_KafkaProducerMetricsConfig_ConfigValueMapper.KafkaProducerMetricsConfig_Defaults(), + new $KafkaPublisherTelemetryConfig_KafkaProducerTracingConfig_ConfigValueMapper.KafkaProducerTracingConfig_Defaults() ), false, false, DefaultKafkaPublisherTelemetryFactory.NOOP_METER_REGISTRY, DefaultKafkaPublisherTelemetryFactory.NOOP_TRACER, new Properties(), "none", "none", "none", ""); } diff --git a/kafka/kafka/src/test/java/io/koraframework/kafka/common/containers/KafkaAssignConsumerContainerTest.java b/kafka/kafka/src/test/java/io/koraframework/kafka/common/containers/KafkaAssignConsumerContainerTest.java index 06fd64b60..9b07764e8 100644 --- a/kafka/kafka/src/test/java/io/koraframework/kafka/common/containers/KafkaAssignConsumerContainerTest.java +++ b/kafka/kafka/src/test/java/io/koraframework/kafka/common/containers/KafkaAssignConsumerContainerTest.java @@ -15,7 +15,7 @@ import org.mockito.Mockito; import org.slf4j.LoggerFactory; import io.koraframework.common.Either; -import io.koraframework.kafka.common.consumer.$KafkaListenerConfig_ConfigValueExtractor; +import io.koraframework.kafka.common.consumer.$KafkaListenerConfig_ConfigValueMapper; import io.koraframework.kafka.common.consumer.containers.KafkaAssignConsumerContainer; import io.koraframework.kafka.common.consumer.telemetry.*; import io.koraframework.test.kafka.KafkaParams; @@ -47,7 +47,7 @@ void test() throws InterruptedException { driverProps.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, params.bootstrapServers()); driverProps.put(ConsumerConfig.AUTO_OFFSET_RESET_CONFIG, "earliest"); var testTopic = params.createTopic("test-topic", 3); - var config = new $KafkaListenerConfig_ConfigValueExtractor.KafkaListenerConfig_Impl( + var config = new $KafkaListenerConfig_ConfigValueMapper.KafkaListenerConfig_Impl( driverProps, List.of(testTopic), null, @@ -60,10 +60,10 @@ void test() throws InterruptedException { Duration.ofMillis(10000), true, null, - new $KafkaConsumerTelemetryConfig_ConfigValueExtractor.KafkaConsumerTelemetryConfig_Impl( - new $KafkaConsumerTelemetryConfig_KafkaConsumerLoggingConfig_ConfigValueExtractor.KafkaConsumerLoggingConfig_Defaults(), - new $KafkaConsumerTelemetryConfig_KafkaConsumerMetricsConfig_ConfigValueExtractor.KafkaConsumerMetricsConfig_Defaults(), - new $KafkaConsumerTelemetryConfig_KafkaConsumerTracingConfig_ConfigValueExtractor.KafkaConsumerTracingConfig_Defaults() + new $KafkaConsumerTelemetryConfig_ConfigValueMapper.KafkaConsumerTelemetryConfig_Impl( + new $KafkaConsumerTelemetryConfig_KafkaConsumerLoggingConfig_ConfigValueMapper.KafkaConsumerLoggingConfig_Defaults(), + new $KafkaConsumerTelemetryConfig_KafkaConsumerMetricsConfig_ConfigValueMapper.KafkaConsumerMetricsConfig_Defaults(), + new $KafkaConsumerTelemetryConfig_KafkaConsumerTracingConfig_ConfigValueMapper.KafkaConsumerTracingConfig_Defaults() ) ); var deque = new ConcurrentLinkedDeque<>(); diff --git a/kafka/kafka/src/test/java/io/koraframework/kafka/common/containers/KafkaSubscribeConsumerContainerTest.java b/kafka/kafka/src/test/java/io/koraframework/kafka/common/containers/KafkaSubscribeConsumerContainerTest.java index ae7076530..3eb5da4bb 100644 --- a/kafka/kafka/src/test/java/io/koraframework/kafka/common/containers/KafkaSubscribeConsumerContainerTest.java +++ b/kafka/kafka/src/test/java/io/koraframework/kafka/common/containers/KafkaSubscribeConsumerContainerTest.java @@ -2,6 +2,7 @@ import ch.qos.logback.classic.Level; import ch.qos.logback.classic.Logger; +import io.koraframework.kafka.common.consumer.$KafkaListenerConfig_ConfigValueMapper; import io.koraframework.kafka.common.consumer.KafkaListenerConfig; import io.koraframework.kafka.common.consumer.telemetry.impl.NoopKafkaConsumerTelemetry; import org.apache.kafka.clients.CommonClientConfigs; @@ -12,7 +13,6 @@ import org.junit.jupiter.api.extension.ExtendWith; import org.slf4j.LoggerFactory; import io.koraframework.common.Either; -import io.koraframework.kafka.common.consumer.$KafkaListenerConfig_ConfigValueExtractor; import io.koraframework.kafka.common.consumer.containers.KafkaSubscribeConsumerContainer; import io.koraframework.kafka.common.consumer.telemetry.*; import io.koraframework.kafka.common.exceptions.RecordValueDeserializationException; @@ -47,7 +47,7 @@ void test() throws InterruptedException { driverProps.put(ConsumerConfig.AUTO_OFFSET_RESET_CONFIG, "earliest"); driverProps.put(CommonClientConfigs.GROUP_ID_CONFIG, UUID.randomUUID().toString()); var testTopic = params.createTopic("test-topic", 3); - var config = new $KafkaListenerConfig_ConfigValueExtractor.KafkaListenerConfig_Impl( + var config = new $KafkaListenerConfig_ConfigValueMapper.KafkaListenerConfig_Impl( driverProps, List.of(testTopic), null, @@ -60,10 +60,10 @@ void test() throws InterruptedException { Duration.ofMillis(10000), true, null, - new $KafkaConsumerTelemetryConfig_ConfigValueExtractor.KafkaConsumerTelemetryConfig_Impl( - new $KafkaConsumerTelemetryConfig_KafkaConsumerLoggingConfig_ConfigValueExtractor.KafkaConsumerLoggingConfig_Defaults(), - new $KafkaConsumerTelemetryConfig_KafkaConsumerMetricsConfig_ConfigValueExtractor.KafkaConsumerMetricsConfig_Defaults(), - new $KafkaConsumerTelemetryConfig_KafkaConsumerTracingConfig_ConfigValueExtractor.KafkaConsumerTracingConfig_Defaults() + new $KafkaConsumerTelemetryConfig_ConfigValueMapper.KafkaConsumerTelemetryConfig_Impl( + new $KafkaConsumerTelemetryConfig_KafkaConsumerLoggingConfig_ConfigValueMapper.KafkaConsumerLoggingConfig_Defaults(), + new $KafkaConsumerTelemetryConfig_KafkaConsumerMetricsConfig_ConfigValueMapper.KafkaConsumerMetricsConfig_Defaults(), + new $KafkaConsumerTelemetryConfig_KafkaConsumerTracingConfig_ConfigValueMapper.KafkaConsumerTracingConfig_Defaults() ) ); var queue = new ArrayBlockingQueue<>(3); diff --git a/kafka/kafka/src/test/java/io/koraframework/kafka/common/producer/TransactionalPublisherImplTest.java b/kafka/kafka/src/test/java/io/koraframework/kafka/common/producer/TransactionalPublisherImplTest.java index 004b456f1..167d6cda7 100644 --- a/kafka/kafka/src/test/java/io/koraframework/kafka/common/producer/TransactionalPublisherImplTest.java +++ b/kafka/kafka/src/test/java/io/koraframework/kafka/common/producer/TransactionalPublisherImplTest.java @@ -71,12 +71,12 @@ void testCommitted() throws Exception { var producerProps = new Properties(); producerProps.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, params.bootstrapServers()); - var producerConfig = new $KafkaPublisherConfig_ConfigValueExtractor.KafkaPublisherConfig_Impl(producerProps, new $KafkaPublisherTelemetryConfig_ConfigValueExtractor.KafkaPublisherTelemetryConfig_Impl( - new $KafkaPublisherTelemetryConfig_KafkaProducerLoggingConfig_ConfigValueExtractor.KafkaProducerLoggingConfig_Defaults(), - new $KafkaPublisherTelemetryConfig_KafkaProducerMetricsConfig_ConfigValueExtractor.KafkaProducerMetricsConfig_Defaults(), - new $KafkaPublisherTelemetryConfig_KafkaProducerTracingConfig_ConfigValueExtractor.KafkaProducerTracingConfig_Defaults() + var producerConfig = new $KafkaPublisherConfig_ConfigValueMapper.KafkaPublisherConfig_Impl(producerProps, new $KafkaPublisherTelemetryConfig_ConfigValueMapper.KafkaPublisherTelemetryConfig_Impl( + new $KafkaPublisherTelemetryConfig_KafkaProducerLoggingConfig_ConfigValueMapper.KafkaProducerLoggingConfig_Defaults(), + new $KafkaPublisherTelemetryConfig_KafkaProducerMetricsConfig_ConfigValueMapper.KafkaProducerMetricsConfig_Defaults(), + new $KafkaPublisherTelemetryConfig_KafkaProducerTracingConfig_ConfigValueMapper.KafkaProducerTracingConfig_Defaults() )); - var transactionalConfig = new $KafkaPublisherConfig_TransactionConfig_ConfigValueExtractor.TransactionConfig_Impl( + var transactionalConfig = new $KafkaPublisherConfig_TransactionConfig_ConfigValueMapper.TransactionConfig_Impl( "test-", 5, Duration.ofSeconds(5) ); @@ -130,12 +130,12 @@ void testAbort() throws Exception { var producerProps = new Properties(); producerProps.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, params.bootstrapServers()); - var producerConfig = new $KafkaPublisherConfig_ConfigValueExtractor.KafkaPublisherConfig_Impl(producerProps, new $KafkaPublisherTelemetryConfig_ConfigValueExtractor.KafkaPublisherTelemetryConfig_Impl( - new $KafkaPublisherTelemetryConfig_KafkaProducerLoggingConfig_ConfigValueExtractor.KafkaProducerLoggingConfig_Defaults(), - new $KafkaPublisherTelemetryConfig_KafkaProducerMetricsConfig_ConfigValueExtractor.KafkaProducerMetricsConfig_Defaults(), - new $KafkaPublisherTelemetryConfig_KafkaProducerTracingConfig_ConfigValueExtractor.KafkaProducerTracingConfig_Defaults() + var producerConfig = new $KafkaPublisherConfig_ConfigValueMapper.KafkaPublisherConfig_Impl(producerProps, new $KafkaPublisherTelemetryConfig_ConfigValueMapper.KafkaPublisherTelemetryConfig_Impl( + new $KafkaPublisherTelemetryConfig_KafkaProducerLoggingConfig_ConfigValueMapper.KafkaProducerLoggingConfig_Defaults(), + new $KafkaPublisherTelemetryConfig_KafkaProducerMetricsConfig_ConfigValueMapper.KafkaProducerMetricsConfig_Defaults(), + new $KafkaPublisherTelemetryConfig_KafkaProducerTracingConfig_ConfigValueMapper.KafkaProducerTracingConfig_Defaults() )); - var transactionalConfig = new $KafkaPublisherConfig_TransactionConfig_ConfigValueExtractor.TransactionConfig_Impl( + var transactionalConfig = new $KafkaPublisherConfig_TransactionConfig_ConfigValueMapper.TransactionConfig_Impl( "test-", 5, Duration.ofSeconds(5) ); diff --git a/logging/logging-common/src/main/java/io/koraframework/logging/common/LoggingConfig.java b/logging/logging-common/src/main/java/io/koraframework/logging/common/LoggingConfig.java index fb328daa9..e6fe61776 100644 --- a/logging/logging-common/src/main/java/io/koraframework/logging/common/LoggingConfig.java +++ b/logging/logging-common/src/main/java/io/koraframework/logging/common/LoggingConfig.java @@ -1,10 +1,10 @@ package io.koraframework.logging.common; -import io.koraframework.config.common.annotation.ConfigValueExtractor; +import io.koraframework.config.common.annotation.ConfigMapper; import java.util.Map; -@ConfigValueExtractor +@ConfigMapper public interface LoggingConfig { default Map levels() { diff --git a/logging/logging-common/src/main/java/io/koraframework/logging/common/LoggingModule.java b/logging/logging-common/src/main/java/io/koraframework/logging/common/LoggingModule.java index 021906c7c..21f2779bd 100644 --- a/logging/logging-common/src/main/java/io/koraframework/logging/common/LoggingModule.java +++ b/logging/logging-common/src/main/java/io/koraframework/logging/common/LoggingModule.java @@ -3,7 +3,7 @@ import io.koraframework.common.annotation.DefaultComponent; import io.koraframework.common.annotation.Root; import io.koraframework.config.common.Config; -import io.koraframework.config.common.extractor.ConfigValueExtractor; +import io.koraframework.config.common.mapper.ConfigValueMapper; import org.slf4j.ILoggerFactory; import org.slf4j.LoggerFactory; @@ -14,8 +14,8 @@ default LoggingLevelRefresher loggingLevelRefresher(LoggingConfig loggingConfig, return new LoggingLevelRefresher(loggingConfig, loggingLevelApplier); } - default LoggingConfig loggingConfig(Config config, ConfigValueExtractor extractor) { - return extractor.extractOrThrow(config.get("logging")); + default LoggingConfig loggingConfig(Config config, ConfigValueMapper mapper) { + return mapper.mapOrThrow(config.get("logging")); } @DefaultComponent diff --git a/netty-common/src/main/java/io/koraframework/netty/common/NettyModule.java b/netty-common/src/main/java/io/koraframework/netty/common/NettyModule.java index 06c573944..f6c20da7f 100644 --- a/netty-common/src/main/java/io/koraframework/netty/common/NettyModule.java +++ b/netty-common/src/main/java/io/koraframework/netty/common/NettyModule.java @@ -4,7 +4,7 @@ import io.koraframework.common.annotation.DefaultComponent; import io.koraframework.common.annotation.Tag; import io.koraframework.config.common.Config; -import io.koraframework.config.common.extractor.ConfigValueExtractor; +import io.koraframework.config.common.mapper.ConfigValueMapper; import io.koraframework.netty.common.NettyTransportConfig.EventLoopType; import io.netty.channel.*; import io.netty.channel.epoll.*; @@ -31,8 +31,8 @@ final class EventLoopWorker { private EventLoopWorker() {} } - default NettyTransportConfig nettyTransportConfig(Config config, ConfigValueExtractor extractor) { - return extractor.extractOrThrow(config.get("netty")); + default NettyTransportConfig nettyTransportConfig(Config config, ConfigValueMapper mapper) { + return mapper.mapOrThrow(config.get("netty")); } @Tag(EventLoopBoss.class) diff --git a/netty-common/src/main/java/io/koraframework/netty/common/NettyTransportConfig.java b/netty-common/src/main/java/io/koraframework/netty/common/NettyTransportConfig.java index f355b09b5..24f9435dc 100644 --- a/netty-common/src/main/java/io/koraframework/netty/common/NettyTransportConfig.java +++ b/netty-common/src/main/java/io/koraframework/netty/common/NettyTransportConfig.java @@ -2,9 +2,9 @@ import io.netty.util.NettyRuntime; import org.jspecify.annotations.Nullable; -import io.koraframework.config.common.annotation.ConfigValueExtractor; +import io.koraframework.config.common.annotation.ConfigMapper; -@ConfigValueExtractor +@ConfigMapper public interface NettyTransportConfig { enum EventLoopType { diff --git a/openapi/openapi-generator/src/main/java/io/koraframework/openapi/generator/AbstractGenerator.java b/openapi/openapi-generator/src/main/java/io/koraframework/openapi/generator/AbstractGenerator.java index 32d817079..c15d1cc76 100644 --- a/openapi/openapi-generator/src/main/java/io/koraframework/openapi/generator/AbstractGenerator.java +++ b/openapi/openapi-generator/src/main/java/io/koraframework/openapi/generator/AbstractGenerator.java @@ -35,9 +35,9 @@ public static class Classes { public static final ClassName config = ClassName.get("io.koraframework.config.common", "Config"); public static final ClassName configSource = ClassName.get("io.koraframework.config.common.annotation", "ConfigSource"); - public static final ClassName configValueExtractorAnnotation = ClassName.get("io.koraframework.config.common.annotation", "ConfigValueExtractor"); - public static final ClassName configValueExtractionException = ClassName.get("io.koraframework.config.common.extractor", "ConfigValueExtractionException"); - public static final ClassName configValueExtractor = ClassName.get("io.koraframework.config.common.extractor", "ConfigValueExtractor"); + public static final ClassName configValueExtractorAnnotation = ClassName.get("io.koraframework.config.common.annotation", "ConfigMapper"); + public static final ClassName configValueException = ClassName.get("io.koraframework.config.common.exception", "ConfigValueException"); + public static final ClassName configValueExtractor = ClassName.get("io.koraframework.config.common.mapper", "ConfigValueMapper"); public static final ClassName generated = ClassName.get("io.koraframework.common.annotation", "Generated"); public static final ClassName httpRoute = ClassName.get("io.koraframework.http.common.annotation", "HttpRoute"); diff --git a/openapi/openapi-generator/src/main/java/io/koraframework/openapi/generator/javagen/ClientSecuritySchemaGenerator.java b/openapi/openapi-generator/src/main/java/io/koraframework/openapi/generator/javagen/ClientSecuritySchemaGenerator.java index a6d42af0c..f5579ff0b 100644 --- a/openapi/openapi-generator/src/main/java/io/koraframework/openapi/generator/javagen/ClientSecuritySchemaGenerator.java +++ b/openapi/openapi-generator/src/main/java/io/koraframework/openapi/generator/javagen/ClientSecuritySchemaGenerator.java @@ -67,7 +67,7 @@ private MethodSpec securityConfigComponent(List authMethods) { var b = MethodSpec.methodBuilder("config") .addModifiers(Modifier.PUBLIC, Modifier.DEFAULT) .addParameter(Classes.config, "config") - .addParameter(ParameterizedTypeName.get(Classes.configValueExtractor, ClassName.get(String.class)), "extractor") + .addParameter(ParameterizedTypeName.get(Classes.configValueExtractor, ClassName.get(String.class)), "mapper") .returns(configClassName); var params = new ArrayList(); for (var authMethod : authMethods) { @@ -78,13 +78,13 @@ private MethodSpec securityConfigComponent(List authMethods) { var authMethodConfig = ClassName.get(apiPackage, "ApiSecurity", "Config", authMethod.name + "Config"); var username = authMethod.name + "_username"; var password = authMethod.name + "_password"; - b.addStatement("var $N = extractor.extractOrThrow(config.get($S))", username, configPath + ".username"); - b.addStatement("var $N = extractor.extractOrThrow(config.get($S))", password, configPath + ".password"); + b.addStatement("var $N = mapper.mapOrThrow(config.get($S))", username, configPath + ".username"); + b.addStatement("var $N = mapper.mapOrThrow(config.get($S))", password, configPath + ".password"); b.addStatement("var $N = new $T($N, $N)", authMethod.name, authMethodConfig, username, password); params.add(CodeBlock.of("$N", authMethod.name)); } if (authMethod.type.equals("apiKey")) { - b.addStatement("var $N = extractor.extractOrThrow(config.get($S))", authMethod.name, configPath); + b.addStatement("var $N = mapper.mapOrThrow(config.get($S))", authMethod.name, configPath); params.add(CodeBlock.of("$N", authMethod.name)); } } diff --git a/openapi/openapi-generator/src/main/kotlin/io/koraframework/openapi/generator/kotlingen/ClientSecuritySchemaGenerator.kt b/openapi/openapi-generator/src/main/kotlin/io/koraframework/openapi/generator/kotlingen/ClientSecuritySchemaGenerator.kt index 7be968b65..8f7d353da 100644 --- a/openapi/openapi-generator/src/main/kotlin/io/koraframework/openapi/generator/kotlingen/ClientSecuritySchemaGenerator.kt +++ b/openapi/openapi-generator/src/main/kotlin/io/koraframework/openapi/generator/kotlingen/ClientSecuritySchemaGenerator.kt @@ -60,7 +60,7 @@ class ClientSecuritySchemaGenerator : AbstractKotlinGenerator>( val configClassName = ClassName(apiPackage, "ApiSecurity", "Config") val b = FunSpec.builder("config") .addParameter("config", Classes.config.asKt()) - .addParameter("extractor", Classes.configValueExtractor.asKt().parameterizedBy(String::class.asTypeName())) + .addParameter("mapper", Classes.configValueExtractor.asKt().parameterizedBy(String::class.asTypeName())) .returns(configClassName) val params = mutableListOf() for (authMethod in authMethods) { @@ -69,13 +69,13 @@ class ClientSecuritySchemaGenerator : AbstractKotlinGenerator>( val authMethodConfig = ClassName(apiPackage, "ApiSecurity", "Config", authMethod.name + "Config") val username = authMethod.name + "_username" val password = authMethod.name + "_password" - b.addStatement("val %N = extractor.extractOrThrow(config.get(%S))", username, configPath + ".username") - b.addStatement("val %N = extractor.extractOrThrow(config.get(%S))", password, configPath + ".password") + b.addStatement("val %N = mapper.mapOrThrow(config.get(%S))", username, configPath + ".username") + b.addStatement("val %N = mapper.mapOrThrow(config.get(%S))", password, configPath + ".password") b.addStatement("val %N = %T(%N, %N)", authMethod.name, authMethodConfig, username, password) params.add(CodeBlock.of("%N", authMethod.name)) } if (authMethod.type == "apiKey") { - b.addStatement("val %N = extractor.extractOrThrow(config.get(%S))", authMethod.name, configPath) + b.addStatement("val %N = mapper.mapOrThrow(config.get(%S))", authMethod.name, configPath) params.add(CodeBlock.of("%N", authMethod.name)) } } diff --git a/openapi/openapi-management/src/main/java/io/koraframework/openapi/management/OpenApiManagementConfig.java b/openapi/openapi-management/src/main/java/io/koraframework/openapi/management/OpenApiManagementConfig.java index 4a008d068..5ba68c463 100644 --- a/openapi/openapi-management/src/main/java/io/koraframework/openapi/management/OpenApiManagementConfig.java +++ b/openapi/openapi-management/src/main/java/io/koraframework/openapi/management/OpenApiManagementConfig.java @@ -1,11 +1,11 @@ package io.koraframework.openapi.management; -import io.koraframework.config.common.annotation.ConfigValueExtractor; +import io.koraframework.config.common.annotation.ConfigMapper; import java.util.List; import java.util.Map; -@ConfigValueExtractor +@ConfigMapper public interface OpenApiManagementConfig { default boolean enabled() { @@ -22,7 +22,7 @@ default String path() { RapidocConfig rapidoc(); - @ConfigValueExtractor + @ConfigMapper interface SwaggerUIConfig { default boolean enabled() { @@ -50,7 +50,7 @@ default Map options() { } } - @ConfigValueExtractor + @ConfigMapper interface RapidocConfig { default boolean enabled() { diff --git a/openapi/openapi-management/src/main/java/io/koraframework/openapi/management/OpenApiManagementModule.java b/openapi/openapi-management/src/main/java/io/koraframework/openapi/management/OpenApiManagementModule.java index 9d328d6cb..32a8f2a8b 100644 --- a/openapi/openapi-management/src/main/java/io/koraframework/openapi/management/OpenApiManagementModule.java +++ b/openapi/openapi-management/src/main/java/io/koraframework/openapi/management/OpenApiManagementModule.java @@ -1,15 +1,15 @@ package io.koraframework.openapi.management; import io.koraframework.config.common.Config; -import io.koraframework.config.common.extractor.ConfigValueExtractor; +import io.koraframework.config.common.mapper.ConfigValueMapper; import io.koraframework.http.common.HttpMethod; import io.koraframework.http.server.common.request.HttpServerRequestHandler; import io.koraframework.http.server.common.request.HttpServerRequestHandlerImpl; public interface OpenApiManagementModule { - default OpenApiManagementConfig openApiManagementConfig(Config config, ConfigValueExtractor extractor) { - return extractor.extractOrThrow(config.get("openapi.management")); + default OpenApiManagementConfig openApiManagementConfig(Config config, ConfigValueMapper mapper) { + return mapper.mapOrThrow(config.get("openapi.management")); } default HttpServerRequestHandler openApiManagementController(OpenApiManagementConfig config) { diff --git a/opentelemetry/opentelemetry-tracing-exporter-grpc/src/main/java/io/koraframework/opentelemetry/tracing/exporter/grpc/OpentelemetryGrpcExporterConfig.java b/opentelemetry/opentelemetry-tracing-exporter-grpc/src/main/java/io/koraframework/opentelemetry/tracing/exporter/grpc/OpentelemetryGrpcExporterConfig.java index 1e879e3ba..23432f500 100644 --- a/opentelemetry/opentelemetry-tracing-exporter-grpc/src/main/java/io/koraframework/opentelemetry/tracing/exporter/grpc/OpentelemetryGrpcExporterConfig.java +++ b/opentelemetry/opentelemetry-tracing-exporter-grpc/src/main/java/io/koraframework/opentelemetry/tracing/exporter/grpc/OpentelemetryGrpcExporterConfig.java @@ -1,18 +1,18 @@ package io.koraframework.opentelemetry.tracing.exporter.grpc; import org.jspecify.annotations.Nullable; -import io.koraframework.config.common.annotation.ConfigValueExtractor; +import io.koraframework.config.common.annotation.ConfigMapper; import java.time.Duration; -import static io.koraframework.opentelemetry.tracing.exporter.grpc.$OpentelemetryGrpcExporterConfig_FromConfig_ConfigValueExtractor.*; +import static io.koraframework.opentelemetry.tracing.exporter.grpc.$OpentelemetryGrpcExporterConfig_FromConfig_ConfigValueMapper.*; public sealed interface OpentelemetryGrpcExporterConfig { record Empty() implements OpentelemetryGrpcExporterConfig {} - @ConfigValueExtractor + @ConfigMapper sealed interface FromConfig extends OpentelemetryGrpcExporterConfig permits FromConfig_Defaults, FromConfig_Impl { String endpoint(); @@ -51,7 +51,7 @@ default boolean exportUnsampledSpans() { } } - @ConfigValueExtractor + @ConfigMapper interface RetryPolicy { default int maxAttempts() { return 5; diff --git a/opentelemetry/opentelemetry-tracing-exporter-grpc/src/main/java/io/koraframework/opentelemetry/tracing/exporter/grpc/OpentelemetryGrpcExporterModule.java b/opentelemetry/opentelemetry-tracing-exporter-grpc/src/main/java/io/koraframework/opentelemetry/tracing/exporter/grpc/OpentelemetryGrpcExporterModule.java index ce0c61440..5eead5322 100644 --- a/opentelemetry/opentelemetry-tracing-exporter-grpc/src/main/java/io/koraframework/opentelemetry/tracing/exporter/grpc/OpentelemetryGrpcExporterModule.java +++ b/opentelemetry/opentelemetry-tracing-exporter-grpc/src/main/java/io/koraframework/opentelemetry/tracing/exporter/grpc/OpentelemetryGrpcExporterModule.java @@ -1,5 +1,6 @@ package io.koraframework.opentelemetry.tracing.exporter.grpc; +import io.koraframework.config.common.mapper.ConfigValueMapper; import io.opentelemetry.api.metrics.MeterProvider; import io.opentelemetry.exporter.otlp.trace.OtlpGrpcSpanExporter; import io.opentelemetry.sdk.common.export.RetryPolicy; @@ -10,7 +11,6 @@ import io.koraframework.common.annotation.DefaultComponent; import io.koraframework.config.common.Config; import io.koraframework.config.common.ConfigValue; -import io.koraframework.config.common.extractor.ConfigValueExtractor; import io.koraframework.opentelemetry.tracing.OpentelemetryTracingModule; public interface OpentelemetryGrpcExporterModule extends OpentelemetryTracingModule { @@ -43,12 +43,12 @@ default SpanExporter spanExporter(OpentelemetryGrpcExporterConfig exporterConfig return exporter.build(); } - default OpentelemetryGrpcExporterConfig otlpGrpcSpanExporterConfig(Config config, ConfigValueExtractor extractor) { + default OpentelemetryGrpcExporterConfig otlpGrpcSpanExporterConfig(Config config, ConfigValueMapper mapper) { var value = config.get("tracing.exporter"); if (value instanceof ConfigValue.NullValue || value.asObject().get("endpoint").isNull()) { return new OpentelemetryGrpcExporterConfig.Empty(); } - return extractor.extractOrThrow(value); + return mapper.mapOrThrow(value); } @DefaultComponent diff --git a/opentelemetry/opentelemetry-tracing-exporter-http/src/main/java/io/koraframework/opentelemetry/tracing/exporter/http/OpentelemetryHttpExporterConfig.java b/opentelemetry/opentelemetry-tracing-exporter-http/src/main/java/io/koraframework/opentelemetry/tracing/exporter/http/OpentelemetryHttpExporterConfig.java index 34692dfdf..549923533 100644 --- a/opentelemetry/opentelemetry-tracing-exporter-http/src/main/java/io/koraframework/opentelemetry/tracing/exporter/http/OpentelemetryHttpExporterConfig.java +++ b/opentelemetry/opentelemetry-tracing-exporter-http/src/main/java/io/koraframework/opentelemetry/tracing/exporter/http/OpentelemetryHttpExporterConfig.java @@ -1,18 +1,18 @@ package io.koraframework.opentelemetry.tracing.exporter.http; import org.jspecify.annotations.Nullable; -import io.koraframework.config.common.annotation.ConfigValueExtractor; +import io.koraframework.config.common.annotation.ConfigMapper; import java.time.Duration; -import static io.koraframework.opentelemetry.tracing.exporter.http.$OpentelemetryHttpExporterConfig_FromConfig_ConfigValueExtractor.*; +import static io.koraframework.opentelemetry.tracing.exporter.http.$OpentelemetryHttpExporterConfig_FromConfig_ConfigValueMapper.*; public sealed interface OpentelemetryHttpExporterConfig { record Empty() implements OpentelemetryHttpExporterConfig {} - @ConfigValueExtractor + @ConfigMapper sealed interface FromConfig extends OpentelemetryHttpExporterConfig permits FromConfig_Defaults, FromConfig_Impl { String endpoint(); @@ -51,7 +51,7 @@ default boolean exportUnsampledSpans() { } } - @ConfigValueExtractor + @ConfigMapper interface RetryPolicy { default int maxAttempts() { return 5; diff --git a/opentelemetry/opentelemetry-tracing-exporter-http/src/main/java/io/koraframework/opentelemetry/tracing/exporter/http/OpentelemetryHttpExporterModule.java b/opentelemetry/opentelemetry-tracing-exporter-http/src/main/java/io/koraframework/opentelemetry/tracing/exporter/http/OpentelemetryHttpExporterModule.java index c8f2e5d96..c7964f1c6 100644 --- a/opentelemetry/opentelemetry-tracing-exporter-http/src/main/java/io/koraframework/opentelemetry/tracing/exporter/http/OpentelemetryHttpExporterModule.java +++ b/opentelemetry/opentelemetry-tracing-exporter-http/src/main/java/io/koraframework/opentelemetry/tracing/exporter/http/OpentelemetryHttpExporterModule.java @@ -10,7 +10,7 @@ import io.koraframework.common.annotation.DefaultComponent; import io.koraframework.config.common.Config; import io.koraframework.config.common.ConfigValue; -import io.koraframework.config.common.extractor.ConfigValueExtractor; +import io.koraframework.config.common.mapper.ConfigValueMapper; import io.koraframework.opentelemetry.tracing.OpentelemetryTracingModule; public interface OpentelemetryHttpExporterModule extends OpentelemetryTracingModule { @@ -45,12 +45,12 @@ default SpanExporter spanExporter(OpentelemetryHttpExporterConfig exporterConfig return exporter.build(); } - default OpentelemetryHttpExporterConfig otlpGrpcSpanExporterConfig(Config config, ConfigValueExtractor extractor) { + default OpentelemetryHttpExporterConfig otlpGrpcSpanExporterConfig(Config config, ConfigValueMapper mapper) { var value = config.get("tracing.exporter"); if (value instanceof ConfigValue.NullValue || value.asObject().get("endpoint").isNull()) { return new OpentelemetryHttpExporterConfig.Empty(); } - return extractor.extractOrThrow(value); + return mapper.mapOrThrow(value); } @DefaultComponent diff --git a/opentelemetry/opentelemetry-tracing/src/main/java/io/koraframework/opentelemetry/tracing/OpentelemetryResourceConfig.java b/opentelemetry/opentelemetry-tracing/src/main/java/io/koraframework/opentelemetry/tracing/OpentelemetryResourceConfig.java index 30d67b049..994e003be 100644 --- a/opentelemetry/opentelemetry-tracing/src/main/java/io/koraframework/opentelemetry/tracing/OpentelemetryResourceConfig.java +++ b/opentelemetry/opentelemetry-tracing/src/main/java/io/koraframework/opentelemetry/tracing/OpentelemetryResourceConfig.java @@ -1,10 +1,10 @@ package io.koraframework.opentelemetry.tracing; -import io.koraframework.config.common.annotation.ConfigValueExtractor; +import io.koraframework.config.common.annotation.ConfigMapper; import java.util.Map; -@ConfigValueExtractor +@ConfigMapper public interface OpentelemetryResourceConfig { default Map attributes() { return Map.of(); diff --git a/opentelemetry/opentelemetry-tracing/src/main/java/io/koraframework/opentelemetry/tracing/OpentelemetryTracingModule.java b/opentelemetry/opentelemetry-tracing/src/main/java/io/koraframework/opentelemetry/tracing/OpentelemetryTracingModule.java index 01859b578..421adfe91 100644 --- a/opentelemetry/opentelemetry-tracing/src/main/java/io/koraframework/opentelemetry/tracing/OpentelemetryTracingModule.java +++ b/opentelemetry/opentelemetry-tracing/src/main/java/io/koraframework/opentelemetry/tracing/OpentelemetryTracingModule.java @@ -12,14 +12,14 @@ import io.koraframework.application.graph.LifecycleWrapper; import io.koraframework.common.annotation.DefaultComponent; import io.koraframework.config.common.Config; -import io.koraframework.config.common.extractor.ConfigValueExtractor; +import io.koraframework.config.common.mapper.ConfigValueMapper; import java.util.function.Supplier; public interface OpentelemetryTracingModule { - default OpentelemetryResourceConfig opentelemetryResourceConfig(Config config, ConfigValueExtractor extractor) { - return extractor.extractOrThrow(config.get("tracing")); + default OpentelemetryResourceConfig opentelemetryResourceConfig(Config config, ConfigValueMapper mapper) { + return mapper.mapOrThrow(config.get("tracing")); } default Resource opentelemetryTracingResource(OpentelemetryResourceConfig config) { diff --git a/redis/redis-lettuce/src/main/java/io/koraframework/redis/lettuce/LettuceConfig.java b/redis/redis-lettuce/src/main/java/io/koraframework/redis/lettuce/LettuceConfig.java index 604426228..9419cde17 100644 --- a/redis/redis-lettuce/src/main/java/io/koraframework/redis/lettuce/LettuceConfig.java +++ b/redis/redis-lettuce/src/main/java/io/koraframework/redis/lettuce/LettuceConfig.java @@ -1,13 +1,13 @@ package io.koraframework.redis.lettuce; -import io.koraframework.config.common.annotation.ConfigValueExtractor; +import io.koraframework.config.common.annotation.ConfigMapper; import io.koraframework.redis.lettuce.telemetry.LettuceTelemetryConfig; import org.jspecify.annotations.Nullable; import java.time.Duration; import java.util.List; -@ConfigValueExtractor +@ConfigMapper public interface LettuceConfig { String uri(); @@ -41,7 +41,7 @@ default Duration commandTimeout() { SslConfig ssl(); - @ConfigValueExtractor + @ConfigMapper interface SslConfig { default List ciphers() { diff --git a/redis/redis-lettuce/src/main/java/io/koraframework/redis/lettuce/LettuceModule.java b/redis/redis-lettuce/src/main/java/io/koraframework/redis/lettuce/LettuceModule.java index 533f35123..6ec5e224a 100644 --- a/redis/redis-lettuce/src/main/java/io/koraframework/redis/lettuce/LettuceModule.java +++ b/redis/redis-lettuce/src/main/java/io/koraframework/redis/lettuce/LettuceModule.java @@ -4,7 +4,7 @@ import io.koraframework.common.annotation.Tag; import io.koraframework.common.Configurer; import io.koraframework.config.common.Config; -import io.koraframework.config.common.extractor.ConfigValueExtractor; +import io.koraframework.config.common.mapper.ConfigValueMapper; import io.koraframework.netty.common.NettyModule; import io.lettuce.core.AbstractRedisClient; import io.lettuce.core.ClientOptions; @@ -17,8 +17,8 @@ public interface LettuceModule extends NettyModule { - default LettuceConfig lettuceConfig(Config config, ConfigValueExtractor extractor) { - return extractor.extractOrThrow(config.get("lettuce")); + default LettuceConfig lettuceConfig(Config config, ConfigValueMapper mapper) { + return mapper.mapOrThrow(config.get("lettuce")); } @DefaultComponent diff --git a/redis/redis-lettuce/src/main/java/io/koraframework/redis/lettuce/telemetry/LettuceTelemetryConfig.java b/redis/redis-lettuce/src/main/java/io/koraframework/redis/lettuce/telemetry/LettuceTelemetryConfig.java index ca305ac82..6f08fd8a0 100644 --- a/redis/redis-lettuce/src/main/java/io/koraframework/redis/lettuce/telemetry/LettuceTelemetryConfig.java +++ b/redis/redis-lettuce/src/main/java/io/koraframework/redis/lettuce/telemetry/LettuceTelemetryConfig.java @@ -1,18 +1,18 @@ package io.koraframework.redis.lettuce.telemetry; -import io.koraframework.config.common.annotation.ConfigValueExtractor; +import io.koraframework.config.common.annotation.ConfigMapper; import io.koraframework.telemetry.common.TelemetryConfig; -@ConfigValueExtractor +@ConfigMapper public interface LettuceTelemetryConfig { LettuceLoggingConfig logging(); LettuceMetricsConfig metrics(); - @ConfigValueExtractor + @ConfigMapper interface LettuceMetricsConfig extends TelemetryConfig.MetricsConfig {} - @ConfigValueExtractor + @ConfigMapper interface LettuceLoggingConfig extends TelemetryConfig.LoggingConfig {} } diff --git a/resilient/resilient-annotation-processor/src/test/java/io/koraframework/resilient/annotation/processor/aop/testdata/AppWithConfig.java b/resilient/resilient-annotation-processor/src/test/java/io/koraframework/resilient/annotation/processor/aop/testdata/AppWithConfig.java index 7b62618d6..0b68817b6 100644 --- a/resilient/resilient-annotation-processor/src/test/java/io/koraframework/resilient/annotation/processor/aop/testdata/AppWithConfig.java +++ b/resilient/resilient-annotation-processor/src/test/java/io/koraframework/resilient/annotation/processor/aop/testdata/AppWithConfig.java @@ -3,7 +3,7 @@ import com.typesafe.config.ConfigFactory; import io.koraframework.common.annotation.KoraApp; import io.koraframework.config.common.Config; -import io.koraframework.config.common.extractor.ConfigValueExtractorModule; +import io.koraframework.config.common.mapper.ConfigValueMapperModule; import io.koraframework.config.common.origin.SimpleConfigOrigin; import io.koraframework.config.hocon.HoconConfigFactory; import io.koraframework.resilient.circuitbreaker.CircuitBreakerModule; @@ -13,7 +13,7 @@ import io.koraframework.resilient.timeout.TimeoutModule; @KoraApp -public interface AppWithConfig extends ConfigValueExtractorModule, CircuitBreakerModule, RetryModule, TimeoutModule, FallbackModule, RateLimiterModule { +public interface AppWithConfig extends ConfigValueMapperModule, CircuitBreakerModule, RetryModule, TimeoutModule, FallbackModule, RateLimiterModule { default Config config() { return HoconConfigFactory.fromHocon(new SimpleConfigOrigin("test"), ConfigFactory.parseString( diff --git a/resilient/resilient-kora/src/main/java/io/koraframework/resilient/circuitbreaker/CircuitBreakerConfig.java b/resilient/resilient-kora/src/main/java/io/koraframework/resilient/circuitbreaker/CircuitBreakerConfig.java index ac246ebb3..2bbb2a475 100644 --- a/resilient/resilient-kora/src/main/java/io/koraframework/resilient/circuitbreaker/CircuitBreakerConfig.java +++ b/resilient/resilient-kora/src/main/java/io/koraframework/resilient/circuitbreaker/CircuitBreakerConfig.java @@ -1,13 +1,13 @@ package io.koraframework.resilient.circuitbreaker; import org.jspecify.annotations.Nullable; -import io.koraframework.config.common.annotation.ConfigValueExtractor; +import io.koraframework.config.common.annotation.ConfigMapper; import io.koraframework.resilient.circuitbreaker.telemetry.CircuitBreakerTelemetryConfig; import java.time.Duration; import java.util.Map; -@ConfigValueExtractor +@ConfigMapper public interface CircuitBreakerConfig { String DEFAULT = "default"; @@ -28,7 +28,7 @@ default Map circuitbreaker() { * {@link #minimumRequiredCalls} Configures the minimum number of calls which are required (per sliding window period) before the CircuitBreaker can calculate the error rate.
* {@link #failurePredicateName} {@link CircuitBreakerPredicate#name()} default is {@link KoraCircuitBreakerPredicate}
*/ - @ConfigValueExtractor + @ConfigMapper interface NamedConfig { @Nullable @@ -101,7 +101,7 @@ private static NamedConfig merge(NamedConfig namedConfig, NamedConfig defaultCon return namedConfig; } - return new $CircuitBreakerConfig_NamedConfig_ConfigValueExtractor.NamedConfig_Impl( + return new $CircuitBreakerConfig_NamedConfig_ConfigValueMapper.NamedConfig_Impl( namedConfig.enabled() != null ? Boolean.TRUE.equals(namedConfig.enabled()) : (defaultConfig.enabled() == null || Boolean.TRUE.equals(defaultConfig.enabled())), namedConfig.failureRateThreshold() == null ? defaultConfig.failureRateThreshold() : namedConfig.failureRateThreshold(), namedConfig.waitDurationInOpenState() == null ? defaultConfig.waitDurationInOpenState() : namedConfig.waitDurationInOpenState(), diff --git a/resilient/resilient-kora/src/main/java/io/koraframework/resilient/circuitbreaker/CircuitBreakerModule.java b/resilient/resilient-kora/src/main/java/io/koraframework/resilient/circuitbreaker/CircuitBreakerModule.java index 6a6dbb9ba..d8d461da4 100644 --- a/resilient/resilient-kora/src/main/java/io/koraframework/resilient/circuitbreaker/CircuitBreakerModule.java +++ b/resilient/resilient-kora/src/main/java/io/koraframework/resilient/circuitbreaker/CircuitBreakerModule.java @@ -3,7 +3,7 @@ import io.koraframework.application.graph.All; import io.koraframework.common.annotation.DefaultComponent; import io.koraframework.config.common.Config; -import io.koraframework.config.common.extractor.ConfigValueExtractor; +import io.koraframework.config.common.mapper.ConfigValueMapper; import io.koraframework.resilient.circuitbreaker.telemetry.CircuitBreakerTelemetryFactory; import io.koraframework.resilient.circuitbreaker.telemetry.impl.DefaultCircuitBreakerLoggerFactory; import io.koraframework.resilient.circuitbreaker.telemetry.impl.DefaultCircuitBreakerMetricsFactory; @@ -14,8 +14,8 @@ public interface CircuitBreakerModule { - default CircuitBreakerConfig koraCircuitBreakerConfig(Config config, ConfigValueExtractor extractor) { - return extractor.extractOrThrow(config.get("resilient")); + default CircuitBreakerConfig koraCircuitBreakerConfig(Config config, ConfigValueMapper mapper) { + return mapper.mapOrThrow(config.get("resilient")); } default CircuitBreakerManager koraCircuitBreakerManager(CircuitBreakerConfig config, diff --git a/resilient/resilient-kora/src/main/java/io/koraframework/resilient/circuitbreaker/telemetry/CircuitBreakerTelemetryConfig.java b/resilient/resilient-kora/src/main/java/io/koraframework/resilient/circuitbreaker/telemetry/CircuitBreakerTelemetryConfig.java index c8705e43b..e58ff83d0 100644 --- a/resilient/resilient-kora/src/main/java/io/koraframework/resilient/circuitbreaker/telemetry/CircuitBreakerTelemetryConfig.java +++ b/resilient/resilient-kora/src/main/java/io/koraframework/resilient/circuitbreaker/telemetry/CircuitBreakerTelemetryConfig.java @@ -1,9 +1,9 @@ package io.koraframework.resilient.circuitbreaker.telemetry; -import io.koraframework.config.common.annotation.ConfigValueExtractor; +import io.koraframework.config.common.annotation.ConfigMapper; import io.koraframework.telemetry.common.TelemetryConfig; -@ConfigValueExtractor +@ConfigMapper public interface CircuitBreakerTelemetryConfig extends TelemetryConfig { @Override @@ -15,13 +15,13 @@ public interface CircuitBreakerTelemetryConfig extends TelemetryConfig { @Override CircuitBreakerTracingConfig tracing(); - @ConfigValueExtractor + @ConfigMapper interface CircuitBreakerLoggingConfig extends TelemetryConfig.LoggingConfig {} - @ConfigValueExtractor + @ConfigMapper interface CircuitBreakerMetricsConfig extends TelemetryConfig.MetricsConfig {} - @ConfigValueExtractor + @ConfigMapper interface CircuitBreakerTracingConfig extends TelemetryConfig.TracingConfig { @Override diff --git a/resilient/resilient-kora/src/main/java/io/koraframework/resilient/circuitbreaker/telemetry/impl/DefaultCircuitBreakerTelemetry.java b/resilient/resilient-kora/src/main/java/io/koraframework/resilient/circuitbreaker/telemetry/impl/DefaultCircuitBreakerTelemetry.java index 6a35962ab..5750b1411 100644 --- a/resilient/resilient-kora/src/main/java/io/koraframework/resilient/circuitbreaker/telemetry/impl/DefaultCircuitBreakerTelemetry.java +++ b/resilient/resilient-kora/src/main/java/io/koraframework/resilient/circuitbreaker/telemetry/impl/DefaultCircuitBreakerTelemetry.java @@ -14,10 +14,10 @@ public record TelemetryContext(String name, MeterRegistry meterRegistry) { public static final TelemetryContext EMPTY = new TelemetryContext("none", - new $CircuitBreakerTelemetryConfig_ConfigValueExtractor.CircuitBreakerTelemetryConfig_Impl( - new $CircuitBreakerTelemetryConfig_CircuitBreakerLoggingConfig_ConfigValueExtractor.CircuitBreakerLoggingConfig_Defaults(), - new $CircuitBreakerTelemetryConfig_CircuitBreakerMetricsConfig_ConfigValueExtractor.CircuitBreakerMetricsConfig_Defaults(), - new $CircuitBreakerTelemetryConfig_CircuitBreakerTracingConfig_ConfigValueExtractor.CircuitBreakerTracingConfig_Defaults() + new $CircuitBreakerTelemetryConfig_ConfigValueMapper.CircuitBreakerTelemetryConfig_Impl( + new $CircuitBreakerTelemetryConfig_CircuitBreakerLoggingConfig_ConfigValueMapper.CircuitBreakerLoggingConfig_Defaults(), + new $CircuitBreakerTelemetryConfig_CircuitBreakerMetricsConfig_ConfigValueMapper.CircuitBreakerMetricsConfig_Defaults(), + new $CircuitBreakerTelemetryConfig_CircuitBreakerTracingConfig_ConfigValueMapper.CircuitBreakerTracingConfig_Defaults() ), false, false, DefaultCircuitBreakerTelemetryFactory.NOOP_TRACER, DefaultCircuitBreakerTelemetryFactory.NOOP_METER_REGISTRY); } diff --git a/resilient/resilient-kora/src/main/java/io/koraframework/resilient/fallback/FallbackConfig.java b/resilient/resilient-kora/src/main/java/io/koraframework/resilient/fallback/FallbackConfig.java index 3404c54e1..0ce0c1c6c 100644 --- a/resilient/resilient-kora/src/main/java/io/koraframework/resilient/fallback/FallbackConfig.java +++ b/resilient/resilient-kora/src/main/java/io/koraframework/resilient/fallback/FallbackConfig.java @@ -1,17 +1,17 @@ package io.koraframework.resilient.fallback; import org.jspecify.annotations.Nullable; -import io.koraframework.config.common.annotation.ConfigValueExtractor; +import io.koraframework.config.common.annotation.ConfigMapper; import io.koraframework.resilient.fallback.telemetry.FallbackTelemetryConfig; import java.util.Map; -@ConfigValueExtractor +@ConfigMapper public interface FallbackConfig { String DEFAULT = "default"; - NamedConfig DEFAULT_CONFIG = new $FallbackConfig_NamedConfig_ConfigValueExtractor.NamedConfig_Defaults(); + NamedConfig DEFAULT_CONFIG = new $FallbackConfig_NamedConfig_ConfigValueMapper.NamedConfig_Defaults(); default Map fallback() { return Map.of(); @@ -22,7 +22,7 @@ default Map fallback() { /** * {@link #failurePredicateName} {@link FallbackPredicate#name()} default is {@link KoraFallbackPredicate} */ - @ConfigValueExtractor + @ConfigMapper interface NamedConfig { @Nullable @@ -44,7 +44,7 @@ private static NamedConfig merge(NamedConfig namedConfig, NamedConfig defaultCon return namedConfig; } - return new $FallbackConfig_NamedConfig_ConfigValueExtractor.NamedConfig_Impl( + return new $FallbackConfig_NamedConfig_ConfigValueMapper.NamedConfig_Impl( namedConfig.enabled() != null ? Boolean.TRUE.equals(namedConfig.enabled()) : (defaultConfig.enabled() == null || Boolean.TRUE.equals(defaultConfig.enabled())), namedConfig.failurePredicateName() == null ? defaultConfig.failurePredicateName() : namedConfig.failurePredicateName()); } diff --git a/resilient/resilient-kora/src/main/java/io/koraframework/resilient/fallback/FallbackModule.java b/resilient/resilient-kora/src/main/java/io/koraframework/resilient/fallback/FallbackModule.java index f3f83b75f..e7762cd1c 100644 --- a/resilient/resilient-kora/src/main/java/io/koraframework/resilient/fallback/FallbackModule.java +++ b/resilient/resilient-kora/src/main/java/io/koraframework/resilient/fallback/FallbackModule.java @@ -3,7 +3,7 @@ import io.koraframework.application.graph.All; import io.koraframework.common.annotation.DefaultComponent; import io.koraframework.config.common.Config; -import io.koraframework.config.common.extractor.ConfigValueExtractor; +import io.koraframework.config.common.mapper.ConfigValueMapper; import io.koraframework.resilient.fallback.telemetry.FallbackTelemetryFactory; import io.koraframework.resilient.fallback.telemetry.impl.DefaultFallbackLoggerFactory; import io.koraframework.resilient.fallback.telemetry.impl.DefaultFallbackMetricsFactory; @@ -14,8 +14,8 @@ public interface FallbackModule { - default FallbackConfig koraFallbackConfig(Config config, ConfigValueExtractor extractor) { - return extractor.extractOrThrow(config.get("resilient")); + default FallbackConfig koraFallbackConfig(Config config, ConfigValueMapper mapper) { + return mapper.mapOrThrow(config.get("resilient")); } default FallbackManager koraFallbackManager(FallbackConfig config, diff --git a/resilient/resilient-kora/src/main/java/io/koraframework/resilient/fallback/telemetry/FallbackTelemetryConfig.java b/resilient/resilient-kora/src/main/java/io/koraframework/resilient/fallback/telemetry/FallbackTelemetryConfig.java index 14e0d920d..a27ad3f63 100644 --- a/resilient/resilient-kora/src/main/java/io/koraframework/resilient/fallback/telemetry/FallbackTelemetryConfig.java +++ b/resilient/resilient-kora/src/main/java/io/koraframework/resilient/fallback/telemetry/FallbackTelemetryConfig.java @@ -1,9 +1,9 @@ package io.koraframework.resilient.fallback.telemetry; -import io.koraframework.config.common.annotation.ConfigValueExtractor; +import io.koraframework.config.common.annotation.ConfigMapper; import io.koraframework.telemetry.common.TelemetryConfig; -@ConfigValueExtractor +@ConfigMapper public interface FallbackTelemetryConfig extends TelemetryConfig { @Override @@ -15,13 +15,13 @@ public interface FallbackTelemetryConfig extends TelemetryConfig { @Override FallbackTracingConfig tracing(); - @ConfigValueExtractor + @ConfigMapper interface FallbackLoggingConfig extends TelemetryConfig.LoggingConfig {} - @ConfigValueExtractor + @ConfigMapper interface FallbackMetricsConfig extends TelemetryConfig.MetricsConfig {} - @ConfigValueExtractor + @ConfigMapper interface FallbackTracingConfig extends TelemetryConfig.TracingConfig { @Override diff --git a/resilient/resilient-kora/src/main/java/io/koraframework/resilient/fallback/telemetry/impl/DefaultFallbackTelemetry.java b/resilient/resilient-kora/src/main/java/io/koraframework/resilient/fallback/telemetry/impl/DefaultFallbackTelemetry.java index 550e2e2a0..9b7aada09 100644 --- a/resilient/resilient-kora/src/main/java/io/koraframework/resilient/fallback/telemetry/impl/DefaultFallbackTelemetry.java +++ b/resilient/resilient-kora/src/main/java/io/koraframework/resilient/fallback/telemetry/impl/DefaultFallbackTelemetry.java @@ -14,10 +14,10 @@ public record TelemetryContext(String name, MeterRegistry meterRegistry) { public static final TelemetryContext EMPTY = new TelemetryContext("none", - new $FallbackTelemetryConfig_ConfigValueExtractor.FallbackTelemetryConfig_Impl( - new $FallbackTelemetryConfig_FallbackLoggingConfig_ConfigValueExtractor.FallbackLoggingConfig_Defaults(), - new $FallbackTelemetryConfig_FallbackMetricsConfig_ConfigValueExtractor.FallbackMetricsConfig_Defaults(), - new $FallbackTelemetryConfig_FallbackTracingConfig_ConfigValueExtractor.FallbackTracingConfig_Defaults() + new $FallbackTelemetryConfig_ConfigValueMapper.FallbackTelemetryConfig_Impl( + new $FallbackTelemetryConfig_FallbackLoggingConfig_ConfigValueMapper.FallbackLoggingConfig_Defaults(), + new $FallbackTelemetryConfig_FallbackMetricsConfig_ConfigValueMapper.FallbackMetricsConfig_Defaults(), + new $FallbackTelemetryConfig_FallbackTracingConfig_ConfigValueMapper.FallbackTracingConfig_Defaults() ), false, false, DefaultFallbackTelemetryFactory.NOOP_TRACER, DefaultFallbackTelemetryFactory.NOOP_METER_REGISTRY); } diff --git a/resilient/resilient-kora/src/main/java/io/koraframework/resilient/ratelimiter/RateLimiterConfig.java b/resilient/resilient-kora/src/main/java/io/koraframework/resilient/ratelimiter/RateLimiterConfig.java index b8e6825a3..7a20914f9 100644 --- a/resilient/resilient-kora/src/main/java/io/koraframework/resilient/ratelimiter/RateLimiterConfig.java +++ b/resilient/resilient-kora/src/main/java/io/koraframework/resilient/ratelimiter/RateLimiterConfig.java @@ -1,13 +1,13 @@ package io.koraframework.resilient.ratelimiter; import org.jspecify.annotations.Nullable; -import io.koraframework.config.common.annotation.ConfigValueExtractor; +import io.koraframework.config.common.annotation.ConfigMapper; import io.koraframework.resilient.ratelimiter.telemetry.RateLimiterTelemetryConfig; import java.time.Duration; import java.util.Map; -@ConfigValueExtractor +@ConfigMapper public interface RateLimiterConfig { String DEFAULT = "default"; @@ -24,7 +24,7 @@ default Map ratelimiter() { * {@link #limitRefreshPeriod} Configures the period of a limit refresh. After each period the rate limiter * sets its permissions count to the {@link #limitForPeriod} value. Must be greater than 0.
*/ - @ConfigValueExtractor + @ConfigMapper interface NamedConfig { @Nullable @@ -76,7 +76,7 @@ private static NamedConfig merge(NamedConfig namedConfig, NamedConfig defaultCon return namedConfig; } - return new $RateLimiterConfig_NamedConfig_ConfigValueExtractor.NamedConfig_Impl( + return new $RateLimiterConfig_NamedConfig_ConfigValueMapper.NamedConfig_Impl( namedConfig.enabled() != null ? Boolean.TRUE.equals(namedConfig.enabled()) : (defaultConfig.enabled() == null || Boolean.TRUE.equals(defaultConfig.enabled())), namedConfig.limitForPeriod() == null ? defaultConfig.limitForPeriod() : namedConfig.limitForPeriod(), namedConfig.limitRefreshPeriod() == null ? defaultConfig.limitRefreshPeriod() : namedConfig.limitRefreshPeriod() diff --git a/resilient/resilient-kora/src/main/java/io/koraframework/resilient/ratelimiter/RateLimiterModule.java b/resilient/resilient-kora/src/main/java/io/koraframework/resilient/ratelimiter/RateLimiterModule.java index 13926926e..1e02e5781 100644 --- a/resilient/resilient-kora/src/main/java/io/koraframework/resilient/ratelimiter/RateLimiterModule.java +++ b/resilient/resilient-kora/src/main/java/io/koraframework/resilient/ratelimiter/RateLimiterModule.java @@ -2,7 +2,7 @@ import io.koraframework.common.annotation.DefaultComponent; import io.koraframework.config.common.Config; -import io.koraframework.config.common.extractor.ConfigValueExtractor; +import io.koraframework.config.common.mapper.ConfigValueMapper; import io.koraframework.resilient.ratelimiter.telemetry.RateLimiterTelemetryFactory; import io.koraframework.resilient.ratelimiter.telemetry.impl.DefaultRateLimiterLoggerFactory; import io.koraframework.resilient.ratelimiter.telemetry.impl.DefaultRateLimiterMetricsFactory; @@ -13,8 +13,8 @@ public interface RateLimiterModule { - default RateLimiterConfig koraRateLimiterConfig(Config config, ConfigValueExtractor extractor) { - return extractor.extractOrThrow(config.get("resilient")); + default RateLimiterConfig koraRateLimiterConfig(Config config, ConfigValueMapper mapper) { + return mapper.mapOrThrow(config.get("resilient")); } default RateLimiterManager koraRateLimiterManager(RateLimiterConfig config, diff --git a/resilient/resilient-kora/src/main/java/io/koraframework/resilient/ratelimiter/telemetry/RateLimiterTelemetryConfig.java b/resilient/resilient-kora/src/main/java/io/koraframework/resilient/ratelimiter/telemetry/RateLimiterTelemetryConfig.java index 97820389f..8116c95a4 100644 --- a/resilient/resilient-kora/src/main/java/io/koraframework/resilient/ratelimiter/telemetry/RateLimiterTelemetryConfig.java +++ b/resilient/resilient-kora/src/main/java/io/koraframework/resilient/ratelimiter/telemetry/RateLimiterTelemetryConfig.java @@ -1,9 +1,9 @@ package io.koraframework.resilient.ratelimiter.telemetry; -import io.koraframework.config.common.annotation.ConfigValueExtractor; +import io.koraframework.config.common.annotation.ConfigMapper; import io.koraframework.telemetry.common.TelemetryConfig; -@ConfigValueExtractor +@ConfigMapper public interface RateLimiterTelemetryConfig extends TelemetryConfig { @Override @@ -15,13 +15,13 @@ public interface RateLimiterTelemetryConfig extends TelemetryConfig { @Override RateLimiterTracingConfig tracing(); - @ConfigValueExtractor + @ConfigMapper interface RateLimiterLoggingConfig extends TelemetryConfig.LoggingConfig {} - @ConfigValueExtractor + @ConfigMapper interface RateLimiterMetricsConfig extends TelemetryConfig.MetricsConfig {} - @ConfigValueExtractor + @ConfigMapper interface RateLimiterTracingConfig extends TelemetryConfig.TracingConfig { @Override diff --git a/resilient/resilient-kora/src/main/java/io/koraframework/resilient/ratelimiter/telemetry/impl/DefaultRateLimiterTelemetry.java b/resilient/resilient-kora/src/main/java/io/koraframework/resilient/ratelimiter/telemetry/impl/DefaultRateLimiterTelemetry.java index 4b4ba6ef5..f4ee0d26f 100644 --- a/resilient/resilient-kora/src/main/java/io/koraframework/resilient/ratelimiter/telemetry/impl/DefaultRateLimiterTelemetry.java +++ b/resilient/resilient-kora/src/main/java/io/koraframework/resilient/ratelimiter/telemetry/impl/DefaultRateLimiterTelemetry.java @@ -14,10 +14,10 @@ public record TelemetryContext(String name, MeterRegistry meterRegistry) { public static final TelemetryContext EMPTY = new TelemetryContext("none", - new $RateLimiterTelemetryConfig_ConfigValueExtractor.RateLimiterTelemetryConfig_Impl( - new $RateLimiterTelemetryConfig_RateLimiterLoggingConfig_ConfigValueExtractor.RateLimiterLoggingConfig_Defaults(), - new $RateLimiterTelemetryConfig_RateLimiterMetricsConfig_ConfigValueExtractor.RateLimiterMetricsConfig_Defaults(), - new $RateLimiterTelemetryConfig_RateLimiterTracingConfig_ConfigValueExtractor.RateLimiterTracingConfig_Defaults() + new $RateLimiterTelemetryConfig_ConfigValueMapper.RateLimiterTelemetryConfig_Impl( + new $RateLimiterTelemetryConfig_RateLimiterLoggingConfig_ConfigValueMapper.RateLimiterLoggingConfig_Defaults(), + new $RateLimiterTelemetryConfig_RateLimiterMetricsConfig_ConfigValueMapper.RateLimiterMetricsConfig_Defaults(), + new $RateLimiterTelemetryConfig_RateLimiterTracingConfig_ConfigValueMapper.RateLimiterTracingConfig_Defaults() ), false, false, DefaultRateLimiterTelemetryFactory.NOOP_TRACER, DefaultRateLimiterTelemetryFactory.NOOP_METER_REGISTRY); } diff --git a/resilient/resilient-kora/src/main/java/io/koraframework/resilient/retry/RetryConfig.java b/resilient/resilient-kora/src/main/java/io/koraframework/resilient/retry/RetryConfig.java index 1da25ae6a..81242426a 100644 --- a/resilient/resilient-kora/src/main/java/io/koraframework/resilient/retry/RetryConfig.java +++ b/resilient/resilient-kora/src/main/java/io/koraframework/resilient/retry/RetryConfig.java @@ -1,14 +1,14 @@ package io.koraframework.resilient.retry; import org.jspecify.annotations.Nullable; -import io.koraframework.config.common.annotation.ConfigValueExtractor; +import io.koraframework.config.common.annotation.ConfigMapper; import io.koraframework.resilient.retry.telemetry.RetryTelemetryConfig; import java.time.Duration; import java.util.Map; import java.util.Objects; -@ConfigValueExtractor +@ConfigMapper public interface RetryConfig { String DEFAULT = "default"; @@ -25,7 +25,7 @@ default Map retry() { * {@link #attempts} Maximum number of retry attempts * {@link #failurePredicateName} {@link RetryPredicate#name()} default is {@link RetryPredicate} */ - @ConfigValueExtractor + @ConfigMapper interface NamedConfig { @Nullable @@ -69,7 +69,7 @@ default NamedConfig getNamedConfig(String name) { private static NamedConfig merge(NamedConfig namedConfig, NamedConfig defaultConfig) { if (defaultConfig == null) { if (namedConfig.delayStep() == null) { - return new $RetryConfig_NamedConfig_ConfigValueExtractor.NamedConfig_Impl( + return new $RetryConfig_NamedConfig_ConfigValueMapper.NamedConfig_Impl( namedConfig.enabled() != null ? Boolean.TRUE.equals(namedConfig.enabled()) : true, namedConfig.delay(), Duration.ZERO, @@ -80,7 +80,7 @@ private static NamedConfig merge(NamedConfig namedConfig, NamedConfig defaultCon return namedConfig; } - return new $RetryConfig_NamedConfig_ConfigValueExtractor.NamedConfig_Impl( + return new $RetryConfig_NamedConfig_ConfigValueMapper.NamedConfig_Impl( namedConfig.enabled() != null ? Boolean.TRUE.equals(namedConfig.enabled()) : (defaultConfig.enabled() == null || Boolean.TRUE.equals(defaultConfig.enabled())), namedConfig.delay() == null ? defaultConfig.delay() : namedConfig.delay(), namedConfig.delayStep() == null ? Objects.requireNonNullElse(defaultConfig.delayStep(), Duration.ZERO) : namedConfig.delayStep(), diff --git a/resilient/resilient-kora/src/main/java/io/koraframework/resilient/retry/RetryModule.java b/resilient/resilient-kora/src/main/java/io/koraframework/resilient/retry/RetryModule.java index d412cd834..6f6d7a6c8 100644 --- a/resilient/resilient-kora/src/main/java/io/koraframework/resilient/retry/RetryModule.java +++ b/resilient/resilient-kora/src/main/java/io/koraframework/resilient/retry/RetryModule.java @@ -3,7 +3,7 @@ import io.koraframework.application.graph.All; import io.koraframework.common.annotation.DefaultComponent; import io.koraframework.config.common.Config; -import io.koraframework.config.common.extractor.ConfigValueExtractor; +import io.koraframework.config.common.mapper.ConfigValueMapper; import io.koraframework.resilient.retry.telemetry.RetryTelemetryFactory; import io.koraframework.resilient.retry.telemetry.impl.DefaultRetryLoggerFactory; import io.koraframework.resilient.retry.telemetry.impl.DefaultRetryMetricsFactory; @@ -14,8 +14,8 @@ public interface RetryModule { - default RetryConfig koraRetryableConfig(Config config, ConfigValueExtractor extractor) { - return extractor.extractOrThrow(config.get("resilient")); + default RetryConfig koraRetryableConfig(Config config, ConfigValueMapper mapper) { + return mapper.mapOrThrow(config.get("resilient")); } default RetryManager koraRetryableManager(All failurePredicates, diff --git a/resilient/resilient-kora/src/main/java/io/koraframework/resilient/retry/telemetry/RetryTelemetryConfig.java b/resilient/resilient-kora/src/main/java/io/koraframework/resilient/retry/telemetry/RetryTelemetryConfig.java index f83cbd4ab..2c3037e0e 100644 --- a/resilient/resilient-kora/src/main/java/io/koraframework/resilient/retry/telemetry/RetryTelemetryConfig.java +++ b/resilient/resilient-kora/src/main/java/io/koraframework/resilient/retry/telemetry/RetryTelemetryConfig.java @@ -1,9 +1,9 @@ package io.koraframework.resilient.retry.telemetry; -import io.koraframework.config.common.annotation.ConfigValueExtractor; +import io.koraframework.config.common.annotation.ConfigMapper; import io.koraframework.telemetry.common.TelemetryConfig; -@ConfigValueExtractor +@ConfigMapper public interface RetryTelemetryConfig extends TelemetryConfig { @Override @@ -15,13 +15,13 @@ public interface RetryTelemetryConfig extends TelemetryConfig { @Override RetryTracingConfig tracing(); - @ConfigValueExtractor + @ConfigMapper interface RetryLoggingConfig extends TelemetryConfig.LoggingConfig {} - @ConfigValueExtractor + @ConfigMapper interface RetryMetricsConfig extends TelemetryConfig.MetricsConfig {} - @ConfigValueExtractor + @ConfigMapper interface RetryTracingConfig extends TelemetryConfig.TracingConfig { @Override diff --git a/resilient/resilient-kora/src/main/java/io/koraframework/resilient/retry/telemetry/impl/DefaultRetryTelemetry.java b/resilient/resilient-kora/src/main/java/io/koraframework/resilient/retry/telemetry/impl/DefaultRetryTelemetry.java index f5f1995f5..bd148346c 100644 --- a/resilient/resilient-kora/src/main/java/io/koraframework/resilient/retry/telemetry/impl/DefaultRetryTelemetry.java +++ b/resilient/resilient-kora/src/main/java/io/koraframework/resilient/retry/telemetry/impl/DefaultRetryTelemetry.java @@ -14,10 +14,10 @@ public record TelemetryContext(String name, MeterRegistry meterRegistry) { public static final TelemetryContext EMPTY = new TelemetryContext("none", - new $RetryTelemetryConfig_ConfigValueExtractor.RetryTelemetryConfig_Impl( - new $RetryTelemetryConfig_RetryLoggingConfig_ConfigValueExtractor.RetryLoggingConfig_Defaults(), - new $RetryTelemetryConfig_RetryMetricsConfig_ConfigValueExtractor.RetryMetricsConfig_Defaults(), - new $RetryTelemetryConfig_RetryTracingConfig_ConfigValueExtractor.RetryTracingConfig_Defaults() + new $RetryTelemetryConfig_ConfigValueMapper.RetryTelemetryConfig_Impl( + new $RetryTelemetryConfig_RetryLoggingConfig_ConfigValueMapper.RetryLoggingConfig_Defaults(), + new $RetryTelemetryConfig_RetryMetricsConfig_ConfigValueMapper.RetryMetricsConfig_Defaults(), + new $RetryTelemetryConfig_RetryTracingConfig_ConfigValueMapper.RetryTracingConfig_Defaults() ), false, false, DefaultRetryTelemetryFactory.NOOP_TRACER, DefaultRetryTelemetryFactory.NOOP_METER_REGISTRY); } diff --git a/resilient/resilient-kora/src/main/java/io/koraframework/resilient/timeout/TimeoutConfig.java b/resilient/resilient-kora/src/main/java/io/koraframework/resilient/timeout/TimeoutConfig.java index 6245a4948..3e62fa16a 100644 --- a/resilient/resilient-kora/src/main/java/io/koraframework/resilient/timeout/TimeoutConfig.java +++ b/resilient/resilient-kora/src/main/java/io/koraframework/resilient/timeout/TimeoutConfig.java @@ -1,14 +1,14 @@ package io.koraframework.resilient.timeout; import org.jspecify.annotations.Nullable; -import io.koraframework.config.common.annotation.ConfigValueExtractor; +import io.koraframework.config.common.annotation.ConfigMapper; import io.koraframework.resilient.timeout.telemetry.TimeoutTelemetryConfig; import java.time.Duration; import java.util.Map; import java.util.Objects; -@ConfigValueExtractor +@ConfigMapper public interface TimeoutConfig { String DEFAULT = "default"; @@ -22,7 +22,7 @@ default Map timeout() { /** * {@link #duration} Configures maximum interval for timeout. */ - @ConfigValueExtractor + @ConfigMapper interface NamedConfig { @Nullable @@ -54,7 +54,7 @@ private static NamedConfig merge(NamedConfig namedConfig, NamedConfig defaultCon return namedConfig; } - return new $TimeoutConfig_NamedConfig_ConfigValueExtractor.NamedConfig_Impl( + return new $TimeoutConfig_NamedConfig_ConfigValueMapper.NamedConfig_Impl( namedConfig.enabled() != null ? Boolean.TRUE.equals(namedConfig.enabled()) : (defaultConfig.enabled() == null || Boolean.TRUE.equals(defaultConfig.enabled())), namedConfig.duration() == null ? defaultConfig.duration() : namedConfig.duration()); } diff --git a/resilient/resilient-kora/src/main/java/io/koraframework/resilient/timeout/TimeoutModule.java b/resilient/resilient-kora/src/main/java/io/koraframework/resilient/timeout/TimeoutModule.java index 3097dc2fd..9468fa278 100644 --- a/resilient/resilient-kora/src/main/java/io/koraframework/resilient/timeout/TimeoutModule.java +++ b/resilient/resilient-kora/src/main/java/io/koraframework/resilient/timeout/TimeoutModule.java @@ -2,7 +2,7 @@ import io.koraframework.common.annotation.DefaultComponent; import io.koraframework.config.common.Config; -import io.koraframework.config.common.extractor.ConfigValueExtractor; +import io.koraframework.config.common.mapper.ConfigValueMapper; import io.koraframework.resilient.timeout.telemetry.TimeoutTelemetryFactory; import io.koraframework.resilient.timeout.telemetry.impl.DefaultTimeoutLoggerFactory; import io.koraframework.resilient.timeout.telemetry.impl.DefaultTimeoutMetricsFactory; @@ -13,8 +13,8 @@ public interface TimeoutModule { - default TimeoutConfig koraTimeoutConfig(Config config, ConfigValueExtractor extractor) { - return extractor.extractOrThrow(config.get("resilient")); + default TimeoutConfig koraTimeoutConfig(Config config, ConfigValueMapper mapper) { + return mapper.mapOrThrow(config.get("resilient")); } default TimeoutManager koraTimeoutManager(TimeoutConfig config, diff --git a/resilient/resilient-kora/src/main/java/io/koraframework/resilient/timeout/telemetry/TimeoutTelemetryConfig.java b/resilient/resilient-kora/src/main/java/io/koraframework/resilient/timeout/telemetry/TimeoutTelemetryConfig.java index a08a71361..5c6008e3e 100644 --- a/resilient/resilient-kora/src/main/java/io/koraframework/resilient/timeout/telemetry/TimeoutTelemetryConfig.java +++ b/resilient/resilient-kora/src/main/java/io/koraframework/resilient/timeout/telemetry/TimeoutTelemetryConfig.java @@ -1,9 +1,9 @@ package io.koraframework.resilient.timeout.telemetry; -import io.koraframework.config.common.annotation.ConfigValueExtractor; +import io.koraframework.config.common.annotation.ConfigMapper; import io.koraframework.telemetry.common.TelemetryConfig; -@ConfigValueExtractor +@ConfigMapper public interface TimeoutTelemetryConfig extends TelemetryConfig { @Override @@ -15,13 +15,13 @@ public interface TimeoutTelemetryConfig extends TelemetryConfig { @Override TimeoutTracingConfig tracing(); - @ConfigValueExtractor + @ConfigMapper interface TimeoutLoggingConfig extends TelemetryConfig.LoggingConfig {} - @ConfigValueExtractor + @ConfigMapper interface TimeoutMetricsConfig extends TelemetryConfig.MetricsConfig {} - @ConfigValueExtractor + @ConfigMapper interface TimeoutTracingConfig extends TelemetryConfig.TracingConfig { @Override diff --git a/resilient/resilient-kora/src/main/java/io/koraframework/resilient/timeout/telemetry/impl/DefaultTimeoutTelemetry.java b/resilient/resilient-kora/src/main/java/io/koraframework/resilient/timeout/telemetry/impl/DefaultTimeoutTelemetry.java index 1a3c82a7c..71b25ebac 100644 --- a/resilient/resilient-kora/src/main/java/io/koraframework/resilient/timeout/telemetry/impl/DefaultTimeoutTelemetry.java +++ b/resilient/resilient-kora/src/main/java/io/koraframework/resilient/timeout/telemetry/impl/DefaultTimeoutTelemetry.java @@ -16,10 +16,10 @@ public record TelemetryContext(String name, MeterRegistry meterRegistry) { public static final TelemetryContext EMPTY = new TelemetryContext("none", - new $TimeoutTelemetryConfig_ConfigValueExtractor.TimeoutTelemetryConfig_Impl( - new $TimeoutTelemetryConfig_TimeoutLoggingConfig_ConfigValueExtractor.TimeoutLoggingConfig_Defaults(), - new $TimeoutTelemetryConfig_TimeoutMetricsConfig_ConfigValueExtractor.TimeoutMetricsConfig_Defaults(), - new $TimeoutTelemetryConfig_TimeoutTracingConfig_ConfigValueExtractor.TimeoutTracingConfig_Defaults() + new $TimeoutTelemetryConfig_ConfigValueMapper.TimeoutTelemetryConfig_Impl( + new $TimeoutTelemetryConfig_TimeoutLoggingConfig_ConfigValueMapper.TimeoutLoggingConfig_Defaults(), + new $TimeoutTelemetryConfig_TimeoutMetricsConfig_ConfigValueMapper.TimeoutMetricsConfig_Defaults(), + new $TimeoutTelemetryConfig_TimeoutTracingConfig_ConfigValueMapper.TimeoutTracingConfig_Defaults() ), false, false, DefaultTimeoutTelemetryFactory.NOOP_TRACER, DefaultTimeoutTelemetryFactory.NOOP_METER_REGISTRY); } diff --git a/resilient/resilient-kora/src/test/java/io/koraframework/resilient/circuitbreaker/KoraCircuitBreakerTests.java b/resilient/resilient-kora/src/test/java/io/koraframework/resilient/circuitbreaker/KoraCircuitBreakerTests.java index 234dda397..0ffbd457d 100644 --- a/resilient/resilient-kora/src/test/java/io/koraframework/resilient/circuitbreaker/KoraCircuitBreakerTests.java +++ b/resilient/resilient-kora/src/test/java/io/koraframework/resilient/circuitbreaker/KoraCircuitBreakerTests.java @@ -39,7 +39,7 @@ private static ConditionFactory awaitily() { @Test void switchFromClosedToOpen() { // given - final CircuitBreakerConfig.NamedConfig config = new $CircuitBreakerConfig_NamedConfig_ConfigValueExtractor.NamedConfig_Impl( + final CircuitBreakerConfig.NamedConfig config = new $CircuitBreakerConfig_NamedConfig_ConfigValueMapper.NamedConfig_Impl( true, 30, WAIT_IN_OPEN, 3, 10L, 8L, KoraCircuitBreakerPredicate.class.getCanonicalName()); final KoraCircuitBreaker circuitBreaker = new KoraCircuitBreaker("default", config, new KoraCircuitBreakerPredicate(), NoopCircuitBreakerTelemetry.INSTANCE); @@ -75,7 +75,7 @@ void switchFromClosedToOpen() { @Test void switchFromClosedToOpenForMinimumNumberOfCalls() { // given - final CircuitBreakerConfig.NamedConfig config = new $CircuitBreakerConfig_NamedConfig_ConfigValueExtractor.NamedConfig_Impl( + final CircuitBreakerConfig.NamedConfig config = new $CircuitBreakerConfig_NamedConfig_ConfigValueMapper.NamedConfig_Impl( true, 100, WAIT_IN_OPEN, 1, 2L, 2L, KoraCircuitBreakerPredicate.class.getCanonicalName()); final KoraCircuitBreaker circuitBreaker = new KoraCircuitBreaker("default", config, new KoraCircuitBreakerPredicate(), NoopCircuitBreakerTelemetry.INSTANCE); @@ -95,7 +95,7 @@ void switchFromClosedToOpenForMinimumNumberOfCalls() { @Test void switchFromClosedToOpenToHalfOpenToOpen() { // given - final CircuitBreakerConfig.NamedConfig config = new $CircuitBreakerConfig_NamedConfig_ConfigValueExtractor.NamedConfig_Impl( + final CircuitBreakerConfig.NamedConfig config = new $CircuitBreakerConfig_NamedConfig_ConfigValueMapper.NamedConfig_Impl( true, 100, WAIT_IN_OPEN, 2, 2L, 2L, KoraCircuitBreakerPredicate.class.getCanonicalName()); final KoraCircuitBreaker circuitBreaker = new KoraCircuitBreaker("default", config, new KoraCircuitBreakerPredicate(), NoopCircuitBreakerTelemetry.INSTANCE); @@ -121,7 +121,7 @@ void switchFromClosedToOpenToHalfOpenToOpen() { @Test void switchFromClosedToOpenToHalfOpenToOpenToHalfOpenToOpen() { // given - final CircuitBreakerConfig.NamedConfig config = new $CircuitBreakerConfig_NamedConfig_ConfigValueExtractor.NamedConfig_Impl( + final CircuitBreakerConfig.NamedConfig config = new $CircuitBreakerConfig_NamedConfig_ConfigValueMapper.NamedConfig_Impl( true, 100, WAIT_IN_OPEN, 2, 2L, 2L, KoraCircuitBreakerPredicate.class.getCanonicalName()); final KoraCircuitBreaker circuitBreaker = new KoraCircuitBreaker("default", config, new KoraCircuitBreakerPredicate(), NoopCircuitBreakerTelemetry.INSTANCE); @@ -154,7 +154,7 @@ void switchFromClosedToOpenToHalfOpenToOpenToHalfOpenToOpen() { @Test void switchFromClosedToOpenToHalfOpenToOpenToHalfOpenToClosed() { // given - final CircuitBreakerConfig.NamedConfig config = new $CircuitBreakerConfig_NamedConfig_ConfigValueExtractor.NamedConfig_Impl( + final CircuitBreakerConfig.NamedConfig config = new $CircuitBreakerConfig_NamedConfig_ConfigValueMapper.NamedConfig_Impl( true, 100, WAIT_IN_OPEN, 2, 2L, 2L, KoraCircuitBreakerPredicate.class.getCanonicalName()); final KoraCircuitBreaker circuitBreaker = new KoraCircuitBreaker("default", config, new KoraCircuitBreakerPredicate(), NoopCircuitBreakerTelemetry.INSTANCE); @@ -191,7 +191,7 @@ void switchFromClosedToOpenToHalfOpenToOpenToHalfOpenToClosed() { @Test void switchFromClosedToOpenToHalfOpenToOpenToHalfOpenToClosedComplex() { // given - final CircuitBreakerConfig.NamedConfig config = new $CircuitBreakerConfig_NamedConfig_ConfigValueExtractor.NamedConfig_Impl( + final CircuitBreakerConfig.NamedConfig config = new $CircuitBreakerConfig_NamedConfig_ConfigValueMapper.NamedConfig_Impl( true, 50, WAIT_IN_OPEN, 2, 4L, 2L, KoraCircuitBreakerPredicate.class.getCanonicalName()); final KoraCircuitBreaker circuitBreaker = new KoraCircuitBreaker("default", config, new KoraCircuitBreakerPredicate(), NoopCircuitBreakerTelemetry.INSTANCE); @@ -228,7 +228,7 @@ void switchFromClosedToOpenToHalfOpenToOpenToHalfOpenToClosedComplex() { @Test void switchFromClosedToOpenToHalfOpenCorrectlyRestoreIgnoredExceptionToOpen() { // given - final CircuitBreakerConfig.NamedConfig config = new $CircuitBreakerConfig_NamedConfig_ConfigValueExtractor.NamedConfig_Impl( + final CircuitBreakerConfig.NamedConfig config = new $CircuitBreakerConfig_NamedConfig_ConfigValueMapper.NamedConfig_Impl( true, 50, WAIT_IN_OPEN, 2, 4L, 2L, KoraCircuitBreakerPredicate.class.getCanonicalName()); final KoraCircuitBreaker circuitBreaker = new KoraCircuitBreaker("default", config, new CircuitBreakerPredicate() { @Override @@ -271,7 +271,7 @@ public boolean test(Throwable throwable) { @Test void switchFromClosedToOpenToHalfOpenToOpenToHalfOpenToClosedForAccept() { // given - final CircuitBreakerConfig.NamedConfig config = new $CircuitBreakerConfig_NamedConfig_ConfigValueExtractor.NamedConfig_Impl( + final CircuitBreakerConfig.NamedConfig config = new $CircuitBreakerConfig_NamedConfig_ConfigValueMapper.NamedConfig_Impl( true, 50, WAIT_IN_OPEN, 2, 4L, 2L, KoraCircuitBreakerPredicate.class.getCanonicalName()); final KoraCircuitBreaker circuitBreaker = new KoraCircuitBreaker("default", config, new KoraCircuitBreakerPredicate(), NoopCircuitBreakerTelemetry.INSTANCE); @@ -313,7 +313,7 @@ void switchFromClosedToOpenToHalfOpenToOpenToHalfOpenToClosedForAccept() { @Test void switchFromClosedToOpenToHalfOpenToOpenToHalfOpenWhenPartFailToOpen() { // given - final CircuitBreakerConfig.NamedConfig config = new $CircuitBreakerConfig_NamedConfig_ConfigValueExtractor.NamedConfig_Impl( + final CircuitBreakerConfig.NamedConfig config = new $CircuitBreakerConfig_NamedConfig_ConfigValueMapper.NamedConfig_Impl( true, 100, WAIT_IN_OPEN, 2, 2L, 2L, KoraCircuitBreakerPredicate.class.getCanonicalName()); final KoraCircuitBreaker circuitBreaker = new KoraCircuitBreaker("default", config, new KoraCircuitBreakerPredicate(), NoopCircuitBreakerTelemetry.INSTANCE); @@ -350,7 +350,7 @@ void switchFromClosedToOpenToHalfOpenToOpenToHalfOpenWhenPartFailToOpen() { @Test void switchFromClosedToOpenToHalfOpenToClosed() { // given - final CircuitBreakerConfig.NamedConfig config = new $CircuitBreakerConfig_NamedConfig_ConfigValueExtractor.NamedConfig_Impl( + final CircuitBreakerConfig.NamedConfig config = new $CircuitBreakerConfig_NamedConfig_ConfigValueMapper.NamedConfig_Impl( true, 100, WAIT_IN_OPEN, 2, 2L, 2L, KoraCircuitBreakerPredicate.class.getCanonicalName()); final KoraCircuitBreaker circuitBreaker = new KoraCircuitBreaker("default", config, new KoraCircuitBreakerPredicate(), NoopCircuitBreakerTelemetry.INSTANCE); @@ -378,7 +378,7 @@ void switchFromClosedToOpenToHalfOpenToClosed() { @Test void switchFromOpenToHalfOpenAndValidateAcquireCalls() { // given - final CircuitBreakerConfig.NamedConfig config = new $CircuitBreakerConfig_NamedConfig_ConfigValueExtractor.NamedConfig_Impl( + final CircuitBreakerConfig.NamedConfig config = new $CircuitBreakerConfig_NamedConfig_ConfigValueMapper.NamedConfig_Impl( true, 100, WAIT_IN_OPEN, 1, 1L, 1L, KoraCircuitBreakerPredicate.class.getCanonicalName()); final KoraCircuitBreaker circuitBreaker = new KoraCircuitBreaker("default", config, new KoraCircuitBreakerPredicate(), NoopCircuitBreakerTelemetry.INSTANCE); @@ -402,7 +402,7 @@ void switchFromOpenToHalfOpenAndValidateAcquireCalls() { @Test void switchFromClosedToOpenForCustomFailurePredicate() { // given - final CircuitBreakerConfig.NamedConfig config = new $CircuitBreakerConfig_NamedConfig_ConfigValueExtractor.NamedConfig_Impl( + final CircuitBreakerConfig.NamedConfig config = new $CircuitBreakerConfig_NamedConfig_ConfigValueMapper.NamedConfig_Impl( true, 100, WAIT_IN_OPEN, 1, 1L, 1L, "custom"); final KoraCircuitBreaker circuitBreaker = new KoraCircuitBreaker("default", config, new CustomPredicate(), NoopCircuitBreakerTelemetry.INSTANCE); diff --git a/resilient/resilient-symbol-processor/src/test/kotlin/io/koraframework/resilient/circuitbreaker/CircuitBreakerTests.kt b/resilient/resilient-symbol-processor/src/test/kotlin/io/koraframework/resilient/circuitbreaker/CircuitBreakerTests.kt index 41c9cca66..9b2c2ae49 100644 --- a/resilient/resilient-symbol-processor/src/test/kotlin/io/koraframework/resilient/circuitbreaker/CircuitBreakerTests.kt +++ b/resilient/resilient-symbol-processor/src/test/kotlin/io/koraframework/resilient/circuitbreaker/CircuitBreakerTests.kt @@ -25,7 +25,7 @@ class CircuitBreakerTests { @Test fun switchFromClosedToOpenToHalfOpenToOpenToHalfOpenToClosedForAccept() { // given - val config: CircuitBreakerConfig.NamedConfig = `$CircuitBreakerConfig_NamedConfig_ConfigValueExtractor`.NamedConfig_Impl( + val config: CircuitBreakerConfig.NamedConfig = `$CircuitBreakerConfig_NamedConfig_ConfigValueMapper`.NamedConfig_Impl( true, 50, WAIT_IN_OPEN, 2, 4L, 2L, KoraCircuitBreakerPredicate::class.java.canonicalName ) val circuitBreaker = KoraCircuitBreaker("default", config, KoraCircuitBreakerPredicate(), NoopCircuitBreakerTelemetry.INSTANCE) diff --git a/resilient/resilient-symbol-processor/src/test/kotlin/io/koraframework/resilient/symbol/processor/aop/testdata/AppWithConfig.kt b/resilient/resilient-symbol-processor/src/test/kotlin/io/koraframework/resilient/symbol/processor/aop/testdata/AppWithConfig.kt index 729fd03c9..a1367d11d 100644 --- a/resilient/resilient-symbol-processor/src/test/kotlin/io/koraframework/resilient/symbol/processor/aop/testdata/AppWithConfig.kt +++ b/resilient/resilient-symbol-processor/src/test/kotlin/io/koraframework/resilient/symbol/processor/aop/testdata/AppWithConfig.kt @@ -3,7 +3,7 @@ package io.koraframework.resilient.symbol.processor.aop.testdata import com.typesafe.config.Config import com.typesafe.config.ConfigFactory import io.koraframework.common.annotation.KoraApp -import io.koraframework.config.common.extractor.ConfigValueExtractorModule +import io.koraframework.config.common.mapper.ConfigValueMapperModule import io.koraframework.config.common.origin.SimpleConfigOrigin import io.koraframework.config.hocon.HoconConfigFactory import io.koraframework.resilient.circuitbreaker.CircuitBreakerModule @@ -13,7 +13,7 @@ import io.koraframework.resilient.retry.RetryModule import io.koraframework.resilient.timeout.TimeoutModule @KoraApp -interface AppWithConfig : ConfigValueExtractorModule, CircuitBreakerModule, RetryModule, TimeoutModule, FallbackModule, RateLimiterModule { +interface AppWithConfig : ConfigValueMapperModule, CircuitBreakerModule, RetryModule, TimeoutModule, FallbackModule, RateLimiterModule { fun config(config: Config) = HoconConfigFactory.fromHocon(SimpleConfigOrigin("test"), config) fun config() = ConfigFactory.parseString( diff --git a/scheduling/scheduling-annotation-processor/src/main/java/io/koraframework/scheduling/annotation/processor/JdkSchedulingGenerator.java b/scheduling/scheduling-annotation-processor/src/main/java/io/koraframework/scheduling/annotation/processor/JdkSchedulingGenerator.java index 567592c87..d1f2afb99 100644 --- a/scheduling/scheduling-annotation-processor/src/main/java/io/koraframework/scheduling/annotation/processor/JdkSchedulingGenerator.java +++ b/scheduling/scheduling-annotation-processor/src/main/java/io/koraframework/scheduling/annotation/processor/JdkSchedulingGenerator.java @@ -12,7 +12,6 @@ import java.time.Duration; import java.time.temporal.ChronoUnit; import java.util.Map; -import java.util.Optional; public class JdkSchedulingGenerator { public static ClassName scheduleAtFixedRate = ClassName.get("io.koraframework.scheduling.jdk.annotation", "ScheduleAtFixedRate"); @@ -85,7 +84,7 @@ private void generateScheduleWithCron(TypeElement type, Element method, TypeSpec .addAnnotation(AnnotationUtils.generated(JdkSchedulingGenerator.class)) .addModifiers(Modifier.PUBLIC) .addSuperinterface(schedulingJobConfigClassName) - .addAnnotation(CommonClassNames.configValueExtractorAnnotation); + .addAnnotation(CommonClassNames.configMapperAnnotation); if (cron == null || cron.isBlank()) { config.addMethod(MethodSpec.methodBuilder("cron") @@ -142,7 +141,7 @@ private void generateScheduleOnce(TypeElement type, Element method, TypeSpec.Bui .addAnnotation(AnnotationUtils.generated(JdkSchedulingGenerator.class)) .addModifiers(Modifier.PUBLIC) .addSuperinterface(schedulingJobConfigClassName) - .addAnnotation(CommonClassNames.configValueExtractorAnnotation); + .addAnnotation(CommonClassNames.configMapperAnnotation); if (delay == null || delay == 0) { config.addMethod(MethodSpec.methodBuilder("delay") @@ -200,7 +199,7 @@ private void generateScheduleWithFixedDelay(TypeElement type, Element method, Ty .addAnnotation(AnnotationUtils.generated(JdkSchedulingGenerator.class)) .addModifiers(Modifier.PUBLIC) .addSuperinterface(schedulingJobConfigClassName) - .addAnnotation(CommonClassNames.configValueExtractorAnnotation); + .addAnnotation(CommonClassNames.configMapperAnnotation); componentMethod.addParameter(ClassName.get(packageName, configClassName), "config"); if (delay == null || delay == 0) { @@ -266,7 +265,7 @@ private void generateScheduleAtFixedRate(TypeElement type, Element method, TypeS .addAnnotation(AnnotationUtils.generated(JdkSchedulingGenerator.class)) .addModifiers(Modifier.PUBLIC) .addSuperinterface(schedulingJobConfigClassName) - .addAnnotation(CommonClassNames.configValueExtractorAnnotation); + .addAnnotation(CommonClassNames.configMapperAnnotation); if (period == null || period == 0) { config.addMethod(MethodSpec.methodBuilder("period") .returns(Duration.class) @@ -307,12 +306,12 @@ private static MethodSpec configComponent(String packageName, String configClass .addParameter(CommonClassNames.config, "config") .addParameter( ParameterizedTypeName.get( - ClassName.get("io.koraframework.config.common.extractor", "ConfigValueExtractor"), + ClassName.get("io.koraframework.config.common.mapper", "ConfigValueMapper"), ClassName.get(packageName, configClassName) ), - "extractor" + "mapper" ) - .addStatement("return extractor.extractOrThrow(config.get($S))", configPath) + .addStatement("return mapper.mapOrThrow(config.get($S))", configPath) .returns(ClassName.get(packageName, configClassName)) .build(); @@ -323,26 +322,26 @@ private static MethodSpec cronConfigComponent(String packageName, String configC var method = MethodSpec.methodBuilder(configClassName) .addModifiers(Modifier.DEFAULT, Modifier.PUBLIC) .addParameter(CommonClassNames.config, "config") - .addParameter(ParameterizedTypeName.get(CommonClassNames.configValueExtractor, configType), "extractor") + .addParameter(ParameterizedTypeName.get(CommonClassNames.configValueMapper, configType), "mapper") .returns(configType) .addStatement("var value = config.get($S)", configPath); if (defaultCron != null && !defaultCron.isBlank()) { method.beginControlFlow("if (value instanceof $T.NullValue)", CommonClassNames.configValue) - .addCode("return extractor.extractOrThrow($>\n") + .addCode("return mapper.mapOrThrow($>\n") .addCode("new $T.ObjectValue(value.origin(), $T.of($S, new $T.StringValue(value.origin(), $S)))", CommonClassNames.configValue, Map.class, "cron", CommonClassNames.configValue, defaultCron) .addCode("$<\n);\n") .endControlFlow(); } method.beginControlFlow("if (value instanceof $T.StringValue str)", CommonClassNames.configValue) .addStatement("var cron = str.value()") - .addCode("return extractor.extractOrThrow($>\n") + .addCode("return mapper.mapOrThrow($>\n") .addCode("new $T.ObjectValue(value.origin(), $T.of($S, new $T.StringValue(value.origin(), cron)))", CommonClassNames.configValue, Map.class, "cron", CommonClassNames.configValue) .addCode("$<\n);\n") .nextControlFlow("else if (value instanceof $T.ObjectValue obj)", CommonClassNames.configValue) - .addStatement("return extractor.extractOrThrow(obj)") + .addStatement("return mapper.mapOrThrow(obj)") .nextControlFlow("else") - .addStatement("throw $T.unexpectedValueType(value, $T.StringValue.class)", CommonClassNames.configValueExtractionException, CommonClassNames.configValue) + .addStatement("throw $T.unexpectedValueType(value, $T.StringValue.class)", CommonClassNames.configValueException, CommonClassNames.configValue) .endControlFlow(); return method.build(); } diff --git a/scheduling/scheduling-annotation-processor/src/main/java/io/koraframework/scheduling/annotation/processor/QuartzSchedulingGenerator.java b/scheduling/scheduling-annotation-processor/src/main/java/io/koraframework/scheduling/annotation/processor/QuartzSchedulingGenerator.java index e3100b4fd..694b31ed7 100644 --- a/scheduling/scheduling-annotation-processor/src/main/java/io/koraframework/scheduling/annotation/processor/QuartzSchedulingGenerator.java +++ b/scheduling/scheduling-annotation-processor/src/main/java/io/koraframework/scheduling/annotation/processor/QuartzSchedulingGenerator.java @@ -64,12 +64,12 @@ public void generate(TypeElement type, ExecutableElement method, TypeSpec.Builde .addModifiers(Modifier.PUBLIC, Modifier.DEFAULT) .returns(configClassName) .addParameter(CommonClassNames.config, "config") - .addParameter(ParameterizedTypeName.get(CommonClassNames.configValueExtractor, configClassName), "extractor"); + .addParameter(ParameterizedTypeName.get(CommonClassNames.configValueMapper, configClassName), "mapper"); if (cron != null && !cron.isBlank()) { b.addStatement("var value = config.get($S)", configPath); b.beginControlFlow("if (value instanceof $T.NullValue)", CommonClassNames.configValue) - .addCode("return extractor.extractOrThrow($>\n") + .addCode("return mapper.mapOrThrow($>\n") .addCode("new $T.ObjectValue(value.origin(), $T.of($S, new $T.StringValue(value.origin(), $S)))", CommonClassNames.configValue, Map.class, "cron", CommonClassNames.configValue, cron) .addCode("$<\n);\n") .endControlFlow(); @@ -78,13 +78,13 @@ public void generate(TypeElement type, ExecutableElement method, TypeSpec.Builde } b.beginControlFlow("if (value instanceof $T.StringValue str)", CommonClassNames.configValue) .addStatement("var cron = str.value()") - .addCode("return extractor.extractOrThrow($>\n") + .addCode("return mapper.mapOrThrow($>\n") .addCode("new $T.ObjectValue(value.origin(), $T.of($S, new $T.StringValue(value.origin(), cron)))", CommonClassNames.configValue, Map.class, "cron", CommonClassNames.configValue) .addCode("$<\n);\n") .nextControlFlow("else if (value instanceof $T.ObjectValue obj)", CommonClassNames.configValue) - .addStatement("return extractor.extractOrThrow(obj)") + .addStatement("return mapper.mapOrThrow(obj)") .nextControlFlow("else") - .addStatement("throw io.koraframework.config.common.extractor.ConfigValueExtractionException.unexpectedValueType(value, $T.StringValue.class)", CommonClassNames.configValue) + .addStatement("throw io.koraframework.config.common.exception.ConfigValueException.unexpectedValueType(value, $T.StringValue.class)", CommonClassNames.configValue) .endControlFlow(); module.addMethod(b.build()); @@ -123,7 +123,7 @@ private ClassName generateCronConfigRecord(TypeElement type, ExecutableElement m .addOriginatingElement(method) .addAnnotation(AnnotationUtils.generated(JdkSchedulingGenerator.class)) .addModifiers(Modifier.PUBLIC) - .addAnnotation(CommonClassNames.configValueExtractorAnnotation) + .addAnnotation(CommonClassNames.configMapperAnnotation) .addSuperinterface(schedulingJobConfigClassName); if (defaultCron != null && !defaultCron.isBlank()) { diff --git a/scheduling/scheduling-common/src/main/java/io/koraframework/scheduling/common/SchedulingJobConfig.java b/scheduling/scheduling-common/src/main/java/io/koraframework/scheduling/common/SchedulingJobConfig.java index c1c1c8333..72e51dc6f 100644 --- a/scheduling/scheduling-common/src/main/java/io/koraframework/scheduling/common/SchedulingJobConfig.java +++ b/scheduling/scheduling-common/src/main/java/io/koraframework/scheduling/common/SchedulingJobConfig.java @@ -1,17 +1,17 @@ package io.koraframework.scheduling.common; -import io.koraframework.config.common.annotation.ConfigValueExtractor; +import io.koraframework.config.common.annotation.ConfigMapper; import org.jspecify.annotations.Nullable; import java.time.Duration; import java.util.Map; -@ConfigValueExtractor +@ConfigMapper public interface SchedulingJobConfig { JobTelemetryConfig telemetry(); - @ConfigValueExtractor + @ConfigMapper interface JobTelemetryConfig { JobLoggingConfig logging(); @@ -20,13 +20,13 @@ interface JobTelemetryConfig { JobTracingConfig tracing(); - @ConfigValueExtractor + @ConfigMapper interface JobLoggingConfig { @Nullable Boolean enabled(); } - @ConfigValueExtractor + @ConfigMapper interface JobMetricsConfig { @Nullable Boolean enabled(); @@ -37,7 +37,7 @@ interface JobMetricsConfig { Map tags(); } - @ConfigValueExtractor + @ConfigMapper interface JobTracingConfig { @Nullable Boolean enabled(); diff --git a/scheduling/scheduling-common/src/main/java/io/koraframework/scheduling/common/SchedulingModule.java b/scheduling/scheduling-common/src/main/java/io/koraframework/scheduling/common/SchedulingModule.java index 73683770d..406064d42 100644 --- a/scheduling/scheduling-common/src/main/java/io/koraframework/scheduling/common/SchedulingModule.java +++ b/scheduling/scheduling-common/src/main/java/io/koraframework/scheduling/common/SchedulingModule.java @@ -2,7 +2,7 @@ import io.koraframework.common.annotation.DefaultComponent; import io.koraframework.config.common.Config; -import io.koraframework.config.common.extractor.ConfigValueExtractor; +import io.koraframework.config.common.mapper.ConfigValueMapper; import io.koraframework.scheduling.common.telemetry.SchedulingTelemetryConfig; import io.koraframework.scheduling.common.telemetry.SchedulingTelemetryFactory; import io.koraframework.scheduling.common.telemetry.impl.DefaultSchedulingLoggerFactory; @@ -14,8 +14,8 @@ public interface SchedulingModule { - default SchedulingTelemetryConfig schedulingTelemetryConfig(Config config, ConfigValueExtractor extractor) { - return extractor.extractOrThrow(config.get("scheduling.telemetry")); + default SchedulingTelemetryConfig schedulingTelemetryConfig(Config config, ConfigValueMapper mapper) { + return mapper.mapOrThrow(config.get("scheduling.telemetry")); } @DefaultComponent diff --git a/scheduling/scheduling-common/src/main/java/io/koraframework/scheduling/common/telemetry/SchedulingTelemetryConfig.java b/scheduling/scheduling-common/src/main/java/io/koraframework/scheduling/common/telemetry/SchedulingTelemetryConfig.java index 2a6a6c683..959af35d6 100644 --- a/scheduling/scheduling-common/src/main/java/io/koraframework/scheduling/common/telemetry/SchedulingTelemetryConfig.java +++ b/scheduling/scheduling-common/src/main/java/io/koraframework/scheduling/common/telemetry/SchedulingTelemetryConfig.java @@ -1,9 +1,9 @@ package io.koraframework.scheduling.common.telemetry; -import io.koraframework.config.common.annotation.ConfigValueExtractor; +import io.koraframework.config.common.annotation.ConfigMapper; import io.koraframework.telemetry.common.TelemetryConfig; -@ConfigValueExtractor +@ConfigMapper public interface SchedulingTelemetryConfig extends TelemetryConfig { @Override @@ -15,12 +15,12 @@ public interface SchedulingTelemetryConfig extends TelemetryConfig { @Override SchedulingTracingConfig tracing(); - @ConfigValueExtractor + @ConfigMapper interface SchedulingLoggingConfig extends TelemetryConfig.LoggingConfig {} - @ConfigValueExtractor + @ConfigMapper interface SchedulingMetricsConfig extends TelemetryConfig.MetricsConfig {} - @ConfigValueExtractor + @ConfigMapper interface SchedulingTracingConfig extends TelemetryConfig.TracingConfig {} } diff --git a/scheduling/scheduling-jdk/src/main/java/io/koraframework/scheduling/jdk/SchedulingJdkConfig.java b/scheduling/scheduling-jdk/src/main/java/io/koraframework/scheduling/jdk/SchedulingJdkConfig.java index 82cb1836b..e56e96f70 100644 --- a/scheduling/scheduling-jdk/src/main/java/io/koraframework/scheduling/jdk/SchedulingJdkConfig.java +++ b/scheduling/scheduling-jdk/src/main/java/io/koraframework/scheduling/jdk/SchedulingJdkConfig.java @@ -1,10 +1,10 @@ package io.koraframework.scheduling.jdk; -import io.koraframework.config.common.annotation.ConfigValueExtractor; +import io.koraframework.config.common.annotation.ConfigMapper; import java.time.Duration; -@ConfigValueExtractor +@ConfigMapper public interface SchedulingJdkConfig { default Duration shutdownWait() { diff --git a/scheduling/scheduling-jdk/src/main/java/io/koraframework/scheduling/jdk/SchedulingJdkModule.java b/scheduling/scheduling-jdk/src/main/java/io/koraframework/scheduling/jdk/SchedulingJdkModule.java index 647be4c88..920d74148 100644 --- a/scheduling/scheduling-jdk/src/main/java/io/koraframework/scheduling/jdk/SchedulingJdkModule.java +++ b/scheduling/scheduling-jdk/src/main/java/io/koraframework/scheduling/jdk/SchedulingJdkModule.java @@ -4,14 +4,14 @@ import io.koraframework.application.graph.ValueOf; import io.koraframework.common.annotation.DefaultComponent; import io.koraframework.config.common.Config; -import io.koraframework.config.common.extractor.ConfigValueExtractor; +import io.koraframework.config.common.mapper.ConfigValueMapper; import io.koraframework.scheduling.common.SchedulingJobConfig; import io.koraframework.scheduling.common.SchedulingModule; public interface SchedulingJdkModule extends SchedulingModule { - default SchedulingJdkConfig schedulingJdkConfig(Config config, ConfigValueExtractor extractor) { - return extractor.extractOrThrow(config.get("scheduling.jdk")); + default SchedulingJdkConfig schedulingJdkConfig(Config config, ConfigValueMapper mapper) { + return mapper.mapOrThrow(config.get("scheduling.jdk")); } @DefaultComponent diff --git a/scheduling/scheduling-quartz/src/main/java/io/koraframework/scheduling/quartz/QuartzModule.java b/scheduling/scheduling-quartz/src/main/java/io/koraframework/scheduling/quartz/QuartzModule.java index 71af5d4d1..5dfd9232d 100644 --- a/scheduling/scheduling-quartz/src/main/java/io/koraframework/scheduling/quartz/QuartzModule.java +++ b/scheduling/scheduling-quartz/src/main/java/io/koraframework/scheduling/quartz/QuartzModule.java @@ -7,7 +7,7 @@ import io.koraframework.common.annotation.Tag; import io.koraframework.common.annotation.Root; import io.koraframework.config.common.Config; -import io.koraframework.config.common.extractor.ConfigValueExtractor; +import io.koraframework.config.common.mapper.ConfigValueMapper; import io.koraframework.scheduling.common.SchedulingModule; import java.io.IOException; @@ -16,7 +16,7 @@ public interface QuartzModule extends SchedulingModule { @Tag(QuartzModule.class) - default Properties quartzProperties(Config config, ConfigValueExtractor extractor) throws IOException { + default Properties quartzProperties(Config config, ConfigValueMapper mapper) throws IOException { var value = config.get("scheduling.quartz.properties"); var defaults = new Properties(); try (var is = Thread.currentThread().getContextClassLoader().getResourceAsStream("org/quartz/quartz.properties")) { @@ -27,7 +27,7 @@ default Properties quartzProperties(Config config, ConfigValueExtractor extractor) { - return extractor.extractOrThrow(config.get("scheduling.quartz")); + default SchedulingQuartzConfig schedulingQuartzConfig(Config config, ConfigValueMapper mapper) { + return mapper.mapOrThrow(config.get("scheduling.quartz")); } default KoraQuartzJobFactory koraQuartzJobFactory(All> jobs) { diff --git a/scheduling/scheduling-quartz/src/main/java/io/koraframework/scheduling/quartz/SchedulingQuartzConfig.java b/scheduling/scheduling-quartz/src/main/java/io/koraframework/scheduling/quartz/SchedulingQuartzConfig.java index 9188510a7..f26332e65 100644 --- a/scheduling/scheduling-quartz/src/main/java/io/koraframework/scheduling/quartz/SchedulingQuartzConfig.java +++ b/scheduling/scheduling-quartz/src/main/java/io/koraframework/scheduling/quartz/SchedulingQuartzConfig.java @@ -1,8 +1,8 @@ package io.koraframework.scheduling.quartz; -import io.koraframework.config.common.annotation.ConfigValueExtractor; +import io.koraframework.config.common.annotation.ConfigMapper; -@ConfigValueExtractor +@ConfigMapper public interface SchedulingQuartzConfig { default boolean waitForJobComplete() { diff --git a/scheduling/scheduling-quartz/src/test/java/io/koraframework/scheduling/quartz/KoraQuartzConfigTests.java b/scheduling/scheduling-quartz/src/test/java/io/koraframework/scheduling/quartz/KoraQuartzConfigTests.java index b59a21ed5..8eb02e2b3 100644 --- a/scheduling/scheduling-quartz/src/test/java/io/koraframework/scheduling/quartz/KoraQuartzConfigTests.java +++ b/scheduling/scheduling-quartz/src/test/java/io/koraframework/scheduling/quartz/KoraQuartzConfigTests.java @@ -1,12 +1,12 @@ package io.koraframework.scheduling.quartz; +import io.koraframework.config.common.mapper.ConfigValueMapper; import org.junit.jupiter.api.Test; import org.mockito.Mockito; import io.koraframework.config.common.Config; import io.koraframework.config.common.ConfigValue; import io.koraframework.config.common.ConfigValueOrigin; import io.koraframework.config.common.ConfigValuePath; -import io.koraframework.config.common.extractor.ConfigValueExtractor; import io.koraframework.config.common.origin.SimpleConfigOrigin; import java.util.List; @@ -26,11 +26,11 @@ void configDefaultsNotSame() throws Exception { defaults.load(is); } - var mockExtractor = Mockito.mock(ConfigValueExtractor.class); + var mockExtractor = Mockito.mock(ConfigValueMapper.class); var mockConfig = Mockito.mock(Config.class); ConfigValue stringValue = new ConfigValue.StringValue(ConfigValueOrigin.of(new SimpleConfigOrigin(""), ConfigValuePath.ROOT), "some"); - when(mockExtractor.extract(any())).thenReturn(null); + when(mockExtractor.map(any())).thenReturn(null); when(mockConfig.get(anyString())).thenReturn(stringValue); Properties properties = new QuartzModule() {}.quartzProperties(mockConfig, mockExtractor); @@ -40,11 +40,11 @@ void configDefaultsNotSame() throws Exception { @Test void quartzNameChanged() throws Exception { - var mockExtractor = Mockito.mock(ConfigValueExtractor.class); + var mockExtractor = Mockito.mock(ConfigValueMapper.class); var mockConfig = Mockito.mock(Config.class); ConfigValue stringValue = new ConfigValue.StringValue(ConfigValueOrigin.of(new SimpleConfigOrigin(""), ConfigValuePath.ROOT), "some"); - when(mockExtractor.extract(any())).thenReturn(null); + when(mockExtractor.map(any())).thenReturn(null); when(mockConfig.get(anyString())).thenReturn(stringValue); QuartzModule quartzModule = new QuartzModule() {}; diff --git a/scheduling/scheduling-symbol-processor/src/main/kotlin/io/koraframework/scheduling/symbol/processor/JdkSchedulingGenerator.kt b/scheduling/scheduling-symbol-processor/src/main/kotlin/io/koraframework/scheduling/symbol/processor/JdkSchedulingGenerator.kt index 63b398bc9..3cc7d7957 100644 --- a/scheduling/scheduling-symbol-processor/src/main/kotlin/io/koraframework/scheduling/symbol/processor/JdkSchedulingGenerator.kt +++ b/scheduling/scheduling-symbol-processor/src/main/kotlin/io/koraframework/scheduling/symbol/processor/JdkSchedulingGenerator.kt @@ -200,10 +200,10 @@ class JdkSchedulingGenerator(val environment: SymbolProcessorEnvironment) { private fun configComponent(packageName: String, configClassName: String, configPath: String) = FunSpec.builder(configClassName) .addParameter("config", CommonClassNames.config) .addParameter( - "extractor", CommonClassNames.configValueExtractor + "mapper", CommonClassNames.configValueMapper .parameterizedBy(ClassName(packageName, configClassName)) ) - .addStatement("return extractor.extractOrThrow(config.get(%S))", configPath) + .addStatement("return mapper.mapOrThrow(config.get(%S))", configPath) .returns(ClassName(packageName, configClassName)) .build() @@ -213,7 +213,7 @@ class JdkSchedulingGenerator(val environment: SymbolProcessorEnvironment) { private fun configType(type: KSClassDeclaration, function: KSFunctionDeclaration, vararg params: ConfigParameter): TypeSpec { val configClassName = type.getOuterClassesAsPrefix() + type.simpleName.getShortName() + "_" + function.simpleName.getShortName() + "_Config" val configType = TypeSpec.interfaceBuilder(configClassName) - .addAnnotation(CommonClassNames.configValueExtractorAnnotation) + .addAnnotation(CommonClassNames.configMapperAnnotation) .generated(JdkSchedulingGenerator::class) .addSuperinterface(schedulingJobConfigClassName) for (param in params) { @@ -234,7 +234,7 @@ class JdkSchedulingGenerator(val environment: SymbolProcessorEnvironment) { private fun cronConfigType(type: KSClassDeclaration, function: KSFunctionDeclaration, defaultCron: String): TypeSpec { val configClassName = type.getOuterClassesAsPrefix() + type.simpleName.getShortName() + "_" + function.simpleName.getShortName() + "_Config" val configType = TypeSpec.interfaceBuilder(configClassName) - .addAnnotation(CommonClassNames.configValueExtractorAnnotation) + .addAnnotation(CommonClassNames.configMapperAnnotation) .generated(JdkSchedulingGenerator::class) .addSuperinterface(schedulingJobConfigClassName) if (defaultCron.isBlank()) { @@ -247,28 +247,28 @@ class JdkSchedulingGenerator(val environment: SymbolProcessorEnvironment) { private fun cronConfigComponent(packageName: String, configClassName: String, configPath: String, defaultCron: String) = FunSpec.builder(configClassName) .addParameter("config", CommonClassNames.config) - .addParameter("extractor", CommonClassNames.configValueExtractor.parameterizedBy(ClassName(packageName, configClassName))) + .addParameter("mapper", CommonClassNames.configValueMapper.parameterizedBy(ClassName(packageName, configClassName))) .addStatement("val value = config.get(%S)", configPath) .apply { if (defaultCron.isNotBlank()) { controlFlow("if (value is %T.NullValue)", CommonClassNames.configValue) { - addCode("return extractor.extractOrThrow(\n") + addCode("return mapper.mapOrThrow(\n") addCode(" %T.ObjectValue(value.origin(), mapOf(%S to %T.StringValue(value.origin(), %S)))\n", CommonClassNames.configValue, "cron", CommonClassNames.configValue, defaultCron) addCode(")!!\n") } } } .controlFlow("if (value is %T.ObjectValue)", CommonClassNames.configValue) { - addStatement("return extractor.extractOrThrow(value)!!") + addStatement("return mapper.mapOrThrow(value)!!") } .controlFlow("if (value is %T.StringValue)", CommonClassNames.configValue) { - addCode("return extractor.extractOrThrow(\n") + addCode("return mapper.mapOrThrow(\n") addCode(" %T.ObjectValue(value.origin(), mapOf(%S to %T.StringValue(value.origin(), value.value())))\n", CommonClassNames.configValue, "cron", CommonClassNames.configValue) addCode(")!!\n") nextControlFlow("else") addStatement( "throw %T.unexpectedValueType(value, %T.StringValue::class.java)", - ClassName("io.koraframework.config.common.extractor", "ConfigValueExtractionException"), + ClassName("io.koraframework.config.common.exception", "ConfigValueException"), CommonClassNames.configValue ) } diff --git a/scheduling/scheduling-symbol-processor/src/main/kotlin/io/koraframework/scheduling/symbol/processor/QuartzSchedulingGenerator.kt b/scheduling/scheduling-symbol-processor/src/main/kotlin/io/koraframework/scheduling/symbol/processor/QuartzSchedulingGenerator.kt index f6e997ce5..2f0e3318b 100644 --- a/scheduling/scheduling-symbol-processor/src/main/kotlin/io/koraframework/scheduling/symbol/processor/QuartzSchedulingGenerator.kt +++ b/scheduling/scheduling-symbol-processor/src/main/kotlin/io/koraframework/scheduling/symbol/processor/QuartzSchedulingGenerator.kt @@ -65,11 +65,11 @@ class QuartzSchedulingGenerator(val env: SymbolProcessorEnvironment) { val b = FunSpec.builder(configClassName.simpleName) .returns(configClassName) .addParameter("config", CommonClassNames.config) - .addParameter("extractor", CommonClassNames.configValueExtractor.parameterizedBy(configClassName)) + .addParameter("mapper", CommonClassNames.configValueMapper.parameterizedBy(configClassName)) if (cron.isNotBlank()) { b.addStatement("val value = config.get(%S)", configPath) b.controlFlow("if (value is %T.NullValue)", CommonClassNames.configValue) { - addCode("return extractor.extractOrThrow(\n") + addCode("return mapper.mapOrThrow(\n") addCode(" %T.ObjectValue(value.origin(), mapOf(%S to %T.StringValue(value.origin(), %S)))\n", CommonClassNames.configValue, "cron", CommonClassNames.configValue, cron) addCode(")!!\n") } @@ -77,16 +77,16 @@ class QuartzSchedulingGenerator(val env: SymbolProcessorEnvironment) { b.addStatement("val value = config.get(%S)!!", configPath) } b.controlFlow("if (value is %T.ObjectValue)", CommonClassNames.configValue) { - addStatement("return extractor.extractOrThrow(value)!!") + addStatement("return mapper.mapOrThrow(value)!!") } b.controlFlow("if (value is %T.StringValue)", CommonClassNames.configValue) { - addCode("return extractor.extractOrThrow(\n") + addCode("return mapper.mapOrThrow(\n") addCode(" %T.ObjectValue(value.origin(), mapOf(%S to %T.StringValue(value.origin(), value.value())))\n", CommonClassNames.configValue, "cron", CommonClassNames.configValue) addCode(")!!\n") nextControlFlow("else") addStatement( "throw %T.unexpectedValueType(value, %T.StringValue::class.java)", - ClassName("io.koraframework.config.common.extractor", "ConfigValueExtractionException"), + ClassName("io.koraframework.config.common.exception", "ConfigValueException"), CommonClassNames.configValue ) } @@ -163,7 +163,7 @@ class QuartzSchedulingGenerator(val env: SymbolProcessorEnvironment) { private fun generateCronConfigRecord(type: KSClassDeclaration, function: KSFunctionDeclaration, defaultCron: String): ClassName { val configClassName = type.getOuterClassesAsPrefix() + type.simpleName.getShortName() + "_" + function.simpleName.getShortName() + "_CronConfig" val configType = TypeSpec.interfaceBuilder(configClassName) - .addAnnotation(CommonClassNames.configValueExtractorAnnotation) + .addAnnotation(CommonClassNames.configMapperAnnotation) .generated(QuartzSchedulingGenerator::class) .addSuperinterface(schedulingJobConfigClassName) diff --git a/telemetry/telemetry-common/src/main/java/io/koraframework/telemetry/common/TelemetryConfig.java b/telemetry/telemetry-common/src/main/java/io/koraframework/telemetry/common/TelemetryConfig.java index 00f7767d1..9526539fa 100644 --- a/telemetry/telemetry-common/src/main/java/io/koraframework/telemetry/common/TelemetryConfig.java +++ b/telemetry/telemetry-common/src/main/java/io/koraframework/telemetry/common/TelemetryConfig.java @@ -1,11 +1,11 @@ package io.koraframework.telemetry.common; -import io.koraframework.config.common.annotation.ConfigValueExtractor; +import io.koraframework.config.common.annotation.ConfigMapper; import java.time.Duration; import java.util.Map; -@ConfigValueExtractor +@ConfigMapper public interface TelemetryConfig { LoggingConfig logging(); @@ -14,7 +14,7 @@ public interface TelemetryConfig { MetricsConfig metrics(); - @ConfigValueExtractor + @ConfigMapper interface LoggingConfig { default boolean enabled() { @@ -22,7 +22,7 @@ default boolean enabled() { } } - @ConfigValueExtractor + @ConfigMapper interface TracingConfig { default boolean enabled() { @@ -34,7 +34,7 @@ default Map attributes() { } } - @ConfigValueExtractor + @ConfigMapper interface MetricsConfig { Duration[] DEFAULT_SLO = new Duration[]{