GenericView.java 3.46 KB
/*
 * Copyright Codecrew Ry
 * 
 * All rights reserved.
 * 
 * This license applies to any software containing a notice placed by the 
 * copyright holder. Such software is herein referred to as the Software. 
 * This license covers modification, distribution and use of the Software. 
 * 
 * Any distribution and use in source and binary forms, with or without 
 * modification is not permitted without explicit written permission from the 
 * copyright owner. 
 * 
 * A non-exclusive royalty-free right is granted to the copyright owner of the 
 * Software to use, modify and distribute all modifications to the Software in 
 * future versions of the Software. 
 * 
 */
package fi.codecrew.moyamgmt;

import java.io.Serializable;

import javax.ejb.EJB;
import javax.enterprise.context.Conversation;
import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;
import javax.inject.Inject;
import javax.servlet.http.HttpServletRequest;

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

import fi.codecrew.moya.beans.EventBeanLocal;
import fi.codecrew.moya.beans.PermissionBeanLocal;
import fi.codecrew.moya.enums.apps.IAppPermission;
import fi.codecrew.moya.utilities.I18n;
import fi.codecrew.moyamgmt.handler.NavigationHandler;

public abstract class GenericView implements Serializable {

	private static final long serialVersionUID = -4000065015178815761L;
	@Inject
	private Conversation conversation;

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

	@Inject
	protected NavigationHandler navihandler;

	@EJB
	protected PermissionBeanLocal permbean;

	@EJB
	private EventBeanLocal eventbean;

	public void beginConversation() {
		if (conversation.isTransient()) {
			conversation.begin();
		}
	}

	public void endConversation() {
		if (!conversation.isTransient())
			conversation.end();
	}

	public boolean hasPermission(IAppPermission perm) {
		// boolean ret =
		// FacesContext.getCurrentInstance().getExternalContext().isUserInRole(perm.getFullName());
		return permbean.hasPermission(perm);
	}

	protected boolean requirePermissions(IAppPermission perm, boolean... externalChecks) {

		boolean ret = requirePermissions(hasPermission(perm));
		if (ret && externalChecks.length > 0) {
			ret = requirePermissions(externalChecks);
		}
		if (!ret) {
			logger.info("Permission required failed for {} Permission: {} (or extrachecks)", perm.getFullName(), perm);

		}

		return ret;
	}

	protected boolean requirePermissions(boolean... externalChecks) {
		boolean ret = true;

		for (boolean check : externalChecks) {
			if (!check) {
				ret = false;
				break;
			}
		}

		if (!ret) {
			FacesContext fcont = FacesContext.getCurrentInstance();
			HttpServletRequest req = (HttpServletRequest) fcont.getExternalContext().getRequest();

			StringBuilder viewidbuilder = new StringBuilder().append(req.getContextPath()).append(req.getServletPath());

			if (req.getQueryString() != null) {
				viewidbuilder.append("?").append(req.getQueryString());
			}

			navihandler.saveDestination(viewidbuilder.toString());
			logger.debug("Permission denied. Saving navi {} for later use", viewidbuilder.toString());
			// navihandler.navigateTo("/permissionDenied");
			fcont.getApplication().getNavigationHandler().handleNavigation(fcont, null, "/permissionDenied?faces-redirect=true");
		}
		return ret;
	}

	protected void addFaceMessage(String string, Object... params) {

		FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(I18n.get(string, params)));

	}
}