package org.ultramine.permission.internal;
import org.ultramine.permission.IDirtyListener;
import org.ultramine.permission.IPermission;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
public class PermissionHolder extends MetaHolder implements IDirtyListener
{
private boolean dirty;
private Map<String, IPermission> permissions = new LinkedHashMap<String, IPermission>();
private PermissionResolver permissionResolver = new PermissionResolver();
private MetaResolver metaResolver = new MetaResolver();
public PermissionHolder()
{
super();
this.dirty = false;
}
public PermissionHolder(Map<String, String> meta)
{
super(meta);
this.dirty = true;
}
public CheckResult check(String key)
{
return getPermissionResolver().check(key);
}
public void addPermission(IPermission permission)
{
if (permissions.containsKey(permission.getKey()))
return;
permissions.put(permission.getKey(), permission);
permission.subscribe(this);
makeDirty();
}
public void removePermission(IPermission permission)
{
removePermission(permission.getKey());
}
public void removePermission(String key)
{
if (!permissions.containsKey(key))
return;
IPermission permission = permissions.remove(key);
permission.unsubscribe(this);
makeDirty();
}
public void clearPermissions()
{
for (IPermission permission : permissions.values())
permission.unsubscribe(this);
permissions.clear();
makeDirty();
}
public List<String> getInnerPermissions()
{
return new ArrayList<String>(permissions.keySet());
}
public boolean isDirty()
{
return dirty;
}
@Override
public void makeDirty()
{
dirty = true;
}
@Override
public void setMeta(String key, String value)
{
super.setMeta(key, value);
makeDirty();
}
@Override
public void removeMeta(String key)
{
super.removeMeta(key);
makeDirty();
}
public void setInnerMeta(Map<String, String> meta)
{
super.setInnerMeta(meta);
makeDirty();
}
@Override
public void clearMeta()
{
super.clearMeta();
makeDirty();
}
public void calculate()
{
if (!isDirty())
return;
dirty = false;
permissionResolver.clear();
metaResolver.clear();
for (IPermission permission : permissions.values())
{
permission.mergePermissionsTo(permissionResolver);
permission.mergeMetaTo(metaResolver);
}
mergeInnerMeta();
}
protected PermissionResolver getPermissionResolver()
{
if (isDirty())
calculate();
return permissionResolver;
}
@Override
protected MetaResolver getMetaResolver()
{
if (isDirty())
calculate();
return metaResolver;
}
}