[SYNCOPE-1224] Properly using pagination for search
Project: http://git-wip-us.apache.org/repos/asf/syncope/repo Commit: http://git-wip-us.apache.org/repos/asf/syncope/commit/fdc991aa Tree: http://git-wip-us.apache.org/repos/asf/syncope/tree/fdc991aa Diff: http://git-wip-us.apache.org/repos/asf/syncope/diff/fdc991aa Branch: refs/heads/master Commit: fdc991aa67cb9d3093948d7bb87f6b70317aa825 Parents: a799dbc Author: Francesco Chicchiriccò <ilgro...@apache.org> Authored: Mon Oct 16 11:12:02 2017 +0200 Committer: Francesco Chicchiriccò <ilgro...@apache.org> Committed: Mon Oct 16 11:14:32 2017 +0200 ---------------------------------------------------------------------- .../client/cli/commands/user/UserDetails.java | 6 ++-- .../client/cli/commands/user/UserList.java | 5 +-- .../commands/user/UserSyncopeOperations.java | 35 +++++++++++++++----- 3 files changed, 30 insertions(+), 16 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/syncope/blob/fdc991aa/client/cli/src/main/java/org/apache/syncope/client/cli/commands/user/UserDetails.java ---------------------------------------------------------------------- diff --git a/client/cli/src/main/java/org/apache/syncope/client/cli/commands/user/UserDetails.java b/client/cli/src/main/java/org/apache/syncope/client/cli/commands/user/UserDetails.java index 59bbf3a..ade6cb3 100644 --- a/client/cli/src/main/java/org/apache/syncope/client/cli/commands/user/UserDetails.java +++ b/client/cli/src/main/java/org/apache/syncope/client/cli/commands/user/UserDetails.java @@ -43,12 +43,12 @@ public class UserDetails extends AbstractUserCommand { if (input.parameterNumber() == 0) { try { final Map<String, String> details = new LinkedHashMap<>(); - final List<UserTO> usersTOs = userSyncopeOperations.list().getResult(); + final List<UserTO> users = userSyncopeOperations.list(); int withoutResource = 0; int withoutRole = 0; int activeStatus = 0; int suspendedStatus = 0; - for (final UserTO userTO : usersTOs) { + for (final UserTO userTO : users) { if (userTO.getResources().isEmpty()) { withoutResource++; } @@ -61,7 +61,7 @@ public class UserDetails extends AbstractUserCommand { suspendedStatus++; } } - details.put("Total number", String.valueOf(usersTOs.size())); + details.put("Total number", String.valueOf(users.size())); details.put("Active", String.valueOf(activeStatus)); details.put("Suspended", String.valueOf(suspendedStatus)); details.put("Without resources", String.valueOf(withoutResource)); http://git-wip-us.apache.org/repos/asf/syncope/blob/fdc991aa/client/cli/src/main/java/org/apache/syncope/client/cli/commands/user/UserList.java ---------------------------------------------------------------------- diff --git a/client/cli/src/main/java/org/apache/syncope/client/cli/commands/user/UserList.java b/client/cli/src/main/java/org/apache/syncope/client/cli/commands/user/UserList.java index 48be66c..d83b734 100644 --- a/client/cli/src/main/java/org/apache/syncope/client/cli/commands/user/UserList.java +++ b/client/cli/src/main/java/org/apache/syncope/client/cli/commands/user/UserList.java @@ -21,8 +21,6 @@ package org.apache.syncope.client.cli.commands.user; import java.util.Scanner; import org.apache.syncope.client.cli.Input; import org.apache.syncope.common.lib.SyncopeClientException; -import org.apache.syncope.common.lib.to.PagedResult; -import org.apache.syncope.common.lib.to.UserTO; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -46,8 +44,7 @@ public class UserList extends AbstractUserCommand { "\nThis operation might produce very large output. Do you want to continue? [yes/no]"); final String answer = scanIn.nextLine(); if ("yes".equalsIgnoreCase(answer)) { - final PagedResult<UserTO> uResult = userSyncopeOperations.list(); - userResultManager.printUsers(uResult.getResult()); + userResultManager.printUsers(userSyncopeOperations.list()); } else if ("no".equalsIgnoreCase(answer)) { userResultManager.genericError("List operation skipped"); } else { http://git-wip-us.apache.org/repos/asf/syncope/blob/fdc991aa/client/cli/src/main/java/org/apache/syncope/client/cli/commands/user/UserSyncopeOperations.java ---------------------------------------------------------------------- diff --git a/client/cli/src/main/java/org/apache/syncope/client/cli/commands/user/UserSyncopeOperations.java b/client/cli/src/main/java/org/apache/syncope/client/cli/commands/user/UserSyncopeOperations.java index 6efa544..42fb5a3 100644 --- a/client/cli/src/main/java/org/apache/syncope/client/cli/commands/user/UserSyncopeOperations.java +++ b/client/cli/src/main/java/org/apache/syncope/client/cli/commands/user/UserSyncopeOperations.java @@ -18,6 +18,7 @@ */ package org.apache.syncope.client.cli.commands.user; +import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.stream.Collectors; @@ -26,7 +27,6 @@ import org.apache.syncope.client.lib.SyncopeClient; import org.apache.syncope.common.lib.to.BulkAction; import org.apache.syncope.common.lib.to.BulkActionResult; import org.apache.syncope.common.lib.to.EntityTO; -import org.apache.syncope.common.lib.to.PagedResult; import org.apache.syncope.common.lib.to.UserTO; import org.apache.syncope.common.rest.api.beans.AnyQuery; import org.apache.syncope.common.rest.api.service.UserService; @@ -47,23 +47,40 @@ public class UserSyncopeOperations { } public List<UserTO> searchByRole(final String realm, final String role) { - return userService.search(new AnyQuery.Builder().realm(realm). - fiql(SyncopeClient.getUserSearchConditionBuilder().inRoles(role).query()).build()).getResult(); + return search(new AnyQuery.Builder().realm(realm). + fiql(SyncopeClient.getUserSearchConditionBuilder().inRoles(role).query()).build()); } public List<UserTO> searchByResource(final String realm, final String resource) { - return userService.search(new AnyQuery.Builder().realm(realm). - fiql(SyncopeClient.getUserSearchConditionBuilder().hasResources(resource).query()).build()).getResult(); + return search(new AnyQuery.Builder().realm(realm). + fiql(SyncopeClient.getUserSearchConditionBuilder().hasResources(resource).query()).build()); } public List<UserTO> searchByAttribute(final String realm, final String attributeName, final String attributeValue) { - return userService.search(new AnyQuery.Builder().realm(realm). + return search(new AnyQuery.Builder().realm(realm). fiql(SyncopeClient.getUserSearchConditionBuilder().is(attributeName).equalTo(attributeValue).query()). - build()).getResult(); + build()); + } + + public List<UserTO> list() { + return search(new AnyQuery()); } - public PagedResult<UserTO> list() { - return userService.search(new AnyQuery()); + private List<UserTO> search(final AnyQuery query) { + query.setPage(0); + query.setSize(0); + int count = userService.search(query).getTotalCount(); + + List<UserTO> result = new ArrayList<>(); + + query.setSize(PAGE_SIZE); + for (int page = 1; page <= (count / PAGE_SIZE) + 1; page++) { + query.setPage(page); + + result.addAll(userService.search(query).getResult()); + } + + return result; } public UserTO read(final String userKey) {