Author: enorman
Date: Thu Mar 25 18:34:30 2010
New Revision: 927532

URL: http://svn.apache.org/viewvc?rev=927532&view=rev
Log:
SLING-1457 SLING-1458 - enable support for specifying the position of an ACE 
(within the ACL) when it is added/updated

Modified:
    
sling/trunk/bundles/jcr/base/src/main/java/org/apache/sling/jcr/base/util/AccessControlUtil.java
    
sling/trunk/bundles/jcr/contentloader/src/main/java/org/apache/sling/jcr/contentloader/internal/ContentCreator.java
    
sling/trunk/bundles/jcr/contentloader/src/main/java/org/apache/sling/jcr/contentloader/internal/DefaultContentCreator.java
    
sling/trunk/bundles/jcr/contentloader/src/main/java/org/apache/sling/jcr/contentloader/internal/readers/JsonReader.java
    
sling/trunk/bundles/jcr/contentloader/src/test/java/org/apache/sling/jcr/contentloader/internal/JsonReaderTest.java
    
sling/trunk/bundles/jcr/contentloader/src/test/java/org/apache/sling/jcr/contentloader/internal/readers/XmlReaderTest.java
    
sling/trunk/bundles/jcr/jackrabbit-accessmanager/src/main/java/org/apache/sling/jcr/jackrabbit/accessmanager/post/GetAclServlet.java
    
sling/trunk/bundles/jcr/jackrabbit-accessmanager/src/main/java/org/apache/sling/jcr/jackrabbit/accessmanager/post/ModifyAceServlet.java
    
sling/trunk/launchpad/testing/src/test/java/org/apache/sling/launchpad/webapp/integrationtest/accessManager/ModifyAceTest.java
    
sling/trunk/launchpad/testing/src/test/java/org/apache/sling/launchpad/webapp/integrationtest/accessManager/RemoveAcesTest.java

Modified: 
sling/trunk/bundles/jcr/base/src/main/java/org/apache/sling/jcr/base/util/AccessControlUtil.java
URL: 
http://svn.apache.org/viewvc/sling/trunk/bundles/jcr/base/src/main/java/org/apache/sling/jcr/base/util/AccessControlUtil.java?rev=927532&r1=927531&r2=927532&view=diff
==============================================================================
--- 
sling/trunk/bundles/jcr/base/src/main/java/org/apache/sling/jcr/base/util/AccessControlUtil.java
 (original)
+++ 
sling/trunk/bundles/jcr/base/src/main/java/org/apache/sling/jcr/base/util/AccessControlUtil.java
 Thu Mar 25 18:34:30 2010
@@ -19,6 +19,7 @@
 package org.apache.sling.jcr.base.util;
 
 import org.apache.jackrabbit.api.JackrabbitSession;
+import org.apache.jackrabbit.api.security.JackrabbitAccessControlList;
 import org.apache.jackrabbit.api.security.principal.PrincipalManager;
 import org.apache.jackrabbit.api.security.user.Authorizable;
 import org.apache.jackrabbit.api.security.user.UserManager;
@@ -211,6 +212,36 @@ public class AccessControlUtil {
        Class[] types = new Class[] {Principal.class, Privilege[].class, 
boolean.class, Map.class};
                return safeInvokeRepoMethod(acl, 
METHOD_JACKRABBIT_ACL_ADD_ENTRY, Boolean.class, args, types);
     }
