/* * Copyright 2015 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.guvnor.common.services.project.client.security; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.List; import javax.enterprise.context.ApplicationScoped; import javax.inject.Inject; import org.guvnor.common.services.project.client.resources.ProjectResources; import org.guvnor.common.services.project.client.resources.i18n.ProjectConstants; import org.guvnor.common.services.project.model.Project; import org.guvnor.common.services.project.service.ProjectSearchService; import org.jboss.errai.common.client.api.Caller; import org.uberfire.security.Resource; import org.uberfire.security.ResourceAction; import org.uberfire.security.authz.Permission; import org.uberfire.security.authz.PermissionManager; import org.uberfire.security.client.authz.tree.LoadCallback; import org.uberfire.security.client.authz.tree.LoadOptions; import org.uberfire.security.client.authz.tree.PermissionNode; import org.uberfire.security.client.authz.tree.PermissionTreeProvider; import org.uberfire.security.client.authz.tree.impl.PermissionLeafNode; import org.uberfire.security.client.authz.tree.impl.PermissionResourceNode; import static org.guvnor.common.services.project.security.ProjectAction.*; /** * The {@link PermissionTreeProvider} plugin that brings {@link Project} permissions into the ACL editor */ @ApplicationScoped public class ProjectTreeProvider implements PermissionTreeProvider { private ProjectConstants i18n = ProjectResources.CONSTANTS; private PermissionManager permissionManager; private int rootNodePosition = 0; private Caller<ProjectSearchService> searchService; public ProjectTreeProvider() { } @Inject public ProjectTreeProvider(PermissionManager permissionManager, Caller<ProjectSearchService> searchService) { this.permissionManager = permissionManager; this.searchService = searchService; } public int getRootNodePosition() { return rootNodePosition; } public void setRootNodePosition(int rootNodePosition) { this.rootNodePosition = rootNodePosition; } @Override public PermissionNode buildRootNode() { PermissionResourceNode rootNode = new PermissionResourceNode(i18n.ProjectResource(), this); rootNode.setNodeName(i18n.ProjectsNode()); rootNode.setNodeFullName(i18n.ProjectsHelp()); rootNode.setPositionInTree(rootNodePosition); Permission readPermission = newPermission(READ); Permission updatePermission = newPermission(UPDATE); Permission deletePermission = newPermission(DELETE); Permission buildPermission = newPermission(BUILD); Permission createPermission = newPermission(CREATE); rootNode.addPermission(readPermission, i18n.ProjectActionRead()); rootNode.addPermission(updatePermission, i18n.ProjectActionUpdate()); rootNode.addPermission(deletePermission, i18n.ProjectActionDelete()); rootNode.addPermission(buildPermission, i18n.ProjectActionBuild()); rootNode.addPermission(createPermission, i18n.ProjectActionCreate()); rootNode.addDependencies(readPermission, updatePermission, deletePermission, buildPermission); return rootNode; } private Permission newPermission(ResourceAction action) { return permissionManager.createPermission(Project.RESOURCE_TYPE, action, true); } private Permission newPermission(Resource resource, ResourceAction action) { return permissionManager.createPermission(resource, action, true); } @Override public void loadChildren(PermissionNode parent, LoadOptions options, LoadCallback callback) { Collection<String> resourceIds = options.getResourceIds(); int maxNodes = options.getMaxNodes(); if (searchService != null) { if (resourceIds != null) { searchService.call((Collection<Project> projects) -> { List<PermissionNode> children = buildPermissionNodes(projects); callback.afterLoad(children); }).searchById(resourceIds); } else { String namePattern = options.getNodeNamePattern(); searchService.call((Collection<Project> projects) -> { List<PermissionNode> children = buildPermissionNodes(projects); callback.afterLoad(children); }).searchByName(namePattern, maxNodes, false); } } else { callback.afterLoad(Collections.emptyList()); } } private List<PermissionNode> buildPermissionNodes(Collection<Project> projects) { List<PermissionNode> nodes = new ArrayList<>(); for (Project p : projects) { nodes.add(toPermissionNode(p)); } return nodes; } private PermissionNode toPermissionNode(Project p) { PermissionLeafNode node = new PermissionLeafNode(); node.setNodeName(p.getProjectName()); Permission readPermission = newPermission(p, READ); Permission updatePermission = newPermission(p, UPDATE); Permission deletePermission = newPermission(p, DELETE); Permission buildPermission = newPermission(p, BUILD); node.addPermission(readPermission, i18n.ProjectActionRead()); node.addPermission(updatePermission, i18n.ProjectActionUpdate()); node.addPermission(deletePermission, i18n.ProjectActionDelete()); node.addPermission(buildPermission, i18n.ProjectActionBuild()); node.addDependencies(readPermission, updatePermission, deletePermission, buildPermission); return node; } }