package io.lumify.web.clientapi.model; import com.google.common.base.Joiner; import org.json.JSONArray; import java.util.*; public enum Privilege { READ(0x01), COMMENT(0x16), EDIT(0x02), PUBLISH(0x04), ADMIN(0x08); private final int value; Privilege(int value) { this.value = value; } public static int toBits(Privilege... indexHints) { return toBits(EnumSet.copyOf(Arrays.asList(indexHints))); } public static int toBits(Collection<Privilege> privileges) { byte b = 0; for (Privilege hint : privileges) { b |= hint.value; } return b; } public static Set<Privilege> toSet(int privileges) { Set<Privilege> hints = new HashSet<Privilege>(); for (int i = 0; i < Privilege.values().length; i++) { Privilege privilege = Privilege.values()[i]; if ((privileges & privilege.value) == privilege.value) { hints.add(privilege); } } return hints; } public static final Set<Privilege> ALL = EnumSet.of(READ, COMMENT, EDIT, PUBLISH, ADMIN); public static final Set<Privilege> NONE = new HashSet<Privilege>(); public static JSONArray toJson(Set<Privilege> privileges) { JSONArray json = new JSONArray(); for (Privilege privilege : privileges) { json.put(privilege.name()); } return json; } public static Set<Privilege> stringToPrivileges(String privilegesString) { if (privilegesString == null || privilegesString.equalsIgnoreCase("NONE")) { return NONE; } if (privilegesString.equalsIgnoreCase("ALL")) { return ALL; } String[] privilegesStringParts = privilegesString.split(","); Set<Privilege> privileges = new HashSet<Privilege>(); for (String privilegesStringPart : privilegesStringParts) { if (privilegesStringPart.trim().length() == 0) { continue; } privileges.add(stringToPrivilege(privilegesStringPart)); } return privileges; } public static Privilege stringToPrivilege(String privilegesStringPart) { privilegesStringPart = privilegesStringPart.trim(); for (Privilege privilege : Privilege.values()) { if (privilege.name().equalsIgnoreCase(privilegesStringPart)) { return privilege; } } return Privilege.valueOf(privilegesStringPart); } public static String toString(Collection<Privilege> privileges) { return Joiner.on(",").join(privileges); } public static boolean hasAll(Set<Privilege> userPrivileges, Set<Privilege> requiredPrivileges) { for (Privilege privilege : requiredPrivileges) { if (!userPrivileges.contains(privilege)) { return false; } } return true; } }