Adding pagination support to sample groovy script for usage with Scripted REST connector
Project: http://git-wip-us.apache.org/repos/asf/syncope/repo Commit: http://git-wip-us.apache.org/repos/asf/syncope/commit/4f6fa1a2 Tree: http://git-wip-us.apache.org/repos/asf/syncope/tree/4f6fa1a2 Diff: http://git-wip-us.apache.org/repos/asf/syncope/diff/4f6fa1a2 Branch: refs/heads/master Commit: 4f6fa1a252f399b225df4c7a73c66201b1ffbd51 Parents: e073cc4 Author: Francesco Chicchiriccò <ilgro...@apache.org> Authored: Thu Mar 1 17:21:15 2018 +0100 Committer: Francesco Chicchiriccò <ilgro...@apache.org> Committed: Fri Mar 2 12:13:41 2018 +0100 ---------------------------------------------------------------------- .../src/test/resources/rest/SearchScript.groovy | 40 ++++++++++++++++++-- 1 file changed, 37 insertions(+), 3 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/syncope/blob/4f6fa1a2/fit/core-reference/src/test/resources/rest/SearchScript.groovy ---------------------------------------------------------------------- diff --git a/fit/core-reference/src/test/resources/rest/SearchScript.groovy b/fit/core-reference/src/test/resources/rest/SearchScript.groovy index 118da8a..ba7a2e8 100644 --- a/fit/core-reference/src/test/resources/rest/SearchScript.groovy +++ b/fit/core-reference/src/test/resources/rest/SearchScript.groovy @@ -22,6 +22,7 @@ import com.fasterxml.jackson.databind.node.ObjectNode import javax.ws.rs.core.Response import org.apache.cxf.jaxrs.client.WebClient import org.identityconnectors.common.security.GuardedString +import org.identityconnectors.framework.common.objects.OperationOptions; // Parameters: // The connector sends the following: @@ -66,6 +67,24 @@ def buildConnectorObject(node) { log.info("Entering " + action + " Script"); +// ---------------- +// Manage pagination +// ---------------- +def offset = options[OperationOptions.OP_PAGED_RESULTS_COOKIE] == null +? 0 +: options[OperationOptions.OP_PAGED_RESULTS_COOKIE].toInteger(); + +def pageSize = options[OperationOptions.OP_PAGE_SIZE] == null +? 100 +: options[OperationOptions.OP_PAGE_SIZE].toInteger(); + +def limit = offset + pageSize; + +log.ok("pagedResultsCookie: " + offset); +log.ok("pageSize: " + pageSize); +log.ok("limit: " + limit); +// ---------------- + WebClient webClient = client; ObjectMapper mapper = new ObjectMapper(); @@ -76,10 +95,11 @@ case "__ACCOUNT__": if (query == null || (!query.get("left").equals("__UID__") && !query.get("conditionType").equals("EQUALS"))) { webClient.path("/users"); Response response = webClient.get(); - ArrayNode node = mapper.readTree(response.getEntity()); + ArrayNode nodes = mapper.readTree(response.getEntity()); - for (i = 0; i < node.size(); i++) { - result.add(buildConnectorObject(node.get(i))); + // beware: this is not enforcing any server-side pagination feature + for (i = offset; i < (limit < nodes.size() ? limit: nodes.size()); i++) { + result.add(buildConnectorObject(nodes.get(i))); } } else { webClient.path("/users/" + query.get("right")); @@ -98,4 +118,18 @@ default: result; } +// ---------------- +// Return paged result cookie +// ---------------- +def pagedResultCookieLine = [:] +if (pageSize > result.size()) { + // no more results + pagedResultCookieLine.put(OperationOptions.OP_PAGED_RESULTS_COOKIE, null); +} else { + pagedResultCookieLine.put(OperationOptions.OP_PAGED_RESULTS_COOKIE, "" + limit); +} + +result.add(pagedResultCookieLine); +// ---------------- + return result;