package com.bagri.core.system;
import java.util.Date;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlList;
import javax.xml.bind.annotation.XmlSeeAlso;
import javax.xml.bind.annotation.XmlType;
import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
/**
* Represents basic entity which can be granted some direct permissions and indirect roles.
*
* @author Denis Sukhoroslov
*
*/
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(namespace = "http://www.bagridb.com/schema/access", propOrder = {
"permissions",
"includedRoles"
})
@XmlSeeAlso({
Role.class,
User.class
})
public abstract class PermissionAware extends Entity {
@XmlElement(name = "permissions")
@XmlJavaTypeAdapter(PermissionsAdapter.class)
private Map<String, Permission> permissions = new HashMap<String, Permission>();
@XmlElement(name = "includedRoles")
@XmlList
private Set<String> includedRoles = new HashSet<String>();
/**
* default constructor
*/
public PermissionAware() {
super();
}
/**
*
* @param version the version
* @param createdAt the date/time of version creation
* @param createdBy the user who has created the version
* @param permissions the map of direct permissions granted to user
* @param includedRoles the collection of roles granted to user
*/
public PermissionAware(int version, Date createdAt, String createdBy, Map<String, Permission> permissions, Set<String> includedRoles) {
super(version, createdAt, createdBy);
setPermissions(permissions);
setIncludedRoles(includedRoles);
}
/**
*
* @return the map of direct permissions granted to the entity
*/
public Map<String, Permission> getPermissions() {
return permissions;
}
/**
*
* @return the full map permissions granted to entity directly or via roles
*/
public Map<String, Object> getFlatPermissions() {
Map<String, Object> perms = new HashMap<String, Object>(permissions.size());
for (Map.Entry<String, Permission> e: permissions.entrySet()) {
perms.put(e.getKey(), e.getValue().getPermissionsAsString());
}
return perms;
}
/**
*
* @return the collection of roles granted to the entity
*/
public Set<String> getIncludedRoles() {
return includedRoles;
}
/**
*
* @param permissions the map of direct permissions granted to the entity
*/
public void setPermissions(Map<String, Permission> permissions) {
this.permissions.clear();
if (permissions != null) {
this.permissions.putAll(permissions);
}
}
/**
*
* @param includedRoles the collection of roles granted to the entity
*/
public void setIncludedRoles(Set<String> includedRoles) {
this.includedRoles.clear();
if (includedRoles != null) {
this.includedRoles.addAll(includedRoles);
}
}
/**
*
* @param role the role to add into the entity roles collection
* @return true if the role has been added, false otherwise
*/
public boolean addIncludedRole(String role) {
return includedRoles.add(role);
}
/**
*
* @param role the role to remove from the entity roles collection
* @return true if the role has been removed, false otherwise
*/
public boolean removeIncludedRole(String role) {
return includedRoles.remove(role);
}
/**
*
* @param resource the resource to grant permission on
* @param permission the permission to add into the entity permissions map
* @return true if the permission has been added, false otherwise
*/
public boolean addPermission(String resource, Permission.Value permission) {
Permission perm = permissions.get(resource);
if (perm == null) {
perm = new Permission(resource);
permissions.put(resource, perm);
}
return perm.addPermission(permission);
}
/**
*
* @param resource the resource to revoke permission from
* @param permission the permission to remove from the entity permissions map
* @return true if the permission has been removed, false otherwise
*/
public boolean removePermission(String resource, Permission.Value permission) {
Permission perm = permissions.get(resource);
if (perm != null) {
if (permission == null) {
permissions.remove(resource);
return true;
} else {
boolean result = perm.removePermission(permission);
if (result && perm.isEmpty()) {
permissions.remove(resource);
}
return result;
}
}
return false;
}
/**
* {@inheritDoc}
*/
@Override
public Map<String, Object> convert() {
Map<String, Object> result = super.convert();
result.put("permissions", permissions.size());
result.put("includedRoles", includedRoles.size());
return result;
}
}