Package org.apache.catalina.users

## Class MemoryUserDatabase

- java.lang.Object
- - org.apache.catalina.users.MemoryUserDatabase

All Implemented Interfaces:
  `UserDatabase`

    public class MemoryUserDatabase
    extends java.lang.Object
    implements UserDatabase

Concrete implementation of `UserDatabase` that loads all defined users, groups, and roles into an in-memory data structure, and uses a specified XML file for its persistent storage.

This class is thread-safe.

This class does not enforce what, in an RDBMS, would be called referential integrity. Concurrent modifications may result in inconsistent data such as a User retaining a reference to a Role that has been removed from the database.

Since:
  4.1
Author:
  Craig R. McClanahan

### Field Summary

Fields
`protected java.util.Map<java.lang.String,​Group>` `groups` The set of `Group`s defined in this database, keyed by group name.
`protected java.lang.String` `id` The unique global identifier of this user database.
`protected java.lang.String` `pathname` The relative (to `catalina.base`) or absolute pathname to the XML file in which we will save our persistent information.
`protected java.lang.String` `pathnameNew` The relative or absolute pathname of the file in which we write our new information prior to renaming.
`protected java.lang.String` `pathnameOld` The relative or absolute pathname to the file in which our old information is stored while renaming is in progress.
`protected boolean` `readonly` A flag, indicating if the user database is read only.
`protected java.util.Map<java.lang.String,​Role>` `roles` The set of `Role`s defined in this database, keyed by role name.
`protected java.util.Map<java.lang.String,​User>` `users` The set of `User`s defined in this database, keyed by user name.

### Constructor Summary

Constructors
`MemoryUserDatabase()` Create a new instance with default values.
`MemoryUserDatabase​(java.lang.String id)` Create a new instance with the specified values.

### Method Summary

All Methods Instance Methods Concrete Methods Deprecated Methods
`void` `backgroundProcess()`
`void` `close()` Finalize access to this user database.
`Group` `createGroup​(java.lang.String groupname, java.lang.String description)` Create and return a new `Group` defined in this user database.
`Role` `createRole​(java.lang.String rolename, java.lang.String description)` Create and return a new `Role` defined in this user database.
`User` `createUser​(java.lang.String username, java.lang.String password, java.lang.String fullName)` Create and return a new `User` defined in this user database.
`Group` `findGroup​(java.lang.String groupname)` Return the `Group` with the specified group name, if any; otherwise return `null`.
`Role` `findRole​(java.lang.String rolename)` Return the `Role` with the specified role name, if any; otherwise return `null`.
`User` `findUser​(java.lang.String username)` Return the `User` with the specified user name, if any; otherwise return `null`.
`java.util.Iterator<Group>` `getGroups()`
`java.lang.String` `getId()`
`java.lang.String` `getPathname()`
`boolean` `getReadonly()`
`java.util.Iterator<Role>` `getRoles()`
`java.util.Iterator<User>` `getUsers()`
`boolean` `getWatchSource()`
`boolean` `isWritable()` Check for permissions to save this user database to persistent storage location.
`boolean` `isWriteable()` Deprecated. Use `isWritable()`.
`void` `open()` Initialize access to this user database.
`void` `removeGroup​(Group group)` Remove the specified `Group` from this user database.
`void` `removeRole​(Role role)` Remove the specified `Role` from this user database.
`void` `removeUser​(User user)` Remove the specified `User` from this user database.
`void` `save()` Save any updated information to the persistent storage location for this user database.
`void` `setPathname​(java.lang.String pathname)` Set the relative or absolute pathname to the persistent storage file.
`void` `setReadonly​(boolean readonly)` Setting the readonly status of the user database
`void` `setWatchSource​(boolean watchSource)`
`java.lang.String` `toString()` Return a String representation of this UserDatabase.

### Methods inherited from class java.lang.Object

`clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait`

### Field Detail

#### groups

    protected final java.util.Map<java.lang.String,​Group> groups

The set of `Group`s defined in this database, keyed by group name.

#### id

    protected final java.lang.String id

The unique global identifier of this user database.

#### pathname

    protected java.lang.String pathname

The relative (to `catalina.base`) or absolute pathname to the XML file in which we will save our persistent information.

#### pathnameOld

    protected java.lang.String pathnameOld

The relative or absolute pathname to the file in which our old information is stored while renaming is in progress.

#### pathnameNew

    protected java.lang.String pathnameNew

The relative or absolute pathname of the file in which we write our new information prior to renaming.

#### readonly

    protected boolean readonly

A flag, indicating if the user database is read only.

#### roles

    protected final java.util.Map<java.lang.String,​Role> roles

The set of `Role`s defined in this database, keyed by role name.

#### users

    protected final java.util.Map<java.lang.String,​User> users

The set of `User`s defined in this database, keyed by user name.

### Constructor Detail

#### MemoryUserDatabase

    public MemoryUserDatabase()

Create a new instance with default values.

#### MemoryUserDatabase

    public MemoryUserDatabase​(java.lang.String id)

Create a new instance with the specified values.

Parameters:
  `id` - Unique global identifier of this user database

### Method Detail

#### getGroups

    public java.util.Iterator<Group> getGroups()

Specified by:
  `getGroups` in interface `UserDatabase`
Returns:
  the set of `Group`s defined in this user database.

#### getId

    public java.lang.String getId()

Specified by:
  `getId` in interface `UserDatabase`
Returns:
  the unique global identifier of this user database.

#### getPathname

    public java.lang.String getPathname()

Returns:
  the relative or absolute pathname to the persistent storage file.

#### setPathname

    public void setPathname​(java.lang.String pathname)

Set the relative or absolute pathname to the persistent storage file.

Parameters:
  `pathname` - The new pathname

#### getReadonly

    public boolean getReadonly()

Returns:
  the readonly status of the user database

#### setReadonly

    public void setReadonly​(boolean readonly)

Setting the readonly status of the user database

Parameters:
  `readonly` - the new status

#### getWatchSource

    public boolean getWatchSource()

#### setWatchSource

    public void setWatchSource​(boolean watchSource)

#### getRoles

    public java.util.Iterator<Role> getRoles()

Specified by:
  `getRoles` in interface `UserDatabase`
Returns:
  the set of `Role`s defined in this user database.

#### getUsers

    public java.util.Iterator<User> getUsers()

Specified by:
  `getUsers` in interface `UserDatabase`
Returns:
  the set of `User`s defined in this user database.

#### close

    public void close()
               throws java.lang.Exception

Finalize access to this user database.

Specified by:
  `close` in interface `UserDatabase`
Throws:
  `java.lang.Exception` - if any exception is thrown during closing

#### createGroup

    public Group createGroup​(java.lang.String groupname,
                             java.lang.String description)

Create and return a new `Group` defined in this user database.

Specified by:
  `createGroup` in interface `UserDatabase`
Parameters:
  `groupname` - The group name of the new group (must be unique)
  `description` - The description of this group
Returns:
  The new group

#### createRole

    public Role createRole​(java.lang.String rolename,
                           java.lang.String description)

Create and return a new `Role` defined in this user database.

Specified by:
  `createRole` in interface `UserDatabase`
Parameters:
  `rolename` - The role name of the new group (must be unique)
  `description` - The description of this group
Returns:
  The new role

#### createUser

    public User createUser​(java.lang.String username,
                           java.lang.String password,
                           java.lang.String fullName)

Create and return a new `User` defined in this user database.

Specified by:
  `createUser` in interface `UserDatabase`
Parameters:
  `username` - The logon username of the new user (must be unique)
  `password` - The logon password of the new user
  `fullName` - The full name of the new user
Returns:
  The new user

#### findGroup

    public Group findGroup​(java.lang.String groupname)

Return the `Group` with the specified group name, if any; otherwise return `null`.

Specified by:
  `findGroup` in interface `UserDatabase`
Parameters:
  `groupname` - Name of the group to return
Returns:
  the `Group` with the specified group name, if any; otherwise return `null`.

#### findRole

    public Role findRole​(java.lang.String rolename)

Return the `Role` with the specified role name, if any; otherwise return `null`.

Specified by:
  `findRole` in interface `UserDatabase`
Parameters:
  `rolename` - Name of the role to return
Returns:
  the `Role` with the specified role name, if any; otherwise return `null`.

#### findUser

    public User findUser​(java.lang.String username)

Return the `User` with the specified user name, if any; otherwise return `null`.

Specified by:
  `findUser` in interface `UserDatabase`
Parameters:
  `username` - Name of the user to return
Returns:
  the `User` with the specified user name, if any; otherwise return `null`.

#### open

    public void open()
              throws java.lang.Exception

Initialize access to this user database.

Specified by:
  `open` in interface `UserDatabase`
Throws:
  `java.lang.Exception` - if any exception is thrown during opening

#### removeGroup

    public void removeGroup​(Group group)

Remove the specified `Group` from this user database.

Specified by:
  `removeGroup` in interface `UserDatabase`
Parameters:
  `group` - The group to be removed

#### removeRole

    public void removeRole​(Role role)

Remove the specified `Role` from this user database.

Specified by:
  `removeRole` in interface `UserDatabase`
Parameters:
  `role` - The role to be removed

#### removeUser

    public void removeUser​(User user)

Remove the specified `User` from this user database.

Specified by:
  `removeUser` in interface `UserDatabase`
Parameters:
  `user` - The user to be removed

#### isWriteable

    @Deprecated
    public boolean isWriteable()

Deprecated.
Use `isWritable()`. This method will be removed in Tomcat 10.1.x onwards.
Check for permissions to save this user database to persistent storage location.

Returns:
  `true` if the database is writable

#### isWritable

    public boolean isWritable()

Check for permissions to save this user database to persistent storage location.

Returns:
  `true` if the database is writable

#### save

    public void save()
              throws java.lang.Exception

Save any updated information to the persistent storage location for this user database.

Specified by:
  `save` in interface `UserDatabase`
Throws:
  `java.lang.Exception` - if any exception is thrown during saving

#### backgroundProcess

    public void backgroundProcess()

#### toString

    public java.lang.String toString()

Return a String representation of this UserDatabase.

Overrides:
  `toString` in class `java.lang.Object`