Merge branch 'master' into SLING-8569
diff --git a/src/main/java/org/apache/sling/feature/cpconverter/acl/Acl.java b/src/main/java/org/apache/sling/feature/cpconverter/acl/Acl.java
index 23cd723..b195441 100644
--- a/src/main/java/org/apache/sling/feature/cpconverter/acl/Acl.java
+++ b/src/main/java/org/apache/sling/feature/cpconverter/acl/Acl.java
@@ -31,12 +31,15 @@
private final Path path;
+ private final Path repositoryPath;
+
private final List<String> restrictions = new LinkedList<>();
- public Acl(String operation, String privileges, Path path) {
+ public Acl(String operation, String privileges, Path path, Path repositoryPath) {
this.operation = operation;
this.privileges = privileges;
this.path = path;
+ this.repositoryPath = repositoryPath;
}
public void addRestriction(String restriction) {
@@ -57,6 +60,10 @@
return path;
}
+ public Path getRepositoryPath() {
+ return repositoryPath;
+ }
+
public List<String> getRestrictions() {
return restrictions;
}
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 cebc5c2..2c0fb84 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
@@ -204,7 +204,7 @@
Set<Path> paths = new TreeSet<>();
for (Acl authorization : authorizations) {
- addPath(authorization.getPath(), paths);
+ addPath(authorization.getRepositoryPath(), paths);
}
for (Path path : paths) {
@@ -247,7 +247,7 @@
formatter.format("%s %s on %s",
authorization.getOperation(),
authorization.getPrivileges(),
- authorization.getPath());
+ authorization.getRepositoryPath());
if (!authorization.getRestrictions().isEmpty()) {
formatter.format(" restriction(%s)",
diff --git a/src/main/java/org/apache/sling/feature/cpconverter/handlers/RepPolicyEntryHandler.java b/src/main/java/org/apache/sling/feature/cpconverter/handlers/RepPolicyEntryHandler.java
index 79995f4..6658264 100644
--- a/src/main/java/org/apache/sling/feature/cpconverter/handlers/RepPolicyEntryHandler.java
+++ b/src/main/java/org/apache/sling/feature/cpconverter/handlers/RepPolicyEntryHandler.java
@@ -23,6 +23,7 @@
import java.io.Reader;
import java.io.StringReader;
import java.io.StringWriter;
+import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.HashMap;
import java.util.Map;
@@ -40,6 +41,7 @@
import org.apache.commons.io.IOUtils;
import org.apache.jackrabbit.vault.fs.io.Archive;
import org.apache.jackrabbit.vault.fs.io.Archive.Entry;
+import org.apache.jackrabbit.vault.util.PlatformNameFormat;
import org.apache.sling.feature.cpconverter.ContentPackage2FeatureModelConverter;
import org.apache.sling.feature.cpconverter.acl.Acl;
import org.apache.sling.feature.cpconverter.acl.AclManager;
@@ -80,7 +82,10 @@
StringWriter stringWriter = new StringWriter();
handler.setResult(new StreamResult(stringWriter));
- RepPolicyParser systemUserParser = new RepPolicyParser(resourcePath, converter.getAclManager(), handler);
+ RepPolicyParser systemUserParser = new RepPolicyParser(Paths.get(resourcePath),
+ Paths.get(PlatformNameFormat.getRepositoryPath(resourcePath)),
+ converter.getAclManager(),
+ handler);
boolean hasRejectedAcls;
try (InputStream input = archive.openInputStream(entry)) {
@@ -122,7 +127,9 @@
private final Stack<Acl> acls = new Stack<>();
- private final String path;
+ private final Path path;
+
+ private final Path repositoryPath;
private final AclManager aclManager;
@@ -136,9 +143,10 @@
// just internal pointer for every iteration
private boolean processCurrentAcl = false;
- public RepPolicyParser(String path, AclManager aclManager, TransformerHandler handler) {
+ public RepPolicyParser(Path path, Path repositoryPath, AclManager aclManager, TransformerHandler handler) {
super(REP_ACL);
this.path = path;
+ this.repositoryPath = repositoryPath;
this.aclManager = aclManager;
this.handler = handler;
}
@@ -160,7 +168,7 @@
String privileges = extractValue(attributes.getValue(REP_PRIVILEGES));
- Acl acl = new Acl(operation, privileges, Paths.get(path));
+ Acl acl = new Acl(operation, privileges, path, repositoryPath);
processCurrentAcl = aclManager.addAcl(principalName, acl);
if (processCurrentAcl) {
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 37afda1..384168c 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
@@ -29,11 +29,13 @@
import java.util.Arrays;
import java.util.List;
+import org.apache.jackrabbit.vault.util.PlatformNameFormat;
import org.apache.sling.feature.ArtifactId;
import org.apache.sling.feature.Extension;
import org.apache.sling.feature.Feature;
import org.apache.sling.feature.cpconverter.vltpkg.VaultPackageAssembler;
import org.apache.sling.repoinit.parser.RepoInitParser;
+import org.apache.sling.repoinit.parser.RepoInitParsingException;
import org.apache.sling.repoinit.parser.impl.RepoInitParserService;
import org.apache.sling.repoinit.parser.operations.Operation;
import org.junit.After;
@@ -63,11 +65,11 @@
aclManager.addSystemUser(new SystemUser("acs-commons-package-replication-status-event-service", Paths.get("/asd/public")));
- aclManager.addAcl("acs-commons-ensure-oak-index-service", new Acl("allow", "jcr:read,rep:write,rep:indexDefinitionManagement", Paths.get("/asd/public")));
- aclManager.addAcl("acs-commons-package-replication-status-event-service", new Acl("allow", "jcr:read,crx:replicate,jcr:removeNode", Paths.get("/asd/public")));
+ aclManager.addAcl("acs-commons-ensure-oak-index-service", newAcl("allow", "jcr:read,rep:write,rep:indexDefinitionManagement", "/asd/public"));
+ aclManager.addAcl("acs-commons-package-replication-status-event-service", newAcl("allow", "jcr:read,crx:replicate,jcr:removeNode", "/asd/public"));
// add an ACL for unknown user
- aclManager.addAcl("acs-commons-on-deploy-scripts-service", new Acl("allow", "jcr:read,crx:replicate,jcr:removeNode", Paths.get("/asd/public")));
+ aclManager.addAcl("acs-commons-on-deploy-scripts-service", newAcl("allow", "jcr:read,crx:replicate,jcr:removeNode", "/asd/public"));
VaultPackageAssembler assembler = mock(VaultPackageAssembler.class);
when(assembler.getEntry(anyString())).thenReturn(new File(System.getProperty("java.io.tmpdir")));
@@ -97,4 +99,39 @@
assertFalse(operations.isEmpty());
}
+ @Test
+ public void pathWithSpecialCharactersTest() throws RepoInitParsingException {
+ aclManager.addSystemUser(new SystemUser("sys-usr", Paths.get("/home/users/system")));
+ aclManager.addAcl("sys-usr", newAcl("allow", "jcr:read", "/content/_cq_tags"));
+ aclManager.addAcl("sys-usr", newAcl("allow", "jcr:write", "/content/cq:tags"));
+ VaultPackageAssembler assembler = mock(VaultPackageAssembler.class);
+ 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);
+
+ Extension repoinitExtension = feature.getExtensions().getByName(Extension.EXTENSION_NAME_REPOINIT);
+ assertNotNull(repoinitExtension);
+ System.out.println(repoinitExtension.getText());
+
+ String expected = "create service user sys-usr with path /home/users/system\n" +
+ "create path (sling:Folder) /content\n" +
+ "create path (sling:Folder) /content/cq:tags\n" +
+ "set ACL for sys-usr\n" +
+ "allow jcr:read on /content/cq:tags\n" +
+ "allow jcr:write on /content/cq:tags\n" +
+ "end\n";
+
+ String actual = repoinitExtension.getText();
+ assertEquals(expected, actual);
+
+ RepoInitParser repoInitParser = new RepoInitParserService();
+ List<Operation> operations = repoInitParser.parse(new StringReader(actual));
+ assertFalse(operations.isEmpty());
+ }
+
+ private static Acl newAcl(String operation, String privileges, String path) {
+ return new Acl(operation, privileges, Paths.get(path), Paths.get(PlatformNameFormat.getRepositoryPath(path)));
+ }
+
}