Merge branch 'master' of github.com:apache/sling-org-apache-sling-feature-cpconverter
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 80ac1be..79b2f0d 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
@@ -28,7 +28,7 @@
 
     boolean addSystemUser(SystemUser systemUser);
 
-    Acl addAcl(String systemUser, Acl acl);
+    boolean addAcl(String systemUser, Acl acl);
 
     void addRepoinitExtension(List<VaultPackageAssembler> packageAssemblers, Feature feature);
 
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 4db3d54..cebc5c2 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
@@ -62,9 +62,12 @@
         return false;
     }
 
-    public Acl addAcl(String systemUser, Acl acl) {
-        acls.computeIfAbsent(systemUser, k -> new LinkedList<>()).add(acl);
-        return acl;
+    public boolean addAcl(String systemUser, Acl acl) {
+        if (isKnownSystemUser(systemUser)) {
+            acls.computeIfAbsent(systemUser, k -> new LinkedList<>()).add(acl);
+            return true;
+        }
+        return false;
     }
 
     private void addPath(Path path, Set<Path> paths) {
diff --git a/src/main/java/org/apache/sling/feature/cpconverter/acl/SystemUser.java b/src/main/java/org/apache/sling/feature/cpconverter/acl/SystemUser.java
index 0c3c3c6..097fad7 100644
--- a/src/main/java/org/apache/sling/feature/cpconverter/acl/SystemUser.java
+++ b/src/main/java/org/apache/sling/feature/cpconverter/acl/SystemUser.java
@@ -61,6 +61,9 @@
         return Objects.equals(id, other.getId()) && Objects.equals(path, other.getPath());
     }
 
-    
+    @Override
+    public String toString() {
+        return "SystemUser [id=" + id + ", path=" + path + "]";
+    }
 
 }
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 dfe8126..3015622 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
@@ -44,10 +44,11 @@
     @Override
     public void handle(String path, Archive archive, Entry entry, ContentPackage2FeatureModelConverter converter)
             throws Exception {
+        String resourcePath;
         Matcher matcher = getPattern().matcher(path);
         // we are pretty sure it matches, here
         if (matcher.matches()) {
-            path = matcher.group(1);
+            resourcePath = matcher.group(1);
         } else {
             throw new IllegalStateException("Something went terribly wrong: pattern '"
                                             + getPattern().pattern()
@@ -56,13 +57,19 @@
                                             + "' but it does not, currently");
         }
 
-        RepPolicyParser systemUserParser = new RepPolicyParser(path, converter.getAclManager());
+        RepPolicyParser systemUserParser = new RepPolicyParser(resourcePath, converter.getAclManager());
+        boolean accepted = false;
+
         try (InputStream input = archive.openInputStream(entry)) {
-            systemUserParser.parse(input);
+            accepted = systemUserParser.parse(input);
+        }
+
+        if (!accepted) {
+            converter.getMainPackageAssembler().addEntry(path, archive, entry);
         }
     }
 
-    private static final class RepPolicyParser extends AbstractJcrNodeParser<Void> {
+    private static final class RepPolicyParser extends AbstractJcrNodeParser<Boolean> {
 
         private static final String REP_ACL = "rep:ACL";
 
@@ -95,6 +102,8 @@
 
         private boolean onRepAclNode = false;
 
+        private boolean accepted = true;
+
         public RepPolicyParser(String path, AclManager aclManager) {
             super(REP_ACL);
             this.path = path;
@@ -115,7 +124,12 @@
 
                     Acl acl = new Acl(operation, privileges, Paths.get(path));
 
-                    acls.add(aclManager.addAcl(principalName, acl));
+                    if (aclManager.addAcl(principalName, acl)) {
+                        acls.add(acl);
+                    } else {
+                        accepted = false;
+                        onRepAclNode = false;
+                    }
                 } else if (REP_RESTRICTIONS.equals(primaryType) && !acls.isEmpty()) {
                     for (String restriction : RESTRICTIONS) {
                         String path = extractValue(attributes.getValue(restriction));
@@ -143,8 +157,8 @@
         }
 
         @Override
-        protected Void getParsingResult() {
-            return null;
+        protected Boolean getParsingResult() {
+            return accepted;
         }
 
         private static String extractValue(String expression) {
diff --git a/src/main/java/org/apache/sling/feature/cpconverter/vltpkg/RecollectorVaultPackageScanner.java b/src/main/java/org/apache/sling/feature/cpconverter/vltpkg/RecollectorVaultPackageScanner.java
index 79925dd..4284e1b 100644
--- a/src/main/java/org/apache/sling/feature/cpconverter/vltpkg/RecollectorVaultPackageScanner.java
+++ b/src/main/java/org/apache/sling/feature/cpconverter/vltpkg/RecollectorVaultPackageScanner.java
@@ -23,13 +23,15 @@
 import org.apache.jackrabbit.vault.packaging.PackageId;
 import org.apache.jackrabbit.vault.packaging.PackageManager;
 import org.apache.sling.feature.cpconverter.ContentPackage2FeatureModelConverter;
+import org.apache.sling.feature.cpconverter.handlers.EntryHandler;
+import org.apache.sling.feature.cpconverter.handlers.SystemUsersEntryHandler;
 import org.apache.sling.feature.cpconverter.handlers.VersionResolverContentPackageEntryHandler;
 
 public final class RecollectorVaultPackageScanner extends BaseVaultPackageScanner {
 
     private final ContentPackage2FeatureModelConverter converter;
 
-    private final VersionResolverContentPackageEntryHandler handler;
+    private final EntryHandler[] handlers;
 
     public RecollectorVaultPackageScanner(ContentPackage2FeatureModelConverter converter,
                                           PackageManager packageManager,
@@ -37,13 +39,18 @@
                                           Map<PackageId, String> subContentPackages) {
         super(packageManager, strictValidation);
         this.converter = converter;
-        handler = new VersionResolverContentPackageEntryHandler(this, subContentPackages);
+        handlers = new EntryHandler[] {
+                new SystemUsersEntryHandler(),
+                new VersionResolverContentPackageEntryHandler(this, subContentPackages)
+        };
     }
 
     @Override
     protected void onFile(String path, Archive archive, Entry entry) throws Exception {
-        if (handler.matches(path)) {
-            handler.handle(path, archive, entry, converter);
+        for (EntryHandler handler : handlers) {
+            if (handler.matches(path)) {
+                handler.handle(path, archive, entry, converter);
+            }
         }
     }
 
diff --git a/src/main/resources/META-INF/services/org.apache.sling.feature.cpconverter.handlers.EntryHandler b/src/main/resources/META-INF/services/org.apache.sling.feature.cpconverter.handlers.EntryHandler
index b63a5d8..f75b920 100644
--- a/src/main/resources/META-INF/services/org.apache.sling.feature.cpconverter.handlers.EntryHandler
+++ b/src/main/resources/META-INF/services/org.apache.sling.feature.cpconverter.handlers.EntryHandler
@@ -6,5 +6,4 @@
 org.apache.sling.feature.cpconverter.handlers.PrivilegesHandler
 org.apache.sling.feature.cpconverter.handlers.PropertiesConfigurationEntryHandler
 org.apache.sling.feature.cpconverter.handlers.RepPolicyEntryHandler
-org.apache.sling.feature.cpconverter.handlers.SystemUsersEntryHandler
 org.apache.sling.feature.cpconverter.handlers.XmlConfigurationEntryHandler