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