Files
SHiNE-server/SHiNE-server/shine-server-config/src/main/java/utils/config/AppConfig.java
T
2026-09-12 10:17:23 +03:00

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();
}
}