+
+    /**
+     * Replaces existing access control entries in the ACL for the specified
+     * <code>principal</code> and <code>resourcePath</code>. Any existing 
granted
+     * or denied privileges which do not conflict with the specified privileges
+     * are maintained. Where conflicts exist, existing privileges are dropped.
+     * The end result will be at most two ACEs for the principal: one for 
grants
+     * and one for denies. Aggregate privileges are disaggregated before 
checking
+     * for conflicts.
+     * @param session
+     * @param resourcePath
+     * @param principal
+     * @param grantedPrivilegeNames
+     * @param deniedPrivilegeNames
+     * @param removedPrivilegeNames privileges which, if they exist, should be
+     * removed for this principal and resource
+     * @throws RepositoryException
+     * @deprecated use @link {...@link #replaceAccessControlEntry(Session, 
String, Principal, String[], String[], String[], String)} instead.
+     */
+    public static void replaceAccessControlEntry(Session session, String 
resourcePath, Principal principal, 
+                       String[] grantedPrivilegeNames, String[] 
deniedPrivilegeNames, String[] removedPrivilegeNames)
+               throws RepositoryException {
+       replaceAccessControlEntry(session, 
+                       resourcePath, 
+                       principal, 
+                       grantedPrivilegeNames, 
+                       deniedPrivilegeNames, 
+                       removedPrivilegeNames, 
+                       null);
+    }    
     
     /**
      * Replaces existing access control entries in the ACL for the specified
@@ -227,10 +258,21 @@ public class AccessControlUtil {
      * @param deniedPrivilegeNames
      * @param removedPrivilegeNames privileges which, if they exist, should be
      * removed for this principal and resource
+     * @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>
      * @throws RepositoryException
      */
     public static void replaceAccessControlEntry(Session session, String 
resourcePath, Principal principal, 
-                       String[] grantedPrivilegeNames, String[] 
deniedPrivilegeNames, String[] removedPrivilegeNames)
+                       String[] grantedPrivilegeNames, String[] 
deniedPrivilegeNames, String[] removedPrivilegeNames,
+                       String order)
                        throws RepositoryException {
        AccessControlManager accessControlManager = 
getAccessControlManager(session);
        Set<String> specifiedPrivilegeNames = new HashSet<String>();
@@ -270,11 +312,17 @@ public class AccessControlUtil {
       
        // Combine all existing ACEs for the target principal.
        AccessControlEntry[] accessControlEntries = 
acl.getAccessControlEntries();
-       for (AccessControlEntry ace : accessControlEntries) {
+       for (int i=0; i < accessControlEntries.length; i++) {
+               AccessControlEntry ace = accessControlEntries[i];
                if (principal.equals(ace.getPrincipal())) {
                        if (log.isDebugEnabled()) {
                                log.debug("Found Existing ACE for principal {} 
on resource {}", new Object[] {principal.getName(), resourcePath});
                        }
+                       if (order == null || order.length() == 0) {
+                               //order not specified, so keep track of the 
original ACE position.
+                               order = String.valueOf(i);
+                       }
+                       
                        boolean isAllow = isAllow(ace);
                        Privilege[] privileges = ace.getPrivileges();
                        if (log.isDebugEnabled()) {
@@ -329,6 +377,10 @@ public class AccessControlUtil {
                        addEntry(acl, principal, 
deniedPrivilegeList.toArray(new Privilege[deniedPrivilegeList.size()]), false);
                }
 
+               
+               //order the ACL
+               reorderAccessControlEntries(acl, principal, order);
+               
        accessControlManager.setPolicy(resourcePath, acl);
        if (log.isDebugEnabled()) {
                List<String> oldGrantedNames = new 
ArrayList<String>(oldGrants.size());
@@ -443,4 +495,128 @@ public class AccessControlUtil {
                }
                return disaggregatedPrivilegeNames;
        }
+
+       /**
+        * Move the ACE(s) for the specified principal to the position 
specified by the 'order'
+        * parameter. 
+        * 
+        * @param acl the acl of the node containing the ACE to position
+        * @param principal the user or group of the ACE to position
+     * @param order where the access control entry should go in the list.  
+     *         Value should be one of these:
+     *         <table>
+     *                         <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 index</td></tr>
+        *         </table>
+        * @throws RepositoryException 
+        * @throws UnsupportedRepositoryOperationException 
+        * @throws AccessControlException 
+        */
+       private static void reorderAccessControlEntries(AccessControlList acl, 
+                                                                               
                                Principal principal, 
+                                                                               
                                String order) 
+                                                       throws 
RepositoryException {
+               if (order == null || order.length() == 0) {
+                       return; //nothing to do
+               }
+               if (acl instanceof JackrabbitAccessControlList) {
+                       JackrabbitAccessControlList jacl = 
(JackrabbitAccessControlList)acl;
+                       
+                       AccessControlEntry[] accessControlEntries = 
jacl.getAccessControlEntries();
+                       if (accessControlEntries.length <= 1) {
+                               return; //only one ACE, so nothing to reorder.
+                       }
+
+                       AccessControlEntry beforeEntry = null;
+                       if ("first".equals(order)) {
+                               beforeEntry = accessControlEntries[0];
+                       } else if ("last".equals(order)) {
+                               beforeEntry = null;
+                       } else if (order.startsWith("before ")) {
+                               String beforePrincipalName = order.substring(7);
+                               
+                               //find the index of the ACE of the 'before' 
principal
+                               for (int i=0; i < accessControlEntries.length; 
i++) {
+                                       if 
(beforePrincipalName.equals(accessControlEntries[i].getPrincipal().getName())) {
+                                               //found it!
+                                               beforeEntry = 
accessControlEntries[i];
+                                               break;
+                                       } 
+                               }
+                               
+                               if (beforeEntry == null) {
+                                       //didn't find an ACE that matched the 
'before' principal
+                                       throw new IllegalArgumentException("No 
ACE was found for the specified principal: " + beforePrincipalName);
+                               }
+                       } else if (order.startsWith("after ")) {
+                               String afterPrincipalName = order.substring(6);
+                               
+                               //find the index of the ACE of the 'after' 
principal
+                               for (int i = accessControlEntries.length - 1; i 
>= 0; i--) {
+                                       if 
(afterPrincipalName.equals(accessControlEntries[i].getPrincipal().getName())) {
+                                               //found it!
+                                               
+                                               // the 'before' ACE is the next 
one after the 'after' ACE
+                                               if (i >= 
accessControlEntries.length - 1) {
+                                                       //the after is the last 
one in the list
+                                                       beforeEntry = null;
+                                               } else {
+                                                       beforeEntry = 
accessControlEntries[i + 1];
+                                               }
+                                               break;
+                                       } 
+                               }
+                               
+                               if (beforeEntry == null) {
+                                       //didn't find an ACE that matched the 
'after' principal
+                                       throw new IllegalArgumentException("No 
ACE was found for the specified principal: " + afterPrincipalName);
+                               }
+                       } else {
+                               try {
+                                       int index = Integer.parseInt(order);
+                                       if (index > 
accessControlEntries.length) {
+                                               //invalid index
+                                               throw new 
IndexOutOfBoundsException("Index value is too large: " + index);
+                                       }
+                                       
+                                       if (index == 0) {
+                                               beforeEntry = 
accessControlEntries[0];
+                                       } else {
+                                               //the index value is the index 
of the principal.  A principal may have more
+                                               // than one ACEs (deny + 
grant), so we need to compensate.
+                                               Set<Principal> 
processedPrincipals = new HashSet<Principal>();
+                                               for (int i = 0; i < 
accessControlEntries.length; i++) {
+                                                       Principal principal2 = 
accessControlEntries[i].getPrincipal();
+                                                       if 
(processedPrincipals.size() == index &&
+                                                                       
!processedPrincipals.contains(principal2)) {
+                                                               //we are now at 
the correct position in the list
+                                                               beforeEntry = 
accessControlEntries[i];
+                                                               break;
+                                                       }
+
+                                                       
processedPrincipals.add(principal2);
+                                               }                               
        
+                                       }
+                               } catch (NumberFormatException nfe) {
+                                       //not a number.
+                                       throw new 
IllegalArgumentException("Illegal value for the order parameter: " + order);
+                               }
+                       }
+                       
+                       //now loop through the entries to move the affected 
ACEs to the specified
+                       // position.
+                       for (int i = accessControlEntries.length - 1; i >= 0; 
i--) {
+                               AccessControlEntry ace = 
accessControlEntries[i];
+                               if (principal.equals(ace.getPrincipal())) {
+                                       //this ACE is for the specified 
principal.
+                                       jacl.orderBefore(ace, beforeEntry);
+                               }
+                       }
+               } else {
+                       throw new IllegalArgumentException("The acl must be an 
instance of JackrabbitAccessControlList");
+               }
+       }
 }

Modified: 
sling/trunk/bundles/jcr/contentloader/src/main/java/org/apache/sling/jcr/contentloader/internal/ContentCreator.java
URL: 
http://svn.apache.org/viewvc/sling/trunk/bundles/jcr/contentloader/src/main/java/org/apache/sling/jcr/contentloader/internal/ContentCreator.java?rev=927532&r1=927531&r2=927532&view=diff
==============================================================================
--- 
sling/trunk/bundles/jcr/contentloader/src/main/java/org/apache/sling/jcr/contentloader/internal/ContentCreator.java
 (original)
+++ 
sling/trunk/bundles/jcr/contentloader/src/main/java/org/apache/sling/jcr/contentloader/internal/ContentCreator.java
 Thu Mar 25 18:34:30 2010
@@ -162,8 +162,17 @@ public interface ContentCreator {
      * @param principal the user or group id for the ACE
      * @param grantedPrivileges the set of privileges to grant the principal
      * @param deniedPrivileges the set of privileges to deny the principal 
(for users only)
+     * @param order specifies the position of the ACE in the containing ACL. 
(may be null)
+     *         Value should be one of these:
+     *         <table>
+     *                         <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 index</td></tr>
+        *         </table>
      * @throws RepositoryException
      */
-    void createAce(String principal, String [] grantedPrivileges, String [] 
deniedPrivileges )
+    void createAce(String principal, String [] grantedPrivileges, String [] 
deniedPrivileges, String order )
     throws RepositoryException;
 }

Modified: 
sling/trunk/bundles/jcr/contentloader/src/main/java/org/apache/sling/jcr/contentloader/internal/DefaultContentCreator.java
URL: 
http://svn.apache.org/viewvc/sling/trunk/bundles/jcr/contentloader/src/main/java/org/apache/sling/jcr/contentloader/internal/DefaultContentCreator.java?rev=927532&r1=927531&r2=927532&view=diff
==============================================================================
--- 
sling/trunk/bundles/jcr/contentloader/src/main/java/org/apache/sling/jcr/contentloader/internal/DefaultContentCreator.java
 (original)
+++ 
sling/trunk/bundles/jcr/contentloader/src/main/java/org/apache/sling/jcr/contentloader/internal/DefaultContentCreator.java
 Thu Mar 25 18:34:30 2010
@@ -799,7 +799,8 @@ public class DefaultContentCreator imple
         * @see 
org.apache.sling.jcr.contentloader.internal.ContentCreator#createAce(java.lang.String,
 java.lang.String, java.lang.String[], java.lang.String[])
         */
        public void createAce(String principalId,
-                       String[] grantedPrivilegeNames, String[] 
deniedPrivilegeNames)
+                       String[] grantedPrivilegeNames, String[] 
deniedPrivilegeNames,
+                       String order)
                        throws RepositoryException {
                final Node parentNode = this.parentNodeStack.peek();
                Session session = parentNode.getSession();
@@ -812,7 +813,7 @@ public class DefaultContentCreator imple
 
                if ((grantedPrivilegeNames != null) || (deniedPrivilegeNames != 
null)) {
                        AccessControlUtil.replaceAccessControlEntry(session, 
resourcePath, principal,
-                                       grantedPrivilegeNames, 
deniedPrivilegeNames, null);
+                                       grantedPrivilegeNames, 
deniedPrivilegeNames, null, order);
                }
        }
 

Modified: 
sling/trunk/bundles/jcr/contentloader/src/main/java/org/apache/sling/jcr/contentloader/internal/readers/JsonReader.java
URL: 
http://svn.apache.org/viewvc/sling/trunk/bundles/jcr/contentloader/src/main/java/org/apache/sling/jcr/contentloader/internal/readers/JsonReader.java?rev=927532&r1=927531&r2=927532&view=diff
==============================================================================
--- 
sling/trunk/bundles/jcr/contentloader/src/main/java/org/apache/sling/jcr/contentloader/internal/readers/JsonReader.java
 (original)
+++ 
sling/trunk/bundles/jcr/contentloader/src/main/java/org/apache/sling/jcr/contentloader/internal/readers/JsonReader.java
 Thu Mar 25 18:34:30 2010
@@ -427,8 +427,10 @@ public class JsonReader implements Conte
                        }
                }
 
+               String order = ace.optString("order", null);
+               
                //do the work.
-               contentCreator.createAce(principalID, grantedPrivileges, 
deniedPrivileges);
+               contentCreator.createAce(principalID, grantedPrivileges, 
deniedPrivileges, order);
     }
 
 }

Modified: 
sling/trunk/bundles/jcr/contentloader/src/test/java/org/apache/sling/jcr/contentloader/internal/JsonReaderTest.java
URL: 
http://svn.apache.org/viewvc/sling/trunk/bundles/jcr/contentloader/src/test/java/org/apache/sling/jcr/contentloader/internal/JsonReaderTest.java?rev=927532&r1=927531&r2=927532&view=diff
==============================================================================
--- 
sling/trunk/bundles/jcr/contentloader/src/test/java/org/apache/sling/jcr/contentloader/internal/JsonReaderTest.java
 (original)
+++ 
sling/trunk/bundles/jcr/contentloader/src/test/java/org/apache/sling/jcr/contentloader/internal/JsonReaderTest.java
 Thu Mar 25 18:34:30 2010
@@ -276,16 +276,17 @@ public class JsonReaderTest {
                        "  {" +
                        "    \"principal\" : \"groupname2\"," +
                        "    \"granted\" : [\"jcr:read\"]," +
-                       "    \"denied\" : [\"jcr:write\"]" +
+                       "    \"denied\" : [\"jcr:write\"]," +
+                       "    \"order\" : \"first\"" +
                        "  }" +
                        "]" +
                        "}";
         this.mockery.checking(new Expectations() {{
                allowing(creator).createNode(null, null, null); 
inSequence(mySequence);
 
-            allowing(creator).createAce("username1",new 
String[]{"jcr:read","jcr:write"},new String[]{}); inSequence(mySequence);
-            allowing(creator).createAce("groupname1",new 
String[]{"jcr:read","jcr:write"},null); inSequence(mySequence);
-            allowing(creator).createAce("groupname2",new 
String[]{"jcr:read"},new String[]{"jcr:write"}); inSequence(mySequence);
+            allowing(creator).createAce("username1",new 
String[]{"jcr:read","jcr:write"},new String[]{}, null); inSequence(mySequence);
+            allowing(creator).createAce("groupname1",new 
String[]{"jcr:read","jcr:write"},null, null); inSequence(mySequence);
+            allowing(creator).createAce("groupname2",new 
String[]{"jcr:read"},new String[]{"jcr:write"}, "first"); 
inSequence(mySequence);
             allowing(creator).finishNode(); inSequence(mySequence);
         }});
         this.parse(json);

Modified: 
sling/trunk/bundles/jcr/contentloader/src/test/java/org/apache/sling/jcr/contentloader/internal/readers/XmlReaderTest.java
URL: 
http://svn.apache.org/viewvc/sling/trunk/bundles/jcr/contentloader/src/test/java/org/apache/sling/jcr/contentloader/internal/readers/XmlReaderTest.java?rev=927532&r1=927531&r2=927532&view=diff
==============================================================================
--- 
sling/trunk/bundles/jcr/contentloader/src/test/java/org/apache/sling/jcr/contentloader/internal/readers/XmlReaderTest.java
 (original)
+++ 
sling/trunk/bundles/jcr/contentloader/src/test/java/org/apache/sling/jcr/contentloader/internal/readers/XmlReaderTest.java
 Thu Mar 25 18:34:30 2010
@@ -145,7 +145,8 @@ public class XmlReaderTest extends TestC
         }
 
                public void createAce(String principal,
-                               String[] grantedPrivileges, String[] 
deniedPrivileges)
+                               String[] grantedPrivileges, String[] 
deniedPrivileges,
+                               String order)
                                throws RepositoryException {
                }
 

