SLING-8855 - slight api refactoring for clean centralized repoinit handling & adding logic to intercept configuration handling and move scripts into repoinit extension
diff --git a/src/main/java/org/apache/sling/feature/cpconverter/ContentPackage2FeatureModelConverter.java b/src/main/java/org/apache/sling/feature/cpconverter/ContentPackage2FeatureModelConverter.java
index 48a4ca7..8a0fc92 100644
--- a/src/main/java/org/apache/sling/feature/cpconverter/ContentPackage2FeatureModelConverter.java
+++ b/src/main/java/org/apache/sling/feature/cpconverter/ContentPackage2FeatureModelConverter.java
@@ -223,7 +223,7 @@
 
                 // finally serialize the Feature Model(s) file(s)
 
-                aclManager.addRepoinitExtension(assemblers, featuresManager.getTargetFeature());
+                aclManager.addRepoinitExtension(assemblers, featuresManager);
 
                 logger.info("Conversion complete!");
 
diff --git a/src/main/java/org/apache/sling/feature/cpconverter/acl/AclManager.java b/src/main/java/org/apache/sling/feature/cpconverter/acl/AclManager.java
index 79b2f0d..915320a 100644
--- a/src/main/java/org/apache/sling/feature/cpconverter/acl/AclManager.java
+++ b/src/main/java/org/apache/sling/feature/cpconverter/acl/AclManager.java
@@ -19,6 +19,7 @@
 import java.util.List;
 
 import org.apache.sling.feature.Feature;
