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