From 3098628db192ff249f581ed180972cdb5e567c0f Mon Sep 17 00:00:00 2001 From: Armin Schrenk Date: Thu, 29 Jun 2023 15:32:15 +0200 Subject: [PATCH] Fix problem of circular class init --- .../common/LazyProcessedProperties.java | 40 ++----------------- .../logging/LogbackConfigurator.java | 10 ++--- 2 files changed, 7 insertions(+), 43 deletions(-) diff --git a/src/main/java/org/cryptomator/common/LazyProcessedProperties.java b/src/main/java/org/cryptomator/common/LazyProcessedProperties.java index 389f81bb1..d12b6c92c 100644 --- a/src/main/java/org/cryptomator/common/LazyProcessedProperties.java +++ b/src/main/java/org/cryptomator/common/LazyProcessedProperties.java @@ -1,7 +1,6 @@ package org.cryptomator.common; import org.jetbrains.annotations.Nullable; -import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.io.IOException; @@ -25,10 +24,8 @@ import java.util.regex.Pattern; public class LazyProcessedProperties extends Properties { - private static final Logger LOG = LoggerFactory.getLogger(LazyProcessedProperties.class); + private static final Pattern TEMPLATE = Pattern.compile("@\\{(\\w+)}"); - //Template and env _need_ to be instance variables, otherwise they might not be initialized at access time - private final Pattern template = Pattern.compile("@\\{(\\w+)}"); private final Map env; private final Properties delegate; @@ -59,14 +56,14 @@ public class LazyProcessedProperties extends Properties { //visible for testing String process(String value) { - return template.matcher(value).replaceAll(match -> // + return TEMPLATE.matcher(value).replaceAll(match -> // switch (match.group(1)) { case "appdir" -> resolveFrom("APPDIR", Source.ENV); case "appdata" -> resolveFrom("APPDATA", Source.ENV); case "localappdata" -> resolveFrom("LOCALAPPDATA", Source.ENV); case "userhome" -> resolveFrom("user.home", Source.PROPS); default -> { - LOG.warn("Unknown variable @{{}} in property value {}.", match.group(), value); + LoggerFactory.getLogger(LazyProcessedProperties.class).warn("Unknown variable @{{}} in property value {}.", match.group(), value); yield match.group(); } }); @@ -78,7 +75,7 @@ public class LazyProcessedProperties extends Properties { case PROPS -> delegate.getProperty(key); }; if (val == null) { - LOG.warn("Variable {} used for substitution not found in {}. Replaced with empty string.", key, src); + LoggerFactory.getLogger(LazyProcessedProperties.class).warn("Variable {} used for substitution not found in {}. Replaced with empty string.", key, src); return ""; } else { return val.replace("\\", "\\\\"); @@ -224,33 +221,4 @@ public class LazyProcessedProperties extends Properties { var delegateClone = (Properties) delegate.clone(); return new LazyProcessedProperties(delegateClone, env); } - - public static Map of() {return Map.of();} - - public static Map of(K k1, V v1) {return Map.of(k1, v1);} - - public static Map of(K k1, V v1, K k2, V v2) {return Map.of(k1, v1, k2, v2);} - - public static Map of(K k1, V v1, K k2, V v2, K k3, V v3) {return Map.of(k1, v1, k2, v2, k3, v3);} - - public static Map of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4) {return Map.of(k1, v1, k2, v2, k3, v3, k4, v4);} - - public static Map of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5) {return Map.of(k1, v1, k2, v2, k3, v3, k4, v4, k5, v5);} - - public static Map of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, K k6, V v6) {return Map.of(k1, v1, k2, v2, k3, v3, k4, v4, k5, v5, k6, v6);} - - public static Map of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, K k6, V v6, K k7, V v7) {return Map.of(k1, v1, k2, v2, k3, v3, k4, v4, k5, v5, k6, v6, k7, v7);} - - public static Map of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, K k6, V v6, K k7, V v7, K k8, V v8) {return Map.of(k1, v1, k2, v2, k3, v3, k4, v4, k5, v5, k6, v6, k7, v7, k8, v8);} - - public static Map of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, K k6, V v6, K k7, V v7, K k8, V v8, K k9, V v9) {return Map.of(k1, v1, k2, v2, k3, v3, k4, v4, k5, v5, k6, v6, k7, v7, k8, v8, k9, v9);} - - public static Map of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, K k6, V v6, K k7, V v7, K k8, V v8, K k9, V v9, K k10, V v10) {return Map.of(k1, v1, k2, v2, k3, v3, k4, v4, k5, v5, k6, v6, k7, v7, k8, v8, k9, v9, k10, v10);} - - @SafeVarargs - public static Map ofEntries(Map.Entry... entries) {return Map.ofEntries(entries);} - - public static Map.Entry entry(K k, V v) {return Map.entry(k, v);} - - public static Map copyOf(Map map) {return Map.copyOf(map);} } diff --git a/src/main/java/org/cryptomator/logging/LogbackConfigurator.java b/src/main/java/org/cryptomator/logging/LogbackConfigurator.java index c352f52f5..511599132 100644 --- a/src/main/java/org/cryptomator/logging/LogbackConfigurator.java +++ b/src/main/java/org/cryptomator/logging/LogbackConfigurator.java @@ -14,12 +14,10 @@ import ch.qos.logback.core.rolling.FixedWindowRollingPolicy; import ch.qos.logback.core.rolling.RollingFileAppender; import ch.qos.logback.core.spi.ContextAwareBase; import ch.qos.logback.core.util.FileSize; -import org.cryptomator.common.LazyProcessedProperties; +import org.cryptomator.common.Environment; -import java.nio.file.Files; import java.nio.file.Path; import java.util.Map; -import java.util.Optional; public class LogbackConfigurator extends ContextAwareBase implements Configurator { @@ -58,10 +56,8 @@ public class LogbackConfigurator extends ContextAwareBase implements Configurato @Override public ExecutionStatus configure(LoggerContext context) { - //we need to preprocess those, because every other class has a dependency to logging, none are initialized yet - var processedProps = new LazyProcessedProperties(System.getProperties(), System.getenv()); - var useCustomCfg = Optional.ofNullable(processedProps.getProperty("logback.configurationFile")).map(s -> Files.exists(Path.of(s))).orElse(false); - var logDir = Optional.ofNullable(processedProps.getProperty("cryptomator.logDir")).map(Path::of).orElse(null); + var useCustomCfg = Environment.getInstance().useCustomLogbackConfig(); + var logDir = Environment.getInstance().getLogDir().orElse(null); if (useCustomCfg) { addInfo("Using external logback configuration file.");