SHA256
92 lines
3.2 KiB
Java
92 lines
3.2 KiB
Java
package utils.config;
|
|
|
|
|
|
import java.io.IOException;
|
|
import java.io.InputStream;
|
|
import java.nio.file.Files;
|
|
import java.nio.file.Path;
|
|
import java.nio.file.Paths;
|
|
import java.util.Properties;
|
|
|
|
public final class AppConfig {
|
|
|
|
private static volatile AppConfig instance;
|
|
private final Properties properties = new Properties();
|
|
|
|
private AppConfig() {
|
|
load();
|
|
}
|
|
|
|
public static AppConfig getInstance() {
|
|
if (instance == null) {
|
|
synchronized (AppConfig.class) {
|
|
if (instance == null) {
|
|
instance = new AppConfig();
|
|
}
|
|
}
|
|
}
|
|
return instance;
|
|
}
|
|
|
|
private void load() {
|
|
try (InputStream in = getClass().getClassLoader().getResourceAsStream("application.properties")) {
|
|
if (in == null) {
|
|
throw new RuntimeException("Config file application.properties not found");
|
|
}
|
|
properties.load(in);
|
|
} catch (IOException e) {
|
|
throw new RuntimeException("Failed to load application.properties", e);
|
|
}
|
|
|
|
Path externalConfig = Paths.get("application.properties");
|
|
if (!Files.isRegularFile(externalConfig)) {
|
|
return;
|
|
}
|
|
|
|
Properties override = new Properties();
|
|
try (InputStream in = Files.newInputStream(externalConfig)) {
|
|
override.load(in);
|
|
} catch (IOException e) {
|
|
throw new RuntimeException("Failed to load external application.properties from " + externalConfig.toAbsolutePath(), e);
|
|
}
|
|
|
|
for (String name : override.stringPropertyNames()) {
|
|
properties.setProperty(name, override.getProperty(name));
|
|
}
|
|
}
|
|
|
|
/** Вернёт значение строки или null, если параметр не найден */
|
|
public String getParam(String name) {
|
|
String fromSystem = System.getProperty(name);
|
|
if (fromSystem != null) return fromSystem;
|
|
String fromEnv = System.getenv(toEnvName(name));
|
|
if (fromEnv != null && !fromEnv.isBlank()) return fromEnv.trim();
|
|
return properties.getProperty(name);
|
|
}
|
|
|
|
/** Вернёт строку или пустую строку, если параметр не найден. */
|
|
public String getStringOrEmpty(String name) {
|
|
String value = getParam(name);
|
|
return value == null ? "" : value.trim();
|
|
}
|
|
|
|
/** Целочисленный параметр с тем же приоритетом: system property -> env -> properties. */
|
|
public int getInt(String name, int defaultValue) {
|
|
String v = getParam(name);
|
|
return v == null || v.isBlank() ? defaultValue : Integer.parseInt(v.trim());
|
|
}
|
|
|
|
/** Boolean-параметр с тем же приоритетом: system property -> env -> properties. */
|
|
public boolean getBoolean(String name, boolean defaultValue) {
|
|
String v = getParam(name);
|
|
return v == null || v.isBlank() ? defaultValue : Boolean.parseBoolean(v.trim());
|
|
}
|
|
|
|
private static String toEnvName(String name) {
|
|
return name
|
|
.replace('.', '_')
|
|
.replace('-', '_')
|
|
.toUpperCase();
|
|
}
|
|
}
|