Details
-
Improvement
-
Resolution: Unresolved
-
Minor
-
None
-
2.6.7
-
None
Description
There is not a way in gsh to find a subject's memberships in groups, in a way that is flexible and easy to use. Compared with the other chained finder classes, the MembershipFinder is much harder to use:
- The wiki page on it is very terse
- The Javadoc method and parameter descriptions are terse
- The resulting object isn't a set of groups, which is what the user will generally want; instead it's a MembershipResult, which itself needs to be queried to get a list of MembershipSubjectContainers that then needs to be iterated to get the groups
- The various settings interact and depend on each other in ways that are not documented, and not intuitive
It's not easy to determine what needs to be set for various queries. For example, If I wanted to find all the groups under a stem where a user has the read privilege:
new MembershipFinder().addStem("unc:app:temp:cer28").addField("readers").addSubject(mySubject).findMembershipResult() |
// => ERROR java.lang.RuntimeException: expecting a stem field since other part of the query involve stem memberships |
|
That was just my first guess. The javadoc for addStem was "add a stem to look for." and no parameter description.
new MembershipFinder().assignScopeForGroup("unc:app:temp:cer28:%").addField("readers").addSubject(mySubject).findMembershipResult() |
// => ERROR java.lang.RuntimeException: If you are filtering by group, then you must page groups |
The Javadoc for assignScopeForGroup is "if paging for group, then also filter for member" which I don't understand. Why is paging necessary in order to filter?
So how to add paging? Nothing matching addPag* or assignPag*. Maybe it's assignQueryOptionsForGroup(QueryOptions)? Again, the javadoc "query options for group. must include paging. if sorting then sort by group" mentions paging being required.
new MembershipFinder().assignScopeForGroup("unc:app:temp:cer28:%").assignQueryOptionsForGroup(new QueryOptions().paging(1000, 0, false)).addField("readers").addSubject(mySubject).findMembershipResult() |
// => Cant get a page size greater then 500! 1000
|
|
new MembershipFinder().assignScopeForGroup("unc:app:temp:cer28:%").assignQueryOptionsForGroup(new QueryOptions().paging(500, 0, false)).addField("readers").addSubject(mySubject).findMembershipResult() |
//===> edu.internet2.middleware.grouper.membership.MembershipResult@1dee84bf
|
// SUCCESS! |
All this should be more intuitive. In the GroupFinder, you can set a stem scope, set fields or privileges, and set a subject to find. The results are a Set of groups. Unfortunately, it does not appear from the source code that it can filter on immediate memberships.
new GroupFinder().assignSubject(mySubject).assignScope("unc:app:temp:cer28:%").assignFieldName("readers").findGroups() |