package codeine.permissions;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.inject.Inject;
import org.apache.log4j.Logger;
import codeine.configuration.IConfigurationManager;
import codeine.jsons.auth.CodeineUser;
import codeine.jsons.global.UserPermissionsJsonStore;
import codeine.jsons.project.ProjectJson;
import com.google.common.collect.Maps;
public class UserPermissionsBuilder {
private static final Logger log = Logger.getLogger(UserPermissionsBuilder.class);
private UserPermissionsJsonStore userPermissionsJsonStore;
private IConfigurationManager configurationManager;
private GroupsManager groupsManager;
@Inject
public UserPermissionsBuilder(UserPermissionsJsonStore userPermissionsJsonStore,
IConfigurationManager configurationManager, GroupsManager groupsManager) {
super();
this.userPermissionsJsonStore = userPermissionsJsonStore;
this.configurationManager = configurationManager;
this.groupsManager = groupsManager;
}
public IUserWithPermissions getUserPermissions(CodeineUser user) {
UserPermissions userPermissions = userPermissionsJsonStore.get().getOrNull(user.username());
if (null == userPermissions) {
userPermissions = new UserPermissions(user, false);
}
Map<String, UserProjectPermissions> p = getProjectPermissions(user.username());
Map<String, UserPermissions> groupPermissions = getGroupsPermissions(user.username()); //group -> permissions
Map<String, Map<String, UserProjectPermissions>> groupProjectsPermissions = getGroupsProjectsPermissions(user.username()); //group -> project -> permissions
return new CompoundUserPermissions(userPermissions, p, groupPermissions, groupProjectsPermissions);
}
private HashMap<String, Map<String, UserProjectPermissions>> getGroupsProjectsPermissions(String user) {
HashMap<String, Map<String, UserProjectPermissions>> $ = Maps.newHashMap();
List<String> groups = groupsManager.groups(user);
for (String group : groups) {
log.debug("group is " + group);
Map<String, UserProjectPermissions> projectPermissions = getProjectPermissions(group);
if (!projectPermissions.isEmpty()) {
$.put(group, projectPermissions);
}
}
return $;
}
private HashMap<String, UserPermissions> getGroupsPermissions(String user) {
HashMap<String, UserPermissions> $ = Maps.newHashMap();
List<String> groups = groupsManager.groups(user);
for (String group : groups) {
UserPermissions userPermissions = userPermissionsJsonStore.get().getOrNull(group);
if (null != userPermissions) {
$.put(group, userPermissions);
}
}
return $;
}
private Map<String, UserProjectPermissions> getProjectPermissions(String theUser) {
List<ProjectJson> configuredProjects = configurationManager.getConfiguredProjects();
Map<String, UserProjectPermissions> p = Maps.newHashMap();
for (ProjectJson projectJson : configuredProjects) {
for (UserProjectPermissions u : projectJson.permissions()) {
if (u.username().equals(theUser)){
p.put(projectJson.name(), u);
}
}
}
return p;
}
}