/* * Copyright @ 2013 CurisTEC, S.A.S. All Rights Reserved. */ package net.curisit.securis.utils; import java.io.IOException; import java.io.InputStream; import java.text.MessageFormat; import java.util.ArrayList; import java.util.List; import java.util.Properties; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; /** * Config *

* Class that loads and serves global config parameters from a classpath properties file * and, as a fallback, from environment variables. * * Initialization: * - Static initializer loads {@link #KEY_CONFIG_FILE} from classpath (fails hard if missing). * * Accessors: * - {@link #get(String)} / {@link #get(String, String)} * - Integer variants: {@link #getInt(String)} / {@link #getInt(String, int)} * - Namespaced helpers: by prefix/domain, and sequential lists via {@link #getListByPrefix(String)}. * * Thread-safety: static-only utility; internal state is read-only after init. * * @author JRA * Last reviewed by JRA on Oct 5, 2025. */ public class Config { private static final Logger LOG = LogManager.getLogger(Config.class); /** * Resource path of the application properties file (in classpath). * E.g. "/securis-server.properties". */ public static final String KEY_CONFIG_FILE = "/securis-server.properties"; private static Properties params = null; static { try { loadParameters(KEY_CONFIG_FILE); } catch (IOException e) { LOG.error("Config file {} was not found in classpath", KEY_CONFIG_FILE); System.exit(-2); } } /** * loadParameters *

* Loads application global parameters from a classpath resource. * * @param resource Classpath location (e.g. "/resource/cp-securis.conf"). * @throws IOException If the resource cannot be found or read. */ public static void loadParameters(String resource) throws IOException { LOG.debug("Loading params from " + resource); InputStream fileis = Params.class.getResourceAsStream(resource); params = new Properties(); try { params.load(fileis); LOG.debug("Params loaded OK from {}", resource); } catch (IOException e) { LOG.error("Error loading config file: " + e); params = null; throw e; } } /** * getByDomain *

* Convenience accessor for domain-suffixed parameters (param.domain). * * @param domain Domain suffix. * @param paramname Base parameter name. * @return String value or null if not present. */ public static String getByDomain(String domain, String paramname) { return getByDomain(domain, paramname, null); } /** * getByPrefix *

* Returns parameter value from "{prefix}.{param}" or falls back to the plain "{param}". * * @param prefix Namespace prefix. * @param paramname Parameter name. * @return Resolved value or null. */ public static String getByPrefix(String prefix, String paramname) { return get(prefix + "." + paramname, get(paramname)); } /** * getByPrefix *

* Returns parameter value from "{prefix}.{param}" or provided default (which itself * falls back to "{param}" or its default). * * @param prefix Namespace prefix. * @param paramname Parameter name. * @param defaultVal Default value if none resolved. * @return Resolved value. */ public static String getByPrefix(String prefix, String paramname, String defaultVal) { return get(prefix + "." + paramname, get(paramname, defaultVal)); } /** * getByDomain *

* Returns value from "{param}.{domain}" or provided default. * * @param domain domain suffix. * @param paramname base name. * @param defaultval fallback if not found. * @return resolved string. */ public static String getByDomain(String domain, String paramname, String defaultval) { return get(paramname + "." + domain, defaultval); } /** * getIntByDomain *

* Integer variant of {@link #getByDomain(String, String)} with fallback to plain param. */ public static int getIntByDomain(String domain, String paramname) { return getInt(paramname + "." + domain, getInt(paramname)); } /** * getIntByDomain *

* Integer variant returning provided default when missing. */ public static int getIntByDomain(String domain, String paramname, int defaultval) { return getInt(paramname + "." + domain, defaultval); } /** * getListByPrefix *

* Reads sequential properties using numeric suffixes starting from 0 and stops on first gap. * Example: * securis.sort.comparator.0=... * securis.sort.comparator.1=... * ... * * @param prefix Base prefix (e.g. "securis.sort.comparator"). * @return Ordered list of values until first missing index. */ public static List getListByPrefix(String prefix) { List list = new ArrayList(); String tpl = prefix + ".{0}"; int i = 0; String value = get(MessageFormat.format(tpl, i++)); while (value != null) { list.add(value); value = get(MessageFormat.format(tpl, i++)); } return list; } /** * get *

* Get a parameter value from the loaded properties or environment variables. * * @param paramname Parameter key. * @return Value or null if not found anywhere. */ public static String get(String paramname) { assert (params != null) : "Parameters have not been loaded. Call method loadParameters(resource) before use Params."; String value = params.getProperty(paramname); if (value == null) value = System.getenv(paramname); return value; } /** * get *

* Returns parameter value or default if missing. * * @param paramname Key. * @param defaultval Default fallback. * @return value or default. */ public static String get(String paramname, String defaultval) { String value = get(paramname); return (value == null ? defaultval : value); } /** * getInt *

* Integer accessor, returns -1 if missing. * * @param paramname Key. * @return Parsed integer or -1. */ public static int getInt(String paramname) { String value = get(paramname); return (value == null ? -1 : Integer.parseInt(value)); } /** * getInt *

* Integer accessor, returns provided default when missing. * * @param paramname Key. * @param defaultval Default fallback. * @return Parsed integer or default. */ public static int getInt(String paramname, int defaultval) { String value = get(paramname); return (value == null ? defaultval : Integer.parseInt(value)); } /** * KEYS *

* Strongly-typed keys used across the application. */ public static class KEYS { public static final String SERVER_HOSTNAME = "license.server.hostname"; public static final String SERVER_PORT = "license.server.port"; public static final String SERVER_SSL_PORT = "license.server.ssl.port"; public static final String KEYSTORE_PATH = "ssl.keystore.path"; public static final String KEYSTORE_TYPE = "ssl.keystore.type"; public static final String KEYSTORE_PASSWORD = "ssl.keystore.password"; public static final String KEYSTORE_ALIAS = "ssl.keystore.alias"; public static final String MAILGUN_DOMAIN = "mailgun.domain"; public static final String MAILGUN_API_KEY = "mailgun.api.key"; public static final String EMAIL_FROM_ADDRESS = "email.from.address"; public static final String EMAIL_LIC_DEFAULT_SUBJECT = "email.lic.default.subject"; } }