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