Re-did container permissions

This commit is contained in:
Obique PSWG
2016-06-02 06:01:55 -05:00
parent 1652656bcb
commit 43af96e047
10 changed files with 127 additions and 473 deletions
@@ -26,182 +26,38 @@
******************************************************************************/
package resources.containers;
import java.util.ArrayList;
import java.util.EnumSet;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import resources.network.NetBufferStream;
import resources.objects.SWGObject;
import resources.persistable.Persistable;
/**
* Structure for creating permission sets that will allow the object to be viewed/modified/added/removed by a requested
* object depending on the implemented abstract methods.
* @author Waverunner
*/
public abstract class ContainerPermissions implements Persistable {
public static final WorldPermissions WORLD = new WorldPermissions();
public static final InventoryPermissions INVENTORY = new InventoryPermissions();
private Map<String, Integer> permissionGroups;
private List<String> joinedGroups;
public abstract class ContainerPermissions {
public ContainerPermissions() {
this.permissionGroups = new HashMap<>();
this.joinedGroups = new ArrayList<>();
}
protected boolean hasPermissions(String group, Permission... permissions) {
if (!hasPermissionGroup(group))
return false;
EnumSet<Permission> groupPermissions = Permission.getFlags(permissionGroups.get(group));
for (Permission permission : permissions) {
if (!groupPermissions.contains(permission))
return false;
}
return true;
}
public boolean hasPermissions(List<String> requesterGroups, Permission ... permission) {
for (String group : requesterGroups) {
if (hasPermissions(group, permission))
return true;
}
return false;
}
public void addPermissions(String group, Permission... permissions) {
if (!hasPermissionGroup(group)) {
permissionGroups.put(group, Permission.valueOf(permissions));
return;
}
EnumSet<Permission> groupPermissions = Permission.getFlags(permissionGroups.get(group));
for (Permission permission : permissions) {
groupPermissions.add(permission);
}
synchronized (permissionGroups) {
permissionGroups.put(group, Permission.valueOf(groupPermissions));
}
}
public void removePermissions(String group, Permission... permissions) {
if (!hasPermissionGroup(group))
return;
EnumSet<Permission> groupPermissions = Permission.getFlags(permissionGroups.get(group));
for (Permission permission : permissions) {
groupPermissions.add(permission);
}
synchronized (permissionGroups) {
permissionGroups.put(group, Permission.valueOf(groupPermissions));
}
}
public void clearPermissions(String group) {
synchronized (permissionGroups) {
if (permissionGroups.containsKey(group))
permissionGroups.put(group, 0);
}
}
public boolean hasPermissionGroup(String group) {
return permissionGroups.containsKey(group);
}
public Set<String> getPermissionGroups() {
synchronized(permissionGroups) {
return permissionGroups.keySet();
}
}
public List<String> getJoinedGroups() {
return joinedGroups;
}
public void addDefaultWorldPermissions() {
addPermissions("world", Permission.VIEW, Permission.ENTER);
}
@Override
public void save(NetBufferStream stream) {
stream.addByte(0);
synchronized (permissionGroups) {
stream.addMap(permissionGroups, (e) -> {
stream.addAscii(e.getKey());
stream.addInt(e.getValue());
});
}
synchronized (joinedGroups) {
stream.addList(joinedGroups, (g) -> stream.addAscii(g));
}
}
@Override
public void read(NetBufferStream stream) {
stream.getByte();
stream.getList((i) -> permissionGroups.put(stream.getAscii(), stream.getInt()));
stream.getList((i) -> joinedGroups.add(stream.getAscii()));
}
public abstract boolean canView(SWGObject viewer, SWGObject container);
public abstract boolean canEnter(SWGObject requester, SWGObject container);
public abstract boolean canRemove(SWGObject requester, SWGObject container);
public abstract boolean canMove(SWGObject requester, SWGObject container);
public abstract boolean canAdd(SWGObject requester, SWGObject container);
public enum Permission {
VIEW(1),
REMOVE(1<<1),
ADD(1<<2),
MOVE(1<<3),
ENTER(1<<4);
int bitmask;
Permission(int bitmask) {
this.bitmask = bitmask;
}
public static EnumSet<Permission> getFlags(int bits) {
EnumSet <Permission> states = EnumSet.noneOf(Permission.class);
for (Permission state : values()) {
if ((state.bitmask & bits) != 0)
states.add(state);
}
return states;
}
public static int valueOf(EnumSet<Permission> bitmaskSet) {
int value = 0;
for (Permission permission : bitmaskSet) {
value += permission.bitmask;
}
return value;
}
public static int valueOf(Permission... permissions) {
int value = 0;
for (Permission permission : permissions) {
value += permission.bitmask;
}
return value;
}
public boolean canView(SWGObject container) {
return canView(null, container);
}
public boolean canEnter(SWGObject container) {
return canEnter(null, container);
}
public boolean canRemove(SWGObject container) {
return canRemove(null, container);
}
public boolean canMove(SWGObject container) {
return canMove(null, container);
}
public boolean canAdd(SWGObject container) {
return canAdd(null, container);
}
}