Author: stillalex
Date: Tue Mar 12 14:40:14 2019
New Revision: 1855333

URL: http://svn.apache.org/viewvc?rev=1855333&view=rev
Log:
OAK-8078 UserPrincipalProvider support for range search


Modified:
    
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/user/UserPrincipalProvider.java
    
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/security/principal/AbstractPrincipalProviderTest.java
    
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/security/user/UserPrincipalProviderTest.java

Modified: 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/user/UserPrincipalProvider.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/user/UserPrincipalProvider.java?rev=1855333&r1=1855332&r2=1855333&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/user/UserPrincipalProvider.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/user/UserPrincipalProvider.java
 Tue Mar 12 14:40:14 2019
@@ -155,10 +155,21 @@ class UserPrincipalProvider implements P
         return principals;
     }
 
+    @Override
+    public Iterator<? extends Principal> findPrincipals(final String nameHint, 
final int searchType) {
+        return findPrincipals(nameHint, searchType, 0, -1);
+    }
+
     @NotNull
     @Override
-    public Iterator<? extends Principal> findPrincipals(final String nameHint,
-                                                        final int searchType) {
+    public Iterator<? extends Principal> findPrincipals(final String nameHint, 
final int searchType, long offset,
+            long limit) {
+        if (offset < 0) {
+            offset = 0;
+        }
+        if (limit < 0) {
+            limit = Long.MAX_VALUE;
+        }
         try {
             AuthorizableType type = AuthorizableType.getType(searchType);
             StringBuilder statement = new StringBuilder()
@@ -166,17 +177,19 @@ class UserPrincipalProvider implements P
                     
.append("//element(*,").append(QueryUtil.getNodeTypeName(type)).append(')')
                     .append("[jcr:like(@rep:principalName,'")
                     .append(buildSearchPattern(nameHint))
-                    .append("')]");
+                    .append("')] order by @rep:principalName");
 
             Result result = root.getQueryEngine().executeQuery(
                     statement.toString(), javax.jcr.query.Query.XPATH,
-                    NO_BINDINGS, namePathMapper.getSessionLocalMappings());
+                    limit, offset, NO_BINDINGS, 
namePathMapper.getSessionLocalMappings());
 
             Iterator<Principal> principals = Iterators.filter(
                     Iterators.transform(result.getRows().iterator(), new 
ResultRowToPrincipal()),
                     Predicates.notNull());
 
-            if (matchesEveryone(nameHint, searchType)) {
+            // everyone is injected only in complete set, not on pages
+            boolean noRange = offset == 0 && limit == Long.MAX_VALUE;
+            if (noRange && matchesEveryone(nameHint, searchType)) {
                 principals = Iterators.concat(principals, 
Iterators.singletonIterator(EveryonePrincipal.getInstance()));
                 return Iterators.filter(principals, new EveryonePredicate());
             } else {

Modified: 
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/security/principal/AbstractPrincipalProviderTest.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/security/principal/AbstractPrincipalProviderTest.java?rev=1855333&r1=1855332&r2=1855333&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/security/principal/AbstractPrincipalProviderTest.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/security/principal/AbstractPrincipalProviderTest.java
 Tue Mar 12 14:40:14 2019
@@ -62,6 +62,9 @@ public abstract class AbstractPrincipalP
     protected String groupId2;
     protected Group testGroup2;
 
+    protected String groupId3;
+    protected Group testGroup3;
+
     @Override
     public void before() throws Exception {
         super.before();
@@ -73,10 +76,13 @@ public abstract class AbstractPrincipalP
         testGroup = getUserManager(root).createGroup(groupId);
         testGroup.addMember(getTestUser());
 
-        groupId2 = "testGroup2" + UUID.randomUUID();
+        groupId2 = "testGroup" + UUID.randomUUID() + "2";
         testGroup2 = getUserManager(root).createGroup(groupId2);
         testGroup.addMember(testGroup2);
 
+        groupId3 = "testGroup" + UUID.randomUUID() + "3";
+        testGroup3 = getUserManager(root).createGroup(groupId3);
+
         root.commit();
 
         principalProvider = createPrincipalProvider();
@@ -87,16 +93,13 @@ public abstract class AbstractPrincipalP
     public void after() throws Exception {
         try {
             root.refresh();
-            Group gr = getUserManager(root).getAuthorizable(groupId, 
Group.class);
-            if (gr != null) {
-                gr.remove();
-                root.commit();
-            }
-
-            gr = getUserManager(root).getAuthorizable(groupId2, Group.class);
-            if (gr != null) {
-                gr.remove();
-                root.commit();
+            String[] rm = new String[] { groupId, groupId2, groupId3 };
+            for (String id : rm) {
+                Group gr = getUserManager(root).getAuthorizable(id, 
Group.class);
+                if (gr != null) {
+                    gr.remove();
+                    root.commit();
+                }
             }
         } finally {
             super.after();

Modified: 
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/security/user/UserPrincipalProviderTest.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/security/user/UserPrincipalProviderTest.java?rev=1855333&r1=1855332&r2=1855333&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/security/user/UserPrincipalProviderTest.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/security/user/UserPrincipalProviderTest.java
 Tue Mar 12 14:40:14 2019
@@ -17,11 +17,17 @@
 package org.apache.jackrabbit.oak.security.user;
 
 import java.security.Principal;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
 import java.util.Enumeration;
+import java.util.Iterator;
+import java.util.List;
 import java.util.Set;
 import java.util.UUID;
 
 import org.apache.jackrabbit.api.security.principal.GroupPrincipal;
+import org.apache.jackrabbit.api.security.principal.PrincipalManager;
 import org.apache.jackrabbit.api.security.user.Authorizable;
 import org.apache.jackrabbit.api.security.user.Group;
 import org.apache.jackrabbit.api.security.user.User;
@@ -32,6 +38,7 @@ import org.apache.jackrabbit.oak.spi.sec
 import org.apache.jackrabbit.oak.spi.security.principal.PrincipalProvider;
 import org.junit.Test;
 
+import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertTrue;
 
 public class UserPrincipalProviderTest extends AbstractPrincipalProviderTest {
@@ -202,4 +209,31 @@ public class UserPrincipalProviderTest e
             root.commit();
         }
     }
+
+    @Test
+    public void testFindRange() throws Exception {
+        List<String> expected = Arrays.asList(groupId, groupId2, groupId3);
+        Collections.sort(expected);
+
+        for (int offset = 0; offset < expected.size() + 1; offset++) {
+            for (int limit = -1; limit < expected.size() + 2; limit++) {
+                int to = expected.size();
+                if (limit >= 0) {
+                    to = Math.min(offset + limit, to);
+                }
+                List<String> sub = expected.subList(offset, to);
+                Iterator<? extends Principal> i1 = 
principalProvider.findPrincipals("testGroup",
+                        PrincipalManager.SEARCH_TYPE_ALL, offset, limit);
+                assertEquals(sub, getNames(i1));
+            }
+        }
+    }
+
+    private static List<String> getNames(Iterator<? extends Principal> i) {
+        List<String> l = new ArrayList<>();
+        while (i.hasNext()) {
+            l.add(i.next().getName());
+        }
+        return l;
+    }
 }


Reply via email to