RoleBean.java 4.36 KB
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package fi.insomnia.bortal.beans;

import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

import javax.ejb.EJB;
import javax.ejb.Stateless;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import fi.insomnia.bortal.enums.BeanRole;
import fi.insomnia.bortal.enums.Permission;
import fi.insomnia.bortal.enums.RolePermission;
import fi.insomnia.bortal.facade.AccessRightFacade;
import fi.insomnia.bortal.facade.EventChildGenericFacade;
import fi.insomnia.bortal.facade.RoleFacade;
import fi.insomnia.bortal.facade.RoleRightFacade;
import fi.insomnia.bortal.model.AccessRight;
import fi.insomnia.bortal.model.LanEvent;
import fi.insomnia.bortal.model.Role;
import fi.insomnia.bortal.model.RoleRight;
import fi.insomnia.bortal.model.User;

/**
 * 
 * @author tuukka
 */
@Stateless
public class RoleBean implements RoleBeanLocal {

    private static final String PUBLIC_ROLE_NAME = BeanRole.ANONYMOUS.toString();

    @EJB
    private EventBeanLocal eventBean;
    @EJB
    private RoleFacade roleFacade;
    @EJB
    private RoleRightFacade rrfacade;

    @EJB
    private UserBeanLocal userbean;
    @EJB
    private AccessRightFacade accessRightFacade;

    private static final Logger logger = LoggerFactory.getLogger(RoleBean.class);

    public List<Role> listRoles() {
        userbean.fatalPermission(Permission.ROLE_MANAGEMENT, RolePermission.READ, "User tried to listRoles");

        return roleFacade.findAll();
    }

    public Role mergeChanges(Role role) {
        userbean.fatalPermission(Permission.ROLE_MANAGEMENT, RolePermission.WRITE, "User tried merge role changes for ", role);
        return roleFacade.merge(role);
    }

    public Role create(Role role) {
        userbean.fatalPermission(Permission.ROLE_MANAGEMENT, RolePermission.WRITE, "User tried to create role", role.getName());
        roleFacade.create(role);
        return role;
    }

    public List<Role> getPossibleParents(Role role) {
        userbean.fatalPermission(Permission.ROLE_MANAGEMENT, RolePermission.READ, "User tried to get possible parents for role ", role);

        List<Role> roleList = listRoles();
        if (role == null)
            return roleList;

        List<Role> children = getAllChilds(role, new HashSet<Role>());

        for (Role unit : children) {
            if (roleList.contains(unit)) {
                roleList.remove(unit);
            }
        }

        return roleList;
    }

    private static List<Role> getAllChilds(Role role, Set<Role> checkedRoles) {

        List<Role> returnList = new ArrayList<Role>();

        if (checkedRoles.contains(role) || role == null) {
            return returnList;
        }

        for (Role unit : role.getChildren()) {
            List<Role> someList = getAllChilds(unit, checkedRoles);

            returnList.addAll(someList);
        }
        checkedRoles.add(role);

        return returnList;
    }

    public List<RoleRight> getRoleRights(Role r) {

        List<AccessRight> rights = accessRightFacade.findAll();
        List<RoleRight> ret = new ArrayList<RoleRight>();
        for (AccessRight ar : rights) {
            ret.add(findRoleRight(r, ar));
        }
        return ret;
    }

    @Override
    public RoleRight mergeChanges(RoleRight row) {
        userbean.fatalPermission(Permission.ROLE_MANAGEMENT, RolePermission.WRITE, "User tried merge changes for RoleRight", row);

        return rrfacade.merge(row);
    }

    public Role getOrCreatePublicRole() {

        Role ret = roleFacade.findByName(PUBLIC_ROLE_NAME);
        if (ret == null) {

            ret = roleFacade.createRole(eventBean.getCurrentEvent(), PUBLIC_ROLE_NAME);
            AccessRight perm = accessRightFacade.findByPermission(Permission.LOGIN);
            RoleRight rr = rrfacade.createRoleRight(ret, perm);
            rr.setRead(true);
        }
        return ret;

    }

    public RoleRight findRoleRight(Role role, Permission perm) {
        AccessRight acr = accessRightFacade.findByPermission(perm);
        return findRoleRight(role, acr);
    }

    public RoleRight findRoleRight(Role role, AccessRight acr) {
        RoleRight rr = rrfacade.find(acr, role);
        if (rr == null) {
            rr = new RoleRight(role, acr, false, false, false);
            rrfacade.create(rr);
        }
        return rr;
    }

}