SLING-8805 The ModifyAce#modifyAce calls should have an option to not
autoSave the session
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 6ad8095..f096763 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
@@ -39,6 +39,9 @@
* 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)
@@ -61,11 +64,45 @@
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)
+ * @param order where the access control entry should go in the list.
+ * Value should be one of these:
+ * <table>
+ * <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>
+ * </table>
+ * @param autoSave true to automatically save changes to the JCR session, false otherwise
+ * @throws RepositoryException
+ */
+ 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)
@@ -94,7 +131,45 @@
Map<String, Value[]> mvRestrictions,
Set<String> removeRestrictionNames
) throws RepositoryException {
- throw new UnsupportedRepositoryOperationException();
+ 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)
+ * @param order where the access control entry should go in the list.
+ * Value should be one of these:
+ * <table>
+ * <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>
+ * </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
+ */
+ 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/package-info.java b/src/main/java/org/apache/sling/jcr/jackrabbit/accessmanager/package-info.java
index e46171e..494de5b 100644
--- a/src/main/java/org/apache/sling/jcr/jackrabbit/accessmanager/package-info.java
+++ b/src/main/java/org/apache/sling/jcr/jackrabbit/accessmanager/package-info.java
@@ -17,7 +17,7 @@
* under the License.
*/
-@org.osgi.annotation.versioning.Version("3.1.0")
+@org.osgi.annotation.versioning.Version("3.2.0")
package org.apache.sling.jcr.jackrabbit.accessmanager;
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 1282299..deeb03d 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
@@ -217,17 +217,27 @@
}
String order = request.getParameter("order");
modifyAce(session, resourcePath, principalId, privileges, order, restrictions, mvRestrictions,
- removeRestrictionNames);
+ removeRestrictionNames, false);
}
/* (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, null, null, null);
+ 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)
@@ -236,6 +246,17 @@
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);
+ }
+
+ /* (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 {
if (jcrSession == null) {
throw new RepositoryException("JCR Session not found");
}
@@ -291,7 +312,7 @@
restrictions,
mvRestrictions,
removeRestrictionNames);
- if (jcrSession.hasPendingChanges()) {
+ if (autoSave && jcrSession.hasPendingChanges()) {
jcrSession.save();
}
} catch (RepositoryException re) {
diff --git a/src/main/java/org/apache/sling/jcr/jackrabbit/accessmanager/post/package-info.java b/src/main/java/org/apache/sling/jcr/jackrabbit/accessmanager/post/package-info.java
index 839033a..19ca1ff 100644
--- a/src/main/java/org/apache/sling/jcr/jackrabbit/accessmanager/post/package-info.java
+++ b/src/main/java/org/apache/sling/jcr/jackrabbit/accessmanager/post/package-info.java
@@ -17,7 +17,7 @@
* under the License.
*/
-@org.osgi.annotation.versioning.Version("3.2.0")
+@org.osgi.annotation.versioning.Version("3.3.0")
package org.apache.sling.jcr.jackrabbit.accessmanager.post;