From 5181f1312bc6f1696c0da1c6bf1ea7df1e3c0ebb Mon Sep 17 00:00:00 2001 From: Rob Bygrave Date: Sat, 3 Feb 2024 09:54:41 +1300 Subject: [PATCH] Move avaje-aws-appconfig package --- avaje-aws-appconfig/pom.xml | 3 +- .../awsappconfig}/AppConfigFetcher.java | 4 +- .../awsappconfig/AwsAppConfigPlugin.java} | 72 ++++++++++--------- .../awsappconfig}/DAppConfigFetcher.java | 2 +- .../awsappconfig}/DResult.java | 5 +- .../src/main/java/module-info.java | 8 +-- .../io.avaje.config.ConfigurationSource | 2 +- 7 files changed, 51 insertions(+), 45 deletions(-) rename avaje-aws-appconfig/src/main/java/io/avaje/{aws/appconfig => config/awsappconfig}/AppConfigFetcher.java (90%) rename avaje-aws-appconfig/src/main/java/io/avaje/{aws/appconfig/AppConfigPlugin.java => config/awsappconfig/AwsAppConfigPlugin.java} (55%) rename avaje-aws-appconfig/src/main/java/io/avaje/{aws/appconfig => config/awsappconfig}/DAppConfigFetcher.java (98%) rename avaje-aws-appconfig/src/main/java/io/avaje/{aws/appconfig => config/awsappconfig}/DResult.java (81%) diff --git a/avaje-aws-appconfig/pom.xml b/avaje-aws-appconfig/pom.xml index 01a81c0..f0445e0 100644 --- a/avaje-aws-appconfig/pom.xml +++ b/avaje-aws-appconfig/pom.xml @@ -10,7 +10,8 @@ - avaje-aws-appconfig + io.avaje + avaje-config-aws-appconfig 0.3-SNAPSHOT diff --git a/avaje-aws-appconfig/src/main/java/io/avaje/aws/appconfig/AppConfigFetcher.java b/avaje-aws-appconfig/src/main/java/io/avaje/config/awsappconfig/AppConfigFetcher.java similarity index 90% rename from avaje-aws-appconfig/src/main/java/io/avaje/aws/appconfig/AppConfigFetcher.java rename to avaje-aws-appconfig/src/main/java/io/avaje/config/awsappconfig/AppConfigFetcher.java index 1b2d447..29e147f 100644 --- a/avaje-aws-appconfig/src/main/java/io/avaje/aws/appconfig/AppConfigFetcher.java +++ b/avaje-aws-appconfig/src/main/java/io/avaje/config/awsappconfig/AppConfigFetcher.java @@ -1,6 +1,6 @@ -package io.avaje.aws.appconfig; +package io.avaje.config.awsappconfig; -public interface AppConfigFetcher { +interface AppConfigFetcher { static AppConfigFetcher.Builder builder() { return new DAppConfigFetcher.Builder(); diff --git a/avaje-aws-appconfig/src/main/java/io/avaje/aws/appconfig/AppConfigPlugin.java b/avaje-aws-appconfig/src/main/java/io/avaje/config/awsappconfig/AwsAppConfigPlugin.java similarity index 55% rename from avaje-aws-appconfig/src/main/java/io/avaje/aws/appconfig/AppConfigPlugin.java rename to avaje-aws-appconfig/src/main/java/io/avaje/config/awsappconfig/AwsAppConfigPlugin.java index dffed85..eee054a 100644 --- a/avaje-aws-appconfig/src/main/java/io/avaje/aws/appconfig/AppConfigPlugin.java +++ b/avaje-aws-appconfig/src/main/java/io/avaje/config/awsappconfig/AwsAppConfigPlugin.java @@ -1,50 +1,56 @@ -package io.avaje.aws.appconfig; +package io.avaje.config.awsappconfig; import io.avaje.config.ConfigParser; import io.avaje.config.Configuration; import io.avaje.config.ConfigurationSource; -import java.io.IOException; import java.io.StringReader; import java.util.Map; -import java.util.Properties; import static java.lang.System.Logger.Level.*; -public final class AppConfigPlugin implements ConfigurationSource { +/** + * Plugin that loads AWS AppConfig as Yaml or Properties. + *

+ * By default, will periodically reload the configuration if it has changed. + */ +public final class AwsAppConfigPlugin implements ConfigurationSource { - private static final System.Logger log = System.getLogger("io.avaje.config.AppConfigPlugin"); + private static final System.Logger log = System.getLogger("io.avaje.config.AwsAppConfig"); @Override public void load(Configuration configuration) { - if (!configuration.getBool("aws.appconfig.enabled", true)) { - log.log(INFO, "AppConfigPlugin is not enabled"); + if (!configuration.enabled("aws.appconfig.enabled", true)) { + log.log(INFO, "AwsAppConfig plugin is disabled"); return; } - var loader = new Loader(configuration); loader.schedule(); loader.reload(); } - static final class Loader { private final Configuration configuration; private final AppConfigFetcher fetcher; private final ConfigParser yamlParser; + private final ConfigParser propertiesParser; private final long frequency; - private String currentVersion = ""; + private String currentVersion = "none"; Loader(Configuration configuration) { this.configuration = configuration; this.frequency = configuration.getLong("aws.appconfig.frequency", 60L); + this.propertiesParser = configuration.parser("properties").orElseThrow(); this.yamlParser = configuration.parser("yaml").orElse(null); + if (yamlParser == null) { + log.log(WARNING, "No Yaml parser registered"); + } var app = configuration.get("aws.appconfig.application"); var env = configuration.get("aws.appconfig.environment"); - var con = configuration.get("aws.appconfig.configuration"); + var con = configuration.get("aws.appconfig.configuration", env + "-" + app); this.fetcher = AppConfigFetcher.builder() .application(app) @@ -61,37 +67,35 @@ void reload() { try { AppConfigFetcher.Result result = fetcher.fetch(); if (currentVersion.equals(result.version())) { - log.log(TRACE, "AwsAppConfig unchanged, version", currentVersion); + log.log(TRACE, "AwsAppConfig unchanged, version {0}", currentVersion); } else { String contentType = result.contentType(); if (log.isLoggable(TRACE)) { log.log(TRACE, "AwsAppConfig fetched version:{0} contentType:{1} body:{2}", result.version(), contentType, result.body()); } - if (contentType.endsWith("yaml")) { - if (yamlParser == null) { - log.log(ERROR, "No Yaml Parser registered to parse AWS AppConfig"); - } else { - Map keyValues = yamlParser.load(new StringReader(result.body())); - configuration.eventBuilder("AwsAppConfig") - .putAll(keyValues) - .publish(); - currentVersion = result.version(); - debugLog(result, keyValues.size()); - } - } else { - // assuming properties content - Properties properties = new Properties(); - properties.load(new StringReader(result.body())); - configuration.eventBuilder("AwsAppConfig") - .putAll(properties) + Map keyValues = parse(result); + configuration.eventBuilder("AwsAppConfig") + .putAll(keyValues) .publish(); - currentVersion = result.version(); - debugLog(result, properties.size()); - } + currentVersion = result.version(); + debugLog(result, keyValues.size()); } - } catch (AppConfigFetcher.FetchException | IOException e) { - log.log(ERROR, "Error fetching or processing AppConfig", e); + } catch (Exception e) { + log.log(ERROR, "Error fetching or processing AwsAppConfig", e); + } + } + + private Map parse(AppConfigFetcher.Result result) { + ConfigParser parser = parser(result.contentType()); + return parser.load(new StringReader(result.body())); + } + + private ConfigParser parser(String contentType) { + if (contentType.endsWith("yaml")) { + return yamlParser; + } else { + return propertiesParser; } } diff --git a/avaje-aws-appconfig/src/main/java/io/avaje/aws/appconfig/DAppConfigFetcher.java b/avaje-aws-appconfig/src/main/java/io/avaje/config/awsappconfig/DAppConfigFetcher.java similarity index 98% rename from avaje-aws-appconfig/src/main/java/io/avaje/aws/appconfig/DAppConfigFetcher.java rename to avaje-aws-appconfig/src/main/java/io/avaje/config/awsappconfig/DAppConfigFetcher.java index 215ffb2..8281903 100644 --- a/avaje-aws-appconfig/src/main/java/io/avaje/aws/appconfig/DAppConfigFetcher.java +++ b/avaje-aws-appconfig/src/main/java/io/avaje/config/awsappconfig/DAppConfigFetcher.java @@ -1,4 +1,4 @@ -package io.avaje.aws.appconfig; +package io.avaje.config.awsappconfig; import java.io.IOException; import java.net.URI; diff --git a/avaje-aws-appconfig/src/main/java/io/avaje/aws/appconfig/DResult.java b/avaje-aws-appconfig/src/main/java/io/avaje/config/awsappconfig/DResult.java similarity index 81% rename from avaje-aws-appconfig/src/main/java/io/avaje/aws/appconfig/DResult.java rename to avaje-aws-appconfig/src/main/java/io/avaje/config/awsappconfig/DResult.java index 5b85817..f387e75 100644 --- a/avaje-aws-appconfig/src/main/java/io/avaje/aws/appconfig/DResult.java +++ b/avaje-aws-appconfig/src/main/java/io/avaje/config/awsappconfig/DResult.java @@ -1,11 +1,12 @@ -package io.avaje.aws.appconfig; +package io.avaje.config.awsappconfig; final class DResult implements AppConfigFetcher.Result { private final String version; private final String contentType; private final String body; - public DResult(String version, String contentType, String body) { + + DResult(String version, String contentType, String body) { this.version = version; this.contentType = contentType; this.body = body; diff --git a/avaje-aws-appconfig/src/main/java/module-info.java b/avaje-aws-appconfig/src/main/java/module-info.java index 89a56e9..d30d949 100644 --- a/avaje-aws-appconfig/src/main/java/module-info.java +++ b/avaje-aws-appconfig/src/main/java/module-info.java @@ -1,10 +1,10 @@ -import io.avaje.aws.appconfig.AppConfigPlugin; +import io.avaje.config.awsappconfig.AwsAppConfigPlugin; -module io.avaje.aws.appconfig { +module io.avaje.config.awsappconfig { - exports io.avaje.aws.appconfig; + exports io.avaje.config.awsappconfig; requires io.avaje.config; requires java.net.http; - provides io.avaje.config.ConfigurationSource with AppConfigPlugin; + provides io.avaje.config.ConfigurationSource with AwsAppConfigPlugin; } diff --git a/avaje-aws-appconfig/src/main/resources/META-INF/services/io.avaje.config.ConfigurationSource b/avaje-aws-appconfig/src/main/resources/META-INF/services/io.avaje.config.ConfigurationSource index fd4b517..53b7519 100644 --- a/avaje-aws-appconfig/src/main/resources/META-INF/services/io.avaje.config.ConfigurationSource +++ b/avaje-aws-appconfig/src/main/resources/META-INF/services/io.avaje.config.ConfigurationSource @@ -1 +1 @@ -io.avaje.aws.appconfig.AppConfigPlugin +io.avaje.config.awsappconfig.AwsAppConfigPlugin