diff --git a/src/main/java/com/evolveum/polygon/connector/grouper/rest/AbstractGroupProcessor.java b/src/main/java/com/evolveum/polygon/connector/grouper/rest/AbstractGroupProcessor.java index 991cb7c..410b235 100644 --- a/src/main/java/com/evolveum/polygon/connector/grouper/rest/AbstractGroupProcessor.java +++ b/src/main/java/com/evolveum/polygon/connector/grouper/rest/AbstractGroupProcessor.java @@ -58,8 +58,8 @@ void read(Filter filter, ResultsHandler handler, OperationOptions options) { } } - void getGroupByUuid(String uuid, ResultsHandler handler, OperationOptions options) { - getGroupByUuid(uuid, handler); + boolean getGroupByUuid(String uuid, ResultsHandler handler, OperationOptions options) { + return getGroupByUuid(uuid, handler); } void getGroupByName(String name, ResultsHandler handler, OperationOptions options) { @@ -68,7 +68,7 @@ void getGroupByName(String name, ResultsHandler handler, OperationOptions option abstract void getAllGroups(ResultsHandler handler, OperationOptions options); - void executeFindGroupsResponse(HttpPost request, JSONObject body, ResultsHandler handler) { + boolean executeFindGroupsResponse(HttpPost request, JSONObject body, ResultsHandler handler) { System.out.println("Request = " + body.toString()); JSONObject response = processor.callRequest(request, body, true, CONTENT_TYPE_JSON); System.out.println("Got response: " + response); @@ -77,10 +77,11 @@ void executeFindGroupsResponse(HttpPost request, JSONObject body, ResultsHandler if (groups != null) { for (Object group : groups) { if (!handleGroupJsonObject(group, handler)) { - return; + return false; } } } + return true; } void executeFindGroupsAsMembersResponse(HttpPost request, JSONObject body, ResultsHandler handler) { @@ -111,7 +112,7 @@ void getGroupByName(String groupName, ResultsHandler handler) { } } - void getGroupByUuid(String groupUuid, ResultsHandler handler) { + boolean getGroupByUuid(String groupUuid, ResultsHandler handler) { URIBuilder uriBuilder = processor.getURIBuilder() .setPath(URI_BASE_PATH + PATH_GROUPS); try { @@ -120,7 +121,7 @@ void getGroupByUuid(String groupUuid, ResultsHandler handler) { .put("WsRestFindGroupsRequest", new JSONObject() .put("wsGroupLookups", new JSONObject[] { new JSONObject() .put("uuid", groupUuid) })); - executeFindGroupsResponse(request, body, handler); + return executeFindGroupsResponse(request, body, handler); } catch (RuntimeException | URISyntaxException e) { throw processor.processException(e, uriBuilder, "Get all groups"); } diff --git a/src/main/java/com/evolveum/polygon/connector/grouper/rest/PlainGroupProcessor.java b/src/main/java/com/evolveum/polygon/connector/grouper/rest/PlainGroupProcessor.java index 4443ff0..e4d5d44 100644 --- a/src/main/java/com/evolveum/polygon/connector/grouper/rest/PlainGroupProcessor.java +++ b/src/main/java/com/evolveum/polygon/connector/grouper/rest/PlainGroupProcessor.java @@ -55,11 +55,22 @@ ObjectClassInfoBuilder buildSchema() { return builder; } - protected void getAllGroups(ResultsHandler handler, OperationOptions options) { + protected void getAllGroups(final ResultsHandler handler, final OperationOptions options) { boolean isGetMembers = isGetMembers(options); - if (isGetMembers) { - throw new IllegalArgumentException("Cannot get members when retrieving all groups"); + if (!isGetMembers) { + getAllGroupsNoMembers(handler); + } else { + ResultsHandler localHandler = new ResultsHandler() { + @Override + public boolean handle(ConnectorObject connectorObject) { + return getGroupByUuid(connectorObject.getUid().getUidValue(), handler, options); + } + }; + getAllGroupsNoMembers(localHandler); } + } + + private void getAllGroupsNoMembers(ResultsHandler handler) { URIBuilder uriBuilder = processor.getURIBuilder() .setPath(URI_BASE_PATH + PATH_GROUPS); try { @@ -77,9 +88,9 @@ protected void getAllGroups(ResultsHandler handler, OperationOptions options) { } @Override - void getGroupByUuid(String uuid, ResultsHandler handler, OperationOptions options) { + boolean getGroupByUuid(String uuid, ResultsHandler handler, OperationOptions options) { if (!isGetMembers(options)) { - getGroupByUuid(uuid, handler); + return getGroupByUuid(uuid, handler); } else { URIBuilder uriBuilder = processor.getURIBuilder() .setPath(URI_BASE_PATH + PATH_GROUPS); @@ -90,7 +101,7 @@ void getGroupByUuid(String uuid, ResultsHandler handler, OperationOptions option .put("wsGroupLookups", new JSONObject[] { new JSONObject() .put("uuid", uuid) }) .put("includeSubjectDetail", true)); - executeGetGroupWithMembersResponse(request, body, handler); + return executeGetGroupWithMembersResponse(request, body, handler); } catch (RuntimeException | URISyntaxException e) { throw processor.processException(e, uriBuilder, "Get all groups"); } @@ -119,7 +130,7 @@ void getGroupByName(String name, ResultsHandler handler, OperationOptions option } } - private void executeGetGroupWithMembersResponse(HttpPost request, JSONObject body, ResultsHandler handler) { + private boolean executeGetGroupWithMembersResponse(HttpPost request, JSONObject body, ResultsHandler handler) { System.out.println("Request = " + body.toString()); JSONObject response = processor.callRequest(request, body, true, CONTENT_TYPE_JSON); System.out.println("Got response: " + response); @@ -136,23 +147,25 @@ private void executeGetGroupWithMembersResponse(HttpPost request, JSONObject bod builder.addAttribute(ATTR_EXTENSION, extension); List subjects = new ArrayList<>(); - JSONArray members = processor.getArray(response, WS_GET_MEMBERS_RESULTS, RESULTS, WS_SUBJECTS); - for (Object memberObject : members) { - JSONObject member = (JSONObject) memberObject; - String sourceId = processor.getStringOrNull(member, "sourceId"); - if (sourceId == null || !sourceId.equals(getConfiguration().getSubjectSource())) { - LOG.info("Skipping non-person member (source={0})", sourceId); - continue; - } - String subjectId = processor.getStringOrNull(member, "id"); - if (subjectId != null) { - subjects.add(subjectId); - } else { - LOG.info("Skipping unnamed member (source={0})", member); + JSONArray members = processor.getArray(response, false, WS_GET_MEMBERS_RESULTS, RESULTS, WS_SUBJECTS); + if (members != null) { + for (Object memberObject : members) { + JSONObject member = (JSONObject) memberObject; + String sourceId = processor.getStringOrNull(member, "sourceId"); + if (sourceId == null || !sourceId.equals(getConfiguration().getSubjectSource())) { + LOG.info("Skipping non-person member (source={0})", sourceId); + continue; + } + String subjectId = processor.getStringOrNull(member, "id"); + if (subjectId != null) { + subjects.add(subjectId); + } else { + LOG.info("Skipping unnamed member (source={0})", member); + } } + builder.addAttribute(ATTR_MEMBER, subjects); } - builder.addAttribute(ATTR_MEMBER, subjects); - handler.handle(builder.build()); + return handler.handle(builder.build()); } @Override diff --git a/src/test/java/com/evolveum/polygon/connector/grouper/test/PlainGroupTests.java b/src/test/java/com/evolveum/polygon/connector/grouper/test/PlainGroupTests.java index caeb719..b9722e3 100644 --- a/src/test/java/com/evolveum/polygon/connector/grouper/test/PlainGroupTests.java +++ b/src/test/java/com/evolveum/polygon/connector/grouper/test/PlainGroupTests.java @@ -120,10 +120,13 @@ public void allGroups() { } } - @Test(priority = 16, expectedExceptions = IllegalArgumentException.class) + @Test(priority = 16) public void allGroupsWithMembers() { results.clear(); grouperConnector.executeQuery(PLAIN_GROUP, null, handler, getMembersOptions()); + for (ConnectorObject group : results) { + System.out.println("Found group: " + group); + } } @Test(priority = 20)