Modified: 
sling/trunk/bundles/jcr/jackrabbit-accessmanager/src/main/java/org/apache/sling/jcr/jackrabbit/accessmanager/post/GetAclServlet.java
URL: 
http://svn.apache.org/viewvc/sling/trunk/bundles/jcr/jackrabbit-accessmanager/src/main/java/org/apache/sling/jcr/jackrabbit/accessmanager/post/GetAclServlet.java?rev=927532&r1=927531&r2=927532&view=diff
==============================================================================
--- 
sling/trunk/bundles/jcr/jackrabbit-accessmanager/src/main/java/org/apache/sling/jcr/jackrabbit/accessmanager/post/GetAclServlet.java
 (original)
+++ 
sling/trunk/bundles/jcr/jackrabbit-accessmanager/src/main/java/org/apache/sling/jcr/jackrabbit/accessmanager/post/GetAclServlet.java
 Thu Mar 25 18:34:30 2010
@@ -18,8 +18,10 @@ package org.apache.sling.jcr.jackrabbit.
 
 import java.io.IOException;
 import java.security.Principal;
+import java.util.ArrayList;
 import java.util.LinkedHashMap;
 import java.util.LinkedHashSet;
+import java.util.List;
 import java.util.Map;
 import java.util.Set;
 import java.util.Map.Entry;
