SLING-11164: keep feature to region cache on feature merge (#18)

diff --git a/src/main/java/org/apache/sling/feature/extension/apiregions/ConfigurationApiMergeHandler.java b/src/main/java/org/apache/sling/feature/extension/apiregions/ConfigurationApiMergeHandler.java
index 082ee61..45bf7a6 100644
--- a/src/main/java/org/apache/sling/feature/extension/apiregions/ConfigurationApiMergeHandler.java
+++ b/src/main/java/org/apache/sling/feature/extension/apiregions/ConfigurationApiMergeHandler.java
@@ -101,6 +101,7 @@
             // update cache
             if ( !context.isPrototypeMerge() ) {
                 targetApi.getFeatureToRegionCache().put(sourceFeature.getId(), sourceApi.detectRegion());
+                targetApi.getFeatureToRegionCache().putAll(sourceApi.getFeatureToRegionCache());
             }
             
             ConfigurationApi.setConfigurationApi(targetFeature, targetApi);
diff --git a/src/test/java/org/apache/sling/feature/extension/apiregions/ConfigurationApiMergeHandlerTest.java b/src/test/java/org/apache/sling/feature/extension/apiregions/ConfigurationApiMergeHandlerTest.java
index f2fdb94..3231fbe 100644
--- a/src/test/java/org/apache/sling/feature/extension/apiregions/ConfigurationApiMergeHandlerTest.java
+++ b/src/test/java/org/apache/sling/feature/extension/apiregions/ConfigurationApiMergeHandlerTest.java
@@ -382,4 +382,45 @@
         assertTrue(api.getInternalFrameworkProperties().contains("pb"));
         assertTrue(api.getInternalFrameworkProperties().contains("pc"));
     }
+
+    @Test public void testConfigurationApiMergeRegionCache() {
+        final BuilderContext context = new BuilderContext(id -> null);
+        context.addMergeExtensions(new ConfigurationApiMergeHandler());
+
+        final Feature featureA = new Feature(ArtifactId.parse("g:a:1"));
+        final ConfigurationApi apiA = new ConfigurationApi();
+        apiA.setRegion(Region.INTERNAL);
+        ConfigurationApi.setConfigurationApi(featureA, apiA);
+
+        final Feature featureB = new Feature(ArtifactId.parse("g:b:1"));
+        final ConfigurationApi apiB = new ConfigurationApi();
+        apiB.setRegion(Region.GLOBAL);
+        ConfigurationApi.setConfigurationApi(featureB, apiB);
+
+
+        final Feature featureC = new Feature(ArtifactId.parse("g:c:1"));
+        final ConfigurationApi apiC = new ConfigurationApi();
+        apiC.setRegion(Region.INTERNAL);
+        ConfigurationApi.setConfigurationApi(featureC, apiC);
+
+        final Feature featureD = new Feature(ArtifactId.parse("g:d:1"));
+        final ConfigurationApi apiD = new ConfigurationApi();
+        apiD.setRegion(Region.INTERNAL);
+        ConfigurationApi.setConfigurationApi(featureD, apiD);
+
+        final ArtifactId idIntermediate = ArtifactId.parse("g:i:1");
+        Feature intermediate = FeatureBuilder.assemble(idIntermediate, context, featureA, featureB);
+        final ArtifactId id = ArtifactId.parse("g:m:1");
+        Feature result = FeatureBuilder.assemble(id, context, featureC, featureD, intermediate);
+        ConfigurationApi api = ConfigurationApi.getConfigurationApi(result);
+        assertNotNull(api);
+
+
+        assertEquals(5, api.getFeatureToRegionCache().size());
+        assertEquals(Region.INTERNAL, api.getFeatureToRegionCache().get(featureA.getId()));
+        assertEquals(Region.GLOBAL, api.getFeatureToRegionCache().get(featureB.getId()));
+        assertEquals(Region.INTERNAL, api.getFeatureToRegionCache().get(featureC.getId()));
+        assertEquals(Region.INTERNAL, api.getFeatureToRegionCache().get(featureD.getId()));
+        assertEquals(Region.GLOBAL, api.getFeatureToRegionCache().get(idIntermediate));
+    }
 }
\ No newline at end of file