RoleBean.java 3.29 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.annotation.Resource;
import javax.annotation.security.DeclareRoles;
import javax.annotation.security.RolesAllowed;
import javax.ejb.EJB;
import javax.ejb.SessionContext;
import javax.ejb.Stateless;

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

import fi.insomnia.bortal.enums.Permission;
import fi.insomnia.bortal.facade.RoleFacade;
import fi.insomnia.bortal.facade.RoleRightFacade;
import fi.insomnia.bortal.model.LanEvent;
import fi.insomnia.bortal.model.Role;
import fi.insomnia.bortal.model.RoleRight;

/**
 * 
 * @author tuukka
 */
@Stateless
@DeclareRoles({ "ROLE_MANAGEMENT/READ", "ROLE_MANAGEMENT/WRITE" })
public class RoleBean implements RoleBeanLocal {

	// private static final String PUBLIC_ROLE_NAME =
	// BeanRole.ANONYMOUS.toString();
	private static final Logger logger = LoggerFactory.getLogger(RoleBean.class);
	@Resource
	private SessionContext sc;
	@EJB
	private EventBeanLocal eventBean;
	@EJB
	private RoleFacade roleFacade;
	@EJB
	private RoleRightFacade rrfacade;

	@Override
	@RolesAllowed("ROLE_MANAGEMENT/READ")
	public List<Role> listRoles() {
		return listRoles(eventBean.getCurrentEvent());
	}

	@RolesAllowed("ROLE_MANAGEMENT/READ")
	public List<Role> listRoles(LanEvent event) {
		return roleFacade.findAll(event);
	}

	@Override
	@RolesAllowed("ROLE_MANAGEMENT/WRITE")
	public Role mergeChanges(Role role) {
		return roleFacade.merge(role);
	}

	@Override
	@RolesAllowed("ROLE_MANAGEMENT/WRITE")
	public Role create(Role role) {
		roleFacade.create(role);
		return role;
	}

	@Override
	@RolesAllowed("ROLE_MANAGEMENT/READ")
	public List<Role> getPossibleParents(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);
			}
		}
		roleList.remove(role);
		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;
	}

	@Override
	@RolesAllowed("ROLE_MANAGEMENT/READ")
	public List<RoleRight> getRoleRights(Role r) {

		List<RoleRight> ret = new ArrayList<RoleRight>();
		for (Permission perm : Permission.values()) {
			ret.add(findRoleRight(r, perm));
		}
		return ret;
	}

	@Override
	@RolesAllowed("ROLE_MANAGEMENT/WRITE")
	public RoleRight mergeChanges(RoleRight row) {

		return rrfacade.merge(row);
	}

	@RolesAllowed("ROLE_MANAGEMENT/READ")
	public RoleRight findRoleRight(Role role, Permission perm) {
		RoleRight rr = rrfacade.find(perm, role);
		if (rr == null) {
			rr = new RoleRight(role, perm, false, false, false);
			rrfacade.create(rr);
		}
		return rr;
	}

	@Override
	@RolesAllowed("ROLE_MANAGEMENT/READ")
	public Role find(int id) {
		return roleFacade.find(eventBean.getCurrentEvent(), id);
	}

}