Merge pull request #18 from bosschaert/SLING-8642-2

SLING-8642 Specify the target API Region in the Content Package to Feature Model converter
diff --git a/src/main/java/org/apache/sling/feature/cpconverter/features/DefaultFeaturesManager.java b/src/main/java/org/apache/sling/feature/cpconverter/features/DefaultFeaturesManager.java
index 1f13de6..0ae7d33 100644
--- a/src/main/java/org/apache/sling/feature/cpconverter/features/DefaultFeaturesManager.java
+++ b/src/main/java/org/apache/sling/feature/cpconverter/features/DefaultFeaturesManager.java
@@ -97,12 +97,12 @@
     public void init(String groupId, String artifactId, String version) {
         targetFeature = new Feature(new ArtifactId(groupId, artifactId, version, null, SLING_OSGI_FEATURE_TILE_TYPE));
 
-        initAPIRegions();
+        initAPIRegions(targetFeature);
 
         runModes.clear();
     }
 
-    private void initAPIRegions() {
+    private void initAPIRegions(Feature feature) {
         if (targetAPIRegions.size() > 0) {
             Extension apiRegions = new Extension(ExtensionType.JSON, "api-regions", false);
             StringBuilder jsonBuilder = new StringBuilder("[");
@@ -116,7 +116,7 @@
             }
             jsonBuilder.append("]");
             apiRegions.setJSON(jsonBuilder.toString());
-            targetFeature.getExtensions().add(apiRegions);
+            feature.getExtensions().add(apiRegions);
         }
     }
 
@@ -135,7 +135,11 @@
 
         ArtifactId newId = appendRunmode(getTargetFeature().getId(), runMode);
 
-        return runModes.computeIfAbsent(runMode, k -> new Feature(newId));
+        return runModes.computeIfAbsent(runMode, k -> {
+            Feature f = new Feature(newId);
+            initAPIRegions(f);
+            return f;
+        });
     }
 
     public void addArtifact(String runMode, ArtifactId id) {
diff --git a/src/test/java/org/apache/sling/feature/cpconverter/ContentPackage2FeatureModelConverterTest.java b/src/test/java/org/apache/sling/feature/cpconverter/ContentPackage2FeatureModelConverterTest.java
index 6eeb8ae..d83816c 100644
--- a/src/test/java/org/apache/sling/feature/cpconverter/ContentPackage2FeatureModelConverterTest.java
+++ b/src/test/java/org/apache/sling/feature/cpconverter/ContentPackage2FeatureModelConverterTest.java
@@ -23,6 +23,7 @@
 
 import java.io.File;
 import java.io.FileInputStream;
+import java.io.FileNotFoundException;
 import java.io.FileReader;
 import java.io.IOException;
 import java.io.Reader;
@@ -439,6 +440,44 @@
     }
 
     @Test
+    public void testAPIRegionsWithRunmodes() throws Exception {
+        URL cp = getClass().getResource("test-content-package.zip");
+        File cpFile = new File(cp.getFile());
+        File outDir = Files.createTempDirectory(getClass().getSimpleName()).toFile();
+
+        try {
+            converter.setBundlesDeployer(new DefaultArtifactsDeployer(outDir))
+            .setFeaturesManager(new DefaultFeaturesManager(false, 5, outDir, null, null, null)
+                    .setAPIRegions(Arrays.asList("a.b.c")))
+            .setEmitter(DefaultPackagesEventsEmitter.open(outDir))
+            .convert(cpFile);
+
+            assertAPIRegion(new File(outDir, "asd.retail.all.json"), "a.b.c");
+            assertAPIRegion(new File(outDir, "asd.retail.all-author.json"), "a.b.c");
+            assertAPIRegion(new File(outDir, "asd.retail.all-publish.json"), "a.b.c");
+        } finally {
+            deleteDirTree(outDir);
+        }
+
+    }
+
+    private void assertAPIRegion(File featureFile, String region) throws IOException, FileNotFoundException {
+        try (Reader reader = new FileReader(featureFile)) {
+            Feature feature = FeatureJSONReader.read(reader, featureFile.getAbsolutePath());
+
+            Extension apiRegions = feature.getExtensions().getByName("api-regions");
+            assertEquals(ExtensionType.JSON, apiRegions.getType());
+            String json = apiRegions.getJSON();
+            JsonArray ja = Json.createReader(new StringReader(json)).readArray();
+            assertEquals(1, ja.size());
+
+            JsonObject regionJO = ja.getJsonObject(0);
+            assertEquals(region, regionJO.getString("name"));
+            assertEquals(0, regionJO.getJsonArray("exports").size());
+        }
+    }
+
+    @Test
     public void overrideFeatureId() throws Exception {
         URL packageUrl = getClass().getResource("test-content-package.zip");
         File packageFile = FileUtils.toFile(packageUrl);