package edu.ualberta.med.biobank.common.action.security;
import java.util.Set;
import org.hibernate.Hibernate;
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.model.Domain;
import edu.ualberta.med.biobank.model.Group;
import edu.ualberta.med.biobank.model.Membership;
import edu.ualberta.med.biobank.model.Role;
import edu.ualberta.med.biobank.model.User;
public class MembershipContextGetAction implements
Action<MembershipContextGetOutput> {
private static final long serialVersionUID = 1L;
@SuppressWarnings("unused")
private final MembershipContextGetInput input;
public MembershipContextGetAction(MembershipContextGetInput input) {
this.input = input;
}
@Override
public boolean isAllowed(ActionContext context) throws ActionException {
return true;
}
@Override
public MembershipContextGetOutput run(ActionContext context)
throws ActionException {
User manager = context.getUser();
initManager(manager);
Set<Role> allRoles = new RoleGetAllAction(new RoleGetAllInput())
.run(context).getAllRoles();
Set<Group> manageableGroups = new GroupGetAllAction(
new GroupGetAllInput())
.run(context)
.getAllManageableGroups();
MembershipContext managerContext =
new MembershipContext(manager, allRoles, manageableGroups);
return new MembershipContextGetOutput(managerContext);
}
/**
* Ensure all necessary areas of the {@link User} are initialized.
*
* @param manager
*/
static void initManager(User manager) {
Hibernate.initialize(manager);
initMemberships(manager.getMemberships());
for (Group group : manager.getGroups()) {
initMemberships(group.getMemberships());
}
}
static void initMemberships(Set<Membership> memberships) {
for (Membership membership : memberships) {
Hibernate.initialize(membership.getDomain());
Domain domain = membership.getDomain();
Hibernate.initialize(domain.getCenters());
Hibernate.initialize(domain.getStudies());
Hibernate.initialize(membership.getPermissions());
Hibernate.initialize(membership.getRoles());
for (Role role : membership.getRoles()) {
Hibernate.initialize(role.getPermissions());
}
}
}
}