SLING-7627 CAConfig Impl: Wrong config name when adapting ConfigurationBuilder multiple times from same resource
diff --git a/src/main/java/org/apache/sling/caconfig/impl/ConfigurationBuilderImpl.java b/src/main/java/org/apache/sling/caconfig/impl/ConfigurationBuilderImpl.java
index 8acb8ee..5534e6c 100644
--- a/src/main/java/org/apache/sling/caconfig/impl/ConfigurationBuilderImpl.java
+++ b/src/main/java/org/apache/sling/caconfig/impl/ConfigurationBuilderImpl.java
@@ -62,8 +62,7 @@
private final ConfigurationOverrideMultiplexer configurationOverrideMultiplexer;
private final ConfigurationMetadataProvider configurationMetadataProvider;
private final Collection<String> configBucketNames;
-
- private String configName;
+ private final String configName;
private static final Logger log = LoggerFactory.getLogger(ConfigurationBuilderImpl.class);
@@ -75,6 +74,19 @@
final ConfigurationOverrideMultiplexer configurationOverrideMultiplexer,
final ConfigurationMetadataProvider configurationMetadataProvider,
final Collection<String> configBucketNames) {
+ this(resource, configurationResolver, configurationResourceResolvingStrategy, configurationPersistenceStrategy,
+ configurationInheritanceStrategy, configurationOverrideMultiplexer, configurationMetadataProvider, configBucketNames, null);
+ }
+
+ private ConfigurationBuilderImpl(final Resource resource,
+ final ConfigurationResolver configurationResolver,
+ final ConfigurationResourceResolvingStrategy configurationResourceResolvingStrategy,
+ final ConfigurationPersistenceStrategyMultiplexer configurationPersistenceStrategy,
+ final ConfigurationInheritanceStrategy configurationInheritanceStrategy,
+ final ConfigurationOverrideMultiplexer configurationOverrideMultiplexer,
+ final ConfigurationMetadataProvider configurationMetadataProvider,
+ final Collection<String> configBucketNames,
+ final String configName) {
this.contentResource = resource;
this.configurationResolver = configurationResolver;
this.configurationResourceResolvingStrategy = configurationResourceResolvingStrategy;
@@ -83,13 +95,21 @@
this.configurationOverrideMultiplexer = configurationOverrideMultiplexer;
this.configurationMetadataProvider = configurationMetadataProvider;
this.configBucketNames = configBucketNames;
+ this.configName = configName;
}
@Override
- public ConfigurationBuilder name(String configName) {
+ public ConfigurationBuilder name(final String configName) {
ConfigNameUtil.ensureValidConfigName(configName);
- this.configName = configName;
- return this;
+ return new ConfigurationBuilderImpl(contentResource,
+ configurationResolver,
+ configurationResourceResolvingStrategy,
+ configurationPersistenceStrategy,
+ configurationInheritanceStrategy,
+ configurationOverrideMultiplexer,
+ configurationMetadataProvider,
+ configBucketNames,
+ configName);
}
/**
diff --git a/src/test/java/org/apache/sling/caconfig/impl/ConfigurationResolverAnnotationClassTest.java b/src/test/java/org/apache/sling/caconfig/impl/ConfigurationResolverAnnotationClassTest.java
index 690d396..15221a0 100644
--- a/src/test/java/org/apache/sling/caconfig/impl/ConfigurationResolverAnnotationClassTest.java
+++ b/src/test/java/org/apache/sling/caconfig/impl/ConfigurationResolverAnnotationClassTest.java
@@ -32,6 +32,7 @@
import java.util.List;
import org.apache.sling.api.resource.Resource;
+import org.apache.sling.caconfig.ConfigurationBuilder;
import org.apache.sling.caconfig.ConfigurationResolveException;
import org.apache.sling.caconfig.ConfigurationResolver;
import org.apache.sling.caconfig.example.ListConfig;
@@ -61,6 +62,7 @@
@Before
public void setUp() {
underTest = ConfigurationTestUtils.registerConfigurationResolver(context);
+ context.registerInjectActivateService(new ConfigurationBuilderAdapterFactory());
// content resources
context.build().resource("/content/site1", PROPERTY_CONFIG_REF, "/conf/content/site1");
@@ -332,4 +334,19 @@
assertTrue(cfgList.isEmpty());
}
+ @Test
+ public void testConfigAdaptMultipleTimes() {
+ context.build().resource("/conf/content/site1/sling:configs/org.apache.sling.caconfig.example.SimpleConfig",
+ "stringParam", "configValue1");
+ context.build().resource("/conf/content/site1/sling:configs/config2",
+ "stringParam", "configValue2");
+
+ SimpleConfig cfg2 = site1Page1.adaptTo(ConfigurationBuilder.class).name("config2").as(SimpleConfig.class);
+ assertEquals("configValue2", cfg2.stringParam());
+
+ // make sure the config name from first call is not cached in the ConfigurationBuilder instance
+ SimpleConfig cfg = site1Page1.adaptTo(ConfigurationBuilder.class).as(SimpleConfig.class);
+ assertEquals("configValue1", cfg.stringParam());
+ }
+
}