+import org.apache.sling.feature.cpconverter.features.FeaturesManager;
 import org.apache.sling.feature.cpconverter.vltpkg.VaultPackageAssembler;
 
 /**
@@ -30,7 +31,7 @@
 
     boolean addAcl(String systemUser, Acl acl);
 
-    void addRepoinitExtension(List<VaultPackageAssembler> packageAssemblers, Feature feature);
+    void addRepoinitExtension(List<VaultPackageAssembler> packageAssemblers, FeaturesManager featureManager);
 
     void addNodetypeRegistrationSentence(String nodetypeRegistrationSentence);
 
diff --git a/src/main/java/org/apache/sling/feature/cpconverter/acl/DefaultAclManager.java b/src/main/java/org/apache/sling/feature/cpconverter/acl/DefaultAclManager.java
index a54483e..3ba81a5 100644
--- a/src/main/java/org/apache/sling/feature/cpconverter/acl/DefaultAclManager.java
+++ b/src/main/java/org/apache/sling/feature/cpconverter/acl/DefaultAclManager.java
@@ -38,6 +38,7 @@
 import org.apache.sling.feature.Extension;
 import org.apache.sling.feature.ExtensionType;
 import org.apache.sling.feature.Feature;
+import org.apache.sling.feature.cpconverter.features.FeaturesManager;
 import org.apache.sling.feature.cpconverter.vltpkg.VaultPackageAssembler;
 
 public final class DefaultAclManager implements AclManager {
@@ -86,7 +87,7 @@
         }
     }
 
-    public void addRepoinitExtension(List<VaultPackageAssembler> packageAssemblers, Feature feature) {
+    public void addRepoinitExtension(List<VaultPackageAssembler> packageAssemblers, FeaturesManager featureManager) {
         Formatter formatter = null;
         try {
             formatter = new Formatter();
@@ -133,9 +134,7 @@
             String text = formatter.toString();
 
             if (!text.isEmpty()) {
-                Extension repoInitExtension = new Extension(ExtensionType.TEXT, Extension.EXTENSION_NAME_REPOINIT, true);
-                repoInitExtension.setText(text);
-                feature.getExtensions().add(repoInitExtension);
+                featureManager.addOrAppendRepoInitExtension(text);
             }
         } finally {
             if (formatter != null) {
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 0ae7d33..6c6749d 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
@@ -278,4 +278,18 @@
         targetAPIRegions.addAll(regions);
         return this;
     }
+
+    @Override
+    public void addOrAppendRepoInitExtension(String text) {
+        
+        Extension repoInitExtension = getTargetFeature().getExtensions().getByName(Extension.EXTENSION_NAME_REPOINIT);
+        
+        if (repoInitExtension == null) {
+            repoInitExtension = new Extension(ExtensionType.TEXT, Extension.EXTENSION_NAME_REPOINIT, true);
+            getTargetFeature().getExtensions().add(repoInitExtension);
+            repoInitExtension.setText(text);
+        } else {
+            repoInitExtension.setText(repoInitExtension.getText() + "\n " + text);
+        }
+    }
 }
diff --git a/src/main/java/org/apache/sling/feature/cpconverter/features/FeaturesManager.java b/src/main/java/org/apache/sling/feature/cpconverter/features/FeaturesManager.java
index 9319d26..be1b5ff 100644
--- a/src/main/java/org/apache/sling/feature/cpconverter/features/FeaturesManager.java
+++ b/src/main/java/org/apache/sling/feature/cpconverter/features/FeaturesManager.java
@@ -37,4 +37,6 @@
 
     void serialize() throws Exception;
 
+    void addOrAppendRepoInitExtension(String text);
+
 }
diff --git a/src/main/java/org/apache/sling/feature/cpconverter/handlers/AbstractConfigurationEntryHandler.java b/src/main/java/org/apache/sling/feature/cpconverter/handlers/AbstractConfigurationEntryHandler.java
index bb933de..0c3dfda 100644
--- a/src/main/java/org/apache/sling/feature/cpconverter/handlers/AbstractConfigurationEntryHandler.java
+++ b/src/main/java/org/apache/sling/feature/cpconverter/handlers/AbstractConfigurationEntryHandler.java
@@ -25,6 +25,8 @@
 import org.apache.sling.feature.cpconverter.ContentPackage2FeatureModelConverter;
 
 abstract class AbstractConfigurationEntryHandler extends AbstractRegexEntryHandler {
+    
+    private static final String REPOINIT_PID = "org.apache.sling.jcr.repoinit.RepositoryInitializer";
 
     public AbstractConfigurationEntryHandler(String extension) {
         super("/jcr_root/(?:apps|libs)/.+/config(\\.([^/]+))?/.+\\." + extension);
@@ -34,13 +36,15 @@
     public final void handle(String path, Archive archive, Entry entry, ContentPackage2FeatureModelConverter converter) throws Exception {
         String pid = entry.getName().substring(0, entry.getName().lastIndexOf('.'));
 
+        String factoryPid = null;
         String id;
         int n = pid.indexOf('~');
         if (n == -1) {
             n = pid.indexOf('-');
         }
         if (n > 0) {
-            id = pid.substring(0, n).concat("~").concat(pid.substring(n + 1));
+            factoryPid = pid.substring(0, n);
+            id = factoryPid.concat("~").concat(pid.substring(n + 1));
         } else {
             id = pid;
         }
@@ -71,8 +75,18 @@
                                             + path
                                             + "' but it does not, currently");
         }
-
-        converter.getFeaturesManager().addConfiguration(runMode, id, configurationProperties);
+        
+        if (REPOINIT_PID.equals(factoryPid)) {
+            String[] scripts = (String[]) configurationProperties.get("scripts");
+            if (scripts != null) {
+                String text = String.join("\n", scripts);
+                converter.getFeaturesManager().addOrAppendRepoInitExtension(text);
+            } else {
+                // any repoinit configuration with empty scripts may be igored - filereferences are not supported at that point
+            }
+        } else {
+            converter.getFeaturesManager().addConfiguration(runMode, id, configurationProperties);
+        }
     }
 
     protected abstract Dictionary<String, Object> parseConfiguration(String name, InputStream input) throws Exception;
diff --git a/src/test/java/org/apache/sling/feature/cpconverter/acl/AclManagerTest.java b/src/test/java/org/apache/sling/feature/cpconverter/acl/AclManagerTest.java
index fef2200..49f5778 100644
--- a/src/test/java/org/apache/sling/feature/cpconverter/acl/AclManagerTest.java
+++ b/src/test/java/org/apache/sling/feature/cpconverter/acl/AclManagerTest.java
@@ -33,6 +33,8 @@
 import org.apache.sling.feature.ArtifactId;
 import org.apache.sling.feature.Extension;
 import org.apache.sling.feature.Feature;
+import org.apache.sling.feature.cpconverter.features.DefaultFeaturesManager;
+import org.apache.sling.feature.cpconverter.features.FeaturesManager;
 import org.apache.sling.feature.cpconverter.vltpkg.VaultPackageAssembler;
 import org.apache.sling.repoinit.parser.RepoInitParser;
 import org.apache.sling.repoinit.parser.RepoInitParsingException;
@@ -41,6 +43,8 @@
 import org.junit.After;
 import org.junit.Before;
 import org.junit.Test;
+import org.mockito.Mockito;
+import org.mockito.Spy;
 
 public class AclManagerTest {
 
@@ -75,8 +79,12 @@
         when(assembler.getEntry(anyString())).thenReturn(new File(System.getProperty("java.io.tmpdir")));
         Feature feature = new Feature(new ArtifactId("org.apache.sling", "org.apache.sling.cp2fm", "0.0.1", null, null));
 
-        aclManager.addRepoinitExtension(Arrays.asList(assembler), feature);
+        FeaturesManager fm = Mockito.spy(new DefaultFeaturesManager());
+        when(fm.getTargetFeature()).thenReturn(feature);
+        
+        aclManager.addRepoinitExtension(Arrays.asList(assembler), fm);
 
+        
         Extension repoinitExtension = feature.getExtensions().getByName(Extension.EXTENSION_NAME_REPOINIT);
         assertNotNull(repoinitExtension);
 
@@ -112,7 +120,10 @@
         when(assembler.getEntry(anyString())).thenReturn(new File(System.getProperty("java.io.tmpdir")));
         Feature feature = new Feature(new ArtifactId("org.apache.sling", "org.apache.sling.cp2fm", "0.0.1", null, null));
 
-        aclManager.addRepoinitExtension(Arrays.asList(assembler), feature);
+        FeaturesManager fm = Mockito.spy(new DefaultFeaturesManager());
+        when(fm.getTargetFeature()).thenReturn(feature);
+        
+        aclManager.addRepoinitExtension(Arrays.asList(assembler), fm);
 
         Extension repoinitExtension = feature.getExtensions().getByName(Extension.EXTENSION_NAME_REPOINIT);
         assertNotNull(repoinitExtension);
diff --git a/src/test/java/org/apache/sling/feature/cpconverter/handlers/ConfigurationEntryHandlerTest.java b/src/test/java/org/apache/sling/feature/cpconverter/handlers/ConfigurationEntryHandlerTest.java
index dd28084..d9a2215 100644
--- a/src/test/java/org/apache/sling/feature/cpconverter/handlers/ConfigurationEntryHandlerTest.java
+++ b/src/test/java/org/apache/sling/feature/cpconverter/handlers/ConfigurationEntryHandlerTest.java
@@ -34,6 +34,7 @@
 import org.apache.sling.feature.ArtifactId;
 import org.apache.sling.feature.Configuration;
 import org.apache.sling.feature.Configurations;
+import org.apache.sling.feature.Extension;
 import org.apache.sling.feature.Feature;
 import org.apache.sling.feature.cpconverter.ContentPackage2FeatureModelConverter;
 import org.apache.sling.feature.cpconverter.features.DefaultFeaturesManager;
@@ -47,7 +48,18 @@
 public class ConfigurationEntryHandlerTest {
 
     private static final String EXPECTED_PID = "org.apache.sling.serviceusermapping.impl.ServiceUserMapperImpl";
+    private static final String REPOINIT_PID = "org.apache.sling.jcr.repoinit.RepositoryInitializer";
+    private static final String REPOINIT_TESTCONFIG_PATH = "/jcr_root/apps/asd/config.author/" + REPOINIT_PID + "-test.config";
+    private static final String EXPECTED_REPOINIT = "create service user test-user\n" + 
+        "    set ACL for test-user\n" + 
+        "        allow    jcr:read    on /conf\n" + 
+        "    end\n" +
+        "create service user test-user2\n" + 
+        "    set ACL for test-user2\n" + 
+        "        allow    jcr:read    on /conf\n" + 
+        "    end";
 
+    
     private final String resourceConfiguration;
 
     private final int expectedConfigurationsSize;
@@ -94,6 +106,12 @@
 
         assertEquals(expectedConfigurationsSize, configurations.size());
 
+        
+        if (this.resourceConfiguration.equals(REPOINIT_TESTCONFIG_PATH)) {
+            assertEquals(EXPECTED_REPOINIT, featuresManager.getTargetFeature().getExtensions().getByName(Extension.EXTENSION_NAME_REPOINIT).getText());
+        }
+
+        if (expectedConfigurationsSize != 0) {
         Configuration configuration = configurations.get(0);
 
         assertTrue(configuration.getPid(), configuration.getPid().startsWith(EXPECTED_PID));
@@ -104,6 +122,7 @@
             assertEquals("Unmatching size: " + configuration.getProperties().size(), 2, configuration.getProperties().size());
         }
     }
+}
 
     @Parameters
     public static Collection<Object[]> data() {
@@ -127,6 +146,7 @@
 
             // runmode aware folders
             { "/jcr_root/apps/asd/config.author/" + EXPECTED_PID + ".config", 1, new ConfigurationEntryHandler() },
+            { REPOINIT_TESTCONFIG_PATH, 0, new ConfigurationEntryHandler() },
             { "/jcr_root/apps/asd/config.publish/" + EXPECTED_PID + ".config", 1, new ConfigurationEntryHandler() },
         });
     }
diff --git a/src/test/java/org/apache/sling/feature/cpconverter/handlers/PrivilegesHandlerTest.java b/src/test/java/org/apache/sling/feature/cpconverter/handlers/PrivilegesHandlerTest.java
index f384139..b6d9ac1 100644
--- a/src/test/java/org/apache/sling/feature/cpconverter/handlers/PrivilegesHandlerTest.java
+++ b/src/test/java/org/apache/sling/feature/cpconverter/handlers/PrivilegesHandlerTest.java
@@ -82,7 +82,7 @@
 
         handler.handle(path, archive, entry, converter);
 
-        converter.getAclManager().addRepoinitExtension(Arrays.asList(packageAssembler), feature);
+        converter.getAclManager().addRepoinitExtension(Arrays.asList(packageAssembler), featuresManager);
 
         Extension repoinitExtension = feature.getExtensions().getByName(Extension.EXTENSION_NAME_REPOINIT);
         assertNotNull(repoinitExtension);
diff --git a/src/test/java/org/apache/sling/feature/cpconverter/handlers/RepPolicyEntryHandlerTest.java b/src/test/java/org/apache/sling/feature/cpconverter/handlers/RepPolicyEntryHandlerTest.java
index fd8d048..211e0e6 100644
--- a/src/test/java/org/apache/sling/feature/cpconverter/handlers/RepPolicyEntryHandlerTest.java
+++ b/src/test/java/org/apache/sling/feature/cpconverter/handlers/RepPolicyEntryHandlerTest.java
@@ -258,8 +258,8 @@
         handler.handle(path, archive, entry, converter);
 
         when(packageAssembler.getEntry(anyString())).thenReturn(new File("itdoesnotexist"));
-
-        converter.getAclManager().addRepoinitExtension(Arrays.asList(packageAssembler), feature);
+        
+        converter.getAclManager().addRepoinitExtension(Arrays.asList(packageAssembler), featuresManager);
         return new ParseResult(feature.getExtensions().getByName(Extension.EXTENSION_NAME_REPOINIT), new String(baos.toByteArray()));
     }
 
diff --git a/src/test/java/org/apache/sling/feature/cpconverter/handlers/SystemUsersEntryHandlerTest.java b/src/test/java/org/apache/sling/feature/cpconverter/handlers/SystemUsersEntryHandlerTest.java
index ca774b3..3932136 100644
--- a/src/test/java/org/apache/sling/feature/cpconverter/handlers/SystemUsersEntryHandlerTest.java
+++ b/src/test/java/org/apache/sling/feature/cpconverter/handlers/SystemUsersEntryHandlerTest.java
@@ -116,7 +116,7 @@
 
         when(packageAssembler.getEntry(anyString())).thenReturn(new File("itdoesnotexist"));
 
-        converter.getAclManager().addRepoinitExtension(Arrays.asList(packageAssembler), feature);
+        converter.getAclManager().addRepoinitExtension(Arrays.asList(packageAssembler), featuresManager);
         return feature.getExtensions().getByName(Extension.EXTENSION_NAME_REPOINIT);
     }
 
diff --git a/src/test/resources/org/apache/sling/feature/cpconverter/handlers/jcr_root/apps/asd/config.author/org.apache.sling.jcr.repoinit.RepositoryInitializer-test.config b/src/test/resources/org/apache/sling/feature/cpconverter/handlers/jcr_root/apps/asd/config.author/org.apache.sling.jcr.repoinit.RepositoryInitializer-test.config
new file mode 100644
index 0000000..5490688
--- /dev/null
+++ b/src/test/resources/org/apache/sling/feature/cpconverter/handlers/jcr_root/apps/asd/config.author/org.apache.sling.jcr.repoinit.RepositoryInitializer-test.config
@@ -0,0 +1,10 @@
+scripts=[\
+    "create service user test-user
+    set ACL for test-user
+        allow    jcr:read    on /conf
+    end",\
+    "create service user test-user2
+    set ACL for test-user2
+        allow    jcr:read    on /conf
+    end"\
+]
\ No newline at end of file