This is an automated email from the ASF dual-hosted git repository.

enorman pushed a commit to branch master
in repository 
https://gitbox.apache.org/repos/asf/sling-org-apache-sling-jcr-jackrabbit-accessmanager.git


The following commit(s) were added to refs/heads/master by this push:
     new 0825da1  cleanup - change tabs to spaces
0825da1 is described below

commit 0825da1234ebd3be107acd9dc1ed04ae692ec8ab
Author: Eric Norman <[email protected]>
AuthorDate: Fri May 28 10:31:08 2021 -0700

    cleanup - change tabs to spaces
---
 .../jcr/jackrabbit/accessmanager/DeleteAces.java   |   26 +-
 .../sling/jcr/jackrabbit/accessmanager/GetAcl.java |   22 +-
 .../jackrabbit/accessmanager/GetEffectiveAcl.java  |   22 +-
 .../jcr/jackrabbit/accessmanager/ModifyAce.java    |  238 ++---
 .../jackrabbit/accessmanager/PrivilegesInfo.java   | 1081 ++++++++++----------
 .../accessmanager/impl/PrivilegesHelper.java       |    2 +-
 .../accessmanager/post/AbstractGetAclServlet.java  |  164 +--
 .../accessmanager/post/DeleteAcesServlet.java      |  277 +++--
 .../accessmanager/post/GetAclServlet.java          |   50 +-
 .../accessmanager/post/GetEffectiveAclServlet.java |   26 +-
 .../accessmanager/post/ModifyAceServlet.java       |  429 ++++----
 11 files changed, 1165 insertions(+), 1172 deletions(-)

diff --git 
a/src/main/java/org/apache/sling/jcr/jackrabbit/accessmanager/DeleteAces.java 
b/src/main/java/org/apache/sling/jcr/jackrabbit/accessmanager/DeleteAces.java
index 2c6102c..6833952 100644
--- 
a/src/main/java/org/apache/sling/jcr/jackrabbit/accessmanager/DeleteAces.java
+++ 
b/src/main/java/org/apache/sling/jcr/jackrabbit/accessmanager/DeleteAces.java
@@ -30,17 +30,17 @@ import javax.jcr.Session;
  */
 public interface DeleteAces {
 
-       /**
-        * Deletes one or more ACEs from the access control list of a resource.
-        * 
-        * @param jcrSession the JCR session of the user updating the user
-        * @param resourcePath The path of the resource to update the ACL for 
(required)
-        * @param principalNamesToDelete An array of ace principal names to 
delete.. (required)
-        * @throws RepositoryException if any errors applying the changes 
-        */
-       void deleteAces(Session jcrSession,
-                                                       String resourcePath,
-                                                       String [] 
principalNamesToDelete
-                               ) throws RepositoryException;
-       
+    /**
+     * Deletes one or more ACEs from the access control list of a resource.
+     * 
+     * @param jcrSession the JCR session of the user updating the user
+     * @param resourcePath The path of the resource to update the ACL for 
(required)
+     * @param principalNamesToDelete An array of ace principal names to 
delete.. (required)
+     * @throws RepositoryException if any errors applying the changes 
+     */
+    void deleteAces(Session jcrSession,
+                            String resourcePath,
+                            String [] principalNamesToDelete
+                ) throws RepositoryException;
+
 }
diff --git 
a/src/main/java/org/apache/sling/jcr/jackrabbit/accessmanager/GetAcl.java 
b/src/main/java/org/apache/sling/jcr/jackrabbit/accessmanager/GetAcl.java
index 14b00f3..145b238 100644
--- a/src/main/java/org/apache/sling/jcr/jackrabbit/accessmanager/GetAcl.java
+++ b/src/main/java/org/apache/sling/jcr/jackrabbit/accessmanager/GetAcl.java
@@ -31,16 +31,16 @@ import javax.json.JsonObject;
  */
 public interface GetAcl {
 
-       /**
-        * Gets the access control list for a resource.
-        * 
-        * @param jcrSession the JCR session of the user updating the user
-        * @param resourcePath The path of the resource to get the ACL for 
(required)
+    /**
+     * Gets the access control list for a resource.
+     * 
+     * @param jcrSession the JCR session of the user updating the user
+     * @param resourcePath The path of the resource to get the ACL for 
(required)
      * @return the ACL as a JSON object 
-        * @throws RepositoryException if any errors reading the information
-        */
-       JsonObject getAcl(Session jcrSession,
-                                                       String resourcePath
-                               ) throws RepositoryException;
-       
+     * @throws RepositoryException if any errors reading the information
+     */
+    JsonObject getAcl(Session jcrSession,
+                            String resourcePath
+                ) throws RepositoryException;
+
 }
diff --git 
a/src/main/java/org/apache/sling/jcr/jackrabbit/accessmanager/GetEffectiveAcl.java
 
b/src/main/java/org/apache/sling/jcr/jackrabbit/accessmanager/GetEffectiveAcl.java
index 767ef46..e118c8a 100644
--- 
a/src/main/java/org/apache/sling/jcr/jackrabbit/accessmanager/GetEffectiveAcl.java
+++ 
b/src/main/java/org/apache/sling/jcr/jackrabbit/accessmanager/GetEffectiveAcl.java
@@ -31,16 +31,16 @@ import javax.json.JsonObject;
  */
 public interface GetEffectiveAcl {
 
-       /**
-        * Gets the effective access control list for a resource.
-        * 
-        * @param jcrSession the JCR session of the user updating the user
-        * @param resourcePath The path of the resource to get the ACL for 
(required)
+    /**
+     * Gets the effective access control list for a resource.
+     * 
+     * @param jcrSession the JCR session of the user updating the user
+     * @param resourcePath The path of the resource to get the ACL for 
(required)
      * @return the ACL as a JSON object 
-        * @throws RepositoryException if any errors reading the information
-        */
-       JsonObject getEffectiveAcl(Session jcrSession,
-                                                       String resourcePath
-                               ) throws RepositoryException;
-       
+     * @throws RepositoryException if any errors reading the information
+     */
+    JsonObject getEffectiveAcl(Session jcrSession,
+                            String resourcePath
+                ) throws RepositoryException;
+
 }
diff --git 
a/src/main/java/org/apache/sling/jcr/jackrabbit/accessmanager/ModifyAce.java 
b/src/main/java/org/apache/sling/jcr/jackrabbit/accessmanager/ModifyAce.java
index ffcfdd1..39d4947 100644
--- a/src/main/java/org/apache/sling/jcr/jackrabbit/accessmanager/ModifyAce.java
+++ b/src/main/java/org/apache/sling/jcr/jackrabbit/accessmanager/ModifyAce.java
@@ -35,149 +35,149 @@ import javax.jcr.Value;
  */
 public interface ModifyAce {
 
-       /**
-        * Add or modify the access control entry for the specified user 
-        * or group.
-        * 
-        * This is equivalent to {@link #modifyAce(Session, String, String, 
Map, String, boolean)} with
-        * the autoSave parameter value equal to true.
-        * 
-        * @param jcrSession the JCR session of the user updating the user
-        * @param resourcePath The absolute path of the resource to apply the 
ACE to (required)
-        * @param principalId The name of the user/group to provision (required)
-        * @param privileges Map of privileges to apply. (optional)
+    /**
+     * Add or modify the access control entry for the specified user 
+     * or group.
+     * 
+     * This is equivalent to {@link #modifyAce(Session, String, String, Map, 
String, boolean)} with
+     * the autoSave parameter value equal to true.
+     * 
+     * @param jcrSession the JCR session of the user updating the user
+     * @param resourcePath The absolute path of the resource to apply the ACE 
to (required)
+     * @param principalId The name of the user/group to provision (required)
+     * @param privileges Map of privileges to apply. (optional)
      * @param order where the access control entry should go in the list.
      *         <table style='margin-left: 30px;' border="1">
      *          <caption>The value should be one of these:</caption>
      *          <tbody>
      *            <tr><td>null</td><td>If the ACE for the principal doesn't 
exist add at the end, otherwise leave the ACE at it's current 
position.</td></tr>
-     *                           <tr><td>first</td><td>Place the target ACE as 
the first amongst its siblings</td></tr>
-        *                        <tr><td>last</td><td>Place the target ACE as 
the last amongst its siblings</td></tr>
-        *                        <tr><td>before xyz</td><td>Place the target 
ACE immediately before the sibling whose name is xyz</td></tr>
-        *                        <tr><td>after xyz</td><td>Place the target 
ACE immediately after the sibling whose name is xyz</td></tr>
-        *                        <tr><td>numeric</td><td>Place the target ACE 
at the specified numeric index</td></tr>
+     *               <tr><td>first</td><td>Place the target ACE as the first 
amongst its siblings</td></tr>
+     *              <tr><td>last</td><td>Place the target ACE as the last 
amongst its siblings</td></tr>
+     *               <tr><td>before xyz</td><td>Place the target ACE 
immediately before the sibling whose name is xyz</td></tr>
+     *               <tr><td>after xyz</td><td>Place the target ACE 
immediately after the sibling whose name is xyz</td></tr>
+     *               <tr><td>numeric</td><td>Place the target ACE at the 
specified numeric index</td></tr>
      *          </tbody>
-        *         </table>
-        * @throws RepositoryException if any errors applying the changes 
-        */
-       void modifyAce(Session jcrSession,
-                                                       String resourcePath,
-                                                       String principalId,
-                                                       Map<String, String> 
privileges,
-                                                       String order
-                               ) throws RepositoryException;
+     *         </table>
+     * @throws RepositoryException if any errors applying the changes 
+     */
+    void modifyAce(Session jcrSession,
+                            String resourcePath,
+                            String principalId,
+                            Map<String, String> privileges,
+                            String order
+                ) throws RepositoryException;
 
-       /**
-        * Add or modify the access control entry for the specified user 
-        * or group.
-        * 
-        * @param jcrSession the JCR session of the user updating the user
-        * @param resourcePath The absolute path of the resource to apply the 
ACE to (required)
-        * @param principalId The name of the user/group to provision (required)
-        * @param privileges Map of privileges to apply. (optional)
+    /**
+     * Add or modify the access control entry for the specified user 
+     * or group.
+     * 
+     * @param jcrSession the JCR session of the user updating the user
+     * @param resourcePath The absolute path of the resource to apply the ACE 
to (required)
+     * @param principalId The name of the user/group to provision (required)
+     * @param privileges Map of privileges to apply. (optional)
      * @param order where the access control entry should go in the list.
      *         <table style='margin-left: 30px;' border="1">
      *          <caption>The value should be one of these:</caption>
      *          <tbody>
      *            <tr><td>null</td><td>If the ACE for the principal doesn't 
exist add at the end, otherwise leave the ACE at it's current 
position.</td></tr>
-     *                           <tr><td>first</td><td>Place the target ACE as 
the first amongst its siblings</td></tr>
-        *                        <tr><td>last</td><td>Place the target ACE as 
the last amongst its siblings</td></tr>
-        *                        <tr><td>before xyz</td><td>Place the target 
ACE immediately before the sibling whose name is xyz</td></tr>
-        *                        <tr><td>after xyz</td><td>Place the target 
ACE immediately after the sibling whose name is xyz</td></tr>
-        *                        <tr><td>numeric</td><td>Place the target ACE 
at the specified numeric index</td></tr>
+     *               <tr><td>first</td><td>Place the target ACE as the first 
amongst its siblings</td></tr>
+     *              <tr><td>last</td><td>Place the target ACE as the last 
amongst its siblings</td></tr>
+     *               <tr><td>before xyz</td><td>Place the target ACE 
immediately before the sibling whose name is xyz</td></tr>
+     *               <tr><td>after xyz</td><td>Place the target ACE 
immediately after the sibling whose name is xyz</td></tr>
+     *               <tr><td>numeric</td><td>Place the target ACE at the 
specified numeric index</td></tr>
      *          </tbody>
-        *         </table>
-        * @param autoSave true to automatically save changes to the JCR 
session, false otherwise
-        * @throws RepositoryException if any errors applying the changes 
-        */
-       default void modifyAce(Session jcrSession,
-                                                       String resourcePath,
-                                                       String principalId,
-                                                       Map<String, String> 
privileges,
-                                                       String order,
-                                                       boolean autoSave
-                               ) throws RepositoryException {
-               throw new UnsupportedRepositoryOperationException();
-       }
-       
-       /**
-        * Add or modify the access control entry for the specified user 
-        * or group.
-        * 
-        * This is equivalent to {@link #modifyAce(Session, String, String, 
Map, String, Map, Map, Set, boolean)} with
-        * the autoSave parameter value equal to true.
-        * 
-        * @param jcrSession the JCR session of the user updating the user
-        * @param resourcePath The absolute path of the resource to apply the 
ACE to (required)
-        * @param principalId The name of the user/group to provision (required)
-        * @param privileges Map of privileges to apply. (optional)
+     *         </table>
+     * @param autoSave true to automatically save changes to the JCR session, 
false otherwise
+     * @throws RepositoryException if any errors applying the changes 
+     */
+    default void modifyAce(Session jcrSession,
+                            String resourcePath,
+                            String principalId,
+                            Map<String, String> privileges,
+                            String order,
+                            boolean autoSave
+                ) throws RepositoryException {
+        throw new UnsupportedRepositoryOperationException();
+    }
+
+    /**
+     * Add or modify the access control entry for the specified user 
+     * or group.
+     * 
+     * This is equivalent to {@link #modifyAce(Session, String, String, Map, 
String, Map, Map, Set, boolean)} with
+     * the autoSave parameter value equal to true.
+     * 
+     * @param jcrSession the JCR session of the user updating the user
+     * @param resourcePath The absolute path of the resource to apply the ACE 
to (required)
+     * @param principalId The name of the user/group to provision (required)
+     * @param privileges Map of privileges to apply. (optional)
      * @param order where the access control entry should go in the list.
      *         <table style='margin-left: 30px;' border="1">
      *          <caption>The value should be one of these:</caption>
      *          <tbody>
      *            <tr><td>null</td><td>If the ACE for the principal doesn't 
exist add at the end, otherwise leave the ACE at it's current 
position.</td></tr>
-     *                           <tr><td>first</td><td>Place the target ACE as 
the first amongst its siblings</td></tr>
-        *                        <tr><td>last</td><td>Place the target ACE as 
the last amongst its siblings</td></tr>
-        *                        <tr><td>before xyz</td><td>Place the target 
ACE immediately before the sibling whose name is xyz</td></tr>
-        *                        <tr><td>after xyz</td><td>Place the target 
ACE immediately after the sibling whose name is xyz</td></tr>
-        *                        <tr><td>numeric</td><td>Place the target ACE 
at the specified numeric index</td></tr>
+     *               <tr><td>first</td><td>Place the target ACE as the first 
amongst its siblings</td></tr>
+     *              <tr><td>last</td><td>Place the target ACE as the last 
amongst its siblings</td></tr>
+     *               <tr><td>before xyz</td><td>Place the target ACE 
immediately before the sibling whose name is xyz</td></tr>
+     *               <tr><td>after xyz</td><td>Place the target ACE 
immediately after the sibling whose name is xyz</td></tr>
+     *               <tr><td>numeric</td><td>Place the target ACE at the 
specified numeric index</td></tr>
      *          </tbody>
-        *         </table>
-        * @param restrictions Map of single-value restrictions to apply. 
(optional)
-        * @param mvRestrictions Map of multi-value restrictions to apply. 
(optional)
-        * @param removeRestrictionNames Set of existing restriction names to 
remove (optional)
-        * @throws RepositoryException if any errors applying the changes 
-        */
-       default void modifyAce(Session jcrSession,
-                                                       String resourcePath,
-                                                       String principalId,
-                                                       Map<String, String> 
privileges,
-                                                       String order,
-                                                       Map<String, Value> 
restrictions,
-                                                       Map<String, Value[]> 
mvRestrictions,
-                                                       Set<String> 
removeRestrictionNames
-                               ) throws RepositoryException {
-               modifyAce(jcrSession, resourcePath, principalId, 
-                               privileges, order, restrictions, 
mvRestrictions, 
-                               removeRestrictionNames, true);
-       }
+     *         </table>
+     * @param restrictions Map of single-value restrictions to apply. 
(optional)
+     * @param mvRestrictions Map of multi-value restrictions to apply. 
(optional)
+     * @param removeRestrictionNames Set of existing restriction names to 
remove (optional)
+     * @throws RepositoryException if any errors applying the changes 
+     */
+    default void modifyAce(Session jcrSession,
+                            String resourcePath,
+                            String principalId,
+                            Map<String, String> privileges,
+                            String order,
+                            Map<String, Value> restrictions,
+                            Map<String, Value[]> mvRestrictions,
+                            Set<String> removeRestrictionNames
+                ) throws RepositoryException {
+        modifyAce(jcrSession, resourcePath, principalId, 
+                privileges, order, restrictions, mvRestrictions, 
+                removeRestrictionNames, true);
+    }
 
-       /**
-        * Add or modify the access control entry for the specified user 
-        * or group.
-        * 
-        * @param jcrSession the JCR session of the user updating the user
-        * @param resourcePath The absolute path of the resource to apply the 
ACE to (required)
-        * @param principalId The name of the user/group to provision (required)
-        * @param privileges Map of privileges to apply. (optional)
+    /**
+     * Add or modify the access control entry for the specified user 
+     * or group.
+     * 
+     * @param jcrSession the JCR session of the user updating the user
+     * @param resourcePath The absolute path of the resource to apply the ACE 
to (required)
+     * @param principalId The name of the user/group to provision (required)
+     * @param privileges Map of privileges to apply. (optional)
      * @param order where the access control entry should go in the list.
      *         <table style='margin-left: 30px;' border="1">
      *          <caption>The value should be one of these:</caption>
      *          <tbody>
      *            <tr><td>null</td><td>If the ACE for the principal doesn't 
exist add at the end, otherwise leave the ACE at it's current 
position.</td></tr>
-     *                           <tr><td>first</td><td>Place the target ACE as 
the first amongst its siblings</td></tr>
-        *                        <tr><td>last</td><td>Place the target ACE as 
the last amongst its siblings</td></tr>
-        *                        <tr><td>before xyz</td><td>Place the target 
ACE immediately before the sibling whose name is xyz</td></tr>
-        *                        <tr><td>after xyz</td><td>Place the target 
ACE immediately after the sibling whose name is xyz</td></tr>
-        *                        <tr><td>numeric</td><td>Place the target ACE 
at the specified numeric index</td></tr>
+     *               <tr><td>first</td><td>Place the target ACE as the first 
amongst its siblings</td></tr>
+     *              <tr><td>last</td><td>Place the target ACE as the last 
amongst its siblings</td></tr>
+     *               <tr><td>before xyz</td><td>Place the target ACE 
immediately before the sibling whose name is xyz</td></tr>
+     *               <tr><td>after xyz</td><td>Place the target ACE 
immediately after the sibling whose name is xyz</td></tr>
+     *               <tr><td>numeric</td><td>Place the target ACE at the 
specified numeric index</td></tr>
      *          </tbody>
-        *         </table>
-        * @param restrictions Map of single-value restrictions to apply. 
(optional)
-        * @param mvRestrictions Map of multi-value restrictions to apply. 
(optional)
-        * @param removeRestrictionNames Set of existing restriction names to 
remove (optional)
-        * @param autoSave true to automatically save changes to the JCR 
session, false otherwise
-        * @throws RepositoryException if any errors applying the changes 
-        */
-       default void modifyAce(Session jcrSession,
-                                                       String resourcePath,
-                                                       String principalId,
-                                                       Map<String, String> 
privileges,
-                                                       String order,
-                                                       Map<String, Value> 
restrictions,
-                                                       Map<String, Value[]> 
mvRestrictions,
-                                                       Set<String> 
removeRestrictionNames,
-                                                       boolean autoSave
-                               ) throws RepositoryException {
-               throw new UnsupportedRepositoryOperationException();
-       }
+     *         </table>
+     * @param restrictions Map of single-value restrictions to apply. 
(optional)
+     * @param mvRestrictions Map of multi-value restrictions to apply. 
(optional)
+     * @param removeRestrictionNames Set of existing restriction names to 
remove (optional)
+     * @param autoSave true to automatically save changes to the JCR session, 
false otherwise
+     * @throws RepositoryException if any errors applying the changes 
+     */
+    default void modifyAce(Session jcrSession,
+                            String resourcePath,
+                            String principalId,
+                            Map<String, String> privileges,
+                            String order,
+                            Map<String, Value> restrictions,
+                            Map<String, Value[]> mvRestrictions,
+                            Set<String> removeRestrictionNames,
+                            boolean autoSave
+                ) throws RepositoryException {
+        throw new UnsupportedRepositoryOperationException();
+    }
 }
