This is an automated email from the ASF dual-hosted git repository.

dimas pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/polaris.git


The following commit(s) were added to refs/heads/main by this push:
     new 656266e5c Introduce RealmConfigurationSource (#3573)
656266e5c is described below

commit 656266e5c63cf5b5677ec3f2928bcc988f162ff6
Author: Dmitri Bourlatchkov <[email protected]>
AuthorDate: Wed Feb 11 11:42:01 2026 -0500

    Introduce RealmConfigurationSource (#3573)
    
    * Introduce RealmConfigurationSource
    
    The existing `PolarisConfigurationStore` interface is a fixture of
    SPI methods providing config values from the environment and utility
    methods for various lookup parameter permutations and type casts.
    
    This change adds `RealmConfigurationSource` for the SPI part and
    moves lookup logic into `RealmConfigImpl`.
    
    Note that existing service code always accesses config via `RealmConfig`.
    
    The old `PolarisConfigurationStore` interface remain for backward 
compatibility
    and but redirects actual config lookup to `RealmConfigImpl`.
---
 CHANGELOG.md                                       |   1 +
 .../maintenance/TestCatalogMaintenance.java        |   8 +-
 .../nosql/metastore/TestNoSqlMetaStoreManager.java |   6 +-
 .../nosql/metastore/TestNoSqlResolver.java         |   6 +-
 .../persistence/nosql/metastore/CdiProducers.java  |   6 +-
 .../apache/polaris/core/PolarisCallContext.java    |  27 +++-
 .../core/config/PolarisConfigurationStore.java     |  65 ++-------
 .../apache/polaris/core/config/RealmConfig.java    |   4 +-
 .../polaris/core/config/RealmConfigImpl.java       |  78 ++++++++--
 .../core/config/RealmConfigurationSource.java      |  45 ++++++
 .../polaris/core/config/RealmConfigImplTest.java   | 159 +++++++++++++++++++++
 .../core/storage/BaseStorageIntegrationTest.java   |   4 +-
 .../storage/InMemoryStorageIntegrationTest.java    |  31 +---
 .../storage/cache/StorageCredentialCacheTest.java  |  24 ++--
 .../storage/PolarisConfigurationStoreTest.java     |   1 +
 .../aws/AwsCredentialsStorageIntegrationTest.java  | 128 +++--------------
 .../admintool/config/AdminToolProducers.java       |  12 +-
 .../service/config/DefaultConfigurationStore.java  |  21 +--
 .../polaris/service/config/ServiceProducers.java   |  10 +-
 .../AbstractIcebergCatalogHandlerAuthzTest.java    |   6 +-
 .../config/DefaultConfigurationStoreTest.java      |  13 +-
 .../polaris/service/entity/CatalogEntityTest.java  |   4 +-
 .../test/PolarisIntegrationTestFixture.java        |   2 +-
 .../service/test/PolarisIntegrationTestHelper.java |   4 +-
 .../org/apache/polaris/service/TestServices.java   |  29 +---
 25 files changed, 413 insertions(+), 281 deletions(-)

diff --git a/CHANGELOG.md b/CHANGELOG.md
index cb5584ee7..2bb892d0c 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -66,6 +66,7 @@ request adding CHANGELOG notes for breaking (!) changes and 
possibly other secti
 ### Deprecations
 
 - The configuration option `polaris.rate-limiter.token-bucket.window` is no 
longer supported and should be removed.
+- `PolarisConfigurationStore` has been deprecated for removal.
 
 ### Fixes
 
diff --git 
a/persistence/nosql/persistence/metastore-maintenance/src/test/java/org/apache/polaris/persistence/nosql/metastore/maintenance/TestCatalogMaintenance.java
 
b/persistence/nosql/persistence/metastore-maintenance/src/test/java/org/apache/polaris/persistence/nosql/metastore/maintenance/TestCatalogMaintenance.java
index 84ffa51a8..91f018bd1 100644
--- 
a/persistence/nosql/persistence/metastore-maintenance/src/test/java/org/apache/polaris/persistence/nosql/metastore/maintenance/TestCatalogMaintenance.java
+++ 
b/persistence/nosql/persistence/metastore-maintenance/src/test/java/org/apache/polaris/persistence/nosql/metastore/maintenance/TestCatalogMaintenance.java
@@ -53,7 +53,7 @@ import java.util.UUID;
 import java.util.stream.Collectors;
 import java.util.stream.Stream;
 import org.apache.polaris.core.PolarisCallContext;
-import org.apache.polaris.core.config.PolarisConfigurationStore;
+import org.apache.polaris.core.config.RealmConfigurationSource;
 import org.apache.polaris.core.context.RealmContext;
 import org.apache.polaris.core.entity.CatalogEntity;
 import org.apache.polaris.core.entity.PolarisBaseEntity;
@@ -101,7 +101,7 @@ public class TestCatalogMaintenance {
   @Inject MaintenanceService maintenance;
   @Inject MutableMonotonicClock mutableMonotonicClock;
 
-  @Inject PolarisConfigurationStore configurationStore;
+  @Inject RealmConfigurationSource configurationSource;
   @Inject CacheBackend cacheBackend;
   @Inject RealmPersistenceFactory realmPersistenceFactory;
 
@@ -139,7 +139,7 @@ public class TestCatalogMaintenance {
 
     var manager = 
metaStoreManagerFactory.getOrCreateMetaStoreManager(realmContext);
     var session = metaStoreManagerFactory.getOrCreateSession(realmContext);
-    var callCtx = new PolarisCallContext(realmContext, session, 
configurationStore);
+    var callCtx = new PolarisCallContext(realmContext, session, 
configurationSource);
 
     var persistence =
         
realmPersistenceFactory.newBuilder().realmId(realmId).skipDecorators().build();
@@ -455,7 +455,7 @@ public class TestCatalogMaintenance {
 
     var manager = 
metaStoreManagerFactory.getOrCreateMetaStoreManager(realmContext);
     var session = metaStoreManagerFactory.getOrCreateSession(realmContext);
-    var callCtx = new PolarisCallContext(realmContext, session, 
configurationStore);
+    var callCtx = new PolarisCallContext(realmContext, session, 
configurationSource);
 
     for (var e : entities) {
       var result =
diff --git 
a/persistence/nosql/persistence/metastore/src/test/java/org/apache/polaris/persistence/nosql/metastore/TestNoSqlMetaStoreManager.java
 
b/persistence/nosql/persistence/metastore/src/test/java/org/apache/polaris/persistence/nosql/metastore/TestNoSqlMetaStoreManager.java
index e6a15e96a..1c41980db 100644
--- 
a/persistence/nosql/persistence/metastore/src/test/java/org/apache/polaris/persistence/nosql/metastore/TestNoSqlMetaStoreManager.java
+++ 
b/persistence/nosql/persistence/metastore/src/test/java/org/apache/polaris/persistence/nosql/metastore/TestNoSqlMetaStoreManager.java
@@ -31,7 +31,7 @@ import java.util.Optional;
 import java.util.UUID;
 import org.apache.iceberg.catalog.Namespace;
 import org.apache.polaris.core.PolarisCallContext;
-import org.apache.polaris.core.config.PolarisConfigurationStore;
+import org.apache.polaris.core.config.RealmConfigurationSource;
 import org.apache.polaris.core.context.RealmContext;
 import org.apache.polaris.core.entity.NamespaceEntity;
 import org.apache.polaris.core.entity.PolarisBaseEntity;
@@ -70,7 +70,7 @@ public class TestNoSqlMetaStoreManager extends 
BasePolarisMetaStoreManagerTest {
   @Identifier("nosql")
   MetaStoreManagerFactory metaStoreManagerFactory;
 
-  @Inject PolarisConfigurationStore configurationStore;
+  @Inject RealmConfigurationSource configurationSource;
   @Inject MonotonicClock monotonicClock;
 
   String realmId;
@@ -91,7 +91,7 @@ public class TestNoSqlMetaStoreManager extends 
BasePolarisMetaStoreManagerTest {
     var manager = 
metaStoreManagerFactory.getOrCreateMetaStoreManager(realmContext);
     var session = metaStoreManagerFactory.getOrCreateSession(realmContext);
 
-    var callCtx = new PolarisCallContext(realmContext, session, 
configurationStore);
+    var callCtx = new PolarisCallContext(realmContext, session, 
configurationSource);
 
     return new PolarisTestMetaStoreManager(manager, callCtx, startTime, false);
   }
diff --git 
a/persistence/nosql/persistence/metastore/src/test/java/org/apache/polaris/persistence/nosql/metastore/TestNoSqlResolver.java
 
b/persistence/nosql/persistence/metastore/src/test/java/org/apache/polaris/persistence/nosql/metastore/TestNoSqlResolver.java
index 464af9ddb..0488bfda2 100644
--- 
a/persistence/nosql/persistence/metastore/src/test/java/org/apache/polaris/persistence/nosql/metastore/TestNoSqlResolver.java
+++ 
b/persistence/nosql/persistence/metastore/src/test/java/org/apache/polaris/persistence/nosql/metastore/TestNoSqlResolver.java
@@ -25,7 +25,7 @@ import jakarta.inject.Inject;
 import java.util.List;
 import java.util.UUID;
 import org.apache.polaris.core.PolarisCallContext;
-import org.apache.polaris.core.config.PolarisConfigurationStore;
+import org.apache.polaris.core.config.RealmConfigurationSource;
 import org.apache.polaris.core.context.RealmContext;
 import org.apache.polaris.core.entity.PolarisGrantRecord;
 import org.apache.polaris.core.persistence.BaseResolverTest;
@@ -48,7 +48,7 @@ public class TestNoSqlResolver extends BaseResolverTest {
   @Identifier("nosql")
   MetaStoreManagerFactory metaStoreManagerFactory;
 
-  @Inject PolarisConfigurationStore configurationStore;
+  @Inject RealmConfigurationSource configurationSource;
   @Inject MonotonicClock monotonicClock;
 
   PolarisMetaStoreManager metaStoreManager;
@@ -73,7 +73,7 @@ public class TestNoSqlResolver extends BaseResolverTest {
       metaStoreManager = 
metaStoreManagerFactory.getOrCreateMetaStoreManager(realmContext);
       var session = metaStoreManagerFactory.getOrCreateSession(realmContext);
 
-      callCtx = new PolarisCallContext(realmContext, session, 
configurationStore);
+      callCtx = new PolarisCallContext(realmContext, session, 
configurationSource);
 
       tm = new PolarisTestMetaStoreManager(metaStoreManager, callCtx, 
startTime, false);
     }
diff --git 
a/persistence/nosql/persistence/metastore/src/testFixtures/java/org/apache/polaris/persistence/nosql/metastore/CdiProducers.java
 
b/persistence/nosql/persistence/metastore/src/testFixtures/java/org/apache/polaris/persistence/nosql/metastore/CdiProducers.java
index 79de0d6ae..126ce395f 100644
--- 
a/persistence/nosql/persistence/metastore/src/testFixtures/java/org/apache/polaris/persistence/nosql/metastore/CdiProducers.java
+++ 
b/persistence/nosql/persistence/metastore/src/testFixtures/java/org/apache/polaris/persistence/nosql/metastore/CdiProducers.java
@@ -24,7 +24,7 @@ import jakarta.enterprise.inject.Produces;
 import java.time.Clock;
 import org.apache.polaris.core.PolarisDefaultDiagServiceImpl;
 import org.apache.polaris.core.PolarisDiagnostics;
-import org.apache.polaris.core.config.PolarisConfigurationStore;
+import org.apache.polaris.core.config.RealmConfigurationSource;
 import org.apache.polaris.core.storage.PolarisStorageConfigurationInfo;
 import org.apache.polaris.core.storage.PolarisStorageIntegration;
 import org.apache.polaris.core.storage.PolarisStorageIntegrationProvider;
@@ -44,8 +44,8 @@ public class CdiProducers {
   }
 
   @Produces
-  PolarisConfigurationStore producePolarisConfigurationStore() {
-    return new PolarisConfigurationStore() {};
+  RealmConfigurationSource produceRealmConfigurationSource() {
+    return RealmConfigurationSource.EMPTY_CONFIG;
   }
 
   @Produces
diff --git 
a/polaris-core/src/main/java/org/apache/polaris/core/PolarisCallContext.java 
b/polaris-core/src/main/java/org/apache/polaris/core/PolarisCallContext.java
index 272b455e7..d260f6979 100644
--- a/polaris-core/src/main/java/org/apache/polaris/core/PolarisCallContext.java
+++ b/polaris-core/src/main/java/org/apache/polaris/core/PolarisCallContext.java
@@ -19,9 +19,9 @@
 package org.apache.polaris.core;
 
 import jakarta.annotation.Nonnull;
-import org.apache.polaris.core.config.PolarisConfigurationStore;
 import org.apache.polaris.core.config.RealmConfig;
 import org.apache.polaris.core.config.RealmConfigImpl;
+import org.apache.polaris.core.config.RealmConfigurationSource;
 import org.apache.polaris.core.context.CallContext;
 import org.apache.polaris.core.context.RealmContext;
 import org.apache.polaris.core.persistence.BasePersistence;
@@ -34,23 +34,36 @@ public class PolarisCallContext implements CallContext {
 
   // meta store which is used to persist Polaris entity metadata
   private final BasePersistence metaStore;
-  private final PolarisConfigurationStore configurationStore;
+  private final RealmConfigurationSource configurationSource;
   private final RealmContext realmContext;
   private final RealmConfig realmConfig;
 
+  /**
+   * @deprecated Use {@link 
PolarisCallContext#PolarisCallContext(RealmContext, BasePersistence,
+   *     RealmConfigurationSource)}.
+   */
+  @SuppressWarnings("removal")
+  @Deprecated(forRemoval = true)
   public PolarisCallContext(
       @Nonnull RealmContext realmContext,
       @Nonnull BasePersistence metaStore,
-      @Nonnull PolarisConfigurationStore configurationStore) {
+      @Nonnull org.apache.polaris.core.config.PolarisConfigurationStore 
configurationStore) {
+    this(realmContext, metaStore, configurationStore::getConfiguration);
+  }
+
+  public PolarisCallContext(
+      @Nonnull RealmContext realmContext,
+      @Nonnull BasePersistence metaStore,
+      @Nonnull RealmConfigurationSource configurationSource) {
     this.realmContext = realmContext;
     this.metaStore = metaStore;
-    this.configurationStore = configurationStore;
-    this.realmConfig = new RealmConfigImpl(this.configurationStore, 
this.realmContext);
+    this.configurationSource = configurationSource;
+    this.realmConfig = new RealmConfigImpl(this.configurationSource, 
this.realmContext);
   }
 
   public PolarisCallContext(
       @Nonnull RealmContext realmContext, @Nonnull BasePersistence metaStore) {
-    this(realmContext, metaStore, new PolarisConfigurationStore() {});
+    this(realmContext, metaStore, RealmConfigurationSource.EMPTY_CONFIG);
   }
 
   public BasePersistence getMetaStore() {
@@ -81,6 +94,6 @@ public class PolarisCallContext implements CallContext {
     // copy of the RealmContext to ensure the access during the task executor.
     String realmId = this.realmContext.getRealmIdentifier();
     RealmContext realmContext = () -> realmId;
-    return new PolarisCallContext(realmContext, this.metaStore, 
this.configurationStore);
+    return new PolarisCallContext(realmContext, this.metaStore, 
this.configurationSource);
   }
 }
diff --git 
a/polaris-core/src/main/java/org/apache/polaris/core/config/PolarisConfigurationStore.java
 
b/polaris-core/src/main/java/org/apache/polaris/core/config/PolarisConfigurationStore.java
index 21bae3308..7da9b2eb1 100644
--- 
a/polaris-core/src/main/java/org/apache/polaris/core/config/PolarisConfigurationStore.java
+++ 
b/polaris-core/src/main/java/org/apache/polaris/core/config/PolarisConfigurationStore.java
@@ -18,11 +18,8 @@
  */
 package org.apache.polaris.core.config;
 
-import com.google.common.base.Preconditions;
 import jakarta.annotation.Nonnull;
 import jakarta.annotation.Nullable;
-import java.util.ArrayList;
-import java.util.List;
 import java.util.Map;
 import org.apache.polaris.core.context.RealmContext;
 import org.apache.polaris.core.entity.CatalogEntity;
@@ -32,7 +29,11 @@ import org.slf4j.LoggerFactory;
 /**
  * Dynamic configuration store used to retrieve runtime parameters, which may 
vary by realm or by
  * request.
+ *
+ * @deprecated Use {@link RealmConfig} instead.
  */
+@SuppressWarnings("DeprecatedIsStillUsed")
+@Deprecated(forRemoval = true)
 public interface PolarisConfigurationStore {
   Logger LOGGER = LoggerFactory.getLogger(PolarisConfigurationStore.class);
 
@@ -58,35 +59,10 @@ public interface PolarisConfigurationStore {
    * @return the current value or the supplied default value
    * @param <T> the type of the configuration value
    */
+  @SuppressWarnings("removal")
   default <T> @Nonnull T getConfiguration(
       @Nonnull RealmContext realmContext, String configName, @Nonnull T 
defaultValue) {
-    Preconditions.checkNotNull(defaultValue, "Cannot pass null as a default 
value");
-    T configValue = getConfiguration(realmContext, configName);
-    return configValue != null ? configValue : defaultValue;
-  }
-
-  /**
-   * In some cases, we may extract a value that doesn't match the expected 
type for a config. This
-   * method can be used to attempt to force-cast it using `String.valueOf`
-   */
-  private <T> @Nonnull T tryCast(PolarisConfiguration<T> config, Object value) 
{
-    if (value == null) {
-      return config.defaultValue();
-    }
-
-    if (config.defaultValue() instanceof Boolean) {
-      return config.cast(Boolean.valueOf(String.valueOf(value)));
-    } else if (config.defaultValue() instanceof Integer) {
-      return config.cast(Integer.valueOf(String.valueOf(value)));
-    } else if (config.defaultValue() instanceof Long) {
-      return config.cast(Long.valueOf(String.valueOf(value)));
-    } else if (config.defaultValue() instanceof Double) {
-      return config.cast(Double.valueOf(String.valueOf(value)));
-    } else if (config.defaultValue() instanceof List<?>) {
-      return config.cast(new ArrayList<>((List<?>) value));
-    } else {
-      return config.cast(value);
-    }
+    return asRealmConfig(realmContext).getConfig(configName, defaultValue);
   }
 
   /**
@@ -99,8 +75,7 @@ public interface PolarisConfigurationStore {
    */
   default <T> @Nonnull T getConfiguration(
       @Nonnull RealmContext realmContext, PolarisConfiguration<T> config) {
-    T result = getConfiguration(realmContext, config.key(), 
config.defaultValue());
-    return tryCast(config, result);
+    return asRealmConfig(realmContext).getConfig(config);
   }
 
   /**
@@ -138,26 +113,10 @@ public interface PolarisConfigurationStore {
       @Nonnull RealmContext realmContext,
       @Nonnull Map<String, String> catalogProperties,
       PolarisConfiguration<T> config) {
-    if (config.hasCatalogConfig() || config.hasCatalogConfigUnsafe()) {
-      String propertyValue = null;
-      if (config.hasCatalogConfig()) {
-        propertyValue = catalogProperties.get(config.catalogConfig());
-      }
-      if (propertyValue == null) {
-        if (config.hasCatalogConfigUnsafe()) {
-          propertyValue = catalogProperties.get(config.catalogConfigUnsafe());
-        }
-        if (propertyValue != null) {
-          LOGGER.warn(
-              String.format(
-                  "Deprecated config %s is in use and will be removed in a 
future version",
-                  config.catalogConfigUnsafe()));
-        }
-      }
-      if (propertyValue != null) {
-        return tryCast(config, propertyValue);
-      }
-    }
-    return getConfiguration(realmContext, config);
+    return asRealmConfig(realmContext).getConfig(config, catalogProperties);
+  }
+
+  private RealmConfig asRealmConfig(RealmContext realmContext) {
+    return new RealmConfigImpl(this::getConfiguration, realmContext);
   }
 }
diff --git 
a/polaris-core/src/main/java/org/apache/polaris/core/config/RealmConfig.java 
b/polaris-core/src/main/java/org/apache/polaris/core/config/RealmConfig.java
index 62135d72d..5d0096d6a 100644
--- a/polaris-core/src/main/java/org/apache/polaris/core/config/RealmConfig.java
+++ b/polaris-core/src/main/java/org/apache/polaris/core/config/RealmConfig.java
@@ -33,7 +33,7 @@ public interface RealmConfig {
    * @return the current value set for the configuration key, or null if not 
set
    * @deprecated Use typed {@link #getConfig(PolarisConfiguration)} instead.
    */
-  @Deprecated
+  @Deprecated(forRemoval = true)
   <T> @Nullable T getConfig(String configName);
 
   /**
@@ -44,7 +44,9 @@ public interface RealmConfig {
    * @param configName the name of the configuration key to check
    * @param defaultValue the default value if the configuration key has no 
value
    * @return the current value or the supplied default value
+   * @deprecated Use typed {@link #getConfig(PolarisConfiguration)} instead.
    */
+  @Deprecated(forRemoval = true)
   <T> T getConfig(String configName, T defaultValue);
 
   /**
diff --git 
a/polaris-core/src/main/java/org/apache/polaris/core/config/RealmConfigImpl.java
 
b/polaris-core/src/main/java/org/apache/polaris/core/config/RealmConfigImpl.java
index d2c28bae2..751625658 100644
--- 
a/polaris-core/src/main/java/org/apache/polaris/core/config/RealmConfigImpl.java
+++ 
b/polaris-core/src/main/java/org/apache/polaris/core/config/RealmConfigImpl.java
@@ -18,43 +18,105 @@
  */
 package org.apache.polaris.core.config;
 
+import jakarta.annotation.Nonnull;
 import jakarta.annotation.Nullable;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
 import java.util.Map;
 import org.apache.polaris.core.context.RealmContext;
 import org.apache.polaris.core.entity.CatalogEntity;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 public class RealmConfigImpl implements RealmConfig {
+  private static final Logger LOGGER = 
LoggerFactory.getLogger(RealmConfigImpl.class);
 
-  private final PolarisConfigurationStore configurationStore;
+  private final RealmConfigurationSource configurationSource;
   private final RealmContext realmContext;
 
-  public RealmConfigImpl(PolarisConfigurationStore configurationStore, 
RealmContext realmContext) {
-    this.configurationStore = configurationStore;
+  public RealmConfigImpl(RealmConfigurationSource configurationSource, 
RealmContext realmContext) {
+    this.configurationSource = configurationSource;
     this.realmContext = realmContext;
   }
 
+  @SuppressWarnings("removal")
   @Override
   public <T> @Nullable T getConfig(String configName) {
-    return configurationStore.getConfiguration(realmContext, configName);
+    @SuppressWarnings("unchecked")
+    T value = (T) configurationSource.getConfigValue(realmContext, configName);
+    return value;
   }
 
+  @SuppressWarnings("removal")
   @Override
   public <T> T getConfig(String configName, T defaultValue) {
-    return configurationStore.getConfiguration(realmContext, configName, 
defaultValue);
+    @SuppressWarnings("unchecked")
+    T value = (T) getConfig(configName);
+    if (value == null) {
+      return defaultValue;
+    }
+    return value;
   }
 
   @Override
   public <T> T getConfig(PolarisConfiguration<T> config) {
-    return configurationStore.getConfiguration(realmContext, config);
+    return getConfig(config, Collections.emptyMap());
   }
 
   @Override
   public <T> T getConfig(PolarisConfiguration<T> config, CatalogEntity 
catalogEntity) {
-    return configurationStore.getConfiguration(realmContext, catalogEntity, 
config);
+    return getConfig(config, catalogEntity.getPropertiesAsMap());
   }
 
   @Override
   public <T> T getConfig(PolarisConfiguration<T> config, Map<String, String> 
catalogProperties) {
-    return configurationStore.getConfiguration(realmContext, 
catalogProperties, config);
+    Object propertyValue = null;
+    if (config.hasCatalogConfig() || config.hasCatalogConfigUnsafe()) {
+      if (config.hasCatalogConfig()) {
+        propertyValue = catalogProperties.get(config.catalogConfig());
+      }
+      if (propertyValue == null) {
+        if (config.hasCatalogConfigUnsafe()) {
+          propertyValue = catalogProperties.get(config.catalogConfigUnsafe());
+        }
+        if (propertyValue != null) {
+          LOGGER.warn(
+              String.format(
+                  "Deprecated config %s is in use and will be removed in a 
future version",
+                  config.catalogConfigUnsafe()));
+        }
+      }
+    }
+
+    if (propertyValue == null) {
+      propertyValue = configurationSource.getConfigValue(realmContext, 
config.key());
+    }
+
+    return tryCast(config, propertyValue);
+  }
+
+  /**
+   * In some cases, we may extract a value that doesn't match the expected 
type for a config. This
+   * method can be used to attempt to force-cast it using `String.valueOf`
+   */
+  private <T> @Nonnull T tryCast(PolarisConfiguration<T> config, Object value) 
{
+    if (value == null) {
+      return config.defaultValue();
+    }
+
+    if (config.defaultValue() instanceof Boolean) {
+      return config.cast(Boolean.valueOf(String.valueOf(value)));
+    } else if (config.defaultValue() instanceof Integer) {
+      return config.cast(Integer.valueOf(String.valueOf(value)));
+    } else if (config.defaultValue() instanceof Long) {
+      return config.cast(Long.valueOf(String.valueOf(value)));
+    } else if (config.defaultValue() instanceof Double) {
+      return config.cast(Double.valueOf(String.valueOf(value)));
+    } else if (config.defaultValue() instanceof List<?>) {
+      return config.cast(new ArrayList<>((List<?>) value));
+    } else {
+      return config.cast(value);
+    }
   }
 }
diff --git 
a/polaris-core/src/main/java/org/apache/polaris/core/config/RealmConfigurationSource.java
 
b/polaris-core/src/main/java/org/apache/polaris/core/config/RealmConfigurationSource.java
new file mode 100644
index 000000000..e7f84cc01
--- /dev/null
+++ 
b/polaris-core/src/main/java/org/apache/polaris/core/config/RealmConfigurationSource.java
@@ -0,0 +1,45 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.polaris.core.config;
+
+import jakarta.annotation.Nonnull;
+import jakarta.annotation.Nullable;
+import org.apache.polaris.core.context.RealmContext;
+
+/**
+ * This is an SPI interface used by Polaris Core for loading base 
configuration values from the
+ * environment.
+ *
+ * <p>Core classes are expected to use {@link RealmConfig} for configuration 
lookup in runtime.
+ */
+public interface RealmConfigurationSource {
+  RealmConfigurationSource EMPTY_CONFIG = (rc, name) -> null;
+
+  /**
+   * Retrieve the current value for a configuration key for a given realm. May 
be null if not set.
+   *
+   * @param realmContext realm context for the configuration lookup request.
+   * @param configName the name of the configuration key to look up.
+   * @return the current value set for the configuration key for the given 
realm, or null if not
+   *     set.
+   */
+  @Nullable
+  Object getConfigValue(@Nonnull RealmContext realmContext, String configName);
+}
diff --git 
a/polaris-core/src/test/java/org/apache/polaris/core/config/RealmConfigImplTest.java
 
b/polaris-core/src/test/java/org/apache/polaris/core/config/RealmConfigImplTest.java
new file mode 100644
index 000000000..1cd05541b
--- /dev/null
+++ 
b/polaris-core/src/test/java/org/apache/polaris/core/config/RealmConfigImplTest.java
@@ -0,0 +1,159 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.polaris.core.config;
+
+import static 
org.apache.polaris.core.config.RealmConfigurationSource.EMPTY_CONFIG;
+import static org.assertj.core.api.Assertions.assertThat;
+
+import java.util.List;
+import java.util.Map;
+import java.util.UUID;
+import org.apache.polaris.core.entity.CatalogEntity;
+import org.junit.jupiter.api.Test;
+
+class RealmConfigImplTest {
+
+  private static final RealmConfigurationSource stringsSource =
+      (rc, name) -> String.format("value-%s-%s", rc.getRealmIdentifier(), 
name);
+
+  private RealmConfig strings(String realmName) {
+    return new RealmConfigImpl(stringsSource, () -> realmName);
+  }
+
+  private RealmConfig fixed(Object value) {
+    return new RealmConfigImpl((rc, name) -> value, () -> "test-realm");
+  }
+
+  private RealmConfig empty() {
+    return new RealmConfigImpl(EMPTY_CONFIG, () -> "test-realm");
+  }
+
+  @Test
+  @SuppressWarnings("removal")
+  void legacyLookup() {
+    assertThat((Object) 
strings("rc1").getConfig("c1")).isEqualTo("value-rc1-c1");
+    assertThat((Object) strings("rc2").getConfig("c1", 
"default1")).isEqualTo("value-rc2-c1");
+    assertThat((Object) empty().getConfig("c1", 
"default1")).isEqualTo("default1");
+  }
+
+  @Test
+  void configPropertyOrder() {
+    @SuppressWarnings("deprecation")
+    FeatureConfiguration<String> cfg1 =
+        PolarisConfiguration.<String>builder()
+            .key("TEST-KEY1")
+            .catalogConfig("polaris.config.cat-prop")
+            .catalogConfigUnsafe("legacy-prop")
+            .description("test")
+            .defaultValue("default2")
+            .buildFeatureConfiguration();
+    
assertThat(strings("rc1").getConfig(cfg1)).isEqualTo("value-rc1-TEST-KEY1");
+    assertThat(strings("rc2").getConfig(cfg1, 
Map.of())).isEqualTo("value-rc2-TEST-KEY1");
+    assertThat(strings("rc3").getConfig(cfg1, 
Map.of("polaris.config.cat-prop", "cat1")))
+        .isEqualTo("cat1");
+    assertThat(strings("rc3").getConfig(cfg1, Map.of("legacy-prop", 
"old2"))).isEqualTo("old2");
+    assertThat(empty().getConfig(cfg1)).isEqualTo("default2");
+
+    @SuppressWarnings("deprecation")
+    FeatureConfiguration<String> cfg2 =
+        PolarisConfiguration.<String>builder()
+            .key("TEST-KEY2")
+            .catalogConfigUnsafe("legacy-prop2")
+            .description("test")
+            .defaultValue("default2")
+            .buildFeatureConfiguration();
+    
assertThat(strings("rc1").getConfig(cfg2)).isEqualTo("value-rc1-TEST-KEY2");
+    assertThat(strings("rc2").getConfig(cfg2, 
Map.of())).isEqualTo("value-rc2-TEST-KEY2");
+    assertThat(strings("rc3").getConfig(cfg2, Map.of("legacy-prop2", 
"old2"))).isEqualTo("old2");
+    assertThat(empty().getConfig(cfg2)).isEqualTo("default2");
+
+    FeatureConfiguration<String> cfg3 =
+        PolarisConfiguration.<String>builder()
+            .key("TEST-KEY3")
+            .catalogConfig("polaris.config.cat-prop2")
+            .description("test")
+            .defaultValue("default2")
+            .buildFeatureConfiguration();
+    
assertThat(strings("rc1").getConfig(cfg3)).isEqualTo("value-rc1-TEST-KEY3");
+    assertThat(strings("rc2").getConfig(cfg3, 
Map.of())).isEqualTo("value-rc2-TEST-KEY3");
+    assertThat(strings("rc3").getConfig(cfg3, 
Map.of("polaris.config.cat-prop2", "cat2")))
+        .isEqualTo("cat2");
+    assertThat(empty().getConfig(cfg3)).isEqualTo("default2");
+
+    FeatureConfiguration<String> cfg4 =
+        PolarisConfiguration.<String>builder()
+            .key("TEST-KEY4")
+            .description("test")
+            .defaultValue("default2")
+            .buildFeatureConfiguration();
+    
assertThat(strings("rc1").getConfig(cfg4)).isEqualTo("value-rc1-TEST-KEY4");
+    assertThat(strings("rc2").getConfig(cfg4, 
Map.of())).isEqualTo("value-rc2-TEST-KEY4");
+    assertThat(empty().getConfig(cfg4)).isEqualTo("default2");
+  }
+
+  @Test
+  void entityProperties() {
+    FeatureConfiguration<String> cfg =
+        PolarisConfiguration.<String>builder()
+            .key("TEST-ENTITY1")
+            .catalogConfig("polaris.config.test-entity-prop")
+            .description("test")
+            .defaultValue("default2")
+            .buildFeatureConfiguration();
+
+    CatalogEntity entity =
+        new CatalogEntity.Builder()
+            .setProperties(Map.of("polaris.config.test-entity-prop", 
"entity2"))
+            .build();
+
+    
assertThat(strings("rc1").getConfig(cfg)).isEqualTo("value-rc1-TEST-ENTITY1");
+    assertThat(strings("rc2").getConfig(cfg, entity)).isEqualTo("entity2");
+  }
+
+  private <T> PolarisConfiguration<T> cfg(T value) {
+    return PolarisConfiguration.<T>builder()
+        .key("TEST-CAST-" + UUID.randomUUID().toString())
+        .description("test")
+        .defaultValue(value)
+        .buildFeatureConfiguration();
+  }
+
+  @Test
+  void typeCast() {
+    assertThat(fixed("str").getConfig(cfg("test"))).isEqualTo("str");
+    assertThat(fixed(1).getConfig(cfg(2))).isEqualTo(1);
+    assertThat(fixed(2L).getConfig(cfg(1L))).isEqualTo(2L);
+    assertThat(fixed(true).getConfig(cfg(false))).isEqualTo(true);
+    assertThat(fixed(1.2f).getConfig(cfg(0.0f))).isEqualTo(1.2f);
+    assertThat(fixed(3.4d).getConfig(cfg(0.1d))).isEqualTo(3.4d);
+    assertThat(fixed(List.of("1", 
"2")).getConfig(cfg(List.of()))).isEqualTo(List.of("1", "2"));
+  }
+
+  @Test
+  void typedDefaults() {
+    assertThat(empty().getConfig(cfg("test"))).isEqualTo("test");
+    assertThat(empty().getConfig(cfg(2))).isEqualTo(2);
+    assertThat(empty().getConfig(cfg(1L))).isEqualTo(1L);
+    assertThat(empty().getConfig(cfg(false))).isEqualTo(false);
+    assertThat(empty().getConfig(cfg(0.1f))).isEqualTo(0.1f);
+    assertThat(empty().getConfig(cfg(2.3d))).isEqualTo(2.3d);
+    assertThat(empty().getConfig(cfg(List.of("3", 
"4")))).isEqualTo(List.of("3", "4"));
+  }
+}
diff --git 
a/polaris-core/src/test/java/org/apache/polaris/core/storage/BaseStorageIntegrationTest.java
 
b/polaris-core/src/test/java/org/apache/polaris/core/storage/BaseStorageIntegrationTest.java
index 6a9300229..adca38632 100644
--- 
a/polaris-core/src/test/java/org/apache/polaris/core/storage/BaseStorageIntegrationTest.java
+++ 
b/polaris-core/src/test/java/org/apache/polaris/core/storage/BaseStorageIntegrationTest.java
@@ -19,11 +19,11 @@
 
 package org.apache.polaris.core.storage;
 
-import org.apache.polaris.core.config.PolarisConfigurationStore;
 import org.apache.polaris.core.config.RealmConfigImpl;
+import org.apache.polaris.core.config.RealmConfigurationSource;
 
 public abstract class BaseStorageIntegrationTest {
 
   protected static final RealmConfigImpl EMPTY_REALM_CONFIG =
-      new RealmConfigImpl(new PolarisConfigurationStore() {}, () -> "realm");
+      new RealmConfigImpl(RealmConfigurationSource.EMPTY_CONFIG, () -> 
"realm");
 }
diff --git 
a/polaris-core/src/test/java/org/apache/polaris/core/storage/InMemoryStorageIntegrationTest.java
 
b/polaris-core/src/test/java/org/apache/polaris/core/storage/InMemoryStorageIntegrationTest.java
index 582af20db..bd18ccdf1 100644
--- 
a/polaris-core/src/test/java/org/apache/polaris/core/storage/InMemoryStorageIntegrationTest.java
+++ 
b/polaris-core/src/test/java/org/apache/polaris/core/storage/InMemoryStorageIntegrationTest.java
@@ -18,13 +18,13 @@
  */
 package org.apache.polaris.core.storage;
 
+import static 
org.apache.polaris.core.config.RealmConfigurationSource.EMPTY_CONFIG;
+
 import jakarta.annotation.Nonnull;
-import jakarta.annotation.Nullable;
 import java.util.Map;
 import java.util.Optional;
 import java.util.Set;
 import org.apache.polaris.core.auth.PolarisPrincipal;
-import org.apache.polaris.core.config.PolarisConfigurationStore;
 import org.apache.polaris.core.config.RealmConfig;
 import org.apache.polaris.core.config.RealmConfigImpl;
 import org.apache.polaris.core.context.RealmContext;
@@ -43,8 +43,7 @@ class InMemoryStorageIntegrationTest {
   @ParameterizedTest
   @CsvSource({"s3,s3", "s3,s3a", "s3a,s3", "s3a,s3a"})
   public void testValidateAccessToLocations(String allowedScheme, String 
locationScheme) {
-    RealmConfig realmConfig =
-        new RealmConfigImpl(new MockedConfigurationStore(Map.of()), 
REALM_CONTEXT);
+    RealmConfig realmConfig = new RealmConfigImpl(EMPTY_CONFIG, REALM_CONTEXT);
     MockInMemoryStorageIntegration storage = new 
MockInMemoryStorageIntegration();
     Map<String, Map<PolarisStorageActions, 
PolarisStorageIntegration.ValidationResult>> result =
         storage.validateAccessToLocations(
@@ -86,8 +85,7 @@ class InMemoryStorageIntegrationTest {
   public void testValidateAccessToLocationsWithWildcard(String s3Scheme) {
     MockInMemoryStorageIntegration storage = new 
MockInMemoryStorageIntegration();
     Map<String, Object> config = Map.of("ALLOW_WILDCARD_LOCATION", true);
-    RealmConfig realmConfig =
-        new RealmConfigImpl(new MockedConfigurationStore(config), 
REALM_CONTEXT);
+    RealmConfig realmConfig = new RealmConfigImpl((rc, name) -> 
config.get(name), REALM_CONTEXT);
     Map<String, Map<PolarisStorageActions, 
PolarisStorageIntegration.ValidationResult>> result =
         storage.validateAccessToLocations(
             realmConfig,
@@ -128,8 +126,7 @@ class InMemoryStorageIntegrationTest {
   @Test
   public void testValidateAccessToLocationsNoAllowedLocations() {
     MockInMemoryStorageIntegration storage = new 
MockInMemoryStorageIntegration();
-    RealmConfig realmConfig =
-        new RealmConfigImpl(new MockedConfigurationStore(Map.of()), 
REALM_CONTEXT);
+    RealmConfig realmConfig = new RealmConfigImpl(EMPTY_CONFIG, REALM_CONTEXT);
     Map<String, Map<PolarisStorageActions, 
PolarisStorageIntegration.ValidationResult>> result =
         storage.validateAccessToLocations(
             realmConfig,
@@ -164,8 +161,7 @@ class InMemoryStorageIntegrationTest {
   @Test
   public void testValidateAccessToLocationsWithPrefixOfAllowedLocation() {
     MockInMemoryStorageIntegration storage = new 
MockInMemoryStorageIntegration();
-    RealmConfig realmConfig =
-        new RealmConfigImpl(new MockedConfigurationStore(Map.of()), 
REALM_CONTEXT);
+    RealmConfig realmConfig = new RealmConfigImpl(EMPTY_CONFIG, REALM_CONTEXT);
     Map<String, Map<PolarisStorageActions, 
PolarisStorageIntegration.ValidationResult>> result =
         storage.validateAccessToLocations(
             realmConfig,
@@ -206,19 +202,4 @@ class InMemoryStorageIntegrationTest {
       return null;
     }
   }
-
-  private static class MockedConfigurationStore implements 
PolarisConfigurationStore {
-    private final Map<String, Object> defaults;
-
-    public MockedConfigurationStore(Map<String, Object> defaults) {
-      this.defaults = Map.copyOf(defaults);
-    }
-
-    @Override
-    public <T> @Nullable T getConfiguration(@Nonnull RealmContext 
realmContext, String configName) {
-      @SuppressWarnings("unchecked")
-      T confgValue = (T) defaults.get(configName);
-      return confgValue;
-    }
-  }
 }
diff --git 
a/polaris-core/src/test/java/org/apache/polaris/core/storage/cache/StorageCredentialCacheTest.java
 
b/polaris-core/src/test/java/org/apache/polaris/core/storage/cache/StorageCredentialCacheTest.java
index 98464dc30..15075db66 100644
--- 
a/polaris-core/src/test/java/org/apache/polaris/core/storage/cache/StorageCredentialCacheTest.java
+++ 
b/polaris-core/src/test/java/org/apache/polaris/core/storage/cache/StorageCredentialCacheTest.java
@@ -18,6 +18,9 @@
  */
 package org.apache.polaris.core.storage.cache;
 
+import static 
org.apache.polaris.core.config.FeatureConfiguration.INCLUDE_PRINCIPAL_NAME_IN_SUBSCOPED_CREDENTIAL;
+import static 
org.apache.polaris.core.config.RealmConfigurationSource.EMPTY_CONFIG;
+
 import jakarta.annotation.Nonnull;
 import java.util.ArrayList;
 import java.util.Arrays;
@@ -29,8 +32,6 @@ import 
org.apache.iceberg.exceptions.UnprocessableEntityException;
 import org.apache.polaris.core.PolarisDefaultDiagServiceImpl;
 import org.apache.polaris.core.PolarisDiagnostics;
 import org.apache.polaris.core.auth.PolarisPrincipal;
-import org.apache.polaris.core.config.FeatureConfiguration;
-import org.apache.polaris.core.config.PolarisConfigurationStore;
 import org.apache.polaris.core.config.RealmConfig;
 import org.apache.polaris.core.config.RealmConfigImpl;
 import org.apache.polaris.core.context.RealmContext;
@@ -54,8 +55,7 @@ import org.mockito.Mockito;
 public class StorageCredentialCacheTest {
   private final PolarisDiagnostics diagServices = new 
PolarisDefaultDiagServiceImpl();
   private final RealmContext realmContext = () -> "testRealm";
-  private final RealmConfig realmConfig =
-      new RealmConfigImpl(new PolarisConfigurationStore() {}, realmContext);
+  private final RealmConfig realmConfig = new RealmConfigImpl(EMPTY_CONFIG, 
realmContext);
   private final StorageCredentialsVendor storageCredentialsVendor;
   private StorageCredentialCache storageCredentialCache;
 
@@ -225,18 +225,10 @@ public class StorageCredentialCacheTest {
     Mockito.when(storageCredentialsVendor.getRealmConfig())
         .thenReturn(
             new RealmConfigImpl(
-                new PolarisConfigurationStore() {
-                  @SuppressWarnings("unchecked")
-                  @Override
-                  public String getConfiguration(@Nonnull RealmContext ctx, 
String configName) {
-                    if (configName.equals(
-                        
FeatureConfiguration.INCLUDE_PRINCIPAL_NAME_IN_SUBSCOPED_CREDENTIAL
-                            .key())) {
-                      return "true";
-                    }
-                    return null;
-                  }
-                },
+                (rc, name) ->
+                    
INCLUDE_PRINCIPAL_NAME_IN_SUBSCOPED_CREDENTIAL.key().equals(name)
+                        ? "true"
+                        : null,
                 () -> "realm"));
 
     testCacheForAnotherPrincipal(false);
diff --git 
a/polaris-core/src/test/java/org/apache/polaris/service/storage/PolarisConfigurationStoreTest.java
 
b/polaris-core/src/test/java/org/apache/polaris/service/storage/PolarisConfigurationStoreTest.java
index 612b8716b..5bdc1dfc9 100644
--- 
a/polaris-core/src/test/java/org/apache/polaris/service/storage/PolarisConfigurationStoreTest.java
+++ 
b/polaris-core/src/test/java/org/apache/polaris/service/storage/PolarisConfigurationStoreTest.java
@@ -34,6 +34,7 @@ import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.Test;
 
 /** Unit test for the default behaviors of the PolarisConfigurationStore 
interface. */
+@SuppressWarnings("removal")
 public class PolarisConfigurationStoreTest {
   private final RealmContext testRealmContext = () -> "testRealm";
 
diff --git 
a/polaris-core/src/test/java/org/apache/polaris/service/storage/aws/AwsCredentialsStorageIntegrationTest.java
 
b/polaris-core/src/test/java/org/apache/polaris/service/storage/aws/AwsCredentialsStorageIntegrationTest.java
index fdea3b0b5..81513896d 100644
--- 
a/polaris-core/src/test/java/org/apache/polaris/service/storage/aws/AwsCredentialsStorageIntegrationTest.java
+++ 
b/polaris-core/src/test/java/org/apache/polaris/service/storage/aws/AwsCredentialsStorageIntegrationTest.java
@@ -18,20 +18,22 @@
  */
 package org.apache.polaris.service.storage.aws;
 
+import static 
org.apache.polaris.core.config.FeatureConfiguration.INCLUDE_PRINCIPAL_NAME_IN_SUBSCOPED_CREDENTIAL;
+import static 
org.apache.polaris.core.config.FeatureConfiguration.INCLUDE_SESSION_TAGS_IN_SUBSCOPED_CREDENTIAL;
+import static 
org.apache.polaris.core.config.FeatureConfiguration.INCLUDE_TRACE_ID_IN_SESSION_TAGS;
 import static org.assertj.core.api.Assertions.assertThat;
 
 import jakarta.annotation.Nonnull;
 import java.time.Instant;
+import java.util.Arrays;
 import java.util.List;
 import java.util.Map;
 import java.util.Optional;
 import java.util.Set;
 import org.apache.polaris.core.auth.PolarisPrincipal;
 import org.apache.polaris.core.config.FeatureConfiguration;
-import org.apache.polaris.core.config.PolarisConfigurationStore;
 import org.apache.polaris.core.config.RealmConfig;
 import org.apache.polaris.core.config.RealmConfigImpl;
-import org.apache.polaris.core.context.RealmContext;
 import org.apache.polaris.core.storage.BaseStorageIntegrationTest;
 import org.apache.polaris.core.storage.CredentialVendingContext;
 import org.apache.polaris.core.storage.StorageAccessConfig;
@@ -64,19 +66,10 @@ class AwsCredentialsStorageIntegrationTest extends 
BaseStorageIntegrationTest {
   public static final Instant EXPIRE_TIME = Instant.now().plusMillis(3600_000);
 
   public static final RealmConfig PRINCIPAL_INCLUDER_REALM_CONFIG =
-      new RealmConfigImpl(
-          new PolarisConfigurationStore() {
-            @SuppressWarnings("unchecked")
-            @Override
-            public String getConfiguration(@Nonnull RealmContext ctx, String 
configName) {
-              if (configName.equals(
-                  
FeatureConfiguration.INCLUDE_PRINCIPAL_NAME_IN_SUBSCOPED_CREDENTIAL.key())) {
-                return "true";
-              }
-              return null;
-            }
-          },
-          () -> "realm");
+      enabledFeatures(INCLUDE_PRINCIPAL_NAME_IN_SUBSCOPED_CREDENTIAL);
+
+  private static final RealmConfig SESSION_TAGS_ENABLED_CONFIG =
+      enabledFeatures(INCLUDE_SESSION_TAGS_IN_SUBSCOPED_CREDENTIAL);
 
   public static final AssumeRoleResponse ASSUME_ROLE_RESPONSE =
       AssumeRoleResponse.builder()
@@ -92,6 +85,14 @@ class AwsCredentialsStorageIntegrationTest extends 
BaseStorageIntegrationTest {
   public static final PolarisPrincipal POLARIS_PRINCIPAL =
       PolarisPrincipal.of("test-principal", Map.of(), Set.of());
 
+  @SafeVarargs
+  private static RealmConfig enabledFeatures(FeatureConfiguration<Boolean>... 
enabledOptions) {
+    return new RealmConfigImpl(
+        (rc, name) ->
+            Arrays.stream(enabledOptions).anyMatch(o -> o.key().equals(name)) 
? "true" : null,
+        () -> "realm");
+  }
+
   @ParameterizedTest
   @ValueSource(strings = {"s3a", "s3"})
   public void testGetSubscopedCreds(String scheme) {
@@ -1146,20 +1147,7 @@ class AwsCredentialsStorageIntegrationTest extends 
BaseStorageIntegrationTest {
     String warehouseKeyPrefix = "path/to/warehouse";
 
     // Create a realm config with session tags enabled
-    RealmConfig sessionTagsEnabledConfig =
-        new RealmConfigImpl(
-            new PolarisConfigurationStore() {
-              @SuppressWarnings("unchecked")
-              @Override
-              public String getConfiguration(@Nonnull RealmContext ctx, String 
configName) {
-                if (configName.equals(
-                    
FeatureConfiguration.INCLUDE_SESSION_TAGS_IN_SUBSCOPED_CREDENTIAL.key())) {
-                  return "true";
-                }
-                return null;
-              }
-            },
-            () -> "realm");
+    RealmConfig sessionTagsEnabledConfig = SESSION_TAGS_ENABLED_CONFIG;
 
     ArgumentCaptor<AssumeRoleRequest> requestCaptor =
         ArgumentCaptor.forClass(AssumeRoleRequest.class);
@@ -1231,23 +1219,8 @@ class AwsCredentialsStorageIntegrationTest extends 
BaseStorageIntegrationTest {
 
     // Create a realm config with both session tags AND trace_id enabled
     RealmConfig sessionTagsAndTraceIdEnabledConfig =
-        new RealmConfigImpl(
-            new PolarisConfigurationStore() {
-              @SuppressWarnings("unchecked")
-              @Override
-              public String getConfiguration(@Nonnull RealmContext ctx, String 
configName) {
-                if (configName.equals(
-                    
FeatureConfiguration.INCLUDE_SESSION_TAGS_IN_SUBSCOPED_CREDENTIAL.key())) {
-                  return "true";
-                }
-                if (configName.equals(
-                    
FeatureConfiguration.INCLUDE_TRACE_ID_IN_SESSION_TAGS.key())) {
-                  return "true";
-                }
-                return null;
-              }
-            },
-            () -> "realm");
+        enabledFeatures(
+            INCLUDE_SESSION_TAGS_IN_SUBSCOPED_CREDENTIAL, 
INCLUDE_TRACE_ID_IN_SESSION_TAGS);
 
     ArgumentCaptor<AssumeRoleRequest> requestCaptor =
         ArgumentCaptor.forClass(AssumeRoleRequest.class);
@@ -1361,20 +1334,7 @@ class AwsCredentialsStorageIntegrationTest extends 
BaseStorageIntegrationTest {
     String bucket = "bucket";
     String warehouseKeyPrefix = "path/to/warehouse";
 
-    RealmConfig sessionTagsEnabledConfig =
-        new RealmConfigImpl(
-            new PolarisConfigurationStore() {
-              @SuppressWarnings("unchecked")
-              @Override
-              public String getConfiguration(@Nonnull RealmContext ctx, String 
configName) {
-                if (configName.equals(
-                    
FeatureConfiguration.INCLUDE_SESSION_TAGS_IN_SUBSCOPED_CREDENTIAL.key())) {
-                  return "true";
-                }
-                return null;
-              }
-            },
-            () -> "realm");
+    RealmConfig sessionTagsEnabledConfig = SESSION_TAGS_ENABLED_CONFIG;
 
     ArgumentCaptor<AssumeRoleRequest> requestCaptor =
         ArgumentCaptor.forClass(AssumeRoleRequest.class);
@@ -1428,21 +1388,6 @@ class AwsCredentialsStorageIntegrationTest extends 
BaseStorageIntegrationTest {
     String bucket = "bucket";
     String warehouseKeyPrefix = "path/to/warehouse";
 
-    RealmConfig sessionTagsEnabledConfig =
-        new RealmConfigImpl(
-            new PolarisConfigurationStore() {
-              @SuppressWarnings("unchecked")
-              @Override
-              public String getConfiguration(@Nonnull RealmContext ctx, String 
configName) {
-                if (configName.equals(
-                    
FeatureConfiguration.INCLUDE_SESSION_TAGS_IN_SUBSCOPED_CREDENTIAL.key())) {
-                  return "true";
-                }
-                return null;
-              }
-            },
-            () -> "realm");
-
     ArgumentCaptor<AssumeRoleRequest> requestCaptor =
         ArgumentCaptor.forClass(AssumeRoleRequest.class);
     
Mockito.when(stsClient.assumeRole(requestCaptor.capture())).thenReturn(ASSUME_ROLE_RESPONSE);
@@ -1463,7 +1408,7 @@ class AwsCredentialsStorageIntegrationTest extends 
BaseStorageIntegrationTest {
                 .build(),
             stsClient)
         .getSubscopedCreds(
-            sessionTagsEnabledConfig,
+            SESSION_TAGS_ENABLED_CONFIG,
             true,
             Set.of(s3Path(bucket, warehouseKeyPrefix)),
             Set.of(s3Path(bucket, warehouseKeyPrefix)),
@@ -1489,21 +1434,6 @@ class AwsCredentialsStorageIntegrationTest extends 
BaseStorageIntegrationTest {
     String bucket = "bucket";
     String warehouseKeyPrefix = "path/to/warehouse";
 
-    RealmConfig sessionTagsEnabledConfig =
-        new RealmConfigImpl(
-            new PolarisConfigurationStore() {
-              @SuppressWarnings("unchecked")
-              @Override
-              public String getConfiguration(@Nonnull RealmContext ctx, String 
configName) {
-                if (configName.equals(
-                    
FeatureConfiguration.INCLUDE_SESSION_TAGS_IN_SUBSCOPED_CREDENTIAL.key())) {
-                  return "true";
-                }
-                return null;
-              }
-            },
-            () -> "realm");
-
     ArgumentCaptor<AssumeRoleRequest> requestCaptor =
         ArgumentCaptor.forClass(AssumeRoleRequest.class);
     
Mockito.when(stsClient.assumeRole(requestCaptor.capture())).thenReturn(ASSUME_ROLE_RESPONSE);
@@ -1517,7 +1447,7 @@ class AwsCredentialsStorageIntegrationTest extends 
BaseStorageIntegrationTest {
                 .build(),
             stsClient)
         .getSubscopedCreds(
-            sessionTagsEnabledConfig,
+            SESSION_TAGS_ENABLED_CONFIG,
             true,
             Set.of(s3Path(bucket, warehouseKeyPrefix)),
             Set.of(s3Path(bucket, warehouseKeyPrefix)),
@@ -1562,19 +1492,7 @@ class AwsCredentialsStorageIntegrationTest extends 
BaseStorageIntegrationTest {
     String warehouseKeyPrefix = "path/to/warehouse";
 
     RealmConfig sessionTagsEnabledConfig =
-        new RealmConfigImpl(
-            new PolarisConfigurationStore() {
-              @SuppressWarnings("unchecked")
-              @Override
-              public String getConfiguration(@Nonnull RealmContext ctx, String 
configName) {
-                if (configName.equals(
-                    
FeatureConfiguration.INCLUDE_SESSION_TAGS_IN_SUBSCOPED_CREDENTIAL.key())) {
-                  return "true";
-                }
-                return null;
-              }
-            },
-            () -> "realm");
+        enabledFeatures(INCLUDE_SESSION_TAGS_IN_SUBSCOPED_CREDENTIAL);
 
     // Simulate STS throwing AccessDeniedException when sts:TagSession is not 
allowed
     // In AWS SDK v2, this is represented as StsException with error code 
"AccessDenied"
diff --git 
a/runtime/admin/src/main/java/org/apache/polaris/admintool/config/AdminToolProducers.java
 
b/runtime/admin/src/main/java/org/apache/polaris/admintool/config/AdminToolProducers.java
index 236325a58..a65324cbe 100644
--- 
a/runtime/admin/src/main/java/org/apache/polaris/admintool/config/AdminToolProducers.java
+++ 
b/runtime/admin/src/main/java/org/apache/polaris/admintool/config/AdminToolProducers.java
@@ -28,9 +28,9 @@ import java.time.Clock;
 import java.util.UUID;
 import org.apache.polaris.core.PolarisDefaultDiagServiceImpl;
 import org.apache.polaris.core.PolarisDiagnostics;
-import org.apache.polaris.core.config.PolarisConfigurationStore;
 import org.apache.polaris.core.config.RealmConfig;
 import org.apache.polaris.core.config.RealmConfigImpl;
+import org.apache.polaris.core.config.RealmConfigurationSource;
 import org.apache.polaris.core.persistence.MetaStoreManagerFactory;
 import org.apache.polaris.core.storage.PolarisStorageConfigurationInfo;
 import org.apache.polaris.core.storage.PolarisStorageIntegration;
@@ -74,15 +74,15 @@ public class AdminToolProducers {
   }
 
   @Produces
-  public PolarisConfigurationStore configurationStore() {
-    // A configuration store is not required when running the admin tool.
-    return new PolarisConfigurationStore() {};
+  public RealmConfigurationSource configurationStore() {
+    // A configuration source is not required when running the admin tool.
+    return RealmConfigurationSource.EMPTY_CONFIG;
   }
 
   @Produces
-  public RealmConfig dummyRealmConfig(PolarisConfigurationStore 
configurationStore) {
+  public RealmConfig dummyRealmConfig(RealmConfigurationSource 
configurationSource) {
     // Use a random realm ID for RealmConfig since the 
PolarisConfigurationStore is empty anyway
     String absentId = UUID.randomUUID().toString();
-    return new RealmConfigImpl(configurationStore, () -> absentId);
+    return new RealmConfigImpl(configurationSource, () -> absentId);
   }
 }
diff --git 
a/runtime/service/src/main/java/org/apache/polaris/service/config/DefaultConfigurationStore.java
 
b/runtime/service/src/main/java/org/apache/polaris/service/config/DefaultConfigurationStore.java
index 02d7a2f22..cd86e4697 100644
--- 
a/runtime/service/src/main/java/org/apache/polaris/service/config/DefaultConfigurationStore.java
+++ 
b/runtime/service/src/main/java/org/apache/polaris/service/config/DefaultConfigurationStore.java
@@ -25,13 +25,15 @@ import jakarta.enterprise.context.ApplicationScoped;
 import jakarta.inject.Inject;
 import java.util.Map;
 import java.util.Optional;
-import org.apache.polaris.core.config.PolarisConfigurationStore;
+import org.apache.polaris.core.config.RealmConfigurationSource;
 import org.apache.polaris.core.context.RealmContext;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+@SuppressWarnings("removal")
 @ApplicationScoped
-public class DefaultConfigurationStore implements PolarisConfigurationStore {
+public class DefaultConfigurationStore
+    implements org.apache.polaris.core.config.PolarisConfigurationStore, 
RealmConfigurationSource {
   Logger LOGGER = LoggerFactory.getLogger(DefaultConfigurationStore.class);
 
   private final Map<String, Object> defaults;
@@ -47,15 +49,18 @@ public class DefaultConfigurationStore implements 
PolarisConfigurationStore {
   }
 
   @Override
-  public <T> @Nullable T getConfiguration(@Nonnull RealmContext realmContext, 
String configName) {
+  public @Nullable Object getConfigValue(@Nonnull RealmContext realmContext, 
String configName) {
     String realm = realmContext.getRealmIdentifier();
     LOGGER.debug("Get configuration value for {} with realm {}", configName, 
realm);
+    return Optional.ofNullable(realmOverrides.getOrDefault(realm, 
Map.of()).get(configName))
+        .orElseGet(() -> getDefaultConfiguration(configName));
+  }
+
+  @Override
+  public <T> @Nullable T getConfiguration(@Nonnull RealmContext realmContext, 
String configName) {
     @SuppressWarnings("unchecked")
-    T confgValue =
-        (T)
-            Optional.ofNullable(realmOverrides.getOrDefault(realm, 
Map.of()).get(configName))
-                .orElseGet(() -> getDefaultConfiguration(configName));
-    return confgValue;
+    T value = (T) getConfigValue(realmContext, configName);
+    return value;
   }
 
   private <T> @Nullable T getDefaultConfiguration(String configName) {
diff --git 
a/runtime/service/src/main/java/org/apache/polaris/service/config/ServiceProducers.java
 
b/runtime/service/src/main/java/org/apache/polaris/service/config/ServiceProducers.java
index 121eb382c..1dc021243 100644
--- 
a/runtime/service/src/main/java/org/apache/polaris/service/config/ServiceProducers.java
+++ 
b/runtime/service/src/main/java/org/apache/polaris/service/config/ServiceProducers.java
@@ -38,9 +38,9 @@ import org.apache.polaris.core.PolarisDiagnostics;
 import org.apache.polaris.core.auth.DefaultPolarisAuthorizerFactory;
 import org.apache.polaris.core.auth.PolarisAuthorizer;
 import org.apache.polaris.core.auth.PolarisAuthorizerFactory;
-import org.apache.polaris.core.config.PolarisConfigurationStore;
 import org.apache.polaris.core.config.RealmConfig;
 import org.apache.polaris.core.config.RealmConfigImpl;
+import org.apache.polaris.core.config.RealmConfigurationSource;
 import org.apache.polaris.core.context.CallContext;
 import org.apache.polaris.core.context.RealmContext;
 import org.apache.polaris.core.credentials.PolarisCredentialManager;
@@ -123,17 +123,17 @@ public class ServiceProducers {
   @RequestScoped
   public CallContext polarisCallContext(
       RealmContext realmContext,
-      PolarisConfigurationStore configurationStore,
+      RealmConfigurationSource configurationSource,
       MetaStoreManagerFactory metaStoreManagerFactory) {
     BasePersistence metaStoreSession = 
metaStoreManagerFactory.getOrCreateSession(realmContext);
-    return new PolarisCallContext(realmContext, metaStoreSession, 
configurationStore);
+    return new PolarisCallContext(realmContext, metaStoreSession, 
configurationSource);
   }
 
   @Produces
   @RequestScoped
   public RealmConfig realmConfig(
-      RealmContext realmContext, PolarisConfigurationStore configurationStore) 
{
-    return new RealmConfigImpl(configurationStore, realmContext);
+      RealmContext realmContext, RealmConfigurationSource configurationSource) 
{
+    return new RealmConfigImpl(configurationSource, realmContext);
   }
 
   @Produces
diff --git 
a/runtime/service/src/test/java/org/apache/polaris/service/catalog/iceberg/AbstractIcebergCatalogHandlerAuthzTest.java
 
b/runtime/service/src/test/java/org/apache/polaris/service/catalog/iceberg/AbstractIcebergCatalogHandlerAuthzTest.java
index 91af34e5b..ed32c09b3 100644
--- 
a/runtime/service/src/test/java/org/apache/polaris/service/catalog/iceberg/AbstractIcebergCatalogHandlerAuthzTest.java
+++ 
b/runtime/service/src/test/java/org/apache/polaris/service/catalog/iceberg/AbstractIcebergCatalogHandlerAuthzTest.java
@@ -1139,14 +1139,16 @@ public abstract class 
AbstractIcebergCatalogHandlerAuthzTest extends PolarisAuth
     // Create a simple RealmConfig implementation that overrides just what we 
need
     RealmConfig customRealmConfig =
         new RealmConfig() {
+          @SuppressWarnings("removal")
           @Override
           public <T> T getConfig(String configName) {
-            return realmConfig.getConfig(configName);
+            throw new UnsupportedOperationException();
           }
 
+          @SuppressWarnings("removal")
           @Override
           public <T> T getConfig(String configName, T defaultValue) {
-            return realmConfig.getConfig(configName, defaultValue);
+            throw new UnsupportedOperationException();
           }
 
           @Override
diff --git 
a/runtime/service/src/test/java/org/apache/polaris/service/config/DefaultConfigurationStoreTest.java
 
b/runtime/service/src/test/java/org/apache/polaris/service/config/DefaultConfigurationStoreTest.java
index e1f76417a..7a3b51644 100644
--- 
a/runtime/service/src/test/java/org/apache/polaris/service/config/DefaultConfigurationStoreTest.java
+++ 
b/runtime/service/src/test/java/org/apache/polaris/service/config/DefaultConfigurationStoreTest.java
@@ -26,7 +26,6 @@ import io.quarkus.test.junit.TestProfile;
 import jakarta.inject.Inject;
 import java.util.Map;
 import org.apache.polaris.core.config.FeatureConfiguration;
-import org.apache.polaris.core.config.PolarisConfigurationStore;
 import org.apache.polaris.core.context.RealmContext;
 import org.apache.polaris.core.entity.CatalogEntity;
 import org.assertj.core.api.Assertions;
@@ -68,7 +67,10 @@ public class DefaultConfigurationStoreTest {
 
   private RealmContext realmContext;
 
-  @Inject PolarisConfigurationStore configurationStore;
+  @SuppressWarnings("removal")
+  @Inject
+  org.apache.polaris.core.config.PolarisConfigurationStore configurationStore;
+
   @Inject FeaturesConfiguration featuresConfiguration;
 
   @BeforeEach
@@ -81,6 +83,7 @@ public class DefaultConfigurationStoreTest {
     realmContext = () -> realmName;
   }
 
+  @SuppressWarnings("removal")
   @Test
   public void testGetConfiguration() {
     Object value = configurationStore.getConfiguration(realmContext, 
"missingKeyWithoutDefault");
@@ -97,6 +100,7 @@ public class DefaultConfigurationStoreTest {
         .isTrue();
   }
 
+  @SuppressWarnings("removal")
   @Test
   public void testGetRealmConfiguration() {
     // check the realmOne configuration
@@ -118,6 +122,7 @@ public class DefaultConfigurationStoreTest {
         .isFalse();
   }
 
+  @SuppressWarnings("removal")
   @Test
   void testGetConfigurationWithRealm() {
     // the falseByDefaultKey is set to `false` for all realms, but overwrite 
with value `true` for
@@ -137,6 +142,7 @@ public class DefaultConfigurationStoreTest {
         .isFalse();
   }
 
+  @SuppressWarnings("removal")
   @Test
   public void testInjectedConfigurationStore() {
     // the default value for trueByDefaultKey is `true`
@@ -175,6 +181,7 @@ public class DefaultConfigurationStoreTest {
         .containsKey(trueByDefaultKey);
   }
 
+  @SuppressWarnings("removal")
   @Test
   public void testRegisterAndUseFeatureConfigurations() {
     String prefix = "testRegisterAndUseFeatureConfigurations";
@@ -187,6 +194,7 @@ public class DefaultConfigurationStoreTest {
             .description(prefix)
             .buildFeatureConfiguration();
 
+    @SuppressWarnings("deprecation")
     FeatureConfiguration<Boolean> unsafeConfig =
         FeatureConfiguration.<Boolean>builder()
             .key(String.format("%s_unsafe", prefix))
@@ -195,6 +203,7 @@ public class DefaultConfigurationStoreTest {
             .description(prefix)
             .buildFeatureConfiguration();
 
+    @SuppressWarnings("deprecation")
     FeatureConfiguration<Boolean> bothConfig =
         FeatureConfiguration.<Boolean>builder()
             .key(String.format("%s_both", prefix))
diff --git 
a/runtime/service/src/test/java/org/apache/polaris/service/entity/CatalogEntityTest.java
 
b/runtime/service/src/test/java/org/apache/polaris/service/entity/CatalogEntityTest.java
index fdc71d5ac..ec90da786 100644
--- 
a/runtime/service/src/test/java/org/apache/polaris/service/entity/CatalogEntityTest.java
+++ 
b/runtime/service/src/test/java/org/apache/polaris/service/entity/CatalogEntityTest.java
@@ -18,6 +18,7 @@
  */
 package org.apache.polaris.service.entity;
 
+import static 
org.apache.polaris.core.config.RealmConfigurationSource.EMPTY_CONFIG;
 import static org.assertj.core.api.Assertions.assertThat;
 
 import com.fasterxml.jackson.core.JsonProcessingException;
@@ -39,7 +40,6 @@ import org.apache.polaris.core.admin.model.PolarisCatalog;
 import org.apache.polaris.core.admin.model.ServiceIdentityInfo;
 import org.apache.polaris.core.admin.model.SigV4AuthenticationParameters;
 import org.apache.polaris.core.admin.model.StorageConfigInfo;
-import org.apache.polaris.core.config.PolarisConfigurationStore;
 import org.apache.polaris.core.config.RealmConfig;
 import org.apache.polaris.core.config.RealmConfigImpl;
 import org.apache.polaris.core.context.RealmContext;
@@ -65,7 +65,7 @@ public class CatalogEntityTest {
   @BeforeEach
   public void setup() {
     RealmContext realmContext = () -> "realm";
-    this.realmConfig = new RealmConfigImpl(new PolarisConfigurationStore() {}, 
realmContext);
+    this.realmConfig = new RealmConfigImpl(EMPTY_CONFIG, realmContext);
     this.serviceIdentityProvider = Mockito.mock(ServiceIdentityProvider.class);
     Mockito.when(serviceIdentityProvider.getServiceIdentityInfo(Mockito.any()))
         .thenReturn(
diff --git 
a/runtime/service/src/test/java/org/apache/polaris/service/test/PolarisIntegrationTestFixture.java
 
b/runtime/service/src/test/java/org/apache/polaris/service/test/PolarisIntegrationTestFixture.java
index 19900e120..e54f42e01 100644
--- 
a/runtime/service/src/test/java/org/apache/polaris/service/test/PolarisIntegrationTestFixture.java
+++ 
b/runtime/service/src/test/java/org/apache/polaris/service/test/PolarisIntegrationTestFixture.java
@@ -107,7 +107,7 @@ public class PolarisIntegrationTestFixture {
     BasePersistence metaStoreSession =
         helper.metaStoreManagerFactory.getOrCreateSession(realmContext);
     PolarisCallContext polarisContext =
-        new PolarisCallContext(realmContext, metaStoreSession, 
helper.configurationStore);
+        new PolarisCallContext(realmContext, metaStoreSession, 
helper.configurationSource);
     PolarisMetaStoreManager metaStoreManager =
         
helper.metaStoreManagerFactory.getOrCreateMetaStoreManager(realmContext);
     PrincipalEntity principal = 
metaStoreManager.findRootPrincipal(polarisContext).orElseThrow();
diff --git 
a/runtime/service/src/test/java/org/apache/polaris/service/test/PolarisIntegrationTestHelper.java
 
b/runtime/service/src/test/java/org/apache/polaris/service/test/PolarisIntegrationTestHelper.java
index 281b15b5f..4f97c191e 100644
--- 
a/runtime/service/src/test/java/org/apache/polaris/service/test/PolarisIntegrationTestHelper.java
+++ 
b/runtime/service/src/test/java/org/apache/polaris/service/test/PolarisIntegrationTestHelper.java
@@ -21,7 +21,7 @@ package org.apache.polaris.service.test;
 import jakarta.inject.Inject;
 import jakarta.inject.Singleton;
 import org.apache.polaris.core.PolarisDiagnostics;
-import org.apache.polaris.core.config.PolarisConfigurationStore;
+import org.apache.polaris.core.config.RealmConfigurationSource;
 import org.apache.polaris.core.persistence.MetaStoreManagerFactory;
 import org.apache.polaris.service.context.RealmContextResolver;
 import org.junit.jupiter.api.TestInfo;
@@ -32,7 +32,7 @@ public class PolarisIntegrationTestHelper {
   @Inject MetaStoreManagerFactory metaStoreManagerFactory;
   @Inject RealmContextResolver realmContextResolver;
   @Inject PolarisDiagnostics diagServices;
-  @Inject PolarisConfigurationStore configurationStore;
+  @Inject RealmConfigurationSource configurationSource;
 
   public PolarisIntegrationTestFixture createFixture(TestEnvironment testEnv, 
TestInfo testInfo) {
     return new PolarisIntegrationTestFixture(this, testEnv, testInfo);
diff --git 
a/runtime/service/src/testFixtures/java/org/apache/polaris/service/TestServices.java
 
b/runtime/service/src/testFixtures/java/org/apache/polaris/service/TestServices.java
index b6572b2d6..e18e8207f 100644
--- 
a/runtime/service/src/testFixtures/java/org/apache/polaris/service/TestServices.java
+++ 
b/runtime/service/src/testFixtures/java/org/apache/polaris/service/TestServices.java
@@ -23,8 +23,6 @@ import static org.mockito.Mockito.RETURNS_DEEP_STUBS;
 
 import com.google.auth.oauth2.AccessToken;
 import com.google.auth.oauth2.GoogleCredentials;
-import jakarta.annotation.Nonnull;
-import jakarta.annotation.Nullable;
 import jakarta.enterprise.inject.Instance;
 import jakarta.ws.rs.core.SecurityContext;
 import java.security.Principal;
@@ -41,8 +39,8 @@ import org.apache.polaris.core.PolarisDiagnostics;
 import org.apache.polaris.core.auth.PolarisAuthorizer;
 import org.apache.polaris.core.auth.PolarisPrincipal;
 import org.apache.polaris.core.catalog.ExternalCatalogFactory;
-import org.apache.polaris.core.config.PolarisConfigurationStore;
 import org.apache.polaris.core.config.RealmConfig;
+import org.apache.polaris.core.config.RealmConfigurationSource;
 import org.apache.polaris.core.context.CallContext;
 import org.apache.polaris.core.context.RealmContext;
 import org.apache.polaris.core.credentials.PolarisCredentialManager;
@@ -109,7 +107,7 @@ public record TestServices(
     IcebergRestCatalogApi restApi,
     IcebergRestConfigurationApi restConfigurationApi,
     IcebergCatalogAdapter catalogAdapter,
-    PolarisConfigurationStore configurationStore,
+    RealmConfigurationSource configurationSource,
     PolarisDiagnostics polarisDiagnostics,
     StorageCredentialCache storageCredentialCache,
     ResolverFactory resolverFactory,
@@ -129,21 +127,6 @@ public record TestServices(
   private static final RealmContext TEST_REALM = () -> "test-realm";
   private static final String GCP_ACCESS_TOKEN = "abc";
 
-  private static class MockedConfigurationStore implements 
PolarisConfigurationStore {
-    private final Map<String, Object> defaults;
-
-    public MockedConfigurationStore(Map<String, Object> defaults) {
-      this.defaults = Map.copyOf(defaults);
-    }
-
-    @Override
-    public <T> @Nullable T getConfiguration(@Nonnull RealmContext 
realmContext, String configName) {
-      @SuppressWarnings("unchecked")
-      T confgValue = (T) defaults.get(configName);
-      return confgValue;
-    }
-  }
-
   public static Builder builder() {
     return new Builder();
   }
@@ -211,7 +194,7 @@ public record TestServices(
     }
 
     public TestServices build() {
-      PolarisConfigurationStore configurationStore = new 
MockedConfigurationStore(config);
+      RealmConfigurationSource configurationSource = (rc, name) -> 
config.get(name);
       PolarisAuthorizer authorizer = Mockito.mock(PolarisAuthorizer.class);
 
       // Application level
@@ -233,7 +216,7 @@ public record TestServices(
 
       BasePersistence metaStoreSession = 
metaStoreManagerFactory.getOrCreateSession(realmContext);
       CallContext callContext =
-          new PolarisCallContext(realmContext, metaStoreSession, 
configurationStore);
+          new PolarisCallContext(realmContext, metaStoreSession, 
configurationSource);
       RealmConfig realmConfig = callContext.getRealmConfig();
 
       PolarisMetaStoreManager metaStoreManager =
@@ -416,7 +399,7 @@ public record TestServices(
           restApi,
           restConfigurationApi,
           catalogService,
-          configurationStore,
+          configurationSource,
           diagnostics,
           storageCredentialCache,
           resolverFactory,
@@ -437,6 +420,6 @@ public record TestServices(
 
   public PolarisCallContext newCallContext() {
     BasePersistence metaStore = 
metaStoreManagerFactory.getOrCreateSession(realmContext);
-    return new PolarisCallContext(realmContext, metaStore, configurationStore);
+    return new PolarisCallContext(realmContext, metaStore, 
configurationSource);
   }
 }

Reply via email to