New UserModule/RoleModule finders
---------------------------------
Key: JBPORTAL-1707
URL:
http://jira.jboss.com/jira/browse/JBPORTAL-1707
Project: JBoss Portal
Issue Type: Feature Request
Security Level: Public (Everyone can see)
Components: Portal Security
Affects Versions: 2.6.1 Final
Reporter: Andrew Oliver
Assigned To: Julien Viet
While working with clients using the portal API some efficiency issues with regards to
finders have become apparent:
It is presently possible to find users having a role by calling
MembershipModule.getUsers(role). However it is not possible to get a list of users with a
set of roles, a list of users who do NOT have a role or set of roles. (there are ways in
both HQL and LDAP to construct each type of query). I suggest something similar to
hibernate conditions.
MembershipModule.getUsers().addCondition(
Condition.and(
Condition.not(roleSet), Condition.with(roleSet)
)
)
this would result in roughly:
from Users where roles in (:roleSet) and roles not in (:roleSet2)
and something like
(& (|(role=roleName)(role=roleName) )
(&(!role=roleName)(!role=roleName) )
)
in LDAP
the attribute name can be based on the type. As it stands you have to do something like:
try {
Role roleApproved = rolemodule.findRoleByName("approved");
Role roleUsers = rolemodule.findRoleByName("User");
//todo create transient wrapper set.
Set users = membership.getUsers(roleUsers);
dirtyStinkyHackToGetAroundPortalAPIBugACO(users);
System.err.println("Total number of users with User Role : " +
users.size() );
Set temp = new HashSet();
temp = dirtyStinkyHackToGetAroundPortalAPIBugACO(users); //because the hibernate set
doesn't have removeall
users = temp;
Set usersApproved = membership.getUsers(roleApproved);
System.err.println("number of users with approved role:
"+usersApproved.size());
users.removeAll(usersApproved);
System.err.println("Total number of users with User Role and NO approved role :
" + users.size() );
Map profiles = profiles(users);
response.setRenderParameter("op", "new");
request.getPortletSession().setAttribute("users", users);
request.getPortletSession().setAttribute("profiles", profiles);
} catch (IdentityException e) {
//todo type this and catch it up higher to make a
//smarter error message
throw new RuntimeException(e);
}
private Map profiles(Set users) throws IdentityException {
Iterator i = users.iterator();
Map retval = new HashMap();
while(i.hasNext()) {
User user = (User) i.next();
retval.put(user, profileModule.getProperties(user));
}
return retval;
}
private Set dirtyStinkyHackToGetAroundPortalAPIBugACO(Set users) {
Iterator i = users.iterator();
Set retval = new HashSet();
while(i.hasNext()) {
User u = (User)i.next();
u.getUserName();
retval.add(u);
}
return retval;
}
Just to get the list of users who DONT have the "approved" role. For our
immediate needs:
UserModule.getUsersWithout(role) would work...until next time.
-Andy
--
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators:
http://jira.jboss.com/jira/secure/Administrators.jspa
-
For more information on JIRA, see:
http://www.atlassian.com/software/jira