MenuView.java 5.6 KB
package fi.codecrew.moya.web.cdiview.menu;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;

import javax.ejb.EJB;
import javax.enterprise.context.RequestScoped;
import javax.faces.context.FacesContext;
import javax.inject.Inject;
import javax.inject.Named;

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

import fi.codecrew.moya.beans.MenuBeanLocal;
import fi.codecrew.moya.beans.SitePageBeanLocal;
import fi.codecrew.moya.enums.apps.UserPermission;
import fi.codecrew.moya.model.MenuNavigation;
import fi.codecrew.moya.model.PageContent;
import fi.codecrew.moya.web.cdiview.GenericCDIView;
import fi.codecrew.moya.web.helper.LayoutView;

@Named
@RequestScoped
public class MenuView extends GenericCDIView {

	private static final long serialVersionUID = -5720164797157054213L;

	private String pagename;

	@Inject
	private transient LayoutView layoutview;

	@Inject
	private transient FacesContext context;

	@EJB
	private transient MenuBeanLocal menubean;

	private LinkedList<List<JsfMenuitem>> menus;

	private HashSet<MenuNavigation> navis;

	private Map<String, List<PageContent>> contents = new HashMap<String, List<PageContent>>();

	@EJB
	private transient SitePageBeanLocal pagebean;

	private String menuChange;

	@SuppressWarnings("unused")
	private static final Logger logger = LoggerFactory.getLogger(MenuView.class);

	public List<PageContent> getPagecontent(String pagekey)
	{
		String key = new StringBuilder(layoutview.getPagepath()).append(":").append(pagekey).toString();
		logger.debug("Getting pagecontent for key {}. Matches: {}", key, contents.containsKey(key));

		if (!contents.containsKey(key)) {
			contents.put(key, pagebean.findContentsForUser(key));
		}
		return contents.get(key);
	}

	public List<JsfMenuitem> getMenu(Integer level)
	{
		getMenus();
		if (level == null || menus.isEmpty() || level < 0 || level >= menus.size())
		{
			return null;
		}

		List<JsfMenuitem> ret = menus.get(level);

		return ret;

	}

	public void menuChangeEvent() {
		super.navihandler.forward(menuChange);
	}

	private List<JsfMenuitem> viewchangeTopmenu;

	public List<JsfMenuitem> getViewChangeTopmenu()
	{
		if (viewchangeTopmenu == null) {
			viewchangeTopmenu = new ArrayList<JsfMenuitem>();
			viewchangeTopmenu.add(new JsfMenuitem("topmenu.user", "/index"));
			if (super.hasPermission(UserPermission.VIEW_ALL)) {
				viewchangeTopmenu.add(new JsfMenuitem("topmenu.helpdesk", "/admin/info/index"));
				viewchangeTopmenu.add(new JsfMenuitem("topmenu.admin", "/useradmin/list"));
			}
		}
		return viewchangeTopmenu;

	}

	public LinkedList<List<JsfMenuitem>> getMenus()
	{
		if (menus == null)
		{
			menus = new LinkedList<List<JsfMenuitem>>();
			navis = new HashSet<MenuNavigation>();
			MenuNavigation pathIter = menubean.findNavigation(layoutview.getPagepath());

			while (pathIter != null) {
				if (pathIter.isVisible()) {
					navis.add(pathIter);
					menus.add(0, addMenu(pathIter.getChildren()));
				}
				pathIter = pathIter.getParent();
			}
			menus.add(0, addMenu(menubean.getTopmenus()));
		}
		return menus;
	}

	private LinkedList<JsfMenuitem> addMenu(List<MenuNavigation> children) {
		LinkedList<JsfMenuitem> ret = new LinkedList<JsfMenuitem>();
		// Iterate through children
		for (MenuNavigation child : children) {
			// if is visible, permission is null or has permission, continue
			if (!child.isVisible() || (child.getPermission() != null && !super.hasPermission(child.getPermission()))) {
				continue;
			}

			JsfMenuitem jsfItem = new JsfMenuitem(child);

			// if menuitem does not have any content, it should get it from the
			// first child.
			if (child.getItem() == null && child.getSitepage() == null)
			{

				// if menulist does not have entries this is the lowest level we
				// have menus, else we can use the outcome from the latest
				// entry in menuarray.
				if (!navis.contains(child) || menus.isEmpty() || menus.get(0).isEmpty()) {
					String outcome = getOutcome(child);
					// if we don't get outcome, we don't have permission to any
					// subitems and this item should be skipped...
					if (outcome == null) {
						continue;
					}
					jsfItem.setOutcome(outcome);
				} else {
					jsfItem.setOutcome(menus.get(0).get(0).getOutcome());
				}
			}

			if (navis.contains(child)) {
				jsfItem.setSelected();

			}

			ret.add(jsfItem);
		}
		return ret;
	}

	private String getOutcome(MenuNavigation navi) {
		String ret = null;
		// try to get the outcome from the first child we have permission to.
		for (MenuNavigation child : navi.getChildren())
		{
			if (!child.isVisible() || (child.getPermission() != null && !super.hasPermission(child.getPermission()))) {
				continue;
			}

			// try to get item from this child.
			if (child.getItem() != null) {
				ret = child.getItem().getUrl();
			}
			// try to get sitepage url.
			else if (child.getSitepage() != null) {
				// ret = child.getSitepage().getUrl();
				ret = new StringBuilder("/pages/index?id=").append(navi.getSitepage().getId()).toString();
			}
			// if navigation does not have menuitem or sitepage we go deeper in
			// to the tree..
			else {
				ret = getOutcome(child);
			}

			// If we found outcome, brek from iterator.
			if (ret != null) {
				break;
			}
		}
		return ret;
	}

	public void setContext(FacesContext context) {
		this.context = context;
	}

	public LayoutView getLayoutview() {
		return layoutview;
	}

	public void setLayoutview(LayoutView layoutview) {
		this.layoutview = layoutview;
	}

	public String getMenuChange() {
		return menuChange;
	}

	public void setMenuChange(String menuChange) {
		this.menuChange = menuChange;
	}

}