Newer
Older
ultramine_permissions / src / main / java / org / ultramine / permission / internal / PermUser.java
@vlad20012 vlad20012 on 2 May 2017 3 KB Initial commit
package org.ultramine.permission.internal;

import java.util.LinkedHashMap;
import java.util.Map;

import org.ultramine.permission.IPermission;
import org.ultramine.permission.IPermissionContainer;
import org.ultramine.permission.IPermissionManager;
import org.ultramine.permission.MixinPermission;

public class PermUser implements IPermissionContainer
{
	private final String name;
	private final MixinPermission global = new MixinPermission("global_world_mixin", -1);
	private final Map<String, PermissionHolder> worlds = new LinkedHashMap<String, PermissionHolder>();
	private IPermissionContainer parentContainer;
	
	public PermUser(String name)
	{
		this.name = name;
		worlds.put(IPermissionManager.GLOBAL_WORLD, global);
	}
	
	@Override
	public String getName()
	{
		return name;
	}
	
	public void setParent(IPermissionContainer parentContainer)
	{
		this.parentContainer = parentContainer;
	}
	
	public String getParentName()
	{
		return parentContainer != null ? parentContainer.getName() : "";
	}
	
	public boolean checkUserPermission(String worldname, String permissionKey)
	{
		return check(worldname, permissionKey).asBoolean();
	}
	
	public CheckResult check(String worldname, String permissionKey)
	{
		CheckResult result = CheckResult.UNRESOLVED;

		PermissionHolder world = worlds.get(worldname);
		if (world == null)
			world = global;

		result = world.check(permissionKey);

		if (result == CheckResult.UNRESOLVED && parentContainer != null)
			result = parentContainer.check(worldname, permissionKey);

		return result;
	}
	
	@Override
	public String getMeta(String worldname, String key)
	{
		String result = null;

		PermissionHolder world = worlds.get(worldname);
		if (world == null)
			world = global;

		result = world.getMeta(key);

		if (result == null && parentContainer != null)
			result = parentContainer.getMeta(worldname, key);

		return result;
	}
	
	public PermissionHolder getGlobalHolder()
	{
		return global;
	}
	
	public PermissionHolder getOrCreateWorldHolder(String worldname)
	{
		PermissionHolder holder = worlds.get(worldname);
		if(holder == null)
		{
			holder = new PermissionHolder();
			holder.addPermission(global);
			worlds.put(worldname, holder);
		}
		return holder;
	}
	
	public void addPermission(String worldname, IPermission permission)
	{
		getOrCreateWorldHolder(worldname).addPermission(permission);
	}

	public void removePermission(String worldname, String key)
	{
		PermissionHolder holder = worlds.get(worldname);
		if(holder != null)
			holder.removePermission(key);
	}
	
	public void setMeta(String worldname, String key, String value)
	{
		getOrCreateWorldHolder(worldname).setMeta(key, value);
	}

	public void clearAll()
	{
		global.clearPermissions();
		global.clearMeta();
		for(PermissionHolder holder : worlds.values())
		{
			holder.clearPermissions();
			holder.clearMeta();
		}
		worlds.clear();
		worlds.put(IPermissionManager.GLOBAL_WORLD, global);
	}
	
	public Map<String, PermissionHolder> getInnerWorlds()
	{
		Map<String, PermissionHolder> map = new LinkedHashMap<String, PermissionHolder>(worlds);
		map.remove(IPermissionManager.GLOBAL_WORLD);
		return map;
	}
}