diff --git 
a/src/main/java/org/apache/sling/jcr/jackrabbit/accessmanager/PrivilegesInfo.java
 
b/src/main/java/org/apache/sling/jcr/jackrabbit/accessmanager/PrivilegesInfo.java
index 4e679f8..6ebddc2 100644
--- 
a/src/main/java/org/apache/sling/jcr/jackrabbit/accessmanager/PrivilegesInfo.java
+++ 
b/src/main/java/org/apache/sling/jcr/jackrabbit/accessmanager/PrivilegesInfo.java
@@ -47,124 +47,123 @@ import org.apache.sling.jcr.base.util.AccessControlUtil;
  * Helper class to assist in the usage of access control from scripts.
  */
 public class PrivilegesInfo {
-       
-       /**
-        * Return the supported Privileges for the specified node.
-        * 
-        * @param node the node to check
-        * @return array of Privileges
-        * @throws RepositoryException if any errors reading the information
-        */
-       public Privilege [] getSupportedPrivileges(Node node) throws 
RepositoryException {
-               return getSupportedPrivileges(node.getSession(), 
node.getPath());
-       }
-       
-       /**
-        * Returns the supported privileges for the specified path.
-        * 
-        * @param session the session for the current user
-        * @param absPath the path to get the privileges for
-        * @return array of Privileges
-        * @throws RepositoryException if any errors reading the information
-        */
-       public Privilege [] getSupportedPrivileges(Session session, String 
absPath) throws RepositoryException {
-               AccessControlManager accessControlManager = 
AccessControlUtil.getAccessControlManager(session);
-               return accessControlManager.getSupportedPrivileges(absPath);
-       }
-       
-       /**
-        * Wrapper class that holds the set of Privileges that are granted 
-        * and/or denied for a specific principal.
-        */
-       public static class AccessRights {
-               private Set<Privilege> granted = new HashSet<>();
-               private Set<Privilege> denied = new HashSet<>();
-
-               private ResourceBundle resBundle = null;
-               private ResourceBundle getResourceBundle(Locale locale) {
-                       if (resBundle == null || 
!resBundle.getLocale().equals(locale)) {
-                               resBundle = 
ResourceBundle.getBundle(getClass().getPackage().getName() + 
".PrivilegesResources", locale);
-                       }
-                       return resBundle;
-               }
-               
-
-               public Set<Privilege> getGranted() {
-                       return granted;
-               }
-               public Set<Privilege> getDenied() {
-                       return denied;
-               }
-               
-               public String getPrivilegeSetDisplayName(Locale locale) {
-                       if (denied != null && !denied.isEmpty()) {
-                               //if there are any denied privileges, then this 
is a custom privilege set
-                               return 
getResourceBundle(locale).getString("privilegeset.custom");
-                       } else {
-                               if (granted.isEmpty()) {
-                                       //appears to have an empty privilege set
-                                       return 
getResourceBundle(locale).getString("privilegeset.none");
-                               }
-                                       
-                               if (granted.size() == 1) {
-                                       //check if the single privilege is 
jcr:all or jcr:read
-                                       Iterator<Privilege> iterator = 
granted.iterator();
-                                       Privilege next = iterator.next();
-                                       if 
(PrivilegeConstants.JCR_ALL.equals(next.getName())) {
-                                               //full control privilege set
-                                               return 
getResourceBundle(locale).getString("privilegeset.all");
-                                       } else if 
(PrivilegeConstants.JCR_READ.equals(next.getName())) {
-                                               //readonly privilege set
-                                               return 
getResourceBundle(locale).getString("privilegeset.readonly");
-                                       } 
-                               } else if (granted.size() == 2) {
-                                       //check if the two privileges are 
jcr:read and jcr:write
-                                       Iterator<Privilege> iterator = 
granted.iterator();
-                                       Privilege next = iterator.next();
-                                       Privilege next2 = iterator.next();
-                                       if ( 
(PrivilegeConstants.JCR_READ.equals(next.getName()) && 
PrivilegeConstants.JCR_WRITE.equals(next2.getName())) ||
-                                                       
(PrivilegeConstants.JCR_READ.equals(next2.getName()) && 
PrivilegeConstants.JCR_WRITE.equals(next.getName())) ) {
-                                               //read/write privileges
-                                               return 
getResourceBundle(locale).getString("privilegeset.readwrite");
-                                       }
-                               }
-
-                               //some other set of privileges
-                               return 
getResourceBundle(locale).getString("privilegeset.custom");
-                       }
-               }
-       }
-
-       /**
-        * Returns the mapping of declared access rights that have been set for 
the resource at
-        * the given path. 
-        * 
-        * @param node the node to get the access rights for
-        * @return map of access rights.  Key is the user/group principal, 
value contains the granted/denied privileges
-        * @throws RepositoryException if any errors reading the information
-        */
-       public Map<Principal, AccessRights> getDeclaredAccessRights(Node node) 
throws RepositoryException {
-               return getDeclaredAccessRights(node.getSession(), 
node.getPath());
-       }
-       
-       /**
-        * Returns the mapping of declared access rights that have been set for 
the resource at
-        * the given path. 
-        * 
-        * @param session the current user session.
-        * @param absPath the path of the resource to get the access rights for
-        * @return map of access rights.  Key is the user/group principal, 
value contains the granted/denied privileges
-        * @throws RepositoryException if any errors reading the information
-        */
-       public Map<Principal, AccessRights> getDeclaredAccessRights(Session 
session, String absPath) throws RepositoryException {
-               AccessControlEntry[] entries = 
getDeclaredAccessControlEntries(session, absPath);
-               return mergePrivilegesFromEntries(entries);
-       }
-
-       private AccessControlEntry[] getDeclaredAccessControlEntries(Session 
session, String absPath) throws RepositoryException {
-               AccessControlManager accessControlManager = 
AccessControlUtil.getAccessControlManager(session);
-               AccessControlPolicy[] policies = 
accessControlManager.getPolicies(absPath);
-               
+
+    /**
+     * Return the supported Privileges for the specified node.
+     * 
+     * @param node the node to check
+     * @return array of Privileges
+     * @throws RepositoryException if any errors reading the information
+     */
+    public Privilege [] getSupportedPrivileges(Node node) throws 
RepositoryException {
+        return getSupportedPrivileges(node.getSession(), node.getPath());
+    }
+
+    /**
+     * Returns the supported privileges for the specified path.
+     * 
+     * @param session the session for the current user
+     * @param absPath the path to get the privileges for
+     * @return array of Privileges
+     * @throws RepositoryException if any errors reading the information
+     */
+    public Privilege [] getSupportedPrivileges(Session session, String 
absPath) throws RepositoryException {
+        AccessControlManager accessControlManager = 
AccessControlUtil.getAccessControlManager(session);
+        return accessControlManager.getSupportedPrivileges(absPath);
+    }
+
+    /**
+     * Wrapper class that holds the set of Privileges that are granted 
+     * and/or denied for a specific principal.
+     */
+    public static class AccessRights {
+        private Set<Privilege> granted = new HashSet<>();
+        private Set<Privilege> denied = new HashSet<>();
+
+        private ResourceBundle resBundle = null;
+        private ResourceBundle getResourceBundle(Locale locale) {
+            if (resBundle == null || !resBundle.getLocale().equals(locale)) {
+                resBundle = 
ResourceBundle.getBundle(getClass().getPackage().getName() + 
".PrivilegesResources", locale);
+            }
+            return resBundle;
+        }
+
+        public Set<Privilege> getGranted() {
+            return granted;
+        }
+        public Set<Privilege> getDenied() {
+            return denied;
+        }
+
+        public String getPrivilegeSetDisplayName(Locale locale) {
+            if (denied != null && !denied.isEmpty()) {
+                //if there are any denied privileges, then this is a custom 
privilege set
+                return 
getResourceBundle(locale).getString("privilegeset.custom");
+            } else {
+                if (granted.isEmpty()) {
+                    //appears to have an empty privilege set
+                    return 
getResourceBundle(locale).getString("privilegeset.none");
+                }
+
+                if (granted.size() == 1) {
+                    //check if the single privilege is jcr:all or jcr:read
+                    Iterator<Privilege> iterator = granted.iterator();
+                    Privilege next = iterator.next();
+                    if (PrivilegeConstants.JCR_ALL.equals(next.getName())) {
+                        //full control privilege set
+                        return 
getResourceBundle(locale).getString("privilegeset.all");
+                    } else if 
(PrivilegeConstants.JCR_READ.equals(next.getName())) {
+                        //readonly privilege set
+                        return 
getResourceBundle(locale).getString("privilegeset.readonly");
+                    }
+                } else if (granted.size() == 2) {
+                    //check if the two privileges are jcr:read and jcr:write
+                    Iterator<Privilege> iterator = granted.iterator();
+                    Privilege next = iterator.next();
+                    Privilege next2 = iterator.next();
+                    if ( (PrivilegeConstants.JCR_READ.equals(next.getName()) 
&& PrivilegeConstants.JCR_WRITE.equals(next2.getName())) ||
+                            
(PrivilegeConstants.JCR_READ.equals(next2.getName()) && 
PrivilegeConstants.JCR_WRITE.equals(next.getName())) ) {
+                        //read/write privileges
+                        return 
getResourceBundle(locale).getString("privilegeset.readwrite");
+                    }
+                }
+
+                //some other set of privileges
+                return 
getResourceBundle(locale).getString("privilegeset.custom");
+            }
+        }
+    }
+
+    /**
+     * Returns the mapping of declared access rights that have been set for 
the resource at
+     * the given path. 
+     * 
+     * @param node the node to get the access rights for
+     * @return map of access rights.  Key is the user/group principal, value 
contains the granted/denied privileges
+     * @throws RepositoryException if any errors reading the information
+     */
+    public Map<Principal, AccessRights> getDeclaredAccessRights(Node node) 
throws RepositoryException {
+        return getDeclaredAccessRights(node.getSession(), node.getPath());
+    }
+
+    /**
+     * Returns the mapping of declared access rights that have been set for 
the resource at
+     * the given path.
+     *
+     * @param session the current user session.
+     * @param absPath the path of the resource to get the access rights for
+     * @return map of access rights.  Key is the user/group principal, value 
contains the granted/denied privileges
+     * @throws RepositoryException if any errors reading the information
+     */
+    public Map<Principal, AccessRights> getDeclaredAccessRights(Session 
session, String absPath) throws RepositoryException {
+        AccessControlEntry[] entries = 
getDeclaredAccessControlEntries(session, absPath);
+        return mergePrivilegesFromEntries(entries);
+    }
+
+    private AccessControlEntry[] getDeclaredAccessControlEntries(Session 
session, String absPath) throws RepositoryException {
+        AccessControlManager accessControlManager = 
AccessControlUtil.getAccessControlManager(session);
+        AccessControlPolicy[] policies = 
accessControlManager.getPolicies(absPath);
+
         List<AccessControlEntry> allEntries = new ArrayList<>();
         for (AccessControlPolicy accessControlPolicy : policies) {
             if (accessControlPolicy instanceof AccessControlList) {
@@ -173,165 +172,163 @@ public class PrivilegesInfo {
             }
         }
         return allEntries.toArray(new AccessControlEntry[allEntries.size()]);
-       }
-
-       /**
-        * Returns the declared access rights for the specified Node for the 
given
-        * principalId.
-        * 
-        * @param node the JCR node to retrieve the access rights for
-        * @param principalId the principalId to get the access rights for
-        * @return access rights for the specified principal
-        * @throws RepositoryException if any errors reading the information
-        */
-       public AccessRights getDeclaredAccessRightsForPrincipal(Node node, 
String principalId) throws RepositoryException {
-               return getDeclaredAccessRightsForPrincipal(node.getSession(), 
node.getPath(), principalId);
-       }
-
-       /**
-        * Returns the declared access rights for the resource at the specified 
path for the given
-        * principalId.
-        * 
-        * @param session the current JCR session
-        * @param absPath the path of the resource to retrieve the rights for
-        * @param principalId the principalId to get the access rights for
-        * @return access rights for the specified principal
-        * @throws RepositoryException if any errors reading the information
-        */
-       public AccessRights getDeclaredAccessRightsForPrincipal(Session 
session, String absPath, String principalId) throws RepositoryException {
-               AccessRights rights = new AccessRights();
-               if (principalId != null && principalId.length() > 0) {
-                       AccessControlManager accessControlManager = 
AccessControlUtil.getAccessControlManager(session);
-                       AccessControlPolicy[] policies = 
accessControlManager.getPolicies(absPath);
-                       for (AccessControlPolicy accessControlPolicy : 
policies) {
-                               if (accessControlPolicy instanceof 
AccessControlList) {
-                                       AccessControlEntry[] 
accessControlEntries = 
((AccessControlList)accessControlPolicy).getAccessControlEntries();
-                                       for (AccessControlEntry ace : 
accessControlEntries) {
-                                               if 
(principalId.equals(ace.getPrincipal().getName())) {
-                                                       boolean isAllow = 
AccessControlUtil.isAllow(ace);
-                                                       if (isAllow) {
-                                                               
rights.getGranted().addAll(Arrays.asList(ace.getPrivileges()));
-                                                       } else {
-                                                               
rights.getDenied().addAll(Arrays.asList(ace.getPrivileges()));
-                                                       }
-                                               }
-                                       }
-                               }
-                       }
-               }
-               
-               return rights;
-       }
-       
-       /**
-        * Returns the restrictions for the specified path.
-        * 
-        * @param node the node to inspect
-        * @param principalId the principalId to get the access rights for
-        * @return map of restrictions (key is restriction name, value is Value 
or Value[])
-        * @throws RepositoryException if any errors reading the information
-        */
-       public Map<String, Object> getDeclaredRestrictionsForPrincipal(Node 
node, String principalId) throws RepositoryException {
-               return getDeclaredRestrictionsForPrincipal(node.getSession(), 
node.getPath(), principalId);
-       }
-       
-       /**
-        * Returns the restrictions for the specified path.
-        * 
-        * @param session the session for the current user
-        * @param absPath the path to get the privileges for
-        * @param principalId the principalId to get the access rights for
-        * @return map of restrictions (key is restriction name, value is Value 
or Value[])
-        * @throws RepositoryException if any errors reading the information
-        */
-       public Map<String, Object> getDeclaredRestrictionsForPrincipal(Session 
session, String absPath, String principalId) throws RepositoryException {
-               Map<String, Object> restrictions = new LinkedHashMap<>();
-               AccessControlEntry[] entries = 
getDeclaredAccessControlEntries(session, absPath);
-               if (entries != null) {
-                       for (AccessControlEntry ace : entries) {
-                               if 
(principalId.equals(ace.getPrincipal().getName()) &&
-                                               ace instanceof 
JackrabbitAccessControlEntry) {
-                                       JackrabbitAccessControlEntry jace = 
(JackrabbitAccessControlEntry)ace;
-                                       String[] restrictionNames = 
jace.getRestrictionNames();
-                                       if (restrictionNames != null) {
-                                               for (String name : 
restrictionNames) {
-                                                       try {
-                                                               Value value = 
jace.getRestriction(name);
-                                                               if (value != 
null) {
-                                                                       
restrictions.put(name, value);
-                                                               }
-                                                       } catch 
(ValueFormatException vfe) {
-                                                               //try 
multi-value restriction
-                                                               Value[] values 
= jace.getRestrictions(name);
-                                                               if (values != 
null && values.length > 0) {
-                                                                       
restrictions.put(name,  values);
-                                                               }
-                                                       }
-                                               }
-                                       }
-                               }
-                       }
-               }
-               return restrictions;
-       }
-
-       
-       
-       /**
-        * Returns the mapping of effective access rights that have been set 
for the resource at
-        * the given path. 
-        * 
-        * @param node the node to get the access rights for
-        * @return map of access rights.  Key is the user/group principal, 
value contains the granted/denied privileges
-        * @throws RepositoryException if any errors reading the information
-        */
-       public Map<Principal, AccessRights> getEffectiveAccessRights(Node node) 
throws RepositoryException {
-               return getEffectiveAccessRights(node.getSession(), 
node.getPath());
-       }
-       
-       /**
-        * Returns the mapping of effective access rights that have been set 
for the resource at
-        * the given path. 
-        * 
-        * @param session the current user session.
-        * @param absPath the path of the resource to get the access rights for
-        * @return map of access rights.  Key is the user/group principal, 
value contains the granted/denied privileges
-        * @throws RepositoryException if any errors reading the information
-        */
-       public Map<Principal, AccessRights> getEffectiveAccessRights(Session 
session, String absPath) throws RepositoryException {
-               AccessControlEntry[] entries = 
getEffectiveAccessControlEntries(session, absPath);
-               return mergePrivilegesFromEntries(entries);
-       }
-
-       /**
-        * Loop through each of the entries to merge the granted and denied 
privileges into
-        * the map
-        * 
-        * @param entries the entries to process
-        * @throws RepositoryException if any errors reading the information
-        */
-       private Map<Principal, AccessRights> 
mergePrivilegesFromEntries(AccessControlEntry[] entries)
-                       throws RepositoryException {
-               Map<Principal, AccessRights> accessMap = new LinkedHashMap<>();
-               if (entries != null) {
-                       for (AccessControlEntry ace : entries) {
-                               Principal principal = ace.getPrincipal();
-                               AccessRights accessPrivileges = 
accessMap.computeIfAbsent(principal, k -> new AccessRights());
-                               boolean allow = AccessControlUtil.isAllow(ace);
-                               if (allow) {
-                                       
accessPrivileges.getGranted().addAll(Arrays.asList(ace.getPrivileges()));
-                               } else {
-                                       
accessPrivileges.getDenied().addAll(Arrays.asList(ace.getPrivileges()));
-                               }
-                       }
-               }
-               return accessMap;
-       }
-       
-       private AccessControlEntry[] getEffectiveAccessControlEntries(Session 
session, String absPath) throws RepositoryException {
-               AccessControlManager accessControlManager = 
AccessControlUtil.getAccessControlManager(session);
-               AccessControlPolicy[] policies = 
accessControlManager.getEffectivePolicies(absPath);
-               
+    }
+
+    /**
+     * Returns the declared access rights for the specified Node for the given
+     * principalId.
+     *
+     * @param node the JCR node to retrieve the access rights for
+     * @param principalId the principalId to get the access rights for
+     * @return access rights for the specified principal
+     * @throws RepositoryException if any errors reading the information
+     */
+    public AccessRights getDeclaredAccessRightsForPrincipal(Node node, String 
principalId) throws RepositoryException {
+        return getDeclaredAccessRightsForPrincipal(node.getSession(), 
node.getPath(), principalId);
+    }
+
+    /**
+     * Returns the declared access rights for the resource at the specified 
path for the given
+     * principalId.
+     *
+     * @param session the current JCR session
+     * @param absPath the path of the resource to retrieve the rights for
+     * @param principalId the principalId to get the access rights for
+     * @return access rights for the specified principal
+     * @throws RepositoryException if any errors reading the information
+     */
+    public AccessRights getDeclaredAccessRightsForPrincipal(Session session, 
String absPath, String principalId) throws RepositoryException {
+        AccessRights rights = new AccessRights();
+        if (principalId != null && principalId.length() > 0) {
+            AccessControlManager accessControlManager = 
AccessControlUtil.getAccessControlManager(session);
+            AccessControlPolicy[] policies = 
accessControlManager.getPolicies(absPath);
+            for (AccessControlPolicy accessControlPolicy : policies) {
+                if (accessControlPolicy instanceof AccessControlList) {
+                    AccessControlEntry[] accessControlEntries = 
((AccessControlList)accessControlPolicy).getAccessControlEntries();
+                    for (AccessControlEntry ace : accessControlEntries) {
+                        if (principalId.equals(ace.getPrincipal().getName())) {
+                            boolean isAllow = AccessControlUtil.isAllow(ace);
+                            if (isAllow) {
+                                
rights.getGranted().addAll(Arrays.asList(ace.getPrivileges()));
+                            } else {
+                                
rights.getDenied().addAll(Arrays.asList(ace.getPrivileges()));
+                            }
+                        }
+                    }
+                }
+            }
+        }
+
+        return rights;
+    }
+
+    /**
+     * Returns the restrictions for the specified path.
+     *
+     * @param node the node to inspect
+     * @param principalId the principalId to get the access rights for
+     * @return map of restrictions (key is restriction name, value is Value or 
Value[])
+     * @throws RepositoryException if any errors reading the information
+     */
+    public Map<String, Object> getDeclaredRestrictionsForPrincipal(Node node, 
String principalId) throws RepositoryException {
+        return getDeclaredRestrictionsForPrincipal(node.getSession(), 
node.getPath(), principalId);
+    }
+
+    /**
+     * Returns the restrictions for the specified path.
+     *
+     * @param session the session for the current user
+     * @param absPath the path to get the privileges for
+     * @param principalId the principalId to get the access rights for
+     * @return map of restrictions (key is restriction name, value is Value or 
Value[])
+     * @throws RepositoryException if any errors reading the information
+     */
+    public Map<String, Object> getDeclaredRestrictionsForPrincipal(Session 
session, String absPath, String principalId) throws RepositoryException {
+        Map<String, Object> restrictions = new LinkedHashMap<>();
+        AccessControlEntry[] entries = 
getDeclaredAccessControlEntries(session, absPath);
+        if (entries != null) {
+            for (AccessControlEntry ace : entries) {
+                if (principalId.equals(ace.getPrincipal().getName()) &&
+                        ace instanceof JackrabbitAccessControlEntry) {
+                    JackrabbitAccessControlEntry jace = 
(JackrabbitAccessControlEntry)ace;
+                    String[] restrictionNames = jace.getRestrictionNames();
+                    if (restrictionNames != null) {
+                        for (String name : restrictionNames) {
+                            try {
+                                Value value = jace.getRestriction(name);
+                                if (value != null) {
+                                    restrictions.put(name, value);
+                                }
+                            } catch (ValueFormatException vfe) {
+                                //try multi-value restriction
+                                Value[] values = jace.getRestrictions(name);
+                                if (values != null && values.length > 0) {
+                                    restrictions.put(name,  values);
+                                }
+                            }
+                        }
+                    }
+                }
+            }
+        }
+        return restrictions;
+    }
+
+    /**
+     * Returns the mapping of effective access rights that have been set for 
the resource at
+     * the given path.
+     *
+     * @param node the node to get the access rights for
+     * @return map of access rights.  Key is the user/group principal, value 
contains the granted/denied privileges
+     * @throws RepositoryException if any errors reading the information
+     */
+    public Map<Principal, AccessRights> getEffectiveAccessRights(Node node) 
throws RepositoryException {
+        return getEffectiveAccessRights(node.getSession(), node.getPath());
+    }
+
+    /**
+     * Returns the mapping of effective access rights that have been set for 
the resource at
+     * the given path.
+     *
+     * @param session the current user session.
+     * @param absPath the path of the resource to get the access rights for
+     * @return map of access rights.  Key is the user/group principal, value 
contains the granted/denied privileges
+     * @throws RepositoryException if any errors reading the information
+     */
+    public Map<Principal, AccessRights> getEffectiveAccessRights(Session 
session, String absPath) throws RepositoryException {
+        AccessControlEntry[] entries = 
getEffectiveAccessControlEntries(session, absPath);
+        return mergePrivilegesFromEntries(entries);
+    }
+
+    /**
+     * Loop through each of the entries to merge the granted and denied 
privileges into
+     * the map
+     *
+     * @param entries the entries to process
+     * @throws RepositoryException if any errors reading the information
+     */
+    private Map<Principal, AccessRights> 
mergePrivilegesFromEntries(AccessControlEntry[] entries)
+            throws RepositoryException {
+        Map<Principal, AccessRights> accessMap = new LinkedHashMap<>();
+        if (entries != null) {
+            for (AccessControlEntry ace : entries) {
+                Principal principal = ace.getPrincipal();
+                AccessRights accessPrivileges = 
accessMap.computeIfAbsent(principal, k -> new AccessRights());
+                boolean allow = AccessControlUtil.isAllow(ace);
+                if (allow) {
+                    
accessPrivileges.getGranted().addAll(Arrays.asList(ace.getPrivileges()));
+                } else {
+                    
accessPrivileges.getDenied().addAll(Arrays.asList(ace.getPrivileges()));
+                }
+            }
+        }
+        return accessMap;
+    }
+
+    private AccessControlEntry[] getEffectiveAccessControlEntries(Session 
session, String absPath) throws RepositoryException {
+        AccessControlManager accessControlManager = 
AccessControlUtil.getAccessControlManager(session);
+        AccessControlPolicy[] policies = 
accessControlManager.getEffectivePolicies(absPath);
+
         List<AccessControlEntry> allEntries = new ArrayList<>();
         for (AccessControlPolicy accessControlPolicy : policies) {
             if (accessControlPolicy instanceof AccessControlList) {
@@ -340,271 +337,269 @@ public class PrivilegesInfo {
             }
         }
         return allEntries.toArray(new AccessControlEntry[allEntries.size()]);
-       }
-
-       /**
-        * Returns the effective access rights for the specified Node for the 
given
-        * principalId.
-        * 
-        * @param node the JCR node to retrieve the access rights for
-        * @param principalId the principalId to get the access rights for
-        * @return access rights for the specified principal
-        * @throws RepositoryException if any errors reading the information
-        */
-       public AccessRights getEffectiveAccessRightsForPrincipal(Node node, 
String principalId) throws RepositoryException {
-               return getEffectiveAccessRightsForPrincipal(node.getSession(), 
node.getPath(), principalId);
-       }
-
-       /**
-        * Returns the effective access rights for the resource at the 
specified path for the given
-        * principalId.
-        * 
-        * @param session the current JCR session
-        * @param absPath the path of the resource to retrieve the rights for
-        * @param principalId the principalId to get the access rights for
-        * @return access rights for the specified principal
-        * @throws RepositoryException if any errors reading the information
-        */
-       public AccessRights getEffectiveAccessRightsForPrincipal(Session 
session, String absPath, String principalId) throws RepositoryException {
-               AccessRights rights = new AccessRights();
-               if (principalId != null && principalId.length() > 0) {
-                       AccessControlManager accessControlManager = 
AccessControlUtil.getAccessControlManager(session);
-                       AccessControlPolicy[] policies = 
accessControlManager.getEffectivePolicies(absPath);
-                       for (AccessControlPolicy accessControlPolicy : 
policies) {
-                               if (accessControlPolicy instanceof 
AccessControlList) {
-                                       AccessControlEntry[] 
accessControlEntries = 
((AccessControlList)accessControlPolicy).getAccessControlEntries();
-                                       for (AccessControlEntry ace : 
accessControlEntries) {
-                                               if 
(principalId.equals(ace.getPrincipal().getName())) {
-                                                       boolean isAllow = 
AccessControlUtil.isAllow(ace);
-                                                       if (isAllow) {
-                                                               
rights.getGranted().addAll(Arrays.asList(ace.getPrivileges()));
-                                                       } else {
-                                                               
rights.getDenied().addAll(Arrays.asList(ace.getPrivileges()));
-                                                       }
-                                               }
-                                       }
-                               }
-                       }
-               }
-               
-               return rights;
-       }
-       
-       
-       
-       /**
-        * Checks whether the current user has been granted privileges
-        * to add children to the specified node.
-        *  
-        * @param node the node to check
-        * @return true if the current user has the privileges, false otherwise
-        */
-       public boolean canAddChildren(Node node) {
-               try {
-                       return canAddChildren(node.getSession(), 
node.getPath());
-               } catch (RepositoryException e) {
-                       return false;
-               }
-       }
-       
-       /**
-        * Checks whether the current user has been granted privileges
-        * to add children to the specified path.
-        *  
-        * @param session the JCR session of the current user
-        * @param absPath the path of the resource to check
-        * @return true if the current user has the privileges, false otherwise
-        */
-       public boolean canAddChildren(Session session, String absPath) {
-               try {
-                       AccessControlManager accessControlManager = 
AccessControlUtil.getAccessControlManager(session);
-                       return accessControlManager.hasPrivileges(absPath, new 
Privilege[] {
-                                                       
accessControlManager.privilegeFromName(Privilege.JCR_ADD_CHILD_NODES)
-                                               });
-               } catch (RepositoryException e) {
-                       return false;
-               }
-       }
-       
-       /**
-        * Checks whether the current user has been granted privileges
-        * to delete children to the specified node.
-        *  
-        * @param node the node to check
-        * @return true if the current user has the privileges, false otherwise
-        */
-       public boolean canDeleteChildren(Node node) {
-               try {
-                       return canDeleteChildren(node.getSession(), 
node.getPath());
-               } catch (RepositoryException e) {
-                       return false;
-               }
-       }
-
-       /**
-        * Checks whether the current user has been granted privileges
-        * to delete children of the specified path.
-        *  
-        * @param session the JCR session of the current user
-        * @param absPath the path of the resource to check
-        * @return true if the current user has the privileges, false otherwise
-        */
-       public boolean canDeleteChildren(Session session, String absPath) {
-               try {
-                       AccessControlManager accessControlManager = 
AccessControlUtil.getAccessControlManager(session);
-                       
-                       return accessControlManager.hasPrivileges(absPath, new 
Privilege[] {
-                                                       
accessControlManager.privilegeFromName(Privilege.JCR_REMOVE_CHILD_NODES)
-                                               });
-               } catch (RepositoryException e) {
-                       return false;
-               }
-       }
-       
-       /**
-        * Checks whether the current user has been granted privileges
-        * to delete the specified node.
-        *  
-        * @param node the node to check
-        * @return true if the current user has the privileges, false otherwise
-        */
-       public boolean canDelete(Node node) {
-               try {
-                       return canDelete(node.getSession(), node.getPath());
-               } catch (RepositoryException e) {
-                       return false;
-               }
-       }
-       
-       /**
-        * Checks whether the current user has been granted privileges
-        * to delete the specified path.
-        *  
-        * @param session the JCR session of the current user
-        * @param absPath the path of the resource to check
-        * @return true if the current user has the privileges, false otherwise
-        */
-       public boolean canDelete(Session session, String absPath) {
-               try {
-                       AccessControlManager accessControlManager = 
AccessControlUtil.getAccessControlManager(session);
-                       
-                       String parentPath;
-                       int lastSlash = absPath.lastIndexOf('/');
-                       if (lastSlash == 0) {
-                               //the parent is the root folder.
-                               parentPath = "/";
-                       } else {
-                               //strip the last segment
-                               parentPath = absPath.substring(0, lastSlash);
-                       }
-                       return accessControlManager.hasPrivileges(absPath, new 
Privilege[] {
-                                                       
accessControlManager.privilegeFromName(Privilege.JCR_REMOVE_NODE)
-                                               }) && 
canDeleteChildren(session, parentPath);
-               } catch (RepositoryException e) {
-                       return false;
-               }
-       }
-
-       /**
-        * Checks whether the current user has been granted privileges
-        * to modify properties of the specified node.
-        *  
-        * @param node the node to check
-        * @return true if the current user has the privileges, false otherwise
-        */
-       public boolean canModifyProperties(Node node) {
-               try {
-                       return canModifyProperties(node.getSession(), 
node.getPath());
-               } catch (RepositoryException e) {
-                       return false;
-               }
-       }
-       
-       /**
-        * Checks whether the current user has been granted privileges
-        * to modify properties of the specified path.
-        *  
-        * @param session the JCR session of the current user
-        * @param absPath the path of the resource to check
-        * @return true if the current user has the privileges, false otherwise
-        */
-       public boolean canModifyProperties(Session session, String absPath) {
-               try {
-                       AccessControlManager accessControlManager = 
AccessControlUtil.getAccessControlManager(session);
-                       return accessControlManager.hasPrivileges(absPath, new 
Privilege[] {
-                                                       
accessControlManager.privilegeFromName(Privilege.JCR_MODIFY_PROPERTIES)
-                                               });
-               } catch (RepositoryException e) {
-                       return false;
-               }
-       }
-       
-       /**
-        * Checks whether the current user has been granted privileges
-        * to read the access control of the specified node.
-        *  
-        * @param node the node to check
-        * @return true if the current user has the privileges, false otherwise
-        */
-       public boolean canReadAccessControl(Node node) {
-               try {
-                       return canReadAccessControl(node.getSession(), 
node.getPath());
-               } catch (RepositoryException e) {
-                       return false;
-               }
-       }
-       
-       /**
-        * Checks whether the current user has been granted privileges
-        * to read the access control of the specified path.
-        *  
-        * @param session the JCR session of the current user
-        * @param absPath the path of the resource to check
-        * @return true if the current user has the privileges, false otherwise
-        */
-       public boolean canReadAccessControl(Session session, String absPath) {
-               try {
-                       AccessControlManager accessControlManager = 
AccessControlUtil.getAccessControlManager(session);
-                       return accessControlManager.hasPrivileges(absPath, new 
Privilege[] {
-                                                       
accessControlManager.privilegeFromName(Privilege.JCR_READ_ACCESS_CONTROL)
-                                               });
-               } catch (RepositoryException e) {
-                       return false;
-               }
-       }
-       
-       /**
-        * Checks whether the current user has been granted privileges
-        * to modify the access control of the specified node.
-        *  
-        * @param node the node to check
-        * @return true if the current user has the privileges, false otherwise
-        */
-       public boolean canModifyAccessControl(Node node) {
-               try {
-                       return canModifyAccessControl(node.getSession(), 
node.getPath());
-               } catch (RepositoryException e) {
-                       return false;
-               }
-       }
-       
-       /**
-        * Checks whether the current user has been granted privileges
-        * to modify the access control of the specified path.
-        *  
-        * @param session the JCR session of the current user
-        * @param absPath the path of the resource to check
-        * @return true if the current user has the privileges, false otherwise
-        */
-       public boolean canModifyAccessControl(Session session, String absPath) {
-               try {
-                       AccessControlManager accessControlManager = 
AccessControlUtil.getAccessControlManager(session);
-                       return accessControlManager.hasPrivileges(absPath, new 
Privilege[] {
-                                                       
accessControlManager.privilegeFromName(Privilege.JCR_MODIFY_ACCESS_CONTROL)
-                                               });
-               } catch (RepositoryException e) {
-                       return false;
-               }
-       }
+    }
+
+    /**
+     * Returns the effective access rights for the specified Node for the given
+     * principalId.
+     * 
+     * @param node the JCR node to retrieve the access rights for
+     * @param principalId the principalId to get the access rights for
+     * @return access rights for the specified principal
+     * @throws RepositoryException if any errors reading the information
+     */
+    public AccessRights getEffectiveAccessRightsForPrincipal(Node node, String 
principalId) throws RepositoryException {
+        return getEffectiveAccessRightsForPrincipal(node.getSession(), 
node.getPath(), principalId);
+    }
+
+    /**
+     * Returns the effective access rights for the resource at the specified 
path for the given
+     * principalId.
+     *
+     * @param session the current JCR session
+     * @param absPath the path of the resource to retrieve the rights for
+     * @param principalId the principalId to get the access rights for
+     * @return access rights for the specified principal
+     * @throws RepositoryException if any errors reading the information
+     */
+    public AccessRights getEffectiveAccessRightsForPrincipal(Session session, 
String absPath, String principalId) throws RepositoryException {
+        AccessRights rights = new AccessRights();
+        if (principalId != null && principalId.length() > 0) {
+            AccessControlManager accessControlManager = 
AccessControlUtil.getAccessControlManager(session);
+            AccessControlPolicy[] policies = 
accessControlManager.getEffectivePolicies(absPath);
+            for (AccessControlPolicy accessControlPolicy : policies) {
+                if (accessControlPolicy instanceof AccessControlList) {
+                    AccessControlEntry[] accessControlEntries = 
((AccessControlList)accessControlPolicy).getAccessControlEntries();
+                    for (AccessControlEntry ace : accessControlEntries) {
+                        if (principalId.equals(ace.getPrincipal().getName())) {
+                            boolean isAllow = AccessControlUtil.isAllow(ace);
+                            if (isAllow) {
+                                
rights.getGranted().addAll(Arrays.asList(ace.getPrivileges()));
+                            } else {
+                                
rights.getDenied().addAll(Arrays.asList(ace.getPrivileges()));
+                            }
+                        }
+                    }
+                }
+            }
+        }
+
+        return rights;
+    }
+
+    /**
+     * Checks whether the current user has been granted privileges
+     * to add children to the specified node.
+     *
+     * @param node the node to check
+     * @return true if the current user has the privileges, false otherwise
+     */
+    public boolean canAddChildren(Node node) {
+        try {
+            return canAddChildren(node.getSession(), node.getPath());
+        } catch (RepositoryException e) {
+            return false;
+        }
+    }
+
+    /**
+     * Checks whether the current user has been granted privileges
+     * to add children to the specified path.
+     *
+     * @param session the JCR session of the current user
+     * @param absPath the path of the resource to check
+     * @return true if the current user has the privileges, false otherwise
+     */
+    public boolean canAddChildren(Session session, String absPath) {
+        try {
+            AccessControlManager accessControlManager = 
AccessControlUtil.getAccessControlManager(session);
+            return accessControlManager.hasPrivileges(absPath, new Privilege[] 
{
+                            
accessControlManager.privilegeFromName(Privilege.JCR_ADD_CHILD_NODES)
+                        });
+        } catch (RepositoryException e) {
+            return false;
+        }
+    }
+
+    /**
+     * Checks whether the current user has been granted privileges
+     * to delete children to the specified node.
+     *
+     * @param node the node to check
+     * @return true if the current user has the privileges, false otherwise
+     */
+    public boolean canDeleteChildren(Node node) {
+        try {
+            return canDeleteChildren(node.getSession(), node.getPath());
+        } catch (RepositoryException e) {
+            return false;
+        }
+    }
+
+    /**
+     * Checks whether the current user has been granted privileges
+     * to delete children of the specified path.
+     *
+     * @param session the JCR session of the current user
+     * @param absPath the path of the resource to check
+     * @return true if the current user has the privileges, false otherwise
+     */
+    public boolean canDeleteChildren(Session session, String absPath) {
+        try {
+            AccessControlManager accessControlManager = 
AccessControlUtil.getAccessControlManager(session);
+            
+            return accessControlManager.hasPrivileges(absPath, new Privilege[] 
{
+                            
accessControlManager.privilegeFromName(Privilege.JCR_REMOVE_CHILD_NODES)
+                        });
+        } catch (RepositoryException e) {
+            return false;
+        }
+    }
+
+    /**
+     * Checks whether the current user has been granted privileges
+     * to delete the specified node.
+     *
+     * @param node the node to check
+     * @return true if the current user has the privileges, false otherwise
+     */
+    public boolean canDelete(Node node) {
+        try {
+            return canDelete(node.getSession(), node.getPath());
+        } catch (RepositoryException e) {
+            return false;
+        }
+    }
+
+    /**
+     * Checks whether the current user has been granted privileges
+     * to delete the specified path.
+     *
+     * @param session the JCR session of the current user
+     * @param absPath the path of the resource to check
+     * @return true if the current user has the privileges, false otherwise
+     */
+    public boolean canDelete(Session session, String absPath) {
+        try {
+            AccessControlManager accessControlManager = 
AccessControlUtil.getAccessControlManager(session);
+
+            String parentPath;
+            int lastSlash = absPath.lastIndexOf('/');
+            if (lastSlash == 0) {
+                //the parent is the root folder.
+                parentPath = "/";
+            } else {
+                //strip the last segment
+                parentPath = absPath.substring(0, lastSlash);
+            }
+            return accessControlManager.hasPrivileges(absPath, new Privilege[] 
{
+                            
accessControlManager.privilegeFromName(Privilege.JCR_REMOVE_NODE)
+                        }) && canDeleteChildren(session, parentPath);
+        } catch (RepositoryException e) {
+            return false;
+        }
+    }
+
+    /**
+     * Checks whether the current user has been granted privileges
+     * to modify properties of the specified node.
+     *
+     * @param node the node to check
+     * @return true if the current user has the privileges, false otherwise
+     */
+    public boolean canModifyProperties(Node node) {
+        try {
+            return canModifyProperties(node.getSession(), node.getPath());
+        } catch (RepositoryException e) {
+            return false;
+        }
+    }
+
+    /**
+     * Checks whether the current user has been granted privileges
+     * to modify properties of the specified path.
+     *
+     * @param session the JCR session of the current user
+     * @param absPath the path of the resource to check
+     * @return true if the current user has the privileges, false otherwise
+     */
+    public boolean canModifyProperties(Session session, String absPath) {
+        try {
+            AccessControlManager accessControlManager = 
AccessControlUtil.getAccessControlManager(session);
+            return accessControlManager.hasPrivileges(absPath, new Privilege[] 
{
+                            
accessControlManager.privilegeFromName(Privilege.JCR_MODIFY_PROPERTIES)
+                        });
+        } catch (RepositoryException e) {
+            return false;
+        }
+    }
+
+    /**
+     * Checks whether the current user has been granted privileges
+     * to read the access control of the specified node.
+     *
+     * @param node the node to check
+     * @return true if the current user has the privileges, false otherwise
+     */
+    public boolean canReadAccessControl(Node node) {
+        try {
+            return canReadAccessControl(node.getSession(), node.getPath());
+        } catch (RepositoryException e) {
+            return false;
+        }
+    }
+
+    /**
+     * Checks whether the current user has been granted privileges
+     * to read the access control of the specified path.
+     *
+     * @param session the JCR session of the current user
+     * @param absPath the path of the resource to check
+     * @return true if the current user has the privileges, false otherwise
+     */
+    public boolean canReadAccessControl(Session session, String absPath) {
+        try {
+            AccessControlManager accessControlManager = 
AccessControlUtil.getAccessControlManager(session);
+            return accessControlManager.hasPrivileges(absPath, new Privilege[] 
{
+                            
accessControlManager.privilegeFromName(Privilege.JCR_READ_ACCESS_CONTROL)
+                        });
+        } catch (RepositoryException e) {
+            return false;
+        }
+    }
+
+    /**
+     * Checks whether the current user has been granted privileges
+     * to modify the access control of the specified node.
+     *
+     * @param node the node to check
+     * @return true if the current user has the privileges, false otherwise
+     */
+    public boolean canModifyAccessControl(Node node) {
+        try {
+            return canModifyAccessControl(node.getSession(), node.getPath());
+        } catch (RepositoryException e) {
+            return false;
+        }
+    }
+
+    /**
+     * Checks whether the current user has been granted privileges
+     * to modify the access control of the specified path.
+     *
+     * @param session the JCR session of the current user
+     * @param absPath the path of the resource to check
+     * @return true if the current user has the privileges, false otherwise
+     */
+    public boolean canModifyAccessControl(Session session, String absPath) {
+        try {
+            AccessControlManager accessControlManager = 
AccessControlUtil.getAccessControlManager(session);
+            return accessControlManager.hasPrivileges(absPath, new Privilege[] 
{
+                            
accessControlManager.privilegeFromName(Privilege.JCR_MODIFY_ACCESS_CONTROL)
+                        });
+        } catch (RepositoryException e) {
+            return false;
+        }
+    }
 
 }
diff --git 
a/src/main/java/org/apache/sling/jcr/jackrabbit/accessmanager/impl/PrivilegesHelper.java
 
b/src/main/java/org/apache/sling/jcr/jackrabbit/accessmanager/impl/PrivilegesHelper.java
index 4c5d716..0f182ef 100644
--- 
a/src/main/java/org/apache/sling/jcr/jackrabbit/accessmanager/impl/PrivilegesHelper.java
+++ 
b/src/main/java/org/apache/sling/jcr/jackrabbit/accessmanager/impl/PrivilegesHelper.java
@@ -56,7 +56,7 @@ public abstract class PrivilegesHelper {
             if (privilege.isAggregate()) {
                 Privilege[] ap = privilege.getAggregatePrivileges();
                 for (Privilege privilege2 : ap) {
-                       Set<Privilege> set = 
privilegeToAncestorMap.computeIfAbsent(privilege2, k -> new HashSet<>());
+                    Set<Privilege> set = 
privilegeToAncestorMap.computeIfAbsent(privilege2, k -> new HashSet<>());
                     set.add(privilege);
                 }
             }
diff --git 
a/src/main/java/org/apache/sling/jcr/jackrabbit/accessmanager/post/AbstractGetAclServlet.java
 
b/src/main/java/org/apache/sling/jcr/jackrabbit/accessmanager/post/AbstractGetAclServlet.java
index 70aa524..6151e0d 100644
--- 
a/src/main/java/org/apache/sling/jcr/jackrabbit/accessmanager/post/AbstractGetAclServlet.java
+++ 
b/src/main/java/org/apache/sling/jcr/jackrabbit/accessmanager/post/AbstractGetAclServlet.java
@@ -56,8 +56,8 @@ import 
org.apache.sling.jcr.jackrabbit.accessmanager.impl.PrivilegesHelper;
 public abstract class AbstractGetAclServlet extends SlingAllMethodsServlet {
 
     protected static final String KEY_ORDER = "order";
-       protected static final String KEY_DENIED = "denied";
-       protected static final String KEY_GRANTED = "granted";
+    protected static final String KEY_DENIED = "denied";
+    protected static final String KEY_GRANTED = "granted";
 
     /* (non-Javadoc)
      * @see 
org.apache.sling.api.servlets.SlingSafeMethodsServlet#doGet(org.apache.sling.api.SlingHttpServletRequest,
 org.apache.sling.api.SlingHttpServletResponse)
@@ -67,57 +67,57 @@ public abstract class AbstractGetAclServlet extends 
SlingAllMethodsServlet {
             SlingHttpServletResponse response) throws ServletException,
             IOException {
 
-               try {
-                       Session session = 
request.getResourceResolver().adaptTo(Session.class);
-               String resourcePath = request.getResource().getPath();
+        try {
+            Session session = 
request.getResourceResolver().adaptTo(Session.class);
+            String resourcePath = request.getResource().getPath();
 
-               JsonObject acl = internalGetAcl(session, resourcePath);
-               response.setContentType("application/json");
-               response.setCharacterEncoding("UTF-8");
+            JsonObject acl = internalGetAcl(session, resourcePath);
+            response.setContentType("application/json");
+            response.setCharacterEncoding("UTF-8");
 
-               boolean isTidy = false;
-               final String[] selectors = 
request.getRequestPathInfo().getSelectors();
-               if (selectors.length > 0) {
-                       for (final String level : selectors) {
-                           if("tidy".equals(level)) {
-                               isTidy = true;
-                               break;
-                           }
-                               }
-               }
+            boolean isTidy = false;
+            final String[] selectors = 
request.getRequestPathInfo().getSelectors();
+            if (selectors.length > 0) {
+                for (final String level : selectors) {
+                    if("tidy".equals(level)) {
+                        isTidy = true;
+                        break;
+                    }
+                }
+            }
 
-               Map<String, Object> options = new HashMap<>();
+            Map<String, Object> options = new HashMap<>();
             options.put(JsonGenerator.PRETTY_PRINTING, isTidy);
-               try (JsonGenerator generator = 
Json.createGeneratorFactory(options).createGenerator(response.getWriter())) {
-                               generator.write(acl).flush();
-               }
+            try (JsonGenerator generator = 
Json.createGeneratorFactory(options).createGenerator(response.getWriter())) {
+                generator.write(acl).flush();
+            }
         } catch (AccessDeniedException ade) {
             response.sendError(HttpServletResponse.SC_NOT_FOUND);
         } catch (ResourceNotFoundException rnfe) {
             response.sendError(HttpServletResponse.SC_NOT_FOUND, 
rnfe.getMessage());
         } catch (Exception throwable) {
             throw new ServletException(String.format("Exception while handling 
GET %s with %s",
-                                                               
request.getResource().getPath(), getClass().getName()),
-                                                               throwable);
+                                            request.getResource().getPath(), 
getClass().getName()),
+                                        throwable);
         }
     }
 
     @SuppressWarnings("unchecked")
-       protected JsonObject internalGetAcl(Session jcrSession, String 
resourcePath) throws RepositoryException {
+    protected JsonObject internalGetAcl(Session jcrSession, String 
resourcePath) throws RepositoryException {
 
         if (jcrSession == null) {
             throw new RepositoryException("JCR Session not found");
         }
 
-               Item item = jcrSession.getItem(resourcePath);
-               if (item != null) {
-                       resourcePath = item.getPath();
-               } else {
-                       throw new ResourceNotFoundException("Resource is not a 
JCR Node");
-               }
+        Item item = jcrSession.getItem(resourcePath);
+        if (item != null) {
+            resourcePath = item.getPath();
+        } else {
+            throw new ResourceNotFoundException("Resource is not a JCR Node");
+        }
 
-               // Calculate a map of privileges to all the aggregate 
privileges it is contained in.
-               // Use for fast lookup during the mergePrivilegeSets calls 
below.
+        // Calculate a map of privileges to all the aggregate privileges it is 
contained in.
+        // Use for fast lookup during the mergePrivilegeSets calls below.
         Map<Privilege, Set<Privilege>> privilegeToAncestorMap = 
PrivilegesHelper.buildPrivilegeToAncestorMap(jcrSession, resourcePath);
 
         AccessControlEntry[] declaredAccessControlEntries = 
getAccessControlEntries(jcrSession, resourcePath);
@@ -136,32 +136,32 @@ public abstract class AbstractGetAclServlet extends 
SlingAllMethodsServlet {
         }
         //evaluate these in reverse order so the most entries with highest 
specificity are last
         for (int i = declaredAccessControlEntries.length - 1; i >= 0; i--) {
-                       AccessControlEntry ace = 
declaredAccessControlEntries[i];
-                       Principal principal = ace.getPrincipal();
+            AccessControlEntry ace = declaredAccessControlEntries[i];
+            Principal principal = ace.getPrincipal();
+
+            if (ace instanceof JackrabbitAccessControlEntry) {
+                JackrabbitAccessControlEntry jace = 
(JackrabbitAccessControlEntry)ace;
+                String[] restrictionNames = jace.getRestrictionNames();
+                if (restrictionNames != null) {
+                    Map<String, Object> restrictions = 
restrictionMap.get(principal.getName());
+                    if (restrictions == null) {
+                        restrictions = new HashMap<>();
+                        restrictionMap.put(principal.getName(), restrictions);
+                    }
+                    for (String rname : restrictionNames) {
+                        try {
+                            //try as a single-value restriction
+                            Value value = jace.getRestriction(rname);
+                            restrictions.put(rname, value);
+                        } catch (ValueFormatException vfe) {
+                            //try as a multi-value restriction
+                            Value[] values = jace.getRestrictions(rname);
+                            restrictions.put(rname, values);
+                        }
+                    }
+                }
+            }
 
-                       if (ace instanceof JackrabbitAccessControlEntry) {
-                               JackrabbitAccessControlEntry jace = 
(JackrabbitAccessControlEntry)ace;
-                               String[] restrictionNames = 
jace.getRestrictionNames();
-                               if (restrictionNames != null) {
-                                       Map<String, Object> restrictions = 
restrictionMap.get(principal.getName());
-                                       if (restrictions == null) {
-                                               restrictions = new HashMap<>();
-                                               
restrictionMap.put(principal.getName(), restrictions);
-                                       }
-                                       for (String rname : restrictionNames) {
-                                               try {
-                                                       //try as a single-value 
restriction
-                                                       Value value = 
jace.getRestriction(rname);
-                                                       restrictions.put(rname, 
value);
-                                               } catch (ValueFormatException 
vfe) {
-                                                       //try as a multi-value 
restriction
-                                                       Value[] values = 
jace.getRestrictions(rname);
-                                                       restrictions.put(rname, 
values);
-                                               }
-                                       }
-                               }
-                       }
-                       
             Map<String, Object> map = aclMap.get(principal.getName());
 
             Set<Privilege> grantedSet = (Set<Privilege>) map.get(KEY_GRANTED);
@@ -179,16 +179,16 @@ public abstract class AbstractGetAclServlet extends 
SlingAllMethodsServlet {
             if (allow) {
                 Privilege[] privileges = ace.getPrivileges();
                 for (Privilege privilege : privileges) {
-                       PrivilegesHelper.mergePrivilegeSets(privilege,
-                                       privilegeToAncestorMap,
-                                                       grantedSet, deniedSet);
+                    PrivilegesHelper.mergePrivilegeSets(privilege,
+                            privilegeToAncestorMap,
+                            grantedSet, deniedSet);
                 }
             } else {
                 Privilege[] privileges = ace.getPrivileges();
                 for (Privilege privilege : privileges) {
                     PrivilegesHelper.mergePrivilegeSets(privilege,
-                                       privilegeToAncestorMap,
-                                                       deniedSet, grantedSet);
+                            privilegeToAncestorMap,
+                            deniedSet, grantedSet);
                 }
             }
         }
@@ -225,25 +225,25 @@ public abstract class AbstractGetAclServlet extends 
SlingAllMethodsServlet {
 
             Map<String, Object> restrictions = 
restrictionMap.get(principalName);
             if (restrictions != null && !restrictions.isEmpty()) {
-               Set<Entry<String, Object>> entrySet2 = restrictions.entrySet();
-               JsonObjectBuilder jsonRestrictions = Json.createObjectBuilder();
-               for (Entry<String, Object> entry2 : entrySet2) {
-                               Object rvalue = entry2.getValue();
-                               if (rvalue != null) {
-                                       if (rvalue.getClass().isArray()) {
-                               JsonArrayBuilder arrayBuilder = 
Json.createArrayBuilder();
-                               int length = Array.getLength(rvalue);
-                               for (int i= 0; i  < length; i++) {
-                                       Object object = Array.get(rvalue, i);
-                                       addTo(arrayBuilder, object);
-                               }
-                               jsonRestrictions.add(entry2.getKey(), 
arrayBuilder);
-                                       } else {
-                                               addTo(jsonRestrictions, 
entry2.getKey(), rvalue);
-                                       }
-                               }
-                       }
-               aceObject.add("restrictions", jsonRestrictions);
+                Set<Entry<String, Object>> entrySet2 = restrictions.entrySet();
+                JsonObjectBuilder jsonRestrictions = 
Json.createObjectBuilder();
+                for (Entry<String, Object> entry2 : entrySet2) {
+                    Object rvalue = entry2.getValue();
+                    if (rvalue != null) {
+                        if (rvalue.getClass().isArray()) {
+                            JsonArrayBuilder arrayBuilder = 
Json.createArrayBuilder();
+                            int length = Array.getLength(rvalue);
+                            for (int i= 0; i  < length; i++) {
+                                Object object = Array.get(rvalue, i);
+                                addTo(arrayBuilder, object);
+                            }
+                            jsonRestrictions.add(entry2.getKey(), 
arrayBuilder);
+                        } else {
+                            addTo(jsonRestrictions, entry2.getKey(), rvalue);
+                        }
+                    }
+                }
+                aceObject.add("restrictions", jsonRestrictions);
             }
             
             aclList.add(aceObject.build());
diff --git 
a/src/main/java/org/apache/sling/jcr/jackrabbit/accessmanager/post/DeleteAcesServlet.java
 
b/src/main/java/org/apache/sling/jcr/jackrabbit/accessmanager/post/DeleteAcesServlet.java
index 7087de4..c9a70d3 100644
--- 
a/src/main/java/org/apache/sling/jcr/jackrabbit/accessmanager/post/DeleteAcesServlet.java
+++ 
b/src/main/java/org/apache/sling/jcr/jackrabbit/accessmanager/post/DeleteAcesServlet.java
@@ -83,158 +83,157 @@ import org.slf4j.LoggerFactory;
 
 @Component(service = {Servlet.class, DeleteAces.class},
     property= {
-               "sling.servlet.resourceTypes=sling/servlet/default",
-               "sling.servlet.methods=POST",
-               "sling.servlet.selectors=deleteAce",
-               "sling.servlet.prefix:Integer=-1"
+            "sling.servlet.resourceTypes=sling/servlet/default",
+            "sling.servlet.methods=POST",
+            "sling.servlet.selectors=deleteAce",
+            "sling.servlet.prefix:Integer=-1"
     })
 public class DeleteAcesServlet extends AbstractAccessPostServlet implements 
DeleteAces {
-       private static final long serialVersionUID = 3784866802938282971L;
+    private static final long serialVersionUID = 3784866802938282971L;
 
-       /**
+    /**
      * default log
      */
     private final transient Logger log = LoggerFactory.getLogger(getClass());
 
     /**
      * Overridden since the @Reference annotation is not inherited from the 
super method
-        */
-       @Override
+     */
+    @Override
     @Reference(service = PostResponseCreator.class,
-           cardinality = ReferenceCardinality.MULTIPLE,
-           policy = ReferencePolicy.DYNAMIC)
-       protected void bindPostResponseCreator(PostResponseCreator creator, 
Map<String, Object> properties) {
-               super.bindPostResponseCreator(creator, properties);
-       }
-       
-       /* (non-Javadoc)
-        * @see 
org.apache.sling.jackrabbit.usermanager.impl.post.AbstractPostServlet#unbindPostResponseCreator(org.apache.sling.servlets.post.PostResponseCreator,
 java.util.Map)
-        */
-       @Override
-       protected void unbindPostResponseCreator(PostResponseCreator creator, 
Map<String, Object> properties) { //NOSONAR
-               super.unbindPostResponseCreator(creator, properties);
-       }
-    
-       
-       /* (non-Javadoc)
-        * @see 
org.apache.sling.jackrabbit.accessmanager.post.AbstractAccessPostServlet#handleOperation(org.apache.sling.api.SlingHttpServletRequest,
 org.apache.sling.servlets.post.PostResponse, java.util.List)
-        */
-       @Override
-       protected void handleOperation(SlingHttpServletRequest request,
-                       PostResponse htmlResponse, List<Modification> changes)
-                       throws RepositoryException {
-
-               Session session = 
request.getResourceResolver().adaptTo(Session.class);
-       String resourcePath = request.getResource().getPath();
+        cardinality = ReferenceCardinality.MULTIPLE,
+        policy = ReferencePolicy.DYNAMIC)
+    protected void bindPostResponseCreator(PostResponseCreator creator, 
Map<String, Object> properties) {
+        super.bindPostResponseCreator(creator, properties);
+    }
+
+    /* (non-Javadoc)
+     * @see 
org.apache.sling.jackrabbit.usermanager.impl.post.AbstractPostServlet#unbindPostResponseCreator(org.apache.sling.servlets.post.PostResponseCreator,
 java.util.Map)
+     */
+    @Override
+    protected void unbindPostResponseCreator(PostResponseCreator creator, 
Map<String, Object> properties) { //NOSONAR
+        super.unbindPostResponseCreator(creator, properties);
+    }
+
+    /* (non-Javadoc)
+     * @see 
org.apache.sling.jackrabbit.accessmanager.post.AbstractAccessPostServlet#handleOperation(org.apache.sling.api.SlingHttpServletRequest,
 org.apache.sling.servlets.post.PostResponse, java.util.List)
+     */
+    @Override
+    protected void handleOperation(SlingHttpServletRequest request,
+            PostResponse htmlResponse, List<Modification> changes)
+            throws RepositoryException {
+
+        Session session = request.getResourceResolver().adaptTo(Session.class);
+        String resourcePath = request.getResource().getPath();
         String[] applyTo = 
request.getParameterValues(SlingPostConstants.RP_APPLY_TO);
         deleteAces(session, resourcePath, applyTo, changes);
-       }
-
-       /* (non-Javadoc)
-        * @see 
org.apache.sling.jcr.jackrabbit.accessmanager.DeleteAces#deleteAces(javax.jcr.Session,
 java.lang.String, java.lang.String[])
-        */
-       public void deleteAces(Session jcrSession, String resourcePath,
-                       String[] principalNamesToDelete) throws 
RepositoryException {
-               deleteAces(jcrSession, resourcePath, principalNamesToDelete, 
null);
-       }
-       
-       /* (non-Javadoc)
-        * @see 
org.apache.sling.jcr.jackrabbit.accessmanager.DeleteAces#deleteAces(javax.jcr.Session,
 java.lang.String, java.lang.String[])
-        */
-       protected void deleteAces(Session jcrSession, String resourcePath,
-                       String[] principalNamesToDelete, List<Modification> 
changes) throws RepositoryException {
+    }
+
+    /* (non-Javadoc)
+     * @see 
org.apache.sling.jcr.jackrabbit.accessmanager.DeleteAces#deleteAces(javax.jcr.Session,
 java.lang.String, java.lang.String[])
+     */
+    public void deleteAces(Session jcrSession, String resourcePath,
+            String[] principalNamesToDelete) throws RepositoryException {
+        deleteAces(jcrSession, resourcePath, principalNamesToDelete, null);
+    }
+
+    /* (non-Javadoc)
+     * @see 
org.apache.sling.jcr.jackrabbit.accessmanager.DeleteAces#deleteAces(javax.jcr.Session,
 java.lang.String, java.lang.String[])
+     */
+    protected void deleteAces(Session jcrSession, String resourcePath,
+            String[] principalNamesToDelete, List<Modification> changes) 
throws RepositoryException {
         if (principalNamesToDelete == null) {
-                       throw new RepositoryException("principalIds were not 
sumitted.");
+            throw new RepositoryException("principalIds were not sumitted.");
         } else {
-               if (jcrSession == null) {
-                       throw new RepositoryException("JCR Session not found");
-               }
-
-               if (resourcePath == null) {
-                       throw new ResourceNotFoundException("Resource path was 
not supplied.");
-               }
-
-               Item item = jcrSession.getItem(resourcePath);
-               if (item != null) {
-                       resourcePath = item.getPath();
-               } else {
-                       throw new ResourceNotFoundException("Resource is not a 
JCR Node");
-               }
-
-               //load the principalIds array into a set for quick lookup below
-                       Set<String> pidSet = new HashSet<>();
-                       pidSet.addAll(Arrays.asList(principalNamesToDelete));
-
-                       // validate that the submitted names are valid
-                       Set<String> notFound = null;
-                       Set<Principal> found = new HashSet<>();
-                       PrincipalManager principalManager = 
AccessControlUtil.getPrincipalManager(jcrSession);
-                       for (String pid : pidSet) {
-                               Principal principal = 
principalManager.getPrincipal(pid);
-                               if (principal == null) {
-                                       if (notFound == null) {
-                                               notFound = new HashSet<>();
-                                       }
-                                       notFound.add(pid);
-                               } else {
-                                       found.add(principal);
-                               }
-                       }
-                       if (notFound != null && !notFound.isEmpty()) {
-                               throw new RepositoryException("Invalid 
principalId was submitted.");
-                       }
-                       
-                       try {
-                               AccessControlManager accessControlManager = 
AccessControlUtil.getAccessControlManager(jcrSession);
-                               AccessControlList updatedAcl = 
getAccessControlListOrNull(accessControlManager, resourcePath, false);
-
-                               // if there is no AccessControlList, then there 
is nothing to be deleted
-                               if (updatedAcl == null) {
-                                       // log the warning about principals 
where no ACE was found
-                                       for (Principal principal : found) {
-                                               log.warn("No AccessControlEntry 
was found to be deleted for principal: {}", principal.getName());
-                                       }
-                               } else {
-                                       //keep track of the existing Aces for 
the target principal
-                                       AccessControlEntry[] 
accessControlEntries = updatedAcl.getAccessControlEntries();
-                                       List<AccessControlEntry> oldAces = new 
ArrayList<>();
-                                       for (AccessControlEntry ace : 
accessControlEntries) {
-                                               if 
(pidSet.contains(ace.getPrincipal().getName())) {
-                                                       oldAces.add(ace);
-                                               }
-                                       }
-
-                                       // track which of the submitted 
principals had an ACE removed
-                                       Set<Principal> removedPrincipalSet = 
new HashSet<>();
-                                       
-                                       //remove the old aces
-                                       if (!oldAces.isEmpty()) {
-                                               for (AccessControlEntry ace : 
oldAces) {
-                                                       
updatedAcl.removeAccessControlEntry(ace);
-                                       
-                                                       // remove from the 
candidate set
-                                                       
removedPrincipalSet.add(ace.getPrincipal());
-                                               }
-                                       }
-
-                                       // log the warning about principals 
where no ACE was found
-                                       for (Principal principal : found) {
-                                               if 
(removedPrincipalSet.contains(principal)) {
-                                                       if (changes != null) {
-                                                               
changes.add(Modification.onDeleted(principal.getName()));
-                                                       }
-                                               } else {
-                                                       log.warn("No 
AccessControlEntry was found to be deleted for principal: {}", 
principal.getName());
-                                               }
-                                       }
-
-                                       //apply the changed policy
-                                       
accessControlManager.setPolicy(resourcePath, updatedAcl);
-                               }
-                       } catch (RepositoryException re) {
-                               throw new RepositoryException("Failed to delete 
access control.", re);
-                       }
+            if (jcrSession == null) {
+                throw new RepositoryException("JCR Session not found");
+            }
+
+            if (resourcePath == null) {
+                throw new ResourceNotFoundException("Resource path was not 
supplied.");
+            }
+
+            Item item = jcrSession.getItem(resourcePath);
+            if (item != null) {
+                resourcePath = item.getPath();
+            } else {
+                throw new ResourceNotFoundException("Resource is not a JCR 
Node");
+            }
+
+            //load the principalIds array into a set for quick lookup below
+            Set<String> pidSet = new HashSet<>();
+            pidSet.addAll(Arrays.asList(principalNamesToDelete));
+
+            // validate that the submitted names are valid
+            Set<String> notFound = null;
+            Set<Principal> found = new HashSet<>();
+            PrincipalManager principalManager = 
AccessControlUtil.getPrincipalManager(jcrSession);
+            for (String pid : pidSet) {
+                Principal principal = principalManager.getPrincipal(pid);
+                if (principal == null) {
+                    if (notFound == null) {
+                        notFound = new HashSet<>();
+                    }
+                    notFound.add(pid);
+                } else {
+                    found.add(principal);
+                }
+            }
+            if (notFound != null && !notFound.isEmpty()) {
+                throw new RepositoryException("Invalid principalId was 
submitted.");
+            }
+            
+            try {
+                AccessControlManager accessControlManager = 
AccessControlUtil.getAccessControlManager(jcrSession);
+                AccessControlList updatedAcl = 
getAccessControlListOrNull(accessControlManager, resourcePath, false);
+
+                // if there is no AccessControlList, then there is nothing to 
be deleted
+                if (updatedAcl == null) {
+                    // log the warning about principals where no ACE was found
+                    for (Principal principal : found) {
+                        log.warn("No AccessControlEntry was found to be 
deleted for principal: {}", principal.getName());
+                    }
+                } else {
+                    //keep track of the existing Aces for the target principal
+                    AccessControlEntry[] accessControlEntries = 
updatedAcl.getAccessControlEntries();
+                    List<AccessControlEntry> oldAces = new ArrayList<>();
+                    for (AccessControlEntry ace : accessControlEntries) {
+                        if (pidSet.contains(ace.getPrincipal().getName())) {
+                            oldAces.add(ace);
+                        }
+                    }
+
+                    // track which of the submitted principals had an ACE 
removed
+                    Set<Principal> removedPrincipalSet = new HashSet<>();
+
+                    //remove the old aces
+                    if (!oldAces.isEmpty()) {
+                        for (AccessControlEntry ace : oldAces) {
+                            updatedAcl.removeAccessControlEntry(ace);
+
+                            // remove from the candidate set
+                            removedPrincipalSet.add(ace.getPrincipal());
+                        }
+                    }
+
+                    // log the warning about principals where no ACE was found
+                    for (Principal principal : found) {
+                        if (removedPrincipalSet.contains(principal)) {
+                            if (changes != null) {
+                                
changes.add(Modification.onDeleted(principal.getName()));
+                            }
+                        } else {
+                            log.warn("No AccessControlEntry was found to be 
deleted for principal: {}", principal.getName());
+                        }
+                    }
+
+                    //apply the changed policy
+                    accessControlManager.setPolicy(resourcePath, updatedAcl);
+                }
+            } catch (RepositoryException re) {
+                throw new RepositoryException("Failed to delete access 
control.", re);
+            }
         }
-       }
-       
+    }
+
 }
diff --git 
a/src/main/java/org/apache/sling/jcr/jackrabbit/accessmanager/post/GetAclServlet.java
 
b/src/main/java/org/apache/sling/jcr/jackrabbit/accessmanager/post/GetAclServlet.java
index 66c6c94..31e165f 100644
--- 
a/src/main/java/org/apache/sling/jcr/jackrabbit/accessmanager/post/GetAclServlet.java
+++ 
b/src/main/java/org/apache/sling/jcr/jackrabbit/accessmanager/post/GetAclServlet.java
@@ -100,36 +100,36 @@ import org.osgi.service.component.annotations.Component;
 
 @Component(service = {Servlet.class, GetAcl.class},
 property= {
-               "sling.servlet.resourceTypes=sling/servlet/default",
-               "sling.servlet.methods=GET",
-               "sling.servlet.selectors=acl",
-               "sling.servlet.selectors=tidy.acl",
-               "sling.servlet.extensions=json",
-               "sling.servlet.prefix:Integer=-1"
+        "sling.servlet.resourceTypes=sling/servlet/default",
+        "sling.servlet.methods=GET",
+        "sling.servlet.selectors=acl",
+        "sling.servlet.selectors=tidy.acl",
+        "sling.servlet.extensions=json",
+        "sling.servlet.prefix:Integer=-1"
 })
 public class GetAclServlet extends AbstractGetAclServlet implements GetAcl {
-       private static final long serialVersionUID = 3391376559396223185L;
+    private static final long serialVersionUID = 3391376559396223185L;
 
-       /* (non-Javadoc)
-        * @see 
org.apache.sling.jcr.jackrabbit.accessmanager.GetAcl#getAcl(javax.jcr.Session, 
java.lang.String)
-        */
-       public JsonObject getAcl(Session jcrSession, String resourcePath)
-                       throws RepositoryException {
-               return internalGetAcl(jcrSession, resourcePath);
-       }
+    /* (non-Javadoc)
+     * @see 
org.apache.sling.jcr.jackrabbit.accessmanager.GetAcl#getAcl(javax.jcr.Session, 
java.lang.String)
+     */
+    public JsonObject getAcl(Session jcrSession, String resourcePath)
+            throws RepositoryException {
+        return internalGetAcl(jcrSession, resourcePath);
+    }
 
-       @Override
-       protected AccessControlEntry[] getAccessControlEntries(Session session, 
String absPath) throws RepositoryException {
-               AccessControlManager accessControlManager = 
AccessControlUtil.getAccessControlManager(session);
-               AccessControlPolicy[] policies = 
accessControlManager.getPolicies(absPath);
+    @Override
+    protected AccessControlEntry[] getAccessControlEntries(Session session, 
String absPath) throws RepositoryException {
+        AccessControlManager accessControlManager = 
AccessControlUtil.getAccessControlManager(session);
+        AccessControlPolicy[] policies = 
accessControlManager.getPolicies(absPath);
         List<AccessControlEntry> allEntries = new ArrayList<>(); 
-               for (AccessControlPolicy accessControlPolicy : policies) {
-                       if (accessControlPolicy instanceof AccessControlList) {
-                               AccessControlEntry[] accessControlEntries = 
((AccessControlList)accessControlPolicy).getAccessControlEntries();
-                               
allEntries.addAll(Arrays.asList(accessControlEntries));
-                       }
-               }
+        for (AccessControlPolicy accessControlPolicy : policies) {
+            if (accessControlPolicy instanceof AccessControlList) {
+                AccessControlEntry[] accessControlEntries = 
((AccessControlList)accessControlPolicy).getAccessControlEntries();
+                allEntries.addAll(Arrays.asList(accessControlEntries));
+            }
+        }
         return allEntries.toArray(new AccessControlEntry[allEntries.size()]);
-       }
+    }
 
 }
diff --git 
a/src/main/java/org/apache/sling/jcr/jackrabbit/accessmanager/post/GetEffectiveAclServlet.java
 
b/src/main/java/org/apache/sling/jcr/jackrabbit/accessmanager/post/GetEffectiveAclServlet.java
index 432a08e..dfc04dd 100644
--- 
a/src/main/java/org/apache/sling/jcr/jackrabbit/accessmanager/post/GetEffectiveAclServlet.java
+++ 
b/src/main/java/org/apache/sling/jcr/jackrabbit/accessmanager/post/GetEffectiveAclServlet.java
@@ -100,25 +100,25 @@ import org.osgi.service.component.annotations.Component;
 
 @Component(service = {Servlet.class, GetEffectiveAcl.class},
 property= {
-               "sling.servlet.resourceTypes=sling/servlet/default",
-               "sling.servlet.methods=GET",
-               "sling.servlet.selectors=eacl",
-               "sling.servlet.selectors=tidy.eacl",
-               "sling.servlet.extensions=json",
-               "sling.servlet.prefix:Integer=-1"
+        "sling.servlet.resourceTypes=sling/servlet/default",
+        "sling.servlet.methods=GET",
+        "sling.servlet.selectors=eacl",
+        "sling.servlet.selectors=tidy.eacl",
+        "sling.servlet.extensions=json",
+        "sling.servlet.prefix:Integer=-1"
 })
 @SuppressWarnings("serial")
 public class GetEffectiveAclServlet extends AbstractGetAclServlet implements 
GetEffectiveAcl {
 
     /* (non-Javadoc)
-        * @see 
org.apache.sling.jcr.jackrabbit.accessmanager.GetEffectiveAcl#getEffectiveAcl(javax.jcr.Session,
 java.lang.String)
-        */
-       public JsonObject getEffectiveAcl(Session jcrSession, String 
resourcePath)
-                       throws RepositoryException {
-               return internalGetAcl(jcrSession, resourcePath);
-       }
+     * @see 
org.apache.sling.jcr.jackrabbit.accessmanager.GetEffectiveAcl#getEffectiveAcl(javax.jcr.Session,
 java.lang.String)
+     */
+    public JsonObject getEffectiveAcl(Session jcrSession, String resourcePath)
+            throws RepositoryException {
+        return internalGetAcl(jcrSession, resourcePath);
+    }
 
-       @Override
+    @Override
     protected AccessControlEntry[] getAccessControlEntries(Session session, 
String absPath) throws RepositoryException {
         AccessControlManager accessControlManager = 
AccessControlUtil.getAccessControlManager(session);
         AccessControlPolicy[] policies = 
accessControlManager.getEffectivePolicies(absPath);
diff --git 
a/src/main/java/org/apache/sling/jcr/jackrabbit/accessmanager/post/ModifyAceServlet.java
 
b/src/main/java/org/apache/sling/jcr/jackrabbit/accessmanager/post/ModifyAceServlet.java
index 56d32c9..f4541ac 100644
--- 
a/src/main/java/org/apache/sling/jcr/jackrabbit/accessmanager/post/ModifyAceServlet.java
+++ 
b/src/main/java/org/apache/sling/jcr/jackrabbit/accessmanager/post/ModifyAceServlet.java
@@ -97,242 +97,241 @@ import 
org.osgi.service.component.annotations.ReferencePolicyOption;
 
 @Component(service = {Servlet.class, ModifyAce.class},
 property= {
-               "sling.servlet.resourceTypes=sling/servlet/default",
-               "sling.servlet.methods=POST",
-               "sling.servlet.selectors=modifyAce",
-               "sling.servlet.prefix:Integer=-1"
+        "sling.servlet.resourceTypes=sling/servlet/default",
+        "sling.servlet.methods=POST",
+        "sling.servlet.selectors=modifyAce",
+        "sling.servlet.prefix:Integer=-1"
 })
 public class ModifyAceServlet extends AbstractAccessPostServlet implements 
ModifyAce {
-       private static final long serialVersionUID = -9182485466670280437L;
+    private static final long serialVersionUID = -9182485466670280437L;
 
-       private transient RestrictionProvider restrictionProvider = null;
+    private transient RestrictionProvider restrictionProvider = null;
 
-       // NOTE: the @Reference annotation is not inherited, so subclasses will 
need to override the #bindRestrictionProvider 
-       // and #unbindRestrictionProvider methods to provide the @Reference 
annotation.     
-       //
+    // NOTE: the @Reference annotation is not inherited, so subclasses will 
need to override the #bindRestrictionProvider 
+    // and #unbindRestrictionProvider methods to provide the @Reference 
annotation.     
+    //
     @Reference(cardinality=ReferenceCardinality.OPTIONAL, policy = 
ReferencePolicy.DYNAMIC, policyOption=ReferencePolicyOption.GREEDY)
     protected void bindRestrictionProvider(RestrictionProvider rp) {
-       this.restrictionProvider = rp;
+        this.restrictionProvider = rp;
     }
     protected void unbindRestrictionProvider(RestrictionProvider rp) { 
//NOSONAR
-       this.restrictionProvider = null;
+        this.restrictionProvider = null;
     }
-    
+
     /**
      * Overridden since the @Reference annotation is not inherited from the 
super method
-        */
-       @Override
+     */
+    @Override
     @Reference(service = PostResponseCreator.class,
-           cardinality = ReferenceCardinality.MULTIPLE,
-           policy = ReferencePolicy.DYNAMIC)
-       protected void bindPostResponseCreator(PostResponseCreator creator, 
Map<String, Object> properties) {
-               super.bindPostResponseCreator(creator, properties);
-       }
-       
-       /* (non-Javadoc)
-        * @see 
org.apache.sling.jackrabbit.usermanager.impl.post.AbstractPostServlet#unbindPostResponseCreator(org.apache.sling.servlets.post.PostResponseCreator,
 java.util.Map)
-        */
-       @Override
-       protected void unbindPostResponseCreator(PostResponseCreator creator, 
Map<String, Object> properties) { //NOSONAR
-               super.unbindPostResponseCreator(creator, properties);
-       }
+        cardinality = ReferenceCardinality.MULTIPLE,
+        policy = ReferencePolicy.DYNAMIC)
+    protected void bindPostResponseCreator(PostResponseCreator creator, 
Map<String, Object> properties) {
+        super.bindPostResponseCreator(creator, properties);
+    }
+
+    /* (non-Javadoc)
+     * @see 
org.apache.sling.jackrabbit.usermanager.impl.post.AbstractPostServlet#unbindPostResponseCreator(org.apache.sling.servlets.post.PostResponseCreator,
 java.util.Map)
+     */
+    @Override
+    protected void unbindPostResponseCreator(PostResponseCreator creator, 
Map<String, Object> properties) { //NOSONAR
+        super.unbindPostResponseCreator(creator, properties);
+    }
+
+    /* (non-Javadoc)
+     * @see 
org.apache.sling.jackrabbit.accessmanager.post.AbstractAccessPostServlet#handleOperation(org.apache.sling.api.SlingHttpServletRequest,
 org.apache.sling.servlets.post.PostResponse, java.util.List)
+     */
+    @Override
+    protected void handleOperation(SlingHttpServletRequest request,
+            PostResponse response, List<Modification> changes)
+            throws RepositoryException {
+        Session session = request.getResourceResolver().adaptTo(Session.class);
+        String resourcePath = request.getResource().getPath();
+        String principalId = request.getParameter("principalId");
+        Map<String, String> privileges = new HashMap<>();
+        Map<String, Value> restrictions = new HashMap<>();
+        Map<String, Value[]> mvRestrictions = new HashMap<>();
+        Set<String> removeRestrictionNames = new HashSet<>();
+
+        //lazy initialized map for quick lookup when processing POSTed 
restrictions
+        Map<String, RestrictionDefinition> supportedRestrictionsMap = null;
+        ValueFactory factory = session.getValueFactory();
+
+        Enumeration<?> parameterNames = request.getParameterNames();
+        while (parameterNames.hasMoreElements()) {
+            Object nextElement = parameterNames.nextElement();
+            if (nextElement instanceof String) {
+                String paramName = (String)nextElement;
+                if (paramName.startsWith("privilege@")) {
+                    String privilegeName = paramName.substring(10);
+                    String parameterValue = request.getParameter(paramName);
+                    privileges.put(privilegeName, parameterValue);
+                } else if (paramName.startsWith("restriction@")) {
+                    if (restrictionProvider == null) {
+                        throw new IllegalArgumentException("No restriction 
provider is available so unable to process POSTed restriction values");
+                    }
+                    if (supportedRestrictionsMap == null) {
+                        supportedRestrictionsMap = new HashMap<>();
+
+                        //populate the map for quick lookup below
+                        Set<RestrictionDefinition> supportedRestrictions = 
restrictionProvider.getSupportedRestrictions(resourcePath);
+                        for (RestrictionDefinition restrictionDefinition : 
supportedRestrictions) {
+                            
supportedRestrictionsMap.put(restrictionDefinition.getName(), 
restrictionDefinition);
+                        }
+                    }
+
+                    if (paramName.endsWith("@Delete")) {
+                        String restrictionName = paramName.substring(12, 
paramName.length() - 7);
+                        removeRestrictionNames.add(restrictionName);
+                    } else {
+                        String restrictionName = paramName.substring(12);
+                        String[] parameterValues = 
request.getParameterValues(paramName);
+                        if (parameterValues != null) {
+                            RestrictionDefinition rd = 
supportedRestrictionsMap.get(restrictionName);
+                            if (rd == null) {
+                                //illegal restriction name?
+                                throw new IllegalArgumentException("Invalid or 
not supported restriction name was supplied");
+                            }
+
+                            boolean multival = rd.getRequiredType().isArray();
+                            int restrictionType = rd.getRequiredType().tag();
+
+                            if (multival) {
+                                Value [] v = new Value[parameterValues.length];
+                                for (int j = 0; j < parameterValues.length; 
j++) {
+                                    String string = parameterValues[j];
+                                    v[j] = factory.createValue(string, 
restrictionType);
+                                }
+
+                                mvRestrictions.put(restrictionName, v);
+                            } else if (parameterValues.length > 0) {
+                                Value v = 
factory.createValue(parameterValues[0], restrictionType);
+                                restrictions.put(restrictionName, v);
+                            }
+                        }
+                    }
+                }
+            }
+        }
+        String order = request.getParameter("order");
+        modifyAce(session, resourcePath, principalId, privileges, order, 
restrictions, mvRestrictions, 
+                removeRestrictionNames, false, changes);
+    }
+
+    /* (non-Javadoc)
+     * @see 
org.apache.sling.jcr.jackrabbit.accessmanager.ModifyAce#modifyAce(javax.jcr.Session,
 java.lang.String, java.lang.String, java.util.Map, java.lang.String, boolean)
+     */
+    @Override
+    public void modifyAce(Session jcrSession, String resourcePath, String 
principalId, Map<String, String> privileges,
+            String order, boolean autoSave) throws RepositoryException {
+        modifyAce(jcrSession, resourcePath, principalId, privileges, order, 
+                null, null, null, autoSave);
+    }
+
+    /* (non-Javadoc)
+     * @see 
org.apache.sling.jcr.jackrabbit.accessmanager.ModifyAce#modifyAce(javax.jcr.Session,
 java.lang.String, java.lang.String, java.util.Map, java.lang.String)
+     */
+    public void modifyAce(Session jcrSession, String resourcePath,
+            String principalId, Map<String, String> privileges, String order)
+            throws RepositoryException {
+        modifyAce(jcrSession, resourcePath, principalId, privileges, order, 
true);
+    }
     
-       
-       /* (non-Javadoc)
-        * @see 
org.apache.sling.jackrabbit.accessmanager.post.AbstractAccessPostServlet#handleOperation(org.apache.sling.api.SlingHttpServletRequest,
 org.apache.sling.servlets.post.PostResponse, java.util.List)
-        */
-       @Override
-       protected void handleOperation(SlingHttpServletRequest request,
-                       PostResponse response, List<Modification> changes)
-                       throws RepositoryException {
-               Session session = 
request.getResourceResolver().adaptTo(Session.class);
-       String resourcePath = request.getResource().getPath();
-               String principalId = request.getParameter("principalId");
-               Map<String, String> privileges = new HashMap<>();
-               Map<String, Value> restrictions = new HashMap<>();
-               Map<String, Value[]> mvRestrictions = new HashMap<>();
-               Set<String> removeRestrictionNames = new HashSet<>();
+    /* (non-Javadoc)
+     * @see 
org.apache.sling.jcr.jackrabbit.accessmanager.ModifyAce#modifyAce(javax.jcr.Session,
 java.lang.String, java.lang.String, java.util.Map, java.lang.String, 
java.util.Map, java.util.Map, java.util.Set)
+     */
+    @Override
+    public void modifyAce(Session jcrSession, String resourcePath, String 
principalId, Map<String, String> privileges,
+            String order, Map<String, Value> restrictions, Map<String, 
Value[]> mvRestrictions,
+            Set<String> removeRestrictionNames) throws RepositoryException {
+        modifyAce(jcrSession, resourcePath, principalId, privileges, order, 
+                restrictions, mvRestrictions, removeRestrictionNames, true);
+    }
 
-               //lazy initialized map for quick lookup when processing POSTed 
restrictions
-               Map<String, RestrictionDefinition> supportedRestrictionsMap = 
null;
-               ValueFactory factory = session.getValueFactory();
+    /* (non-Javadoc)
+     * @see 
org.apache.sling.jcr.jackrabbit.accessmanager.ModifyAce#modifyAce(javax.jcr.Session,
 java.lang.String, java.lang.String, java.util.Map, java.lang.String, 
java.util.Map, java.util.Map, java.util.Set, boolean)
+     */
+    @Override
+    public void modifyAce(Session jcrSession, String resourcePath, String 
principalId, Map<String, String> privileges,
+            String order, Map<String, Value> restrictions, Map<String, 
Value[]> mvRestrictions,
+            Set<String> removeRestrictionNames, boolean autoSave) throws 
RepositoryException {
+        modifyAce(jcrSession, resourcePath, principalId, privileges, order, 
+                restrictions, mvRestrictions, removeRestrictionNames, 
autoSave, null);
+    }
 
-               Enumeration<?> parameterNames = request.getParameterNames();
-               while (parameterNames.hasMoreElements()) {
-                       Object nextElement = parameterNames.nextElement();
-                       if (nextElement instanceof String) {
-                               String paramName = (String)nextElement;
-                               if (paramName.startsWith("privilege@")) {
-                                       String privilegeName = 
paramName.substring(10);
-                                       String parameterValue = 
request.getParameter(paramName);
-                                       privileges.put(privilegeName, 
parameterValue);
-                               } else if 
(paramName.startsWith("restriction@")) {
-                                       if (restrictionProvider == null) {
-                                               throw new 
IllegalArgumentException("No restriction provider is available so unable to 
process POSTed restriction values");
-                                       }
-                                       if (supportedRestrictionsMap == null) {
-                                               supportedRestrictionsMap = new 
HashMap<>();
+    protected void modifyAce(Session jcrSession, String resourcePath, String 
principalId, Map<String, String> privileges,
+            String order, Map<String, Value> restrictions, Map<String, 
Value[]> mvRestrictions,
+            Set<String> removeRestrictionNames, boolean autoSave, 
List<Modification> changes) throws RepositoryException {
+        if (jcrSession == null) {
+            throw new RepositoryException("JCR Session not found");
+        }
 
-                                               //populate the map for quick 
lookup below
-                                               Set<RestrictionDefinition> 
supportedRestrictions = 
restrictionProvider.getSupportedRestrictions(resourcePath);
-                                               for (RestrictionDefinition 
restrictionDefinition : supportedRestrictions) {
-                                                       
supportedRestrictionsMap.put(restrictionDefinition.getName(), 
restrictionDefinition);
-                                               }
-                                       }
-                                       
-                                       if (paramName.endsWith("@Delete")) {
-                                               String restrictionName = 
paramName.substring(12, paramName.length() - 7);
-                                               
removeRestrictionNames.add(restrictionName);
-                                       } else {
-                                               String restrictionName = 
paramName.substring(12);
-                                               String[] parameterValues = 
request.getParameterValues(paramName);
-                                               if (parameterValues != null) {
-                                                       RestrictionDefinition 
rd = supportedRestrictionsMap.get(restrictionName);
-                                                       if (rd == null) {
-                                                               //illegal 
restriction name?
-                                                               throw new 
IllegalArgumentException("Invalid or not supported restriction name was 
supplied");
-                                                       }
-                                                       
-                                                       boolean multival = 
rd.getRequiredType().isArray();
-                                                       int restrictionType = 
rd.getRequiredType().tag();
-                                                       
-                                                       if (multival) {
-                                                               Value [] v = 
new Value[parameterValues.length];
-                                                               for (int j = 0; 
j < parameterValues.length; j++) {
-                                                                       String 
string = parameterValues[j];
-                                                                       v[j] = 
factory.createValue(string, restrictionType);
-                                                               }
+        if (principalId == null) {
+            throw new RepositoryException("principalId was not submitted.");
+        }
 
-                                                               
mvRestrictions.put(restrictionName, v);
-                                                       } else if 
(parameterValues.length > 0) {
-                                                               Value v = 
factory.createValue(parameterValues[0], restrictionType);
-                                                               
restrictions.put(restrictionName, v);
-                                                       }
-                                               }
-                                       }
-                               }
-                       }
-               }
-               String order = request.getParameter("order");
-       modifyAce(session, resourcePath, principalId, privileges, order, 
restrictions, mvRestrictions, 
-                       removeRestrictionNames, false, changes);
-       }
-       
+        // validate that the submitted name is valid
+        PrincipalManager principalManager = 
AccessControlUtil.getPrincipalManager(jcrSession);
+        Principal principal = principalManager.getPrincipal(principalId);
+        if (principal == null) {
+            throw new RepositoryException("Invalid principalId was 
submitted.");
+        }
 
-       /* (non-Javadoc)
-        * @see 
org.apache.sling.jcr.jackrabbit.accessmanager.ModifyAce#modifyAce(javax.jcr.Session,
 java.lang.String, java.lang.String, java.util.Map, java.lang.String, boolean)
-        */
-       @Override
-       public void modifyAce(Session jcrSession, String resourcePath, String 
principalId, Map<String, String> privileges,
-                       String order, boolean autoSave) throws 
RepositoryException {
-               modifyAce(jcrSession, resourcePath, principalId, privileges, 
order, 
-                               null, null, null, autoSave);
-       }
+        if (resourcePath == null) {
+            throw new ResourceNotFoundException("Resource path was not 
supplied.");
+        }
 
-       /* (non-Javadoc)
-        * @see 
org.apache.sling.jcr.jackrabbit.accessmanager.ModifyAce#modifyAce(javax.jcr.Session,
 java.lang.String, java.lang.String, java.util.Map, java.lang.String)
-        */
-       public void modifyAce(Session jcrSession, String resourcePath,
-                       String principalId, Map<String, String> privileges, 
String order)
-                       throws RepositoryException {
-               modifyAce(jcrSession, resourcePath, principalId, privileges, 
order, true);
-       }
-       /* (non-Javadoc)
-        * @see 
org.apache.sling.jcr.jackrabbit.accessmanager.ModifyAce#modifyAce(javax.jcr.Session,
 java.lang.String, java.lang.String, java.util.Map, java.lang.String, 
java.util.Map, java.util.Map, java.util.Set)
-        */
-       @Override
-       public void modifyAce(Session jcrSession, String resourcePath, String 
principalId, Map<String, String> privileges,
-                       String order, Map<String, Value> restrictions, 
Map<String, Value[]> mvRestrictions,
-                       Set<String> removeRestrictionNames) throws 
RepositoryException {
-               modifyAce(jcrSession, resourcePath, principalId, privileges, 
order, 
-                               restrictions, mvRestrictions, 
removeRestrictionNames, true);
-       }       
+        Item item = jcrSession.getItem(resourcePath);
+        if (item != null) {
+            resourcePath = item.getPath();
+        } else {
+            throw new ResourceNotFoundException("Resource is not a JCR Node");
+        }
 
-       /* (non-Javadoc)
-        * @see 
org.apache.sling.jcr.jackrabbit.accessmanager.ModifyAce#modifyAce(javax.jcr.Session,
 java.lang.String, java.lang.String, java.util.Map, java.lang.String, 
java.util.Map, java.util.Map, java.util.Set, boolean)
-        */
-       @Override
-       public void modifyAce(Session jcrSession, String resourcePath, String 
principalId, Map<String, String> privileges,
-                       String order, Map<String, Value> restrictions, 
Map<String, Value[]> mvRestrictions,
-                       Set<String> removeRestrictionNames, boolean autoSave) 
throws RepositoryException {
-               modifyAce(jcrSession, resourcePath, principalId, privileges, 
order, 
-                               restrictions, mvRestrictions, 
removeRestrictionNames, autoSave, null);
-       }
-       
-       protected void modifyAce(Session jcrSession, String resourcePath, 
String principalId, Map<String, String> privileges,
-                       String order, Map<String, Value> restrictions, 
Map<String, Value[]> mvRestrictions,
-                       Set<String> removeRestrictionNames, boolean autoSave, 
List<Modification> changes) throws RepositoryException {
-               if (jcrSession == null) {
-                       throw new RepositoryException("JCR Session not found");
-               }
+        // Collect the modified privileges from the request.
+        Set<String> grantedPrivilegeNames = new HashSet<>();
+        Set<String> deniedPrivilegeNames = new HashSet<>();
+        Set<String> removedPrivilegeNames = new HashSet<>();
+        if (privileges != null) {
+            Set<Entry<String, String>> entrySet = privileges.entrySet();
+            for (Entry<String, String> entry : entrySet) {
+                String privilegeName = entry.getKey();
+                if (privilegeName.startsWith("privilege@")) {
+                    privilegeName = privilegeName.substring(10);
+                }
+                String parameterValue = entry.getValue();
+                if (parameterValue != null && parameterValue.length() > 0) {
+                    if ("granted".equals(parameterValue)) {
+                        grantedPrivilegeNames.add(privilegeName);
+                    } else if ("denied".equals(parameterValue)) {
+                        deniedPrivilegeNames.add(privilegeName);
+                    } else if ("none".equals(parameterValue)){
+                        removedPrivilegeNames.add(privilegeName);
+                    }
+                }
+            }
+        }
 
-               if (principalId == null) {
-                       throw new RepositoryException("principalId was not 
submitted.");
-               }
-               
-               // validate that the submitted name is valid
-               PrincipalManager principalManager = 
AccessControlUtil.getPrincipalManager(jcrSession);
-               Principal principal = 
principalManager.getPrincipal(principalId);
-               if (principal == null) {
-                       throw new RepositoryException("Invalid principalId was 
submitted.");
-               }
-               
-       if (resourcePath == null) {
-                       throw new ResourceNotFoundException("Resource path was 
not supplied.");
-       }
+        // Make the actual changes.
+        try {
+            AccessControlUtil.replaceAccessControlEntry(jcrSession, 
resourcePath, principal,
+                    grantedPrivilegeNames.toArray(new 
String[grantedPrivilegeNames.size()]),
+                    deniedPrivilegeNames.toArray(new 
String[deniedPrivilegeNames.size()]),
+                    removedPrivilegeNames.toArray(new 
String[removedPrivilegeNames.size()]),
+                    order,
+                    restrictions,
+                    mvRestrictions,
+                    removeRestrictionNames);
 
-               Item item = jcrSession.getItem(resourcePath);
-               if (item != null) {
-                       resourcePath = item.getPath();
-               } else {
-                       throw new ResourceNotFoundException("Resource is not a 
JCR Node");
-               }
-               
-               // Collect the modified privileges from the request.
-               Set<String> grantedPrivilegeNames = new HashSet<>();
-               Set<String> deniedPrivilegeNames = new HashSet<>();
-               Set<String> removedPrivilegeNames = new HashSet<>();
-               if (privileges != null) {
-                       Set<Entry<String, String>> entrySet = 
privileges.entrySet();
-                       for (Entry<String, String> entry : entrySet) {
-                               String privilegeName = entry.getKey();
-                               if (privilegeName.startsWith("privilege@")) {
-                                       privilegeName = 
privilegeName.substring(10);
-                               }
-                               String parameterValue = entry.getValue();
-                               if (parameterValue != null && 
parameterValue.length() > 0) {
-                                       if ("granted".equals(parameterValue)) {
-                                               
grantedPrivilegeNames.add(privilegeName);
-                                       } else if 
("denied".equals(parameterValue)) {
-                                               
deniedPrivilegeNames.add(privilegeName);
-                                       } else if 
("none".equals(parameterValue)){
-                                               
removedPrivilegeNames.add(privilegeName);
-                                       }
-                               }
-                       }
-               }
+            if (changes != null) {
+                changes.add(Modification.onModified(principal.getName()));
+            }
+
+            if (autoSave && jcrSession.hasPendingChanges()) {
+                jcrSession.save();
+            }
+        } catch (RepositoryException re) {
+            throw new RepositoryException("Failed to create ace.", re);
+        }
+    }
 
-               // Make the actual changes.
-               try {
-                       AccessControlUtil.replaceAccessControlEntry(jcrSession, 
resourcePath, principal,
-                                       grantedPrivilegeNames.toArray(new 
String[grantedPrivilegeNames.size()]),
-                                       deniedPrivilegeNames.toArray(new 
String[deniedPrivilegeNames.size()]),
-                                       removedPrivilegeNames.toArray(new 
String[removedPrivilegeNames.size()]),
-                                       order,
-                                       restrictions,
-                                       mvRestrictions,
-                                       removeRestrictionNames);
-                       
-                       if (changes != null) {
-                               
changes.add(Modification.onModified(principal.getName()));
-                       }
-                       
-                       if (autoSave && jcrSession.hasPendingChanges()) {
-                               jcrSession.save();
-                       }
-               } catch (RepositoryException re) {
-                       throw new RepositoryException("Failed to create ace.", 
re);
-               }
-       }
-       
 }

Reply via email to