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;
- }
}