Author: stillalex
Date: Tue Mar 12 18:15:22 2019
New Revision: 1855340

URL: http://svn.apache.org/viewvc?rev=1855340&view=rev
Log:
OAK-8125 PrincipalProviderImpl support for range search


Modified:
    
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/principal/PrincipalProviderImpl.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/principal/PrincipalProviderImpl.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/principal/PrincipalProviderImpl.java?rev=1855340&r1=1855339&r2=1855340&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/principal/PrincipalProviderImpl.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/principal/PrincipalProviderImpl.java
 Tue Mar 12 18:15:22 2019
@@ -25,6 +25,7 @@ import org.apache.jackrabbit.api.securit
 import org.apache.jackrabbit.api.security.user.Authorizable;
 import org.apache.jackrabbit.api.security.user.Query;
 import org.apache.jackrabbit.api.security.user.QueryBuilder;
+import org.apache.jackrabbit.api.security.user.QueryBuilder.Direction;
 import org.apache.jackrabbit.api.security.user.UserManager;
 import org.apache.jackrabbit.oak.api.Root;
 import org.apache.jackrabbit.oak.namepath.NamePathMapper;
@@ -129,15 +130,29 @@ class PrincipalProviderImpl implements P
 
     @NotNull
     @Override
-    public Iterator<? extends Principal> findPrincipals(@Nullable final String 
nameHint,
-                                                        final int searchType) {
+    public Iterator<? extends Principal> findPrincipals(@Nullable 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, long offset,
+            long limit) {
+        if (offset < 0) {
+            offset = 0;
+        }
+        if (limit < 0) {
+            limit = Long.MAX_VALUE;
+        }
         try {
-            Iterator<Authorizable> authorizables = findAuthorizables(nameHint, 
searchType);
+            Iterator<Authorizable> authorizables = findAuthorizables(nameHint, 
searchType, offset, limit);
             Iterator<Principal> principals = Iterators.transform(
                     Iterators.filter(authorizables, Predicates.notNull()),
                     new AuthorizableToPrincipal());
 
-            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 {
@@ -183,12 +198,15 @@ class PrincipalProviderImpl implements P
     }
 
     private Iterator<Authorizable> findAuthorizables(@Nullable final String 
nameHint,
-                                                     final int searchType) 
throws RepositoryException {
+                                                     final int searchType, 
final long offset,
+                                                     final long limit) throws 
RepositoryException {
         Query userQuery = new Query() {
             @Override
             public <T> void build(QueryBuilder<T> builder) {
                 builder.setCondition(builder.like('@' 
+UserConstants.REP_PRINCIPAL_NAME, buildSearchPattern(nameHint)));
                 
builder.setSelector(AuthorizableType.getType(searchType).getAuthorizableClass());
+                builder.setSortOrder(UserConstants.REP_PRINCIPAL_NAME, 
Direction.ASCENDING);
+                builder.setLimit(offset, limit);
             }
         };
         return userManager.findAuthorizables(userQuery);

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=1855340&r1=1855339&r2=1855340&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 18:15:22 2019
@@ -18,8 +18,9 @@ package org.apache.jackrabbit.oak.securi
 
 import java.security.Principal;
 import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
 import java.util.HashMap;
-import java.util.HashSet;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
@@ -366,12 +367,7 @@ public abstract class AbstractPrincipalP
 
             root.commit();
 
-            Set<String> resultNames = new HashSet<String>();
-            Iterator<? extends Principal> principals = 
principalProvider.findPrincipals(PrincipalManager.SEARCH_TYPE_ALL);
-            while (principals.hasNext()) {
-                resultNames.add(principals.next().getName());
-            }
-
+            List<String> resultNames = 
getNames(principalProvider.findPrincipals(PrincipalManager.SEARCH_TYPE_ALL));
             assertTrue(resultNames.contains(EveryonePrincipal.NAME));
             assertTrue(resultNames.contains("TestUser"));
             assertTrue(resultNames.contains("TestGroup"));
@@ -406,4 +402,31 @@ public abstract class AbstractPrincipalP
             }
         }
     }
+
+    @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));
+            }
+        }
+    }
+
+    protected static List<String> getNames(Iterator<? extends Principal> i) {
+        List<String> l = new ArrayList<>();
+        while (i.hasNext()) {
+            l.add(i.next().getName());
+        }
+        return l;
+    }
 }

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=1855340&r1=1855339&r2=1855340&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 18:15:22 2019
@@ -17,17 +17,11 @@
 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;
@@ -38,7 +32,6 @@ 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 {
@@ -209,31 +202,4 @@ 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