BortalLocalContextHolder.java 3.27 KB
package fi.insomnia.bortal.clientutils;

import java.util.HashMap;
import java.util.Map;

import javax.security.auth.login.LoginContext;
import javax.security.auth.login.LoginException;

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

import fi.insomnia.bortal.enums.apps.IAppPermission;

public class BortalLocalContextHolder {

	private static final ThreadLocal<BortalLocalContextHolder> THREAD_WITH_CONTEXT = new ThreadLocal<BortalLocalContextHolder>();

	private String hostname;
	private boolean ssl = false;
	private Integer hostnameId;
	
	private LoginContext loginContext;

	private final Map<IAppPermission, Boolean> rightcache = new HashMap<IAppPermission, Boolean>();

	private static boolean inDevelopmentMode = false;

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

	private BortalLocalContextHolder() {
		super();
	}

	private BortalLocalContextHolder(BortalLocalContextHolder old) {
		super();
		this.hostname = old.hostname;
		this.ssl = old.ssl;
		this.loginContext = old.loginContext;
	}

	public static void setHostname(String hostname) {

		getThread().hostname = hostname;

	}

	public static String getHostname() {

		return getThread().getHolderHostname();

	}

	public static void cleanupThread() {

		if (THREAD_WITH_CONTEXT != null) {
			THREAD_WITH_CONTEXT.remove();
		}

	}

	public String getHolderHostname() {
		return hostname;
	}

	public static Boolean hasPermission(IAppPermission permission) {
		return getThread().hasHolderPermission(permission);
	}

	private static BortalLocalContextHolder getThread() {
		if (THREAD_WITH_CONTEXT.get() == null) {
			THREAD_WITH_CONTEXT.set(new BortalLocalContextHolder());
		}
		return THREAD_WITH_CONTEXT.get();
	}

	private Boolean hasHolderPermission(IAppPermission target) {
		return rightcache.get(target);
	}

	public static void setPermission(IAppPermission permission, Boolean value) {
		getThread().rightcache.put(permission, value);
	}

	public static BortalLocalContextHolder getInstance() {
		return getThread();
	}

	public static boolean isInDevelopmentMode() {
		return inDevelopmentMode;
	}

	public static void setInDevelopmentMode(boolean developmentMode) {
		inDevelopmentMode = developmentMode;
	}

	public static Integer getHostnameId() {
		return getThread().hostnameId;
	}

	public static void setHostnameId(Integer id)
	{
		getThread().hostnameId = id;
	}

	public static boolean isSsl() {
		return getThread().ssl;
	}

	public static void setSsl(boolean ssl) {
		getThread().ssl = ssl;
	}

	public static void copy(BortalLocalContextHolder contextHolder) {
		if (THREAD_WITH_CONTEXT.get() != null) {
			logger.warn("Context for thread is not empty. Received hostname {}", THREAD_WITH_CONTEXT.get().hostname);
		}
		THREAD_WITH_CONTEXT.set(new BortalLocalContextHolder(contextHolder));
	}

	public void setLoginContext(LoginContext loginContext) {
		this.loginContext = loginContext;
	}
	
	public LoginContext getLoginContext() {
		return loginContext;
	}
	
	public boolean executeLogin() {
		try {
			this.loginContext.login();
			System.err.println("execute login");
			return true;
		} catch (LoginException e) {
			return false;
		}
	}
	
	public void executeLogout() {
		try {
			this.loginContext.logout();
			System.err.println("execute logout");
		} catch(Exception e) {
			
		}
	}
}