From 00e9021ccaa24b37d759bc3151481b8c87c779d7 Mon Sep 17 00:00:00 2001 From: Pavol Mederly Date: Tue, 11 Jun 2019 17:44:19 +0200 Subject: [PATCH] Add support for "plain groups" In this mode the Grouper resource is seen as a set of groups, each consisting of a set of members IDs. --- pom.xml | 2 +- ...essor.java => AbstractGroupProcessor.java} | 90 ++++------ .../grouper/rest/GrouperConfiguration.java | 34 ++++ .../grouper/rest/GrouperConnector.java | 27 ++- .../grouper/rest/PlainGroupProcessor.java | 167 ++++++++++++++++++ .../connector/grouper/rest/Processor.java | 41 ++++- .../grouper/rest/StandardGroupProcessor.java | 68 +++++++ .../grouper/test/GrouperTestHelper.java | 1 + .../grouper/test/PlainGroupTests.java | 149 ++++++++++++++++ ...roupTests.java => StandardGroupTests.java} | 2 +- 10 files changed, 500 insertions(+), 81 deletions(-) rename src/main/java/com/evolveum/polygon/connector/grouper/rest/{GroupProcessor.java => AbstractGroupProcessor.java} (68%) create mode 100644 src/main/java/com/evolveum/polygon/connector/grouper/rest/PlainGroupProcessor.java create mode 100644 src/main/java/com/evolveum/polygon/connector/grouper/rest/StandardGroupProcessor.java create mode 100644 src/test/java/com/evolveum/polygon/connector/grouper/test/PlainGroupTests.java rename src/test/java/com/evolveum/polygon/connector/grouper/test/{GroupTests.java => StandardGroupTests.java} (97%) diff --git a/pom.xml b/pom.xml index d37b3e5..afddb46 100644 --- a/pom.xml +++ b/pom.xml @@ -27,7 +27,7 @@ connector-grouper-rest - 0.2 + 0.3 jar Grouper REST Connector diff --git a/src/main/java/com/evolveum/polygon/connector/grouper/rest/GroupProcessor.java b/src/main/java/com/evolveum/polygon/connector/grouper/rest/AbstractGroupProcessor.java similarity index 68% rename from src/main/java/com/evolveum/polygon/connector/grouper/rest/GroupProcessor.java rename to src/main/java/com/evolveum/polygon/connector/grouper/rest/AbstractGroupProcessor.java index d9f9bcf..991cb7c 100644 --- a/src/main/java/com/evolveum/polygon/connector/grouper/rest/GroupProcessor.java +++ b/src/main/java/com/evolveum/polygon/connector/grouper/rest/AbstractGroupProcessor.java @@ -1,16 +1,3 @@ -/******************************************************************************* - * Copyright 2017 Evolveum - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and limitations under the License. - ******************************************************************************/ package com.evolveum.polygon.connector.grouper.rest; import org.apache.http.client.methods.HttpPost; @@ -26,33 +13,20 @@ import static com.evolveum.polygon.connector.grouper.rest.Processor.*; /** - * @author surmanek - * @author mederly * */ -class GroupProcessor { +public abstract class AbstractGroupProcessor { - private final Processor processor; + protected static final String ATTR_EXTENSION = "extension"; + protected final Processor processor; - private static final String ATTR_EXTENSION = "extension"; - - GroupProcessor(Processor processor) { + public AbstractGroupProcessor(Processor processor) { this.processor = processor; } - ObjectClassInfoBuilder buildSchema() { - ObjectClassInfoBuilder builder = new ObjectClassInfoBuilder(); - - builder.setType(ObjectClass.GROUP_NAME); - AttributeInfoBuilder extension = new AttributeInfoBuilder(ATTR_EXTENSION, String.class); - builder.addAttributeInfo(extension.build()); - - return builder; - } - void read(Filter filter, ResultsHandler handler, OperationOptions options) { if (filter == null) { - getAllGroups(handler); + getAllGroups(handler, options); } else if (filter instanceof EqualsFilter && ((EqualsFilter) filter).getAttribute() instanceof Name) { Attribute name = ((EqualsFilter) filter).getAttribute(); if (name != null) { @@ -61,7 +35,7 @@ void read(Filter filter, ResultsHandler handler, OperationOptions options) { } else if (name.getValue().size() > 1) { throw new IllegalArgumentException("More than one group name to look for: " + name.getValue()); } else { - getGroupByName((String) name.getValue().get(0), handler); + getGroupByName((String) name.getValue().get(0), handler, options); } } else { processor.throwNullAttrException(filter); @@ -74,7 +48,7 @@ void read(Filter filter, ResultsHandler handler, OperationOptions options) { } else if (name.getValue().size() > 1) { throw new IllegalArgumentException("More than one group UUID to look for: " + name.getValue()); } else { - getGroupByUuid((String) name.getValue().get(0), handler); + getGroupByUuid((String) name.getValue().get(0), handler, options); } } else { processor.throwNullAttrException(filter); @@ -84,37 +58,32 @@ void read(Filter filter, ResultsHandler handler, OperationOptions options) { } } - private void getAllGroups(ResultsHandler handler) { - URIBuilder uriBuilder = processor.getURIBuilder() - .setPath(URI_BASE_PATH + PATH_GROUPS); - try { - HttpPost request = new HttpPost(uriBuilder.build()); - JSONObject body = new JSONObject() - .put("WsRestGetMembersRequest", new JSONObject() - .put("wsGroupLookups", new JSONObject[] { new JSONObject() - .put("groupName", getConfiguration().getSuperGroup()) }) - .put("includeSubjectDetail", true) - .put("memberFilter", "Immediate")); - executeFindGroupsAsMembersResponse(request, body, handler); - } catch (RuntimeException | URISyntaxException e) { - throw processor.processException(e, uriBuilder, "Get all groups"); - } + void getGroupByUuid(String uuid, ResultsHandler handler, OperationOptions options) { + getGroupByUuid(uuid, handler); + } + + void getGroupByName(String name, ResultsHandler handler, OperationOptions options) { + getGroupByName(name, handler); } - private void executeFindGroupsResponse(HttpPost request, JSONObject body, ResultsHandler handler) { + abstract void getAllGroups(ResultsHandler handler, OperationOptions options); + + void 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); processor.checkSuccess(response, "WsFindGroupsResults"); - JSONArray groups = processor.getArray(response, "WsFindGroupsResults", "groupResults"); - for (Object group : groups) { - if (!handleGroupJsonObject(group, handler)) { - return; + JSONArray groups = processor.getArray(response, false, "WsFindGroupsResults", "groupResults"); + if (groups != null) { + for (Object group : groups) { + if (!handleGroupJsonObject(group, handler)) { + return; + } } } } - private void executeFindGroupsAsMembersResponse(HttpPost request, JSONObject body, ResultsHandler handler) { + void executeFindGroupsAsMembersResponse(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); @@ -127,7 +96,7 @@ private void executeFindGroupsAsMembersResponse(HttpPost request, JSONObject bod } } - private void getGroupByName(String groupName, ResultsHandler handler) { + void getGroupByName(String groupName, ResultsHandler handler) { URIBuilder uriBuilder = processor.getURIBuilder() .setPath(URI_BASE_PATH + PATH_GROUPS); try { @@ -142,7 +111,7 @@ private void getGroupByName(String groupName, ResultsHandler handler) { } } - private void getGroupByUuid(String groupUuid, ResultsHandler handler) { + void getGroupByUuid(String groupUuid, ResultsHandler handler) { URIBuilder uriBuilder = processor.getURIBuilder() .setPath(URI_BASE_PATH + PATH_GROUPS); try { @@ -164,7 +133,7 @@ private boolean handleGroupJsonObject(Object group, ResultsHandler handler) { String extension = processor.getStringOrNull(gObject, "extension"); String uuid = processor.getStringOrNull(gObject, "uuid"); ConnectorObjectBuilder builder = new ConnectorObjectBuilder(); - builder.setObjectClass(ObjectClass.GROUP); + builder.setObjectClass(getObjectClass()); builder.setUid(uuid); builder.setName(name); builder.addAttribute(ATTR_EXTENSION, extension); @@ -185,7 +154,7 @@ private boolean handleGroupAsMemberJsonObject(Object group, ResultsHandler handl String name = processor.getStringOrNull(gObject, "name"); String id = processor.getStringOrNull(gObject, "id"); ConnectorObjectBuilder builder = new ConnectorObjectBuilder(); - builder.setObjectClass(ObjectClass.GROUP); + builder.setObjectClass(getObjectClass()); builder.setUid(id); builder.setName(name); return handler.handle(builder.build()); @@ -194,7 +163,9 @@ private boolean handleGroupAsMemberJsonObject(Object group, ResultsHandler handl } } - private GrouperConfiguration getConfiguration() { + protected abstract ObjectClass getObjectClass(); + + protected GrouperConfiguration getConfiguration() { return processor.configuration; } @@ -218,5 +189,4 @@ void test() { throw processor.processException(e, uriBuilder, "Test"); } } - } diff --git a/src/main/java/com/evolveum/polygon/connector/grouper/rest/GrouperConfiguration.java b/src/main/java/com/evolveum/polygon/connector/grouper/rest/GrouperConfiguration.java index 8caf6d9..8c4dbdc 100644 --- a/src/main/java/com/evolveum/polygon/connector/grouper/rest/GrouperConfiguration.java +++ b/src/main/java/com/evolveum/polygon/connector/grouper/rest/GrouperConfiguration.java @@ -46,6 +46,7 @@ public class GrouperConfiguration extends AbstractConfiguration implements State private Boolean ignoreSslValidation; private String subjectSource; private String groupSource; + private String exportStem; // getter and setter methods for "baseUrl" attribute: @ConfigurationProperty(order = 1, displayMessageKey = "baseUrl.display", helpMessageKey = "baseUrl.help", required = true) @@ -88,6 +89,11 @@ public void access(char[] clearChars) { return stringPassword; } + /** + * "Super group" that marks groups and users that are to be visible through this connector. + * + * Used for Account and Group object classes; ignored for PlainGroup object class. + */ @ConfigurationProperty(order = 4, displayMessageKey = "superGroup.display", helpMessageKey = "superGroup.help", required = true) public String getSuperGroup() { return superGroup; @@ -97,6 +103,9 @@ public void setSuperGroup(String superGroup) { this.superGroup = superGroup; } + /** + * Used to limit group membership to a subset of all groups. Applicable to Account object class. + */ @ConfigurationProperty(order = 5, displayMessageKey = "groupIncludePattern.display", helpMessageKey = "groupIncludePattern.help", required = true) public String[] getGroupIncludePattern() { return groupIncludePattern; @@ -106,11 +115,15 @@ public void setGroupIncludePattern(String[] groupIncludePattern) { this.groupIncludePattern = groupIncludePattern; } + /** + * Used to limit group membership to a subset of all groups. Applicable to Account object class. + */ @ConfigurationProperty(order = 6, displayMessageKey = "groupExcludePattern.display", helpMessageKey = "groupExcludePattern.help", required = true) public String[] getGroupExcludePattern() { return groupExcludePattern; } + @SuppressWarnings("unused") public void setGroupExcludePattern(String[] groupExcludePattern) { this.groupExcludePattern = groupExcludePattern; } @@ -124,6 +137,9 @@ public void setIgnoreSslValidation(Boolean ignoreSslValidation) { this.ignoreSslValidation = ignoreSslValidation; } + /** + * Used to limit subjects returned by this connector. Applicable to Account and PlainGroup object class. + */ @ConfigurationProperty(order = 8, displayMessageKey = "subjectSource.display", helpMessageKey = "subjectSource.help", required = true) public String getSubjectSource() { return subjectSource; @@ -133,15 +149,31 @@ public void setSubjectSource(String subjectSource) { this.subjectSource = subjectSource; } + /** + * Used to limit groups returned by this connector. Applicable to Group object class. Usually not needed to change. + */ @ConfigurationProperty(order = 9, displayMessageKey = "groupSource.display", helpMessageKey = "groupSource.help") public String getGroupSource() { return groupSource != null ? groupSource : DEFAULT_GROUP_SOURCE_ID; } + @SuppressWarnings("unused") public void setGroupSource(String groupSource) { this.groupSource = groupSource; } + /** + * Used to specify root stem for groups returned by this connector. Applicable to PlainGroup object class. + */ + @ConfigurationProperty(order = 10, displayMessageKey = "exportStem.display", helpMessageKey = "exportStem.help") + public String getExportStem() { + return exportStem; + } + + public void setExportStem(String exportStem) { + this.exportStem = exportStem; + } + @Override public void validate() { String exceptionMsg; @@ -175,6 +207,7 @@ public void release() { this.groupExcludePattern = null; this.subjectSource = null; this.groupSource = null; + this.exportStem = null; } @Override @@ -188,6 +221,7 @@ public String toString() { ", ignoreSslValidation=" + ignoreSslValidation + ", subjectSource='" + subjectSource + '\'' + ", groupSource='" + groupSource + '\'' + + ", exportStem='" + exportStem + '\'' + '}'; } } diff --git a/src/main/java/com/evolveum/polygon/connector/grouper/rest/GrouperConnector.java b/src/main/java/com/evolveum/polygon/connector/grouper/rest/GrouperConnector.java index f77c00a..f770ebc 100644 --- a/src/main/java/com/evolveum/polygon/connector/grouper/rest/GrouperConnector.java +++ b/src/main/java/com/evolveum/polygon/connector/grouper/rest/GrouperConnector.java @@ -40,7 +40,8 @@ public class GrouperConnector implements TestOp, SchemaOp, Connector, SearchOp 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); + } + } + builder.addAttribute(ATTR_MEMBER, subjects); + handler.handle(builder.build()); + } + + @Override + protected ObjectClass getObjectClass() { + return new ObjectClass(OBJECT_CLASS_NAME); + } + + private boolean isGetMembers(OperationOptions options) { + String[] attrs = options.getAttributesToGet(); + return attrs != null && Arrays.asList(attrs).contains(ATTR_MEMBER); + } +} diff --git a/src/main/java/com/evolveum/polygon/connector/grouper/rest/Processor.java b/src/main/java/com/evolveum/polygon/connector/grouper/rest/Processor.java index ed64b8a..49eabd2 100644 --- a/src/main/java/com/evolveum/polygon/connector/grouper/rest/Processor.java +++ b/src/main/java/com/evolveum/polygon/connector/grouper/rest/Processor.java @@ -64,6 +64,7 @@ public class Processor { public static final String GROUP_NAME = "groupName"; public static final String WS_GET_GROUPS_RESULTS = "WsGetGroupsResults"; public static final String WS_GROUPS = "wsGroups"; + public static final String WS_GROUP = "wsGroup"; GrouperConfiguration configuration; public static final String URI_BASE_PATH = "/grouper-ws/servicesRest/json/v2_4_000"; @@ -415,19 +416,35 @@ public void checkSuccess(JSONObject response, String rootName) { } } + public Object getIfExists(JSONObject object, String... items) { + return get(object, false, items); + } + public Object get(JSONObject object, String... items) { + return get(object, true, items); + } + + public Object get(JSONObject object, boolean mustExist, String... items) { if (items.length == 0) { throw new IllegalArgumentException("Empty item path"); } for (int i = 0; i < items.length - 1; i++) { if (!object.has(items[i])) { - throw new IllegalStateException("Item " + Arrays.asList(items).subList(0, i) + " was not found"); + if (mustExist) { + throw new IllegalStateException("Item " + Arrays.asList(items).subList(0, i) + " was not found"); + } else { + return null; + } } Object o = object.get(items[i]); if (o instanceof JSONArray) { JSONArray array = (JSONArray) o; if (array.length() == 0) { - throw new IllegalStateException("Item " + Arrays.asList(items).subList(0, i) + " is an empty array"); + if (mustExist) { + throw new IllegalStateException("Item " + Arrays.asList(items).subList(0, i) + " is an empty array"); + } else { + return null; + } } else if (array.length() > 1) { throw new IllegalStateException("Item " + Arrays.asList(items).subList(0, i) + " is a multi-valued array (length: " + array.length() + ")"); } else { @@ -440,12 +457,26 @@ public Object get(JSONObject object, String... items) { throw new IllegalStateException("Item " + Arrays.asList(items).subList(0, i) + " is neither object nor array; it is " + o.getClass()); } } - return object.get(items[items.length - 1]); + String last = items[items.length - 1]; + if (object.has(last)) { + return object.get(last); + } else if (mustExist) { + throw new IllegalStateException("Item " + Arrays.asList(items) + " was not found"); + } else { + return null; + } } public JSONArray getArray(JSONObject object, String... items) { - Object rv = get(object, items); - if (rv instanceof JSONArray) { + return getArray(object, true, items); + } + + public JSONArray getArray(JSONObject object, boolean mustExist, String... items) { + Object rv = get(object, mustExist, items); + if (rv == null) { + assert !mustExist; + return null; + } else if (rv instanceof JSONArray) { return (JSONArray) rv; } else { throw new IllegalStateException("Item " + Arrays.asList(items) + " should be an array but it's " + rv.getClass()); diff --git a/src/main/java/com/evolveum/polygon/connector/grouper/rest/StandardGroupProcessor.java b/src/main/java/com/evolveum/polygon/connector/grouper/rest/StandardGroupProcessor.java new file mode 100644 index 0000000..9507c5e --- /dev/null +++ b/src/main/java/com/evolveum/polygon/connector/grouper/rest/StandardGroupProcessor.java @@ -0,0 +1,68 @@ +/******************************************************************************* + * Copyright 2017 Evolveum + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and limitations under the License. + ******************************************************************************/ +package com.evolveum.polygon.connector.grouper.rest; + +import org.apache.http.client.methods.HttpPost; +import org.apache.http.client.utils.URIBuilder; +import org.identityconnectors.framework.common.objects.*; +import org.json.JSONArray; +import org.json.JSONObject; + +import java.net.URISyntaxException; + +import static com.evolveum.polygon.connector.grouper.rest.Processor.*; + +/** + * @author surmanek + * @author mederly + * + */ +class StandardGroupProcessor extends AbstractGroupProcessor { + + StandardGroupProcessor(Processor processor) { + super(processor); + } + + ObjectClassInfoBuilder buildSchema() { + ObjectClassInfoBuilder builder = new ObjectClassInfoBuilder(); + + builder.setType(ObjectClass.GROUP_NAME); + AttributeInfoBuilder extension = new AttributeInfoBuilder(ATTR_EXTENSION, String.class); + builder.addAttributeInfo(extension.build()); + + return builder; + } + + protected void getAllGroups(ResultsHandler handler, OperationOptions options) { + URIBuilder uriBuilder = processor.getURIBuilder() + .setPath(URI_BASE_PATH + PATH_GROUPS); + try { + HttpPost request = new HttpPost(uriBuilder.build()); + JSONObject body = new JSONObject() + .put("WsRestGetMembersRequest", new JSONObject() + .put("wsGroupLookups", new JSONObject[] { new JSONObject() + .put("groupName", getConfiguration().getSuperGroup()) }) + .put("includeSubjectDetail", true) + .put("memberFilter", "Immediate")); + executeFindGroupsAsMembersResponse(request, body, handler); + } catch (RuntimeException | URISyntaxException e) { + throw processor.processException(e, uriBuilder, "Get all groups"); + } + } + + @Override + protected ObjectClass getObjectClass() { + return ObjectClass.GROUP; + } +} diff --git a/src/test/java/com/evolveum/polygon/connector/grouper/test/GrouperTestHelper.java b/src/test/java/com/evolveum/polygon/connector/grouper/test/GrouperTestHelper.java index c0df248..3695241 100644 --- a/src/test/java/com/evolveum/polygon/connector/grouper/test/GrouperTestHelper.java +++ b/src/test/java/com/evolveum/polygon/connector/grouper/test/GrouperTestHelper.java @@ -95,6 +95,7 @@ protected GrouperConfiguration getConfiguration() { config.setGroupIncludePattern(new String[] { SUPER_GROUP }); config.setIgnoreSslValidation(true); config.setSubjectSource(SUBJECT_SOURCE); + config.setExportStem("ref"); return config; } } 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 new file mode 100644 index 0000000..caeb719 --- /dev/null +++ b/src/test/java/com/evolveum/polygon/connector/grouper/test/PlainGroupTests.java @@ -0,0 +1,149 @@ +package com.evolveum.polygon.connector.grouper.test; +/******************************************************************************* + * Copyright 2019 Evolveum + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and limitations under the License. + ******************************************************************************/ + +import com.evolveum.polygon.connector.grouper.rest.PlainGroupProcessor; +import org.identityconnectors.framework.common.objects.*; +import org.identityconnectors.framework.common.objects.filter.AttributeFilter; +import org.identityconnectors.framework.common.objects.filter.EqualsFilter; +import org.identityconnectors.framework.common.objects.filter.FilterBuilder; +import org.testng.annotations.Test; + +import java.util.Arrays; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; + +import static org.identityconnectors.framework.common.objects.OperationOptions.OP_ATTRIBUTES_TO_GET; +import static org.testng.AssertJUnit.assertEquals; + +/** + * @author surmanek + * @author mederly + * + */ +public class PlainGroupTests extends GrouperTestHelper { + + private static final ObjectClass PLAIN_GROUP = new ObjectClass(PlainGroupProcessor.OBJECT_CLASS_NAME); + + private String uuid; + + @Test(priority = 1) + public void initTest() { + grouperConnector.init(getConfiguration()); + cleanUp(); + } + + @Test(priority = 2) + public void schemaTest() { + grouperConnector.schema(); + } + + @Test(priority = 3) + public void testTest() { + grouperConnector.test(); + } + + @Test(priority = 4) + public void findByGroupName() { + // filtering: + results.clear(); + AttributeFilter filter = (EqualsFilter) FilterBuilder + .equalTo(AttributeBuilder.build(Name.NAME, "etc:sysadmingroup")); + + grouperConnector.executeQuery(PLAIN_GROUP, filter, handler, options); + assertEquals("Wrong # of groups retrieved", results.size(), 1); + ConnectorObject group = results.get(0); + System.out.println("Found group: " + group); + uuid = group.getUid().getUidValue(); + } + + @Test(priority = 10) + public void findByGroupNameWithMembers() { + // filtering: + results.clear(); + AttributeFilter filter = (EqualsFilter) FilterBuilder + .equalTo(AttributeBuilder.build(Name.NAME, "etc:sysadmingroup")); + + grouperConnector.executeQuery(PLAIN_GROUP, filter, handler, getMembersOptions()); + assertEquals("Wrong # of groups retrieved", results.size(), 1); + ConnectorObject group = results.get(0); + System.out.println("Found group: " + group); + List members = getMembers(group); + assertEquals("Wrong members", Collections.singletonList("banderson"), members); + } + + @Test(priority = 12) + public void findByGroupUuid() { + // filtering: + results.clear(); + AttributeFilter filter = (EqualsFilter) FilterBuilder + .equalTo(AttributeBuilder.build(Uid.NAME, uuid)); + + grouperConnector.executeQuery(PLAIN_GROUP, filter, handler, options); + assertEquals("Wrong # of groups retrieved", results.size(), 1); + ConnectorObject group = results.get(0); + System.out.println("Found group: " + group); + } + + @Test(priority = 13) + public void findByGroupUuidWihMembers() { + // filtering: + results.clear(); + AttributeFilter filter = (EqualsFilter) FilterBuilder + .equalTo(AttributeBuilder.build(Uid.NAME, uuid)); + + grouperConnector.executeQuery(PLAIN_GROUP, filter, handler, getMembersOptions()); + assertEquals("Wrong # of groups retrieved", results.size(), 1); + ConnectorObject group = results.get(0); + System.out.println("Found group: " + group); + assertEquals("Wrong members", Collections.singletonList("banderson"), getMembers(group)); + } + + @Test(priority = 14) + public void allGroups() { + results.clear(); + grouperConnector.executeQuery(PLAIN_GROUP, null, handler, options); + for (ConnectorObject group : results) { + System.out.println("Found group: " + group); + } + } + + @Test(priority = 16, expectedExceptions = IllegalArgumentException.class) + public void allGroupsWithMembers() { + results.clear(); + grouperConnector.executeQuery(PLAIN_GROUP, null, handler, getMembersOptions()); + } + + @Test(priority = 20) + public void dispose() { + grouperConnector.dispose(); + } + + private void cleanUp() { + results.clear(); + } + + private OperationOptions getMembersOptions() { + HashMap map = new HashMap<>(); + map.put(OP_ATTRIBUTES_TO_GET, new String[] { PlainGroupProcessor.ATTR_MEMBER }); + return new OperationOptions(map); + } + + private List getMembers(ConnectorObject group) { + Attribute attribute = group.getAttributeByName(PlainGroupProcessor.ATTR_MEMBER); + //noinspection unchecked + return attribute != null ? (List) (List) attribute.getValue() : Collections.emptyList(); + } +} diff --git a/src/test/java/com/evolveum/polygon/connector/grouper/test/GroupTests.java b/src/test/java/com/evolveum/polygon/connector/grouper/test/StandardGroupTests.java similarity index 97% rename from src/test/java/com/evolveum/polygon/connector/grouper/test/GroupTests.java rename to src/test/java/com/evolveum/polygon/connector/grouper/test/StandardGroupTests.java index ba1889d..e906a20 100644 --- a/src/test/java/com/evolveum/polygon/connector/grouper/test/GroupTests.java +++ b/src/test/java/com/evolveum/polygon/connector/grouper/test/StandardGroupTests.java @@ -26,7 +26,7 @@ * @author mederly * */ -public class GroupTests extends GrouperTestHelper { +public class StandardGroupTests extends GrouperTestHelper { private String uuid;