# Class Permissions

java.lang.Object
java.security.PermissionCollection
java.security.Permissions

All Implemented Interfaces:
  `Serializable`

public final class Permissions extends PermissionCollection implements Serializable
This class represents a heterogeneous collection of permissions. That is, it contains different types of `Permission` objects, organized into `PermissionCollection` objects. For example, if any `java.io.FilePermission` objects are added to an instance of this class, they are all stored in a single `PermissionCollection`. It is the `PermissionCollection` returned by a call to the `newPermissionCollection` method in the `FilePermission` class. Similarly, any `java.lang.RuntimePermission` objects are stored in the `PermissionCollection` returned by a call to the `newPermissionCollection` method in the `RuntimePermission` class. Thus, this class represents a collection of `PermissionCollection` objects.

When the `add` method is called to add a `Permission`, the `Permission` is stored in the appropriate `PermissionCollection`. If no such collection exists yet, the `Permission` object's class is determined and the `newPermissionCollection` method is called on that class to create the `PermissionCollection` and add it to the `Permissions` object. If `newPermissionCollection` returns `null`, then a default `PermissionCollection` that uses a hashtable will be created and used. Each hashtable entry stores a `Permission` object as both the key and the value.

Enumerations returned via the `elements` method are not fail-fast. Modifications to a collection should not be performed while enumerating over that collection.

Since:
  1.2
See Also:
  - `Permission`
  - `PermissionCollection`
  - `AllPermission`

- ## Constructor Summary

  Constructors
  Constructor
  Description
  `Permissions()`
  Creates a new `Permissions` object containing no `PermissionCollection` objects.

- ## Method Summary

  Modifier and Type
  Method
  Description
  `void`
  `add(Permission permission)`
  Adds a `Permission` object to the `PermissionCollection` for the class the permission belongs to.
  `Enumeration<Permission>`
  `elements()`
  Returns an enumeration of all the `Permission` objects in all the `PermissionCollection` objects in this `Permissions` object.
  `boolean`
  `implies(Permission permission)`
  Checks to see if this object's `PermissionCollection` for permissions of the specified permission's class implies the permissions expressed in the permission object.

  ### Methods declared in class PermissionCollection

  `elementsAsStream, isReadOnly, setReadOnly, toString`
  Modifier and Type
  Method
  Description
  `Stream<Permission>`
  `elementsAsStream()`
  Returns a stream of all the Permission objects in the collection.
  `boolean`
  `isReadOnly()`
  Returns `true` if this `PermissionCollection` object is marked as readonly.
  `void`
  `setReadOnly()`
  Marks this `PermissionCollection` object as "readonly".
  `String`
  `toString()`
  Returns a string describing this `PermissionCollection` object, providing information about all the permissions it contains.

  ### Methods declared in class Object

  `clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait`
  Modifier and Type
  Method
  Description
  `protected Object`
  `clone()`
  Creates and returns a copy of this object.
  `boolean`
  `equals(Object obj)`
  Indicates whether some other object is "equal to" this one.
  `protected void`
  `finalize()`
  Deprecated, for removal: This API element is subject to removal in a future version.
  Finalization is deprecated and subject to removal in a future release.
  `final Class<?>`
  `getClass()`
  Returns the runtime class of this `Object`.
  `int`
  `hashCode()`
  Returns a hash code value for this object.
  `final void`
  `notify()`
  Wakes up a single thread that is waiting on this object's monitor.
  `final void`
  `notifyAll()`
  Wakes up all threads that are waiting on this object's monitor.
  `final void`
  `wait()`
  Causes the current thread to wait until it is awakened, typically by being notified or interrupted.
  `final void`
  `wait(long timeoutMillis)`
  Causes the current thread to wait until it is awakened, typically by being notified or interrupted, or until a certain amount of real time has elapsed.
  `final void`
  `wait(long timeoutMillis, int nanos)`
  Causes the current thread to wait until it is awakened, typically by being notified or interrupted, or until a certain amount of real time has elapsed.

- ## Constructor Details

  - ### Permissions

    public Permissions()
    Creates a new `Permissions` object containing no `PermissionCollection` objects.

- ## Method Details

  - ### add

    public void add(Permission permission)
    Adds a `Permission` object to the `PermissionCollection` for the class the permission belongs to. For example, if permission is a `FilePermission`, it is added to the `FilePermissionCollection` stored in this `Permissions` object. This method creates a new `PermissionCollection` object (and adds the permission to it) if an appropriate collection does not yet exist.
    Specified by:
      `add` in class `PermissionCollection`
    Parameters:
      `permission` - the `Permission` object to add.
    Throws:
      `SecurityException` - if this `Permissions` object is marked as readonly.
    See Also:
      - `PermissionCollection.isReadOnly()`

  - ### implies

    public boolean implies(Permission permission)
    Checks to see if this object's `PermissionCollection` for permissions of the specified permission's class implies the permissions expressed in the permission object. Returns `true` if the combination of permissions in the appropriate `PermissionCollection` (e.g., a `FilePermissionCollection` for a `FilePermission`) together imply the specified permission.

    For example, suppose there is a `FilePermissionCollection` in this `Permissions` object, and it contains one `FilePermission` that specifies "read" access for all files in all subdirectories of the "/tmp" directory, and another `FilePermission` that specifies "write" access for all files in the "/tmp/scratch/foo" directory. Then if the `implies` method is called with a permission specifying both "read" and "write" access to files in the "/tmp/scratch/foo" directory, `true` is returned.

    Additionally, if this `PermissionCollection` contains the `AllPermission`, this method will always return `true`.

    Specified by:
      `implies` in class `PermissionCollection`
    Parameters:
      `permission` - the `Permission` object to check.
    Returns:
      `true` if "permission" is implied by the permissions in the `PermissionCollection` it belongs to, `false` if not.

  - ### elements

    public Enumeration<Permission> elements()
    Returns an enumeration of all the `Permission` objects in all the `PermissionCollection` objects in this `Permissions` object.
    Specified by:
      `elements` in class `PermissionCollection`
    Returns:
      an enumeration of all the `Permission` objects.
    See Also:
      - `PermissionCollection.elementsAsStream()`