/*
* Copyright 2016 Red Hat, Inc. and/or its affiliates.
*
* 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.
*/
package org.uberfire.security.client.authz.tree;
import java.util.List;
import org.uberfire.security.authz.Permission;
import org.uberfire.security.authz.PermissionCollection;
/**
* A permission tree node
*/
public interface PermissionNode {
/**
* Get the provider instance that built this node instance.
*/
PermissionTreeProvider getPermissionTreeProvider();
/**
* Set the provider instance that built this node instance.
*/
void setPermissionTreeProvider(PermissionTreeProvider provider);
/**
* Get the {@link PermissionTree} instance this root node has been attached to.
*/
PermissionTree getPermissionTree();
/**
* Attach this root node to the given {@link PermissionTree} instance.
*/
void setPermissionTree(PermissionTree tree);
/**
* Get the parent node.
* @return null if this is a root node
*/
PermissionNode getParentNode();
/**
* Set this node's parent
*/
void setParentNode(PermissionNode parentNode);
/**
* A number indicating at what specific levels this node is placed within the {@link PermissionTree}
* @return A positive integer from 0 to N, where <i>0=root</i>, <i>N=leaf</i>.
*/
int getLevel();
/**
* Retrieves the name to display for the given node.
* @return The name to display in the UI
*/
String getNodeName();
/**
* Retrieves the full name to display for the given node.
* @return The name to display in the UI
*/
String getNodeFullName();
/**
* The position of the node within the permission tree. The position is used by {@link PermissionTree}
* implementations to order its root nodes from lower position nodes to higher ones.
*/
int getPositionInTree();
/**
* The list of permissions attached to this node.
*/
List<Permission> getPermissionList();
/**
* Updates the node's permission values according to the values specified in the given collection.
* @param collection The permission collection with the results to apply.
*/
void updatePermissionList(PermissionCollection collection);
/**
* Add a permission instance to the list
*/
void addPermission(Permission permission,
String name);
/**
* Add a permission instance to the list
*/
void addPermission(Permission permission,
String grantName,
String denyName);
/**
* Retrieves the name to display for the grant action.
* @param permission The {@link Permission} instance
* @return The name to display in the UI
*/
String getPermissionGrantName(Permission permission);
/**
* Retrieves the name to display for the deny action.
* @param permission The {@link Permission} instance
* @return The name to display in the UI
*/
String getPermissionDenyName(Permission permission);
/**
* Attach to the given {@link Permission} instance a set of permissions which depends on it so that if the
* permission is denied then all its dependencies must be denied as well.
* <p>
* <p>For instance, the update and delete permission over a resource depends on the read permission.</p>
* @param permission The {@link Permission} instance
* @param dependencies The set of dependencies
*/
void addDependencies(Permission permission,
Permission... dependencies);
/**
* Get the dependencies (if any) attached to a given permission instance.
* @param permission The permission to check
* @return A list of permissions
*/
List<Permission> getDependencies(Permission permission);
/**
* Get the expand status
* @return true if expanded, false if collapsed
*/
boolean isExpanded();
/**
* Get a property attached to this node
* @param key The property key
* @return The value object
*/
Object getProperty(String key);
/**
* Attach a property to this node
* @param key The property key
* @param value The value object
*/
void setProperty(String key,
Object value);
/**
* Check if a property exists and matchs the given value
* @param key The property key
* @param value The value object to check
*/
boolean propertyEquals(String key,
Object value);
/**
* Retrieve the permissions of the specified node that are implied by this node's permissions.
* @return A sub-list of {@link Permission} instances
*/
List<Permission> impliesName(PermissionNode node);
/**
* Expand the node.
* <p>
* <p>The children nodes are loaded asynchronously and the consumer instance passed
* as a parameter is invoked after the loading process is done.</p>
* <p>
* <p>It does nothing in case the node is already expanded.</p>
* @param consumer The callback instance that consumes the children nodes.
*/
void expand(LoadCallback consumer);
/**
* Collapse the node
*/
void collapse();
}