/*
* 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.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import javax.annotation.PostConstruct;
import javax.enterprise.context.ApplicationScoped;
import javax.inject.Inject;
import org.jboss.errai.ioc.client.container.SyncBeanDef;
import org.jboss.errai.ioc.client.container.SyncBeanManager;
import org.jboss.errai.security.shared.api.Group;
import org.jboss.errai.security.shared.api.Role;
import org.jboss.errai.security.shared.api.identity.User;
import org.uberfire.security.authz.AuthorizationPolicy;
import org.uberfire.security.authz.PermissionCollection;
import org.uberfire.security.authz.PermissionManager;
import org.uberfire.security.authz.VotingStrategy;
import org.uberfire.security.client.authz.tree.PermissionNode;
import org.uberfire.security.client.authz.tree.PermissionTree;
import org.uberfire.security.client.authz.tree.PermissionTreeFactory;
import org.uberfire.security.client.authz.tree.PermissionTreeProvider;
@ApplicationScoped
public class DefaultPermissionTreeFactory implements PermissionTreeFactory {
private PermissionManager permissionManager;
private SyncBeanManager beanManager;
private Collection<PermissionTreeProvider> permissionTreeProviderSet = new HashSet<>();
public DefaultPermissionTreeFactory() {
}
@Inject
public DefaultPermissionTreeFactory(PermissionManager permissionManager,
SyncBeanManager beanManager) {
this.permissionManager = permissionManager;
this.beanManager = beanManager;
}
public DefaultPermissionTreeFactory(PermissionManager permissionManager,
Collection<PermissionTreeProvider> permissionTreeProviderSet) {
this.permissionManager = permissionManager;
this.permissionTreeProviderSet = permissionTreeProviderSet;
}
@PostConstruct
private void init() {
for (SyncBeanDef<PermissionTreeProvider> beanDef : beanManager.lookupBeans(PermissionTreeProvider.class)) {
PermissionTreeProvider provider = beanDef.getInstance();
permissionTreeProviderSet.add(provider);
}
}
@Override
public PermissionTree createPermissionTree() {
return createPermissionTree((PermissionCollection) null);
}
@Override
public PermissionTree createPermissionTree(Role role) {
AuthorizationPolicy policy = permissionManager.getAuthorizationPolicy();
PermissionCollection pc = policy.getPermissions(role);
return createPermissionTree(pc);
}
@Override
public PermissionTree createPermissionTree(Group group) {
AuthorizationPolicy policy = permissionManager.getAuthorizationPolicy();
PermissionCollection pc = policy.getPermissions(group);
return createPermissionTree(pc);
}
@Override
public PermissionTree createPermissionTree(User user,
VotingStrategy votingStrategy) {
PermissionCollection pc = permissionManager.resolvePermissions(user,
votingStrategy);
return createPermissionTree(pc);
}
private PermissionTree createPermissionTree(PermissionCollection permissions) {
List<PermissionNode> rootNodes = new ArrayList<>();
for (PermissionTreeProvider provider : permissionTreeProviderSet) {
if (provider.isActive()) {
PermissionNode rootNode = provider.buildRootNode();
if (rootNode != null) {
rootNodes.add(rootNode);
}
}
}
Collections.sort(rootNodes,
this::compareRootNode);
return new DefaultPermissionTree(permissionManager,
rootNodes,
permissions);
}
private int compareRootNode(PermissionNode n1,
PermissionNode n2) {
if (n1.getPositionInTree() > n2.getPositionInTree()) {
return 1;
}
if (n1.getPositionInTree() < n2.getPositionInTree()) {
return -1;
}
String name1 = n1.getNodeName();
String name2 = n2.getNodeName();
return name1.compareTo(name2);
}
}