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;