@@ -41,6 +43,7 @@ import org.apache.sling.api.SlingHttpSer
 import org.apache.sling.api.resource.Resource;
 import org.apache.sling.api.resource.ResourceNotFoundException;
 import org.apache.sling.api.servlets.SlingAllMethodsServlet;
+import org.apache.sling.commons.json.JSONArray;
 import org.apache.sling.commons.json.JSONObject;
 import org.apache.sling.jcr.base.util.AccessControlUtil;
 import org.slf4j.Logger;
@@ -191,13 +194,15 @@ public class GetAclServlet extends Sling
                response.setContentType("application/json");
                response.setCharacterEncoding("UTF-8");
 
-               JSONObject jsonObj = new JSONObject();
+               List<JSONObject> aclList = new ArrayList<JSONObject>();
                Set<Entry<String, Map<String, Set<String>>>> entrySet = 
aclMap.entrySet();
                for (Entry<String, Map<String, Set<String>>> entry : entrySet) {
                        String principalName = entry.getKey();
                        Map<String, Set<String>> value = entry.getValue();
-                       
-                       JSONObject aceObject = new JSONObject();
+
+               JSONObject aceObject = new JSONObject();
+               aceObject.put("principal", principalName);
+
                        Set<String> grantedSet = value.get("granted");
                        if (grantedSet != null) {
                        aceObject.put("granted", grantedSet);
@@ -208,12 +213,12 @@ public class GetAclServlet extends Sling
                                aceObject.put("denied", deniedSet);
                        }
 
-                       jsonObj.put(principalName, aceObject);
+                       aclList.add(aceObject);
                        }
-               
+               JSONArray jsonAclArray = new JSONArray(aclList);
 
             // do the dump
-               jsonObj.write(response.getWriter());
+               jsonAclArray.write(response.getWriter());
         } catch (AccessDeniedException ade) {
                response.sendError(HttpServletResponse.SC_NOT_FOUND);
         } catch (ResourceNotFoundException rnfe) {

Modified: 
sling/trunk/bundles/jcr/jackrabbit-accessmanager/src/main/java/org/apache/sling/jcr/jackrabbit/accessmanager/post/ModifyAceServlet.java
URL: 
http://svn.apache.org/viewvc/sling/trunk/bundles/jcr/jackrabbit-accessmanager/src/main/java/org/apache/sling/jcr/jackrabbit/accessmanager/post/ModifyAceServlet.java?rev=927532&r1=927531&r2=927532&view=diff
==============================================================================
--- 
sling/trunk/bundles/jcr/jackrabbit-accessmanager/src/main/java/org/apache/sling/jcr/jackrabbit/accessmanager/post/ModifyAceServlet.java
 (original)
+++ 
sling/trunk/bundles/jcr/jackrabbit-accessmanager/src/main/java/org/apache/sling/jcr/jackrabbit/accessmanager/post/ModifyAceServlet.java
 Thu Mar 25 18:34:30 2010
@@ -140,12 +140,15 @@ public class ModifyAceServlet extends Ab
                        }
                }
 
+               String order = request.getParameter("order");
+               
                // Make the actual changes.
                try {
                        AccessControlUtil.replaceAccessControlEntry(session, 
resourcePath, principal,
                                        grantedPrivilegeNames.toArray(new 
String[grantedPrivilegeNames.size()]),
                                        deniedPrivilegeNames.toArray(new 
String[deniedPrivilegeNames.size()]),
-                                       removedPrivilegeNames.toArray(new 
String[removedPrivilegeNames.size()]));
+                                       removedPrivilegeNames.toArray(new 
String[removedPrivilegeNames.size()]),
+                                       order);
                        if (session.hasPendingChanges()) {
                                session.save();
                        }

Modified: 
sling/trunk/launchpad/testing/src/test/java/org/apache/sling/launchpad/webapp/integrationtest/accessManager/ModifyAceTest.java
URL: 
http://svn.apache.org/viewvc/sling/trunk/launchpad/testing/src/test/java/org/apache/sling/launchpad/webapp/integrationtest/accessManager/ModifyAceTest.java?rev=927532&r1=927531&r2=927532&view=diff
==============================================================================
--- 
sling/trunk/launchpad/testing/src/test/java/org/apache/sling/launchpad/webapp/integrationtest/accessManager/ModifyAceTest.java
 (original)
+++ 
sling/trunk/launchpad/testing/src/test/java/org/apache/sling/launchpad/webapp/integrationtest/accessManager/ModifyAceTest.java
 Thu Mar 25 18:34:30 2010
@@ -37,6 +37,7 @@ import org.apache.sling.commons.json.JSO
 public class ModifyAceTest extends AbstractAccessManagerTest {
 
        String testUserId = null;
+       String testUserId2 = null;
        String testGroupId = null;
        String testFolderUrl = null;
        
@@ -65,6 +66,12 @@ public class ModifyAceTest extends Abstr
                        List<NameValuePair> postParams = new 
ArrayList<NameValuePair>();
                        assertAuthenticatedPostStatus(creds, postUrl, 
HttpServletResponse.SC_OK, postParams, null);
                }
