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