/* * 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.impl; import java.util.Collection; import java.util.Collections; import java.util.HashSet; import java.util.List; import java.util.Set; import org.uberfire.security.authz.Permission; import org.uberfire.security.authz.PermissionCollection; import org.uberfire.security.authz.PermissionManager; import org.uberfire.security.client.authz.tree.PermissionNode; import org.uberfire.security.client.authz.tree.PermissionTree; import org.uberfire.security.client.authz.tree.PermissionTreeVisitor; public class DefaultPermissionTree implements PermissionTree { private PermissionManager permissionManager; private List<PermissionNode> rootNodes; private PermissionCollection permissions; public DefaultPermissionTree(PermissionManager permissionManager, List<PermissionNode> rootNodes, PermissionCollection permissions) { this.permissionManager = permissionManager; this.rootNodes = rootNodes; this.permissions = permissions; this.init(); } private void init() { for (PermissionNode rootNode : rootNodes) { rootNode.setPermissionTree(this); rootNode.updatePermissionList(permissions); } } public List<PermissionNode> getRootNodes() { return Collections.unmodifiableList(rootNodes); } @Override public PermissionCollection getPermissions() { return permissions; } public Collection<String> getChildrenResourceIds(PermissionNode node) { Set<String> result = new HashSet<>(); for (Permission permission : getChildrenPermissions(node)) { String id = permissionManager.resolveResourceId(permission); if (id != null) { result.add(id); } } return result; } public Set<Permission> getChildrenPermissions(PermissionNode parent) { List<Permission> permissionInTree = parent.getPermissionList(); if (permissionInTree == null || permissions == null || permissions.collection().isEmpty()) { return Collections.emptySet(); } Set<Permission> result = new HashSet<>(); for (Permission parentPermission : permissionInTree) { for (Permission p : permissions.collection()) { /// Get only the children that overwrite its parent if (parentPermission.impliesName(p) && !parentPermission.impliesResult(p)) { result.add(p); } } } return result; } public void accept(PermissionTreeVisitor visitor) { for (PermissionNode rootNode : rootNodes) { this.accept(visitor, rootNode); } } public void accept(PermissionTreeVisitor visitor, PermissionNode node) { visitor.visit(node); node.expand(children -> accept(visitor, children)); } public void accept(PermissionTreeVisitor visitor, List<PermissionNode> children) { for (PermissionNode child : children) { accept(visitor, child); } } }