package edu.ualberta.med.biobank.common.action.security;
import java.util.List;
import java.util.SortedSet;
import java.util.TreeSet;
import org.hibernate.Criteria;
import org.hibernate.criterion.CriteriaSpecification;
import org.hibernate.criterion.Order;
import edu.ualberta.med.biobank.common.action.Action;
import edu.ualberta.med.biobank.common.action.ActionContext;
import edu.ualberta.med.biobank.common.action.exception.ActionException;
import edu.ualberta.med.biobank.common.permission.Permission;
import edu.ualberta.med.biobank.common.permission.security.UserManagerPermission;
import edu.ualberta.med.biobank.model.Group;
import edu.ualberta.med.biobank.model.User;
/**
* Returns a list of {@link Group}-s that the executing user has
* <em>complete</em> control over.
*
* @author Jonathan Ferland
*/
public class GroupGetAllAction implements Action<GroupGetAllOutput> {
private static final long serialVersionUID = 1L;
private static final Permission PERMISSION = new UserManagerPermission();
public GroupGetAllInput input;
public GroupGetAllAction(GroupGetAllInput input) {
this.input = input;
}
@Override
public boolean isAllowed(ActionContext context) throws ActionException {
return PERMISSION.isAllowed(context);
}
@Override
public GroupGetAllOutput run(ActionContext context)
throws ActionException {
Criteria c = context.getSession()
.createCriteria(Group.class, "g")
.createAlias("g.memberships", "m", Criteria.LEFT_JOIN)
.createAlias("g.users", "u", Criteria.LEFT_JOIN)
.createAlias("m.domain", "d", Criteria.LEFT_JOIN)
.createAlias("d.centers", "c", Criteria.LEFT_JOIN)
.createAlias("d.studies", "s", Criteria.LEFT_JOIN)
.createAlias("m.roles", "r", Criteria.LEFT_JOIN)
.setResultTransformer(CriteriaSpecification.DISTINCT_ROOT_ENTITY)
.addOrder(Order.asc("g.name"));
User user = context.getUser();
SortedSet<Group> groups = new TreeSet<Group>(Group.NAME_COMPARATOR);
@SuppressWarnings("unchecked")
List<Group> results = c.list();
for (Group group : results) {
if (group.isFullyManageable(user)) {
groups.add(group);
}
}
return new GroupGetAllOutput(groups);
}
}