From e8c41acb7d5e771fe47380dbf578a00ab650af81 Mon Sep 17 00:00:00 2001 From: krrish175-byte Date: Thu, 30 Oct 2025 01:21:04 +0530 Subject: [PATCH] Add centralized configuration management module using YAML --- .../configuration_management/config.yaml | 10 ++++ .../configuration_management/pom.xml | 47 +++++++++++++++++++ .../thealgorithms/config/ConfigLoader.java | 46 ++++++++++++++++++ .../thealgorithms/config/ExampleUsage.java | 14 ++++++ 4 files changed, 117 insertions(+) create mode 100644 design_patterns/configuration_management/config.yaml create mode 100644 design_patterns/configuration_management/pom.xml create mode 100644 design_patterns/configuration_management/src/main/java/org/thealgorithms/config/ConfigLoader.java create mode 100644 design_patterns/configuration_management/src/main/java/org/thealgorithms/config/ExampleUsage.java diff --git a/design_patterns/configuration_management/config.yaml b/design_patterns/configuration_management/config.yaml new file mode 100644 index 000000000000..ef7bc4813438 --- /dev/null +++ b/design_patterns/configuration_management/config.yaml @@ -0,0 +1,10 @@ +global: + db_url: "jdbc:mysql://localhost:3306/main" + jwt_secret: "default_secret" + vault_key: "global_vault_key" + +services: + serviceA: + jwt_secret: "serviceA_secret" + serviceB: + db_url: "jdbc:postgresql://localhost:5432/serviceB" diff --git a/design_patterns/configuration_management/pom.xml b/design_patterns/configuration_management/pom.xml new file mode 100644 index 000000000000..049aa37b13db --- /dev/null +++ b/design_patterns/configuration_management/pom.xml @@ -0,0 +1,47 @@ + + + 4.0.0 + + com.thealgorithms + configuration-management-example + 1.0-SNAPSHOT + jar + + + 21 + UTF-8 + + + + + org.yaml + snakeyaml + 2.1 + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.14.1 + + ${maven.compiler.release} + + + + + org.codehaus.mojo + exec-maven-plugin + 3.1.0 + + org.thealgorithms.config.ExampleUsage + + + + + diff --git a/design_patterns/configuration_management/src/main/java/org/thealgorithms/config/ConfigLoader.java b/design_patterns/configuration_management/src/main/java/org/thealgorithms/config/ConfigLoader.java new file mode 100644 index 000000000000..864ef56c9186 --- /dev/null +++ b/design_patterns/configuration_management/src/main/java/org/thealgorithms/config/ConfigLoader.java @@ -0,0 +1,46 @@ +package org.thealgorithms.config; + +import org.yaml.snakeyaml.Yaml; +import java.io.InputStream; +import java.util.Map; + +/** + * ConfigLoader reads configuration from a shared YAML file. + * It supports global and service-specific configurations. + */ +public class ConfigLoader { + + private final Map config; + + public ConfigLoader(String filename) { + Yaml yaml = new Yaml(); + try (InputStream in = ConfigLoader.class.getClassLoader().getResourceAsStream(filename)) { + if (in == null) { + throw new IllegalArgumentException("Configuration file not found: " + filename); + } + config = yaml.load(in); + } catch (Exception e) { + throw new RuntimeException("Failed to load configuration: " + e.getMessage(), e); + } + } + + /** + * Returns the value of a global config key. + */ + public Object getGlobal(String key) { + Map global = (Map) config.get("global"); + return global != null ? global.get(key) : null; + } + + /** + * Returns a value for a specific service override. + */ + public Object getServiceOverride(String service, String key) { + Map> services = + (Map>) config.get("services"); + if (services == null || !services.containsKey(service)) { + return null; + } + return services.get(service).getOrDefault(key, getGlobal(key)); + } +} diff --git a/design_patterns/configuration_management/src/main/java/org/thealgorithms/config/ExampleUsage.java b/design_patterns/configuration_management/src/main/java/org/thealgorithms/config/ExampleUsage.java new file mode 100644 index 000000000000..927fe36a8653 --- /dev/null +++ b/design_patterns/configuration_management/src/main/java/org/thealgorithms/config/ExampleUsage.java @@ -0,0 +1,14 @@ +package org.thealgorithms.config; + +/** + * Demonstrates how to use ConfigLoader with a shared YAML file. + */ +public class ExampleUsage { + public static void main(String[] args) { + ConfigLoader loader = new ConfigLoader("config.yaml"); + + System.out.println("Global DB URL: " + loader.getGlobal("db_url")); + System.out.println("Service A JWT Secret: " + loader.getServiceOverride("serviceA", "jwt_secret")); + System.out.println("Service B DB URL: " + loader.getServiceOverride("serviceB", "db_url")); + } +}