From a04d5d7b5e4dadef2c033018d77b05a3de1826b7 Mon Sep 17 00:00:00 2001 From: Steven Hawkins Date: Wed, 5 Nov 2025 02:45:06 -0500 Subject: [PATCH] task: clarifying home dir unset logic (#43904) closes: #43903 Signed-off-by: Steve Hawkins --- .../quarkus/deployment/KeycloakProcessor.java | 3 +- .../keycloak/quarkus/runtime/Environment.java | 45 +++++-------------- .../quarkus/runtime/KeycloakRecorder.java | 6 +-- .../quarkus/runtime/cli/command/Build.java | 8 ++-- .../runtime/cli/command/ImportRealmMixin.java | 7 +-- .../KeycloakPropertiesConfigSource.java | 12 ++--- .../configuration/PersistedConfigSource.java | 6 +-- .../QuarkusPropertiesConfigSource.java | 23 ++-------- .../mappers/CachingPropertyMappers.java | 39 +++------------- .../mappers/HttpPropertyMappers.java | 13 +----- .../runtime/integration/QuarkusPlatform.java | 30 ++++--------- ...lacklistPasswordPolicyProviderFactory.java | 2 +- .../QuarkusFolderThemeProviderFactory.java | 13 ++---- .../AbstractConfigurationTest.java | 6 --- .../configuration/ConfigurationTest.java | 6 +-- .../DatasourcesConfigurationTest.java | 4 +- 16 files changed, 56 insertions(+), 167 deletions(-) diff --git a/quarkus/deployment/src/main/java/org/keycloak/quarkus/deployment/KeycloakProcessor.java b/quarkus/deployment/src/main/java/org/keycloak/quarkus/deployment/KeycloakProcessor.java index ba75002b03c..88cfe89a7ea 100644 --- a/quarkus/deployment/src/main/java/org/keycloak/quarkus/deployment/KeycloakProcessor.java +++ b/quarkus/deployment/src/main/java/org/keycloak/quarkus/deployment/KeycloakProcessor.java @@ -48,6 +48,7 @@ import io.quarkus.narayana.jta.runtime.TransactionManagerBuildTimeConfig; import io.quarkus.narayana.jta.runtime.TransactionManagerBuildTimeConfig.UnsafeMultipleLastResourcesMode; import io.quarkus.resteasy.reactive.server.spi.MethodScannerBuildItem; import io.quarkus.resteasy.reactive.server.spi.PreExceptionMapperHandlerBuildItem; +import io.quarkus.runtime.LaunchMode; import io.quarkus.runtime.configuration.ConfigurationException; import io.quarkus.vertx.http.deployment.FilterBuildItem; import io.quarkus.vertx.http.deployment.HttpRootPathBuildItem; @@ -997,7 +998,7 @@ class KeycloakProcessor { URL url = descriptorsUrls.nextElement(); List descriptors = getScriptProviderDescriptorsFromJarFile(url); - if (!Environment.isDistribution()) { + if (LaunchMode.current().isDevOrTest() || Environment.getHomeDir().isEmpty()) { // script providers are only loaded from classpath when running embedded descriptors = new ArrayList<>(descriptors); descriptors.addAll(getScriptProviderDescriptorsFromClassPath(url)); diff --git a/quarkus/runtime/src/main/java/org/keycloak/quarkus/runtime/Environment.java b/quarkus/runtime/src/main/java/org/keycloak/quarkus/runtime/Environment.java index a235ffbc9e7..10186655115 100644 --- a/quarkus/runtime/src/main/java/org/keycloak/quarkus/runtime/Environment.java +++ b/quarkus/runtime/src/main/java/org/keycloak/quarkus/runtime/Environment.java @@ -54,36 +54,24 @@ public final class Environment { return Boolean.getBoolean("quarkus.launch.rebuild"); } - public static String getHomeDir() { - return System.getProperty(KC_HOME_DIR); + public static Optional getHomeDir() { + return Optional.ofNullable(System.getProperty(KC_HOME_DIR)); } - public static Path getHomePath() { - String homeDir = getHomeDir(); - - if (homeDir != null) { - return Paths.get(homeDir); - } - - return null; + public static Optional getHomePath() { + return getHomeDir().map(Paths::get); } - public static String getDataDir() { - return getHomeDir() + DATA_PATH; + public static Optional getDataDir() { + return getHomeDir().map(p -> p.concat(DATA_PATH)); } - public static String getDefaultThemeRootDir() { - return getHomeDir() + DEFAULT_THEMES_PATH; + public static Optional getDefaultThemeRootDir() { + return getHomeDir().map(p -> p.concat(DEFAULT_THEMES_PATH)); } - public static Path getProvidersPath() { - Path homePath = Environment.getHomePath(); - - if (homePath != null) { - return homePath.resolve("providers"); - } - - return null; + public static Optional getProvidersPath() { + return Environment.getHomePath().map(p -> p.resolve("providers")); } public static String getCommand() { @@ -128,7 +116,7 @@ public final class Environment { } public static Map getProviderFiles() { - Path providersPath = Environment.getProvidersPath(); + Path providersPath = Environment.getProvidersPath().orElse(null); if (providersPath == null) { return Collections.emptyMap(); @@ -186,13 +174,6 @@ public final class Environment { return profile; } - public static boolean isDistribution() { - if (LaunchMode.current().isDevOrTest()) { - return false; - } - return getHomeDir() != null; - } - public static boolean isRebuildCheck() { return Boolean.getBoolean(KC_CONFIG_REBUILD_CHECK); } @@ -226,10 +207,6 @@ public final class Environment { return profile; } - public static void removeHomeDir() { - System.getProperties().remove(KC_HOME_DIR); - } - public static void setRebuild() { System.setProperty("quarkus.launch.rebuild", "true"); } diff --git a/quarkus/runtime/src/main/java/org/keycloak/quarkus/runtime/KeycloakRecorder.java b/quarkus/runtime/src/main/java/org/keycloak/quarkus/runtime/KeycloakRecorder.java index e20604f8a52..be4aaf0df29 100644 --- a/quarkus/runtime/src/main/java/org/keycloak/quarkus/runtime/KeycloakRecorder.java +++ b/quarkus/runtime/src/main/java/org/keycloak/quarkus/runtime/KeycloakRecorder.java @@ -88,9 +88,9 @@ public class KeycloakRecorder { String[] truststores = Configuration.getOptionalKcValue(TruststoreOptions.TRUSTSTORE_PATHS.getKey()) .map(s -> s.split(",")).orElse(new String[0]); - String dataDir = Environment.getDataDir(); + Optional dataDir = Environment.getDataDir(); - File truststoresDir = Optional.ofNullable(Environment.getHomePath()).map(path -> path.resolve("conf").resolve("truststores").toFile()).orElse(null); + File truststoresDir = Environment.getHomePath().map(p -> p.resolve("conf").resolve("truststores").toFile()).orElse(null); if (truststoresDir != null && truststoresDir.exists() && Optional.ofNullable(truststoresDir.list()).map(a -> a.length).orElse(0) > 0) { truststores = Stream.concat(Stream.of(truststoresDir.getAbsolutePath()), Stream.of(truststores)).toArray(String[]::new); @@ -98,7 +98,7 @@ public class KeycloakRecorder { return; // nothing to configure, we'll just use the system default } - TruststoreBuilder.setSystemTruststore(truststores, true, dataDir); + TruststoreBuilder.setSystemTruststore(truststores, true, dataDir.orElseThrow()); } public void configureLiquibase(Map> services) { diff --git a/quarkus/runtime/src/main/java/org/keycloak/quarkus/runtime/cli/command/Build.java b/quarkus/runtime/src/main/java/org/keycloak/quarkus/runtime/cli/command/Build.java index 1d3e9bf1a93..ab5b9d21c91 100644 --- a/quarkus/runtime/src/main/java/org/keycloak/quarkus/runtime/cli/command/Build.java +++ b/quarkus/runtime/src/main/java/org/keycloak/quarkus/runtime/cli/command/Build.java @@ -22,7 +22,7 @@ import static org.keycloak.config.DatabaseOptions.DB; import static org.keycloak.quarkus.runtime.Environment.getHomePath; import static org.keycloak.quarkus.runtime.Environment.isDevProfile; -import io.quarkus.runtime.LaunchMode; +import java.util.Optional; import org.keycloak.quarkus.runtime.Environment; import org.keycloak.quarkus.runtime.Messages; @@ -30,13 +30,11 @@ import org.keycloak.quarkus.runtime.configuration.Configuration; import org.keycloak.quarkus.runtime.configuration.PersistedConfigSource; import io.quarkus.bootstrap.runner.RunnerClassLoader; - +import io.quarkus.runtime.LaunchMode; import io.smallrye.config.ConfigValue; import picocli.CommandLine; import picocli.CommandLine.Command; -import java.util.Optional; - @Command(name = Build.NAME, header = "Creates a new and optimized server image.", description = { @@ -143,7 +141,7 @@ public final class Build extends AbstractCommand { private void cleanTempResources() { if (!LaunchMode.current().isDevOrTest()) { // only needed for dev/testing purposes - Optional.ofNullable(getHomePath()).ifPresent(path -> path.resolve("quarkus-artifact.properties").toFile().delete()); + getHomePath().ifPresent(path -> path.resolve("quarkus-artifact.properties").toFile().delete()); } } diff --git a/quarkus/runtime/src/main/java/org/keycloak/quarkus/runtime/cli/command/ImportRealmMixin.java b/quarkus/runtime/src/main/java/org/keycloak/quarkus/runtime/cli/command/ImportRealmMixin.java index e62cd5e700e..00f679986eb 100644 --- a/quarkus/runtime/src/main/java/org/keycloak/quarkus/runtime/cli/command/ImportRealmMixin.java +++ b/quarkus/runtime/src/main/java/org/keycloak/quarkus/runtime/cli/command/ImportRealmMixin.java @@ -35,10 +35,7 @@ public final class ImportRealmMixin { paramLabel = NO_PARAM_LABEL, arity = "0") public void setImportRealm(boolean importRealm) { - File importDir = Environment.getHomePath().resolve("data").resolve("import").toFile(); - - if (importDir.exists()) { - ExportImportConfig.setDir(importDir.getAbsolutePath()); - } + Environment.getHomePath().map(p -> p.resolve("data").resolve("import").toFile()).filter(File::exists) + .map(File::getAbsolutePath).ifPresent(ExportImportConfig::setDir); } } diff --git a/quarkus/runtime/src/main/java/org/keycloak/quarkus/runtime/configuration/KeycloakPropertiesConfigSource.java b/quarkus/runtime/src/main/java/org/keycloak/quarkus/runtime/configuration/KeycloakPropertiesConfigSource.java index fc3c25b3f35..374f3b8fa90 100644 --- a/quarkus/runtime/src/main/java/org/keycloak/quarkus/runtime/configuration/KeycloakPropertiesConfigSource.java +++ b/quarkus/runtime/src/main/java/org/keycloak/quarkus/runtime/configuration/KeycloakPropertiesConfigSource.java @@ -89,15 +89,9 @@ public class KeycloakPropertiesConfigSource extends AbstractLocationConfigSource } if (filePath == null) { - String homeDir = Environment.getHomeDir(); - - if (homeDir != null) { - File file = Paths.get(homeDir, "conf", KeycloakPropertiesConfigSource.KEYCLOAK_CONF_FILE).toFile(); - - if (file.exists()) { - filePath = file.getAbsolutePath(); - } - } + filePath = Environment.getHomeDir() + .map(f -> Paths.get(f, "conf", KeycloakPropertiesConfigSource.KEYCLOAK_CONF_FILE).toFile()) + .filter(File::exists).map(File::getAbsolutePath).orElse(null); } if (filePath == null) { diff --git a/quarkus/runtime/src/main/java/org/keycloak/quarkus/runtime/configuration/PersistedConfigSource.java b/quarkus/runtime/src/main/java/org/keycloak/quarkus/runtime/configuration/PersistedConfigSource.java index ab2949118d5..70ca5e48825 100644 --- a/quarkus/runtime/src/main/java/org/keycloak/quarkus/runtime/configuration/PersistedConfigSource.java +++ b/quarkus/runtime/src/main/java/org/keycloak/quarkus/runtime/configuration/PersistedConfigSource.java @@ -114,7 +114,7 @@ public final class PersistedConfigSource extends PropertiesConfigSource { } private static InputStream loadPersistedConfig() { - Path homePath = Environment.getHomePath(); + Path homePath = Environment.getHomePath().orElse(null); if (homePath == null) { return null; @@ -172,7 +172,7 @@ public final class PersistedConfigSource extends PropertiesConfigSource { } public void saveDryRunProperties() throws FileNotFoundException, IOException { - Path path = Environment.getHomePath().resolve("lib").resolve("dryRun.properties"); + Path path = Environment.getHomePath().orElseThrow().resolve("lib").resolve("dryRun.properties"); var properties = Picocli.getNonPersistedBuildTimeOptions(); try (FileOutputStream fos = new FileOutputStream(path.toFile())) { properties.store(fos, null); @@ -180,7 +180,7 @@ public final class PersistedConfigSource extends PropertiesConfigSource { } public void useDryRunProperties() { - Path path = Environment.getHomePath().resolve("lib").resolve("dryRun.properties"); + Path path = Environment.getHomePath().orElseThrow().resolve("lib").resolve("dryRun.properties"); if (Files.exists(path)) { Properties properties = new Properties(); try (FileInputStream fis = new FileInputStream(path.toFile())) { diff --git a/quarkus/runtime/src/main/java/org/keycloak/quarkus/runtime/configuration/QuarkusPropertiesConfigSource.java b/quarkus/runtime/src/main/java/org/keycloak/quarkus/runtime/configuration/QuarkusPropertiesConfigSource.java index bc50246f26e..cb0e18abe6e 100644 --- a/quarkus/runtime/src/main/java/org/keycloak/quarkus/runtime/configuration/QuarkusPropertiesConfigSource.java +++ b/quarkus/runtime/src/main/java/org/keycloak/quarkus/runtime/configuration/QuarkusPropertiesConfigSource.java @@ -22,7 +22,6 @@ import static org.keycloak.quarkus.runtime.configuration.MicroProfileConfigProvi import java.io.File; import java.io.IOException; import java.net.URL; -import java.nio.file.Path; import java.nio.file.Paths; import java.util.ArrayList; import java.util.List; @@ -44,20 +43,6 @@ public final class QuarkusPropertiesConfigSource extends AbstractLocationConfigS private static final String FILE_NAME = "quarkus.properties"; public static final String NAME = "KcQuarkusPropertiesConfigSource"; - public static Path getConfigurationFile() { - String homeDir = Environment.getHomeDir(); - - if (homeDir != null) { - File file = Paths.get(homeDir, "conf", FILE_NAME).toFile(); - - if (file.exists()) { - return file.toPath(); - } - } - - return null; - } - @Override protected String[] getFileExtensions() { return new String[] { "properties" }; @@ -74,11 +59,9 @@ public final class QuarkusPropertiesConfigSource extends AbstractLocationConfigS public synchronized List getConfigSources(final ClassLoader classLoader) { List configSources = new ArrayList<>(); - Path configFile = getConfigurationFile(); - - if (configFile != null) { - configSources.addAll(loadConfigSources(configFile.toUri().toString(), KeycloakPropertiesConfigSource.PROPERTIES_FILE_ORDINAL, classLoader)); - } + Environment.getHomeDir().map(p -> Paths.get(p, "conf", FILE_NAME).toFile()).filter(File::exists) + .ifPresent(configFile -> configSources.addAll(loadConfigSources(configFile.toPath().toUri().toString(), + KeycloakPropertiesConfigSource.PROPERTIES_FILE_ORDINAL, classLoader))); return configSources; } diff --git a/quarkus/runtime/src/main/java/org/keycloak/quarkus/runtime/configuration/mappers/CachingPropertyMappers.java b/quarkus/runtime/src/main/java/org/keycloak/quarkus/runtime/configuration/mappers/CachingPropertyMappers.java index dbbdd1988d4..ef96c12cedb 100644 --- a/quarkus/runtime/src/main/java/org/keycloak/quarkus/runtime/configuration/mappers/CachingPropertyMappers.java +++ b/quarkus/runtime/src/main/java/org/keycloak/quarkus/runtime/configuration/mappers/CachingPropertyMappers.java @@ -69,7 +69,7 @@ final class CachingPropertyMappers implements PropertyMapperGrouping { .to("kc.spi-jgroups-mtls--default--enabled") .isEnabled(CachingPropertyMappers::getDefaultMtlsEnabled, "a TCP based cache-stack is used") .build(), - fromOption(CachingOptions.CACHE_EMBEDDED_MTLS_KEYSTORE.withRuntimeSpecificDefault(getDefaultKeystorePathValue())) + fromOption(CachingOptions.CACHE_EMBEDDED_MTLS_KEYSTORE.withRuntimeSpecificDefault(getConfPathValue("cache-mtls-keystore.p12"))) .paramLabel("file") .to("kc.spi-jgroups-mtls--default--keystore-file") .isEnabled(() -> Configuration.isTrue(CachingOptions.CACHE_EMBEDDED_MTLS_ENABLED), "property '%s' is enabled".formatted(CachingOptions.CACHE_EMBEDDED_MTLS_ENABLED.getKey())) @@ -82,7 +82,7 @@ final class CachingPropertyMappers implements PropertyMapperGrouping { .isEnabled(() -> Configuration.isTrue(CachingOptions.CACHE_EMBEDDED_MTLS_ENABLED), "property '%s' is enabled".formatted(CachingOptions.CACHE_EMBEDDED_MTLS_ENABLED.getKey())) .validator(value -> checkOptionPresent(CachingOptions.CACHE_EMBEDDED_MTLS_KEYSTORE_PASSWORD, CachingOptions.CACHE_EMBEDDED_MTLS_KEYSTORE)) .build(), - fromOption(CachingOptions.CACHE_EMBEDDED_MTLS_TRUSTSTORE.withRuntimeSpecificDefault(getDefaultTruststorePathValue())) + fromOption(CachingOptions.CACHE_EMBEDDED_MTLS_TRUSTSTORE.withRuntimeSpecificDefault(getConfPathValue("cache-mtls-truststore.p12"))) .paramLabel("file") .to("kc.spi-jgroups-mtls--default--truststore-file") .isEnabled(() -> Configuration.isTrue(CachingOptions.CACHE_EMBEDDED_MTLS_ENABLED), "property '%s' is enabled".formatted(CachingOptions.CACHE_EMBEDDED_MTLS_ENABLED.getKey())) @@ -204,39 +204,12 @@ final class CachingPropertyMappers implements PropertyMapperGrouping { } private static String resolveConfigFile(String value, ConfigSourceInterceptorContext context) { - String homeDir = Environment.getHomeDir(); - - return homeDir == null ? - value : - homeDir + (homeDir.endsWith(File.separator) ? "" : File.separator) + "conf" + File.separator + value; + return Environment.getHomeDir().map(f -> Paths.get(f, "conf", value).toString()).orElse(null); } - private static String getDefaultKeystorePathValue() { - String homeDir = Environment.getHomeDir(); - - if (homeDir != null) { - File file = Paths.get(homeDir, "conf", "cache-mtls-keystore.p12").toFile(); - - if (file.exists()) { - return file.getAbsolutePath(); - } - } - - return null; - } - - private static String getDefaultTruststorePathValue() { - String homeDir = Environment.getHomeDir(); - - if (homeDir != null) { - File file = Paths.get(homeDir, "conf", "cache-mtls-truststore.p12").toFile(); - - if (file.exists()) { - return file.getAbsolutePath(); - } - } - - return null; + private static String getConfPathValue(String file) { + return Environment.getHomeDir().map(f -> Paths.get(f, "conf", file).toFile()).filter(File::exists) + .map(File::getAbsolutePath).orElse(null); } private static PropertyMapper maxCountOpt(String cacheName, BooleanSupplier isEnabled, String enabledWhen) { diff --git a/quarkus/runtime/src/main/java/org/keycloak/quarkus/runtime/configuration/mappers/HttpPropertyMappers.java b/quarkus/runtime/src/main/java/org/keycloak/quarkus/runtime/configuration/mappers/HttpPropertyMappers.java index 5d240d9884a..ecd5e2baea4 100644 --- a/quarkus/runtime/src/main/java/org/keycloak/quarkus/runtime/configuration/mappers/HttpPropertyMappers.java +++ b/quarkus/runtime/src/main/java/org/keycloak/quarkus/runtime/configuration/mappers/HttpPropertyMappers.java @@ -202,17 +202,8 @@ public final class HttpPropertyMappers implements PropertyMapperGrouping { } private static File getDefaultKeystorePathValue() { - String homeDir = Environment.getHomeDir(); - - if (homeDir != null) { - File file = Paths.get(homeDir, "conf", "server.keystore").toFile(); - - if (file.exists()) { - return file; - } - } - - return null; + return Environment.getHomeDir().map(f -> Paths.get(f, "conf", "server.keystore").toFile()).filter(File::exists) + .orElse(null); } private static String resolveKeyStoreType(String value, diff --git a/quarkus/runtime/src/main/java/org/keycloak/quarkus/runtime/integration/QuarkusPlatform.java b/quarkus/runtime/src/main/java/org/keycloak/quarkus/runtime/integration/QuarkusPlatform.java index ebd121dc185..7d0c5c48276 100644 --- a/quarkus/runtime/src/main/java/org/keycloak/quarkus/runtime/integration/QuarkusPlatform.java +++ b/quarkus/runtime/src/main/java/org/keycloak/quarkus/runtime/integration/QuarkusPlatform.java @@ -19,7 +19,6 @@ package org.keycloak.quarkus.runtime.integration; import java.io.File; import java.io.IOException; -import java.nio.file.Files; import java.nio.file.Path; import java.util.concurrent.atomic.AtomicBoolean; @@ -60,34 +59,23 @@ public class QuarkusPlatform implements PlatformProvider { @Override public File getTmpDirectory() { if (tmpDir == null) { - String homeDir = Environment.getHomeDir(); + String dataDir = Environment.getDataDir().orElse(null); File tmpDir; - if (homeDir == null) { - // Should happen just in the unit tests + if (dataDir == null) { + // Should happen just in non-script launch scenarios try { - // Use "tmp" directory in case it points to the "target" directory (which is usually the case with quarkus unit tests) - // Trying to use "target" subdirectory to avoid the situation when separate subdirectory will be created in the "/tmp" for each build and hence "/tmp" directory being swamped with many subdirectories - String tmpDirProp = System.getProperty("java.io.tmpdir"); - if (tmpDirProp == null || !tmpDirProp.endsWith("target")) { - // Fallback to "target" inside "user.dir" - String userDirProp = System.getProperty("user.dir"); - if (userDirProp != null) { - File userDir = new File(userDirProp, "target"); - if (userDir.exists()) { - tmpDirProp = userDir.getAbsolutePath(); - } - } + tmpDir = Path.of(System.getProperty("java.io.tmpdir"), "keycloak-quarkus-tmp").toFile(); + if (tmpDir.exists()) { + org.apache.commons.io.FileUtils.deleteDirectory(tmpDir); + } + if (tmpDir.mkdirs()) { + tmpDir.deleteOnExit(); } - // Finally fallback to system tmp directory. Always create dedicated directory for current user - Path path = tmpDirProp != null ? Files.createTempDirectory(new File(tmpDirProp).toPath(), "keycloak-quarkus-tmp") : - Files.createTempDirectory("keycloak-quarkus-tmp"); - tmpDir = path.toFile(); } catch (IOException ioex) { throw new RuntimeException("It was not possible to create temporary directory keycloak-quarkus-tmp", ioex); } } else { - String dataDir = Environment.getDataDir(); tmpDir = new File(dataDir, "tmp"); tmpDir.mkdirs(); } diff --git a/quarkus/runtime/src/main/java/org/keycloak/quarkus/runtime/policy/QuarkusBlacklistPasswordPolicyProviderFactory.java b/quarkus/runtime/src/main/java/org/keycloak/quarkus/runtime/policy/QuarkusBlacklistPasswordPolicyProviderFactory.java index f271290867e..03df08789e7 100644 --- a/quarkus/runtime/src/main/java/org/keycloak/quarkus/runtime/policy/QuarkusBlacklistPasswordPolicyProviderFactory.java +++ b/quarkus/runtime/src/main/java/org/keycloak/quarkus/runtime/policy/QuarkusBlacklistPasswordPolicyProviderFactory.java @@ -33,6 +33,6 @@ public class QuarkusBlacklistPasswordPolicyProviderFactory extends BlacklistPass @Override public String getDefaultBlacklistsBasePath() { - return Environment.getDataDir() + File.separator + PASSWORD_BLACKLISTS_FOLDER; + return Environment.getDataDir().map(d -> d + File.separator + PASSWORD_BLACKLISTS_FOLDER).orElse(null); } } diff --git a/quarkus/runtime/src/main/java/org/keycloak/quarkus/runtime/themes/QuarkusFolderThemeProviderFactory.java b/quarkus/runtime/src/main/java/org/keycloak/quarkus/runtime/themes/QuarkusFolderThemeProviderFactory.java index 8b83c6dd38b..1465cbe309f 100644 --- a/quarkus/runtime/src/main/java/org/keycloak/quarkus/runtime/themes/QuarkusFolderThemeProviderFactory.java +++ b/quarkus/runtime/src/main/java/org/keycloak/quarkus/runtime/themes/QuarkusFolderThemeProviderFactory.java @@ -9,7 +9,7 @@ import org.keycloak.theme.ThemeProvider; import org.keycloak.theme.ThemeProviderFactory; import java.io.File; -import java.util.Objects; +import java.util.Optional; public class QuarkusFolderThemeProviderFactory implements ThemeProviderFactory { @@ -53,14 +53,7 @@ public class QuarkusFolderThemeProviderFactory implements ThemeProviderFactory { * @throws RuntimeException when filesystem path is not accessible */ private File getThemeRootDirWithFallback(String rootDirFromConfig) { - File themeRootDir; - - themeRootDir = new File(Objects.requireNonNullElseGet(rootDirFromConfig, Environment::getDefaultThemeRootDir)); - - if (!themeRootDir.exists()) { - return null; - } - - return themeRootDir; + return Optional.ofNullable(rootDirFromConfig).or(Environment::getDefaultThemeRootDir).map(File::new) + .filter(File::exists).orElse(null); } } diff --git a/quarkus/runtime/src/test/java/org/keycloak/quarkus/runtime/configuration/AbstractConfigurationTest.java b/quarkus/runtime/src/test/java/org/keycloak/quarkus/runtime/configuration/AbstractConfigurationTest.java index c9d0bb86422..6fc1e15b0a3 100644 --- a/quarkus/runtime/src/test/java/org/keycloak/quarkus/runtime/configuration/AbstractConfigurationTest.java +++ b/quarkus/runtime/src/test/java/org/keycloak/quarkus/runtime/configuration/AbstractConfigurationTest.java @@ -30,7 +30,6 @@ import java.util.Properties; import java.util.function.Function; import org.junit.After; -import org.junit.AfterClass; import org.junit.BeforeClass; import org.keycloak.Config; import org.keycloak.common.Profile; @@ -90,11 +89,6 @@ public abstract class AbstractConfigurationTest { resetConfiguration(); } - @AfterClass - public static void afterAll() { - Environment.removeHomeDir(); - } - protected static Config.Scope initConfig(String... scope) { Config.init(new MicroProfileConfigProvider(createConfig())); return Config.scope(scope); diff --git a/quarkus/runtime/src/test/java/org/keycloak/quarkus/runtime/configuration/ConfigurationTest.java b/quarkus/runtime/src/test/java/org/keycloak/quarkus/runtime/configuration/ConfigurationTest.java index 4f826427511..4988d63c022 100644 --- a/quarkus/runtime/src/test/java/org/keycloak/quarkus/runtime/configuration/ConfigurationTest.java +++ b/quarkus/runtime/src/test/java/org/keycloak/quarkus/runtime/configuration/ConfigurationTest.java @@ -270,7 +270,7 @@ public class ConfigurationTest extends AbstractConfigurationTest { assertEquals(H2Dialect.class.getName(), config.getConfigValue("kc.db-dialect").getValue()); assertEquals(Driver.class.getName(), config.getConfigValue("quarkus.datasource.jdbc.driver").getValue()); - assertEquals("jdbc:h2:file:" + Environment.getHomeDir() + "/data/h2/keycloakdb;NON_KEYWORDS=VALUE;DB_CLOSE_ON_EXIT=FALSE;DB_CLOSE_DELAY=0", config.getConfigValue("quarkus.datasource.jdbc.url").getValue()); + assertEquals("jdbc:h2:file:" + Environment.getHomeDir().orElseThrow() + "/data/h2/keycloakdb;NON_KEYWORDS=VALUE;DB_CLOSE_ON_EXIT=FALSE;DB_CLOSE_DELAY=0", config.getConfigValue("quarkus.datasource.jdbc.url").getValue()); ConfigArgsConfigSource.setCliArgs("--db=dev-mem"); config = createConfig(); @@ -403,7 +403,7 @@ public class ConfigurationTest extends AbstractConfigurationTest { @Test public void testNestedDatabaseProperties() { SmallRyeConfig config = createConfig(); - assertEquals("jdbc:h2:file:"+Environment.getHomeDir()+"/data/keycloakdb", config.getConfigValue("quarkus.datasource.foo").getValue()); + assertEquals("jdbc:h2:file:"+Environment.getHomeDir().orElseThrow()+"/data/keycloakdb", config.getConfigValue("quarkus.datasource.foo").getValue()); Assert.assertEquals("foo-def-suffix", config.getConfigValue("quarkus.datasource.bar").getValue()); @@ -423,7 +423,7 @@ public class ConfigurationTest extends AbstractConfigurationTest { @Test public void testClusterConfig() { // Cluster enabled by default, but disabled for the "dev" profile - String conf = Environment.getHomeDir() + File.separator + "conf" + File.separator; + String conf = Environment.getHomeDir().orElseThrow() + File.separator + "conf" + File.separator; Assert.assertEquals(conf + "cache-ispn.xml", cacheEmbeddedConfiguration().get(DefaultCacheEmbeddedConfigProviderFactory.CONFIG)); // If explicitly set, then it is always used regardless of the profile diff --git a/quarkus/runtime/src/test/java/org/keycloak/quarkus/runtime/configuration/DatasourcesConfigurationTest.java b/quarkus/runtime/src/test/java/org/keycloak/quarkus/runtime/configuration/DatasourcesConfigurationTest.java index ce7e03e7f01..f3d83be087d 100644 --- a/quarkus/runtime/src/test/java/org/keycloak/quarkus/runtime/configuration/DatasourcesConfigurationTest.java +++ b/quarkus/runtime/src/test/java/org/keycloak/quarkus/runtime/configuration/DatasourcesConfigurationTest.java @@ -188,7 +188,7 @@ public class DatasourcesConfigurationTest extends AbstractConfigurationTest { ConfigArgsConfigSource.setCliArgs("--db-kind-asdf=dev-file", "--db-url-properties-asdf=;DB_CLOSE_ON_EXIT=true"); initConfig(); assertExternalConfig(Map.of( - "quarkus.datasource.\"asdf\".jdbc.url", "jdbc:h2:file:" + Environment.getHomeDir() + "/data/h2-asdf/keycloakdb-asdf;DB_CLOSE_ON_EXIT=true;NON_KEYWORDS=VALUE;DB_CLOSE_DELAY=0", + "quarkus.datasource.\"asdf\".jdbc.url", "jdbc:h2:file:" + Environment.getHomeDir().orElseThrow() + "/data/h2-asdf/keycloakdb-asdf;DB_CLOSE_ON_EXIT=true;NON_KEYWORDS=VALUE;DB_CLOSE_DELAY=0", "quarkus.datasource.\"asdf\".db-kind", "h2" )); onAfter(); @@ -283,7 +283,7 @@ public class DatasourcesConfigurationTest extends AbstractConfigurationTest { @Test public void nestedDatasourceProperties() { initConfig(); - assertExternalConfig("quarkus.datasource.foo", "jdbc:h2:file:" + Environment.getHomeDir() + "/data/keycloakdb"); + assertExternalConfig("quarkus.datasource.foo", "jdbc:h2:file:" + Environment.getHomeDir().orElseThrow() + "/data/keycloakdb"); assertExternalConfig("quarkus.datasource.bar", "foo-def-suffix"); System.setProperty("kc.prop5", "val5");