+               if (testUserId2 != null) {
+                       //remove the test user if it exists.
+                       String postUrl = HTTP_BASE_URL + 
"/system/userManager/user/" + testUserId2 + ".delete.html";
+                       List<NameValuePair> postParams = new 
ArrayList<NameValuePair>();
+                       assertAuthenticatedPostStatus(creds, postUrl, 
HttpServletResponse.SC_OK, postParams, null);
+               }
        }
 
        public void testModifyAceForUser() throws IOException, JSONException {
@@ -89,19 +96,21 @@ public class ModifyAceTest extends Abstr
 
                String json = getAuthenticatedContent(creds, getUrl, 
CONTENT_TYPE_JSON, null, HttpServletResponse.SC_OK);
                assertNotNull(json);
-               JSONObject jsonObj = new JSONObject(json);
-               String aceString = jsonObj.getString(testUserId);
-               assertNotNull(aceString);
+               JSONArray jsonArray = new JSONArray(json);
+               assertEquals(1, jsonArray.length());
                
-               JSONObject aceObject = new JSONObject(aceString); 
+               JSONObject aceObject = jsonArray.optJSONObject(0);
                assertNotNull(aceObject);
                
-               JSONArray grantedArray = aceObject.getJSONArray("granted");
+               String principalString = aceObject.optString("principal");
+               assertEquals(testUserId, principalString);
+               
+               JSONArray grantedArray = aceObject.optJSONArray("granted");
                assertNotNull(grantedArray);
                assertEquals(1, grantedArray.length());
                assertEquals("jcr:read", grantedArray.getString(0));
 
-               JSONArray deniedArray = aceObject.getJSONArray("denied");
+               JSONArray deniedArray = aceObject.optJSONArray("denied");
                assertNotNull(deniedArray);
                assertEquals(1, deniedArray.length());
                assertEquals("jcr:write", deniedArray.getString(0));
@@ -129,19 +138,21 @@ public class ModifyAceTest extends Abstr
 
                String json = getAuthenticatedContent(creds, getUrl, 
CONTENT_TYPE_JSON, null, HttpServletResponse.SC_OK);
                assertNotNull(json);
-               JSONObject jsonObj = new JSONObject(json);
-               String aceString = jsonObj.getString(testGroupId);
-               assertNotNull(aceString);
-
-               JSONObject aceObject = new JSONObject(aceString);
+               JSONArray jsonArray = new JSONArray(json);
+               assertEquals(1, jsonArray.length());
+               
+               JSONObject aceObject = jsonArray.optJSONObject(0);
                assertNotNull(aceObject);
+
+               String principalString = aceObject.optString("principal");
+               assertEquals(testGroupId, principalString);
                
-               JSONArray grantedArray = aceObject.getJSONArray("granted");
+               JSONArray grantedArray = aceObject.optJSONArray("granted");
                assertNotNull(grantedArray);
                assertEquals(1, grantedArray.length());
                assertEquals("jcr:read", grantedArray.getString(0));
 
-               JSONArray deniedArray = aceObject.getJSONArray("denied");
+               JSONArray deniedArray = aceObject.optJSONArray("denied");
                assertNotNull(deniedArray);
                assertEquals("jcr:write", deniedArray.getString(0));
        }
@@ -173,14 +184,16 @@ public class ModifyAceTest extends Abstr
 
                String json = getAuthenticatedContent(creds, getUrl, 
CONTENT_TYPE_JSON, null, HttpServletResponse.SC_OK);
                assertNotNull(json);
-               JSONObject jsonObj = new JSONObject(json);
-               String aceString = jsonObj.getString(testUserId);
-               assertNotNull(aceString);
+               JSONArray jsonArray = new JSONArray(json);
+               assertEquals(1, jsonArray.length());
                
-               JSONObject aceObject = new JSONObject(aceString); 
+               JSONObject aceObject = jsonArray.optJSONObject(0);
                assertNotNull(aceObject);
+
+               String principalString = aceObject.optString("principal");
+               assertEquals(testUserId, principalString);
                
-               JSONArray grantedArray = aceObject.getJSONArray("granted");
+               JSONArray grantedArray = aceObject.optJSONArray("granted");
                assertNotNull(grantedArray);
                assertEquals(3, grantedArray.length());
                Set<String> grantedPrivilegeNames = new HashSet<String>();
@@ -191,7 +204,7 @@ public class ModifyAceTest extends Abstr
                
assertTrue(grantedPrivilegeNames.contains("jcr:readAccessControl"));
                assertTrue(grantedPrivilegeNames.contains("jcr:addChildNodes"));
 
-               JSONArray deniedArray = aceObject.getJSONArray("denied");
+               JSONArray deniedArray = aceObject.optJSONArray("denied");
                assertNotNull(deniedArray);
                assertEquals(2, deniedArray.length());
                Set<String> deniedPrivilegeNames = new HashSet<String>();
@@ -219,16 +232,17 @@ public class ModifyAceTest extends Abstr
                
                //fetch the JSON for the acl to verify the settings.
                String json2 = getAuthenticatedContent(creds, getUrl, 
CONTENT_TYPE_JSON, null, HttpServletResponse.SC_OK);
-               
                assertNotNull(json2);
-               JSONObject jsonObj2 = new JSONObject(json2);
-               String aceString2 = jsonObj2.getString(testUserId);
-               assertNotNull(aceString2);
+               JSONArray jsonArray2 = new JSONArray(json2);
+               assertEquals(1, jsonArray2.length());
                
-               JSONObject aceObject2 = new JSONObject(aceString2); 
+               JSONObject aceObject2 = jsonArray2.optJSONObject(0);
                assertNotNull(aceObject2);
+
+               String principalString2 = aceObject2.optString("principal");
+               assertEquals(testUserId, principalString2);
                
-               JSONArray grantedArray2 = aceObject2.getJSONArray("granted");
+               JSONArray grantedArray2 = aceObject2.optJSONArray("granted");
                assertNotNull(grantedArray2);
                assertEquals(3, grantedArray2.length());
                Set<String> grantedPrivilegeNames2 = new HashSet<String>();
@@ -239,7 +253,7 @@ public class ModifyAceTest extends Abstr
                
assertTrue(grantedPrivilegeNames2.contains("jcr:addChildNodes"));
                
assertTrue(grantedPrivilegeNames2.contains("jcr:modifyProperties"));
 
-               JSONArray deniedArray2 = aceObject2.getJSONArray("denied");
+               JSONArray deniedArray2 = aceObject2.optJSONArray("denied");
                assertNotNull(deniedArray2);
                assertEquals(2, deniedArray2.length());
                Set<String> deniedPrivilegeNames2 = new HashSet<String>();
@@ -275,14 +289,16 @@ public class ModifyAceTest extends Abstr
 
                String json = getAuthenticatedContent(creds, getUrl, 
CONTENT_TYPE_JSON, null, HttpServletResponse.SC_OK);
                assertNotNull(json);
-               JSONObject jsonObj = new JSONObject(json);
-               String aceString = jsonObj.getString(testUserId);
-               assertNotNull(aceString);
                
-               JSONObject aceObject = new JSONObject(aceString); 
+               JSONArray jsonArray = new JSONArray(json);
+               assertEquals(1, jsonArray.length());
+               
+               JSONObject aceObject = jsonArray.optJSONObject(0); 
                assertNotNull(aceObject);
                
-               JSONArray grantedArray = aceObject.getJSONArray("granted");
+               assertEquals(testUserId, aceObject.optString("principal"));
+               
+               JSONArray grantedArray = aceObject.optJSONArray("granted");
                assertNotNull(grantedArray);
                assertEquals(1, grantedArray.length());
                Set<String> grantedPrivilegeNames = new HashSet<String>();
@@ -291,7 +307,7 @@ public class ModifyAceTest extends Abstr
                }
                assertTrue(grantedPrivilegeNames.contains("jcr:read"));
 
-               JSONArray deniedArray = aceObject.getJSONArray("denied");
+               JSONArray deniedArray = aceObject.optJSONArray("denied");
                assertNotNull(deniedArray);
                assertEquals(1, deniedArray.length());
                Set<String> deniedPrivilegeNames = new HashSet<String>();
@@ -315,16 +331,17 @@ public class ModifyAceTest extends Abstr
                
                //fetch the JSON for the acl to verify the settings.
                String json2 = getAuthenticatedContent(creds, getUrl, 
CONTENT_TYPE_JSON, null, HttpServletResponse.SC_OK);
-               
                assertNotNull(json2);
-               JSONObject jsonObj2 = new JSONObject(json2);
-               String aceString2 = jsonObj2.getString(testUserId);
-               assertNotNull(aceString2);
                
-               JSONObject aceObject2 = new JSONObject(aceString2); 
+               JSONArray jsonArray2 = new JSONArray(json2);
+               assertEquals(1, jsonArray2.length());
+               
+               JSONObject aceObject2 = jsonArray2.optJSONObject(0); 
                assertNotNull(aceObject2);
                
-               JSONArray grantedArray2 = aceObject2.getJSONArray("granted");
+               assertEquals(testUserId, aceObject2.optString("principal"));
+               
+               JSONArray grantedArray2 = aceObject2.optJSONArray("granted");
                assertNotNull(grantedArray2);
                assertEquals(2, grantedArray2.length());
                Set<String> grantedPrivilegeNames2 = new HashSet<String>();
@@ -334,7 +351,7 @@ public class ModifyAceTest extends Abstr
                assertTrue(grantedPrivilegeNames2.contains("jcr:read"));
                
assertTrue(grantedPrivilegeNames2.contains("jcr:modifyProperties"));
 
-               JSONArray deniedArray2 = aceObject2.getJSONArray("denied");
+               JSONArray deniedArray2 = aceObject2.optJSONArray("denied");
                assertNotNull(deniedArray2);
                assertEquals(3, deniedArray2.length());
                Set<String> deniedPrivilegeNames2 = new HashSet<String>();
@@ -372,13 +389,15 @@ public class ModifyAceTest extends Abstr
 
                String json = getAuthenticatedContent(creds, getUrl, 
CONTENT_TYPE_JSON, null, HttpServletResponse.SC_OK);
                assertNotNull(json);
-               JSONObject jsonObj = new JSONObject(json);
-               String aceString = jsonObj.getString(testUserId);
-               assertNotNull(aceString);
                
-               JSONObject aceObject = new JSONObject(aceString); 
+               JSONArray jsonArray = new JSONArray(json);
+               assertEquals(1, jsonArray.length());
+               
+               JSONObject aceObject = jsonArray.optJSONObject(0); 
                assertNotNull(aceObject);
                
+               assertEquals(testUserId, aceObject.optString("principal"));
+               
                JSONArray grantedArray = aceObject.getJSONArray("granted");
                assertNotNull(grantedArray);
                assertEquals(1, grantedArray.length());
@@ -413,16 +432,17 @@ public class ModifyAceTest extends Abstr
                
                //fetch the JSON for the acl to verify the settings.
                String json2 = getAuthenticatedContent(creds, getUrl, 
CONTENT_TYPE_JSON, null, HttpServletResponse.SC_OK);
-               
                assertNotNull(json2);
-               JSONObject jsonObj2 = new JSONObject(json2);
-               String aceString2 = jsonObj2.getString(testUserId);
-               assertNotNull(aceString2);
                
-               JSONObject aceObject2 = new JSONObject(aceString2); 
+               JSONArray jsonArray2 = new JSONArray(json2);
+               assertEquals(1, jsonArray2.length());
+               
+               JSONObject aceObject2 = jsonArray2.optJSONObject(0); 
                assertNotNull(aceObject2);
                
-               JSONArray grantedArray2 = aceObject2.getJSONArray("granted");
+               assertEquals(testUserId, aceObject.optString("principal"));
+               
+               JSONArray grantedArray2 = aceObject2.optJSONArray("granted");
                assertNotNull(grantedArray2);
                assertEquals(1, grantedArray2.length());
                Set<String> grantedPrivilegeNames2 = new HashSet<String>();
@@ -431,7 +451,7 @@ public class ModifyAceTest extends Abstr
                }
                assertTrue(grantedPrivilegeNames2.contains("jcr:read"));
 
-               JSONArray deniedArray2 = aceObject2.getJSONArray("denied");
+               JSONArray deniedArray2 = aceObject2.optJSONArray("denied");
                assertNotNull(deniedArray2);
                assertEquals(1, deniedArray2.length());
                Set<String> deniedPrivilegeNames2 = new HashSet<String>();
@@ -465,14 +485,16 @@ public class ModifyAceTest extends Abstr
 
                String json = getAuthenticatedContent(creds, getUrl, 
CONTENT_TYPE_JSON, null, HttpServletResponse.SC_OK);
                assertNotNull(json);
-               JSONObject jsonObj = new JSONObject(json);
-               String aceString = jsonObj.getString(testUserId);
-               assertNotNull(aceString);
                
-               JSONObject aceObject = new JSONObject(aceString); 
+               JSONArray jsonArray = new JSONArray(json);
+               assertEquals(1, jsonArray.length());
+               
+               JSONObject aceObject = jsonArray.optJSONObject(0); 
                assertNotNull(aceObject);
                
-               JSONArray grantedArray = aceObject.getJSONArray("granted");
+               assertEquals(testUserId, aceObject.optString("principal"));
+               
+               JSONArray grantedArray = aceObject.optJSONArray("granted");
                assertNotNull(grantedArray);
                assertEquals(1, grantedArray.length());
                Set<String> grantedPrivilegeNames = new HashSet<String>();
@@ -498,16 +520,17 @@ public class ModifyAceTest extends Abstr
                
                //fetch the JSON for the acl to verify the settings.
                String json2 = getAuthenticatedContent(creds, getUrl, 
CONTENT_TYPE_JSON, null, HttpServletResponse.SC_OK);
-               
                assertNotNull(json2);
-               JSONObject jsonObj2 = new JSONObject(json2);
-               String aceString2 = jsonObj2.getString(testUserId);
-               assertNotNull(aceString2);
+
+               JSONArray jsonArray2 = new JSONArray(json2);
+               assertEquals(1, jsonArray2.length());
                
-               JSONObject aceObject2 = new JSONObject(aceString2); 
+               JSONObject aceObject2 = jsonArray2.optJSONObject(0); 
                assertNotNull(aceObject2);
                
-               JSONArray grantedArray2 = aceObject2.getJSONArray("granted");
+               assertEquals(testUserId, aceObject2.optString("principal"));
+               
+               JSONArray grantedArray2 = aceObject2.optJSONArray("granted");
                assertNotNull(grantedArray2);
                assertEquals(1, grantedArray2.length());
                Set<String> grantedPrivilegeNames2 = new HashSet<String>();
@@ -516,7 +539,7 @@ public class ModifyAceTest extends Abstr
                }
                assertTrue(grantedPrivilegeNames2.contains("jcr:write"));
 
-               JSONArray deniedArray2 = aceObject2.getJSONArray("denied");
+               JSONArray deniedArray2 = aceObject2.optJSONArray("denied");
                assertNotNull(deniedArray2);
                assertEquals(1, deniedArray2.length());
                Set<String> deniedPrivilegeNames2 = new HashSet<String>();
@@ -525,5 +548,216 @@ public class ModifyAceTest extends Abstr
                }
                
assertTrue(deniedPrivilegeNames2.contains("jcr:nodeTypeManagement"));
        }
+
+
+       
+       /**
+        * Test to verify adding an ACE in the first position of 
+        * the ACL
+        */
+       public void testAddAceOrderByFirst() throws IOException, JSONException {
+               createAceOrderTestFolderWithOneAce();
+               
+               testGroupId = createTestGroup();
+
+               addOrUpdateAce(testFolderUrl, testGroupId, true, "first");
+
+               //fetch the JSON for the acl to verify the settings.
+               String getUrl = testFolderUrl + ".acl.json";
+
+               Credentials creds = new UsernamePasswordCredentials("admin", 
"admin");
+               String json = getAuthenticatedContent(creds, getUrl, 
CONTENT_TYPE_JSON, null, HttpServletResponse.SC_OK);
+               assertNotNull(json);
+
+               JSONArray jsonArray = new JSONArray(json);
+               assertEquals(2, jsonArray.length());
+               
+               assertEquals(testGroupId, 
jsonArray.getJSONObject(0).getString("principal"));
+               assertEquals(testUserId, 
jsonArray.getJSONObject(1).getString("principal"));
+       }       
+
+       /**
+        * Test to verify adding an ACE at the end 
+        * the ACL
+        */
+       public void testAddAceOrderByLast() throws IOException, JSONException {
+               createAceOrderTestFolderWithOneAce();
+               
+               testGroupId = createTestGroup();
+
+               addOrUpdateAce(testFolderUrl, testGroupId, true, "last");
+
+               //fetch the JSON for the acl to verify the settings.
+               String getUrl = testFolderUrl + ".acl.json";
+
+               Credentials creds = new UsernamePasswordCredentials("admin", 
"admin");
+               String json = getAuthenticatedContent(creds, getUrl, 
CONTENT_TYPE_JSON, null, HttpServletResponse.SC_OK);
+               assertNotNull(json);
+
+               JSONArray jsonArray = new JSONArray(json);
+               assertEquals(2, jsonArray.length());
+               
+               assertEquals(testUserId, 
jsonArray.getJSONObject(0).getString("principal"));
+               assertEquals(testGroupId, 
jsonArray.getJSONObject(1).getString("principal"));
+       }       
+
+       /**
+        * Test to verify adding an ACE before an existing ACE 
+        * the ACL
+        */
+       public void testAddAceOrderByBefore() throws IOException, JSONException 
{
+               createAceOrderTestFolderWithOneAce();
+               
+               testGroupId = createTestGroup();
+
+               addOrUpdateAce(testFolderUrl, testGroupId, true, "before " + 
testUserId);
+
+               //fetch the JSON for the acl to verify the settings.
+               String getUrl = testFolderUrl + ".acl.json";
+
+               Credentials creds = new UsernamePasswordCredentials("admin", 
"admin");
+               String json = getAuthenticatedContent(creds, getUrl, 
CONTENT_TYPE_JSON, null, HttpServletResponse.SC_OK);
+               assertNotNull(json);
+
+               JSONArray jsonArray = new JSONArray(json);
+               assertEquals(2, jsonArray.length());
+               
+               assertEquals(testGroupId, 
jsonArray.getJSONObject(0).getString("principal"));
+               assertEquals(testUserId, 
jsonArray.getJSONObject(1).getString("principal"));
+       }       
+
+       /**
+        * Test to verify adding an ACE after an existing ACE 
+        * the ACL
+        */
+       public void testAddAceOrderByAfter() throws IOException, JSONException {
+               createAceOrderTestFolderWithOneAce();
+               
+               testGroupId = createTestGroup();
+
+               addOrUpdateAce(testFolderUrl, testGroupId, true, "after " + 
testUserId);
+
+               //fetch the JSON for the acl to verify the settings.
+               String getUrl = testFolderUrl + ".acl.json";
+
+               Credentials creds = new UsernamePasswordCredentials("admin", 
"admin");
+               String json = getAuthenticatedContent(creds, getUrl, 
CONTENT_TYPE_JSON, null, HttpServletResponse.SC_OK);
+               assertNotNull(json);
+
+               JSONArray jsonArray = new JSONArray(json);
+               assertEquals(2, jsonArray.length());
+               
+               assertEquals(testUserId, 
jsonArray.getJSONObject(0).getString("principal"));
+               assertEquals(testGroupId, 
jsonArray.getJSONObject(1).getString("principal"));
+       }       
+
+       /**
+        * Test to verify adding an ACE at a specific index inside 
+        * the ACL
+        */
+       public void testAddAceOrderByNumeric() throws IOException, 
JSONException {
+               createAceOrderTestFolderWithOneAce();
+               
+               testGroupId = createTestGroup();
+               addOrUpdateAce(testFolderUrl, testGroupId, true, "0");
+
+               //fetch the JSON for the acl to verify the settings.
+               String getUrl = testFolderUrl + ".acl.json";
+
+               Credentials creds = new UsernamePasswordCredentials("admin", 
"admin");
+               String json = getAuthenticatedContent(creds, getUrl, 
CONTENT_TYPE_JSON, null, HttpServletResponse.SC_OK);
+               assertNotNull(json);
+
+               JSONArray jsonArray = new JSONArray(json);
+               assertEquals(2, jsonArray.length());
+               
+               assertEquals(testGroupId, 
jsonArray.getJSONObject(0).getString("principal"));
+               assertEquals(testUserId, 
jsonArray.getJSONObject(1).getString("principal"));
+               
+               //add another principal between the testGroupId and testUserId
+               testUserId2 = createTestUser();
+               addOrUpdateAce(testFolderUrl, testUserId2, true, "1");
+
+               String json2 = getAuthenticatedContent(creds, getUrl, 
CONTENT_TYPE_JSON, null, HttpServletResponse.SC_OK);
+               assertNotNull(json2);
+
+               JSONArray jsonArray2 = new JSONArray(json2);
+               assertEquals(3, jsonArray2.length());
+               
+               assertEquals(testGroupId, 
jsonArray2.getJSONObject(0).getString("principal"));
+               assertEquals(testUserId2, 
jsonArray2.getJSONObject(1).getString("principal"));          
+               assertEquals(testUserId, 
jsonArray2.getJSONObject(2).getString("principal"));           
+       }       
+
+       /**
+        * Test to make sure modifying an existing ace without changing the 
order 
+        * leaves the ACE in the same position in the ACL
+        */
+       public void testUpdateAcePreservePosition() throws IOException, 
JSONException {
+               createAceOrderTestFolderWithOneAce();
+               
+               testGroupId = createTestGroup();
+
+               addOrUpdateAce(testFolderUrl, testGroupId, true, "first");
+
+               //update the ace to make sure the update does not change the 
ACE order
+               addOrUpdateAce(testFolderUrl, testGroupId, false, null);
+               
+               
+               //fetch the JSON for the acl to verify the settings.
+               String getUrl = testFolderUrl + ".acl.json";
+
+               Credentials creds = new UsernamePasswordCredentials("admin", 
"admin");
+               String json = getAuthenticatedContent(creds, getUrl, 
CONTENT_TYPE_JSON, null, HttpServletResponse.SC_OK);
+               assertNotNull(json);
+               
+               JSONArray jsonArray = new JSONArray(json);
+               assertEquals(2, jsonArray.length());
+               
+               assertEquals(testGroupId, 
jsonArray.getJSONObject(0).getString("principal"));
+               assertEquals(testUserId, 
jsonArray.getJSONObject(1).getString("principal"));
+       }       
+
+       
+       /**
+        * Helper to create a test folder with a single ACE pre-created
+        */
+       private void createAceOrderTestFolderWithOneAce() throws IOException, 
JSONException {
+               testUserId = createTestUser();
+               
+               testFolderUrl = createTestFolder();
+
+               addOrUpdateAce(testFolderUrl, testUserId, true, null);
+
+               //fetch the JSON for the acl to verify the settings.
+               String getUrl = testFolderUrl + ".acl.json";
+
+               Credentials creds = new UsernamePasswordCredentials("admin", 
"admin");
+               String json = getAuthenticatedContent(creds, getUrl, 
CONTENT_TYPE_JSON, null, HttpServletResponse.SC_OK);
+               assertNotNull(json);
+               JSONArray jsonArray = new JSONArray(json);
+               assertEquals(1, jsonArray.length());
+               
+               assertEquals(testUserId, 
jsonArray.getJSONObject(0).getString("principal"));
+       }
+       
+       /**
+        * Helper to add or update an ace for testing
+        */
+       private void addOrUpdateAce(String folderUrl, String principalId, 
boolean readGranted, String order) throws IOException, JSONException {
+        String postUrl = folderUrl + ".modifyAce.html";
+
+               //1. create an initial set of privileges
+               List<NameValuePair> postParams = new ArrayList<NameValuePair>();
+               postParams.add(new NameValuePair("principalId", principalId));
+               postParams.add(new NameValuePair("privil...@jcr:read", 
readGranted ? "granted" : "denied"));
+               postParams.add(new NameValuePair("privil...@jcr:write", 
"denied"));
+               if (order != null) {
+                       postParams.add(new NameValuePair("order", order));
+               }
+               
+               Credentials creds = new UsernamePasswordCredentials("admin", 
"admin");
+               assertAuthenticatedPostStatus(creds, postUrl, 
HttpServletResponse.SC_OK, postParams, null);
+       }
        
 }

Modified: 
sling/trunk/launchpad/testing/src/test/java/org/apache/sling/launchpad/webapp/integrationtest/accessManager/RemoveAcesTest.java
URL: 
http://svn.apache.org/viewvc/sling/trunk/launchpad/testing/src/test/java/org/apache/sling/launchpad/webapp/integrationtest/accessManager/RemoveAcesTest.java?rev=927532&r1=927531&r2=927532&view=diff
==============================================================================
--- 
sling/trunk/launchpad/testing/src/test/java/org/apache/sling/launchpad/webapp/integrationtest/accessManager/RemoveAcesTest.java
 (original)
+++ 
sling/trunk/launchpad/testing/src/test/java/org/apache/sling/launchpad/webapp/integrationtest/accessManager/RemoveAcesTest.java
 Thu Mar 25 18:34:30 2010
@@ -95,29 +95,36 @@ public class RemoveAcesTest extends Abst
                String json = getAuthenticatedContent(creds, getUrl, 
CONTENT_TYPE_JSON, null, HttpServletResponse.SC_OK);
                assertNotNull(json);
                
-               JSONObject jsonObj = new JSONObject(json);
-               String aceString = jsonObj.getString(testUserId);
-               assertNotNull(aceString);
-
-               JSONObject aceObject = new JSONObject(aceString);
+               JSONArray jsonArray = new JSONArray(json);
+               
+               if (addGroupAce) {
+                       assertEquals(2, jsonArray.length());
+               } else {
+                       assertEquals(1, jsonArray.length());
+               }
+               
+               JSONObject aceObject = jsonArray.optJSONObject(0);
                assertNotNull(aceObject);
                
-               JSONArray grantedArray = aceObject.getJSONArray("granted");
+               String principalString = aceObject.optString("principal");
+               assertEquals(testUserId, principalString);
+               
+               JSONArray grantedArray = aceObject.optJSONArray("granted");
                assertNotNull(grantedArray);
                assertEquals("jcr:read", grantedArray.getString(0));
 
-               JSONArray deniedArray = aceObject.getJSONArray("denied");
+               JSONArray deniedArray = aceObject.optJSONArray("denied");
                assertNotNull(deniedArray);
                assertEquals("jcr:write", deniedArray.getString(0));
 
                if (addGroupAce) {
-                       aceString = jsonObj.getString(testGroupId);
-                       assertNotNull(aceString);
-
-                       aceObject = new JSONObject(aceString);
+                       aceObject = jsonArray.optJSONObject(1);
                        assertNotNull(aceObject);
+                       
+                       principalString = aceObject.optString("principal");
+                       assertEquals(testGroupId, principalString);
 
-                       grantedArray = aceObject.getJSONArray("granted");
+                       grantedArray = aceObject.optJSONArray("granted");
                        assertNotNull(grantedArray);
                        assertEquals("jcr:read", grantedArray.getString(0));
                }
@@ -142,8 +149,9 @@ public class RemoveAcesTest extends Abst
                String json = getAuthenticatedContent(creds, getUrl, 
CONTENT_TYPE_JSON, null, HttpServletResponse.SC_OK);
                assertNotNull(json);
 
-               JSONObject jsonObj = new JSONObject(json);
-               assertTrue(jsonObj.isNull(testUserId));
+               JSONArray jsonArray = new JSONArray(json);
+               assertNotNull(jsonArray);
+               assertEquals(0, jsonArray.length());
        }
 
        //test removing multiple aces
@@ -164,8 +172,8 @@ public class RemoveAcesTest extends Abst
                String json = getAuthenticatedContent(creds, getUrl, 
CONTENT_TYPE_JSON, null, HttpServletResponse.SC_OK);
                assertNotNull(json);
 
-               JSONObject jsonObj = new JSONObject(json);
-               assertTrue(jsonObj.isNull(testUserId));
-               assertTrue(jsonObj.isNull(testGroupId));
+               JSONArray jsonArray = new JSONArray(json);
+               assertNotNull(jsonArray);
+               assertEquals(0, jsonArray.length());
        }
 }


Reply via email to