MenuNavigationFacade.java 3.64 KB
package fi.insomnia.bortal.facade;

import java.util.ArrayList;
import java.util.List;

import javax.ejb.EJB;
import javax.ejb.LocalBean;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;
import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Path;
import javax.persistence.criteria.Predicate;
import javax.persistence.criteria.Root;

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

import fi.insomnia.bortal.beans.EventBean;
import fi.insomnia.bortal.beans.PermissionBeanLocal;
import fi.insomnia.bortal.model.LanEvent;
import fi.insomnia.bortal.model.MenuNavigation;
import fi.insomnia.bortal.model.MenuNavigation_;
import fi.insomnia.bortal.model.Menuitem;
import fi.insomnia.bortal.model.Menuitem_;

@Stateless
@LocalBean
public class MenuNavigationFacade extends GenericFacade<Integer, MenuNavigation> {

	public MenuNavigationFacade() {
		super(MenuNavigation.class);
		// TODO Auto-generated constructor stub
	}

	@EJB
	private MenuitemFacade menuitemfacade;

	@PersistenceContext
	private EntityManager em;
	@EJB
	private EventBean eventbean;

	@EJB
	private PermissionBeanLocal permbean;

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

	@Override
	protected EntityManager getEm() {
		return em;
	}

	public MenuNavigation find(String url, LanEvent event) {
		logger.debug("Finding MenuNavigation with url {}", url);
		if (url == null || url.isEmpty())
		{
			return null;
		}
		CriteriaBuilder cb = em.getCriteriaBuilder();
		CriteriaQuery<MenuNavigation> cq = cb.createQuery(MenuNavigation.class);
		Root<MenuNavigation> root = cq.from(MenuNavigation.class);
		Predicate eventFilter = null;
		if (event == null)
		{
			eventFilter = cb.isNull(root.get(MenuNavigation_.event));
		} else {
			eventFilter = cb.equal(root.get(MenuNavigation_.event), event);
		}

		cq.where(cb.equal(root.get(MenuNavigation_.item).get(Menuitem_.url), url), eventFilter);
		cq.orderBy(cb.asc(root.get(MenuNavigation_.sort)));
		List<MenuNavigation> results = em.createQuery(cq).getResultList();

		MenuNavigation ret = null;
		for (MenuNavigation navi : results)
		{
			if (permbean.hasPermission(navi.getPermission()))
			{
				ret = navi;
			}
		}
		if (ret == null && !results.isEmpty())
		{
			ret = results.get(0);
		}

		if (ret == null)
		{
			if (event != null)
			{
				return find(url, null);
			} else {
				Menuitem item = menuitemfacade.findOrCreate(url);
				if (item.getNavigations() == null || item.getNavigations().isEmpty())
				{
					ret = new MenuNavigation();
					ret.setItem(item);
					ret.setEvent(null);
					item.setNavigations(new ArrayList<MenuNavigation>());
					item.getNavigations().add(ret);
				}
			}
		}
		return ret;
	}

	/**
	 * Returns top level navigations for BOTH default and current event Results
	 * have to be filtered for duplicates to get correct result!!
	 * 
	 * @param event
	 * @return
	 */
	public List<MenuNavigation> findToplevels() {
		CriteriaBuilder cb = em.getCriteriaBuilder();
		CriteriaQuery<MenuNavigation> cq = cb.createQuery(MenuNavigation.class);
		Root<MenuNavigation> root = cq.from(MenuNavigation.class);

		Path<LanEvent> eventpath = root.get(MenuNavigation_.event);
		cq.where(cb.isNull(root.get(MenuNavigation_.parent)), cb.or(cb.equal(eventpath, eventbean.getCurrentEvent()), cb.isNull(eventpath)), cb.isTrue(root.get(MenuNavigation_.visible)));

		return em.createQuery(cq).getResultList();
	}

	public void deleteAllDefaults() {
		Query q = em.createQuery("delete from MenuNavigation where parent is null");
		q.executeUpdate();
	}

}