/*
* Copyright 2011 Tyler Blair. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without modification, are
* permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice, this list of
* conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright notice, this list
* of conditions and the following disclaimer in the documentation and/or other materials
* provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ''AS IS'' AND ANY EXPRESS OR IMPLIED
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
* FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
* ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* The views and conclusions contained in the software and documentation are those of the
* authors and contributors and should not be interpreted as representing official policies,
* either expressed or implied, of anybody else.
*/
package com.griefcraft.model;
import com.griefcraft.util.Colors;
import com.griefcraft.util.StringUtil;
import com.griefcraft.util.UUIDRegistry;
import org.json.simple.JSONObject;
public class Permission {
/**
* The access level
* The ordering of this enum <b>MUST NOT</b> change as ordinal values are used internally.
*/
public enum Access {
/**
* The player has no access
*/
NONE,
/**
* The player has rights that of a regular player
*/
PLAYER,
/**
* The player has admin rights
*/
ADMIN;
@Override
public String toString() {
return StringUtil.capitalizeFirstLetter(super.toString());
}
}
/**
* The type this permission applies to.
* The ordering of this enum <b>MUST NOT</b> change as ordinal values are used internally.
*/
public enum Type {
/**
* Applies to a specific group of players
*/
GROUP,
/**
* Applies to a specific player
*/
PLAYER,
/**
* Unused / reserved, has been used before
*/
RESERVED,
/**
* Applies to citizens of a Towny town
*/
TOWN,
/**
* Allows a specific item (such as a key) to open the protection when interacted with in hand
*/
ITEM,
/**
* Applies to members of a WorldGuard region
*/
REGION;
@Override
public String toString() {
return StringUtil.capitalizeFirstLetter(super.toString());
}
}
/**
* The entity this applies to
*/
private String name;
/**
* The type of access used for the permission
*/
private Type type;
/**
* The access the permission has to the protection
*/
private Access access = Access.PLAYER;
/**
* If the permission is not synchronized to the database
*/
private boolean isVolatile = false;
public Permission() {
}
public Permission(String name) {
this.name = name;
}
public Permission(String name, Type type) {
this(name);
this.type = type;
}
public Permission(String name, Type type, Access access) {
this(name, type);
this.access = access;
}
/**
* Encode the Permission object to a JSONObject
*
* @return
*/
public JSONObject encodeToJSON() {
JSONObject object = new JSONObject();
object.put("name", name);
object.put("type", getType().ordinal());
object.put("rights", getAccess().ordinal());
return object;
}
/**
* Decode a JSONObject into a Permission object
*
* @param node
* @return
*/
public static Permission decodeJSON(JSONObject node) {
Permission permission = new Permission();
Access access = Access.values()[((Long) node.get("rights")).intValue()];
if (access.ordinal() == 0) {
access = Access.PLAYER;
}
// The values are stored as longs internally, despite us passing an int
permission.setName((String) node.get("name"));
permission.setType(Type.values()[((Long) node.get("type")).intValue()]);
permission.setAccess(access);
return permission;
}
@Override
public String toString() {
StringBuilder builder = new StringBuilder();
builder.append(Colors.Yellow);
if (type == Type.PLAYER) {
builder.append(UUIDRegistry.formatPlayerName(getName()));
} else {
builder.append(getName());
}
builder.append(Colors.White);
builder.append(" (");
builder.append(Colors.Green);
builder.append(getType());
builder.append(Colors.White);
builder.append(") ");
if (getAccess() == Access.ADMIN) {
builder.append(Colors.White);
builder.append("(");
builder.append(Colors.Red);
builder.append("ADMIN");
builder.append(Colors.White);
builder.append(")");
}
return builder.toString();
// return String.format("Permission = { protection=%d name=%s rights=%d type=%s }", protectionId, name, rights, typeToString(rights));
}
public String getName() {
return name;
}
public Access getAccess() {
return access;
}
public Type getType() {
return type;
}
public void setName(String name) {
this.name = name;
}
public void setAccess(Access access) {
this.access = access;
}
public void setType(Type type) {
this.type = type;
}
public void setVolatile(boolean isVolatile) {
this.isVolatile = isVolatile;
}
public boolean isVolatile() {
return isVolatile;
}
}