/**
*
*/
package com.thinkbiganalytics.metadata.api.user;
/*-
* #%L
* thinkbig-metadata-api
* %%
* Copyright (C) 2017 ThinkBig Analytics
* %%
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* #L%
*/
import com.thinkbiganalytics.security.GroupPrincipal;
import java.io.Serializable;
import java.util.Set;
import java.util.stream.Stream;
import javax.annotation.Nonnull;
/**
* Represents a group of users and/or other groups of users.
*/
public interface UserGroup {
/**
* @return the ID of this group
*/
@Nonnull
ID getId();
/**
* @return the unique name of this group
*/
@Nonnull
String getSystemName();
/**
* @return the human readable title for this group, or the system name if none has been set.
*/
String getTitle();
/**
* Sets a human-readable title for this group.
*
* @param title the new title
*/
void setTitle(String title);
/**
* @return the description of this group
*/
String getDescription();
/**
* Sets the description of this group.
*
* @param descr the new description
*/
void setDescription(String descr);
/**
* Indicates that the group is available to be assigned users.
*
* @return {@code true} if the group is enabled, or {@code false} otherwise
*/
boolean isEnabled();
/**
* Enables or disables whether the group is available to be assigned users.
*/
void setEnabled(boolean enabled);
/**
* @return the users that are direct members of this group
*/
@Nonnull
Iterable<User> getUsers();
/**
* Collects all users that are direct members of this group, as well as the transitive members
* of all of the groups contained within this group.
*
* @return an Iterable of all users of this group
*/
@Nonnull
Stream<User> streamAllUsers();
/**
* Adds a new user member to this group.
*
* @param user the user to add
* @return true if the user was not already a member, otherwise false
*/
boolean addUser(@Nonnull User user);
/**
* Removes a member from this group.
*
* @param user the user to remove
* @return true if the user was a member of the group, otherwise false
*/
boolean removeUser(@Nonnull User user);
/**
* @return an Iterable of groups directly contained within this group
*/
@Nonnull
Iterable<UserGroup> getGroups();
/**
* @return an set of all groups of which this group is a direct member
*/
@Nonnull
Set<UserGroup> getContainingGroups();
/**
* @return all of the groups of which this group is a member; both directly and transitively.
*/
Set<UserGroup> getAllContainingGroups();
/**
* Streams all groups transitively from the member groups this group
* in a depth-first order.
*
* @return an stream of all groups contained in this group
*/
@Nonnull
Stream<UserGroup> streamAllGroups();
/**
* Adds a new group member to this group.
*
* @param group the group to add
* @return true if the group was not already a member, otherwise false
*/
boolean addGroup(@Nonnull UserGroup group);
/**
* Removes a group member from this group.
*
* @param group the group to remove
* @return true if the group was a member of the group, otherwise false
*/
boolean removeGroup(@Nonnull UserGroup group);
/**
* @return the full group principal (i.e. containing member principals) associated with this group
*/
GroupPrincipal getPrincial();
/**
* @return the group root principal (i.e. for the group only without member principals) associated with this group
*/
GroupPrincipal getRootPrincial();
/**
* A unique identifier for a group.
*/
interface ID extends Serializable {
}
}