package org.bukkit.permissions; import java.util.LinkedHashMap; import java.util.Locale; import java.util.Map; import org.bukkit.plugin.Plugin; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; /** * Holds information about a permission attachment on a {@link Permissible} * object */ public class PermissionAttachment { private PermissionRemovedExecutor removed; private final Map permissions = new LinkedHashMap(); private final Permissible permissible; private final Plugin plugin; public PermissionAttachment(@NotNull Plugin plugin, @NotNull Permissible permissible) { if (plugin == null) { throw new IllegalArgumentException("Plugin cannot be null"); } else if (!plugin.isEnabled()) { throw new IllegalArgumentException("Plugin " + plugin.getDescription().getFullName() + " is disabled"); } this.permissible = permissible; this.plugin = plugin; } /** * Gets the plugin responsible for this attachment * * @return Plugin responsible for this permission attachment */ @NotNull public Plugin getPlugin() { return plugin; } /** * Sets an object to be called for when this attachment is removed from a * {@link Permissible}. May be null. * * @param ex Object to be called when this is removed */ public void setRemovalCallback(@Nullable PermissionRemovedExecutor ex) { removed = ex; } /** * Gets the class that was previously set to be called when this * attachment was removed from a {@link Permissible}. May be null. * * @return Object to be called when this is removed */ @Nullable public PermissionRemovedExecutor getRemovalCallback() { return removed; } /** * Gets the Permissible that this is attached to * * @return Permissible containing this attachment */ @NotNull public Permissible getPermissible() { return permissible; } /** * Gets a copy of all set permissions and values contained within this * attachment. *

* This map may be modified but will not affect the attachment, as it is a * copy. * * @return Copy of all permissions and values expressed by this attachment */ @NotNull public Map getPermissions() { return new LinkedHashMap(permissions); } /** * Sets a permission to the given value, by its fully qualified name * * @param name Name of the permission * @param value New value of the permission */ public void setPermission(@NotNull String name, boolean value) { permissions.put(name.toLowerCase(Locale.ROOT), value); permissible.recalculatePermissions(); } /** * Sets a permission to the given value * * @param perm Permission to set * @param value New value of the permission */ public void setPermission(@NotNull Permission perm, boolean value) { setPermission(perm.getName(), value); } /** * Removes the specified permission from this attachment. *

* If the permission does not exist in this attachment, nothing will * happen. * * @param name Name of the permission to remove */ public void unsetPermission(@NotNull String name) { permissions.remove(name.toLowerCase(Locale.ROOT)); permissible.recalculatePermissions(); } /** * Removes the specified permission from this attachment. *

* If the permission does not exist in this attachment, nothing will * happen. * * @param perm Permission to remove */ public void unsetPermission(@NotNull Permission perm) { unsetPermission(perm.getName()); } /** * Removes this attachment from its registered {@link Permissible} * * @return true if the permissible was removed successfully, false if it * did not exist */ public boolean remove() { try { permissible.removeAttachment(this); return true; } catch (IllegalArgumentException ex) { return false; } } }