
de.arbeitsagentur.opdt.keycloak.cassandra.group.CassandraGroupAdapter Maven / Gradle / Ivy
package de.arbeitsagentur.opdt.keycloak.cassandra.group;
import de.arbeitsagentur.opdt.keycloak.cassandra.group.persistence.GroupRepository;
import de.arbeitsagentur.opdt.keycloak.cassandra.group.persistence.entities.GroupValue;
import de.arbeitsagentur.opdt.keycloak.cassandra.group.persistence.entities.Groups;
import lombok.EqualsAndHashCode;
import lombok.RequiredArgsConstructor;
import lombok.extern.jbosslog.JBossLog;
import org.keycloak.models.*;
import org.keycloak.models.utils.RoleUtils;
import java.util.*;
import java.util.function.Consumer;
import java.util.stream.Stream;
@JBossLog
@RequiredArgsConstructor
@EqualsAndHashCode(of = "groupId")
public class CassandraGroupAdapter implements GroupModel {
private final String groupId;
protected final KeycloakSession session;
private final RealmModel realm;
private final GroupValue groupValue;
private final Groups groups;
private final CassandraGroupProvider provider;
@Override
public String getId() {
return groupValue.getId();
}
@Override
public String getName() {
return groupValue.getName();
}
@Override
public void setName(String name) {
groupValue.setName(name);
provider.markChanged(realm.getId());
}
@Override
public void setSingleAttribute(String name, String value) {
groupValue.getAttributes().remove(name);
setAttribute(name, Collections.singletonList(value));
}
@Override
public void setAttribute(String name, List values) {
groupValue.getAttributes().put(name, values);
provider.markChanged(realm.getId());
}
@Override
public void removeAttribute(String name) {
groupValue.getAttributes().remove(name);
provider.markChanged(realm.getId());
}
@Override
public String getFirstAttribute(String name) {
return getAttributeStream(name).findFirst().orElse(null);
}
@Override
public Stream getAttributeStream(String name) {
return groupValue.getAttributes().getOrDefault(name, Collections.emptyList()).stream();
}
@Override
public Map> getAttributes() {
return groupValue.getAttributes();
}
@Override
public GroupModel getParent() {
String parentId = getParentId();
if (parentId == null) {
return null;
}
return new CassandraGroupAdapter(parentId,
session,
realm,
groups.getGroupById(parentId),
groups,
provider);
}
@Override
public String getParentId() {
return groupValue.getParentId();
}
@Override
public Stream getSubGroupsStream() {
return groups.getRealmGroupsByParentId(groupValue.getId())
.stream()
.map(group -> new CassandraGroupAdapter(group.getId(), session, realm, group, groups, provider));
}
@Override
public void setParent(GroupModel group) {
groupValue.setParentId(group == null ? null : group.getId());
provider.markChanged(realm.getId());
}
@Override
public void addChild(GroupModel subGroup) {
subGroup.setParent(this);
}
@Override
public void removeChild(GroupModel subGroup) {
if (getId().equals(subGroup.getParentId())) {
subGroup.setParent(null);
}
}
@Override
public Stream getRealmRoleMappingsStream() {
return getRoleMappingsStream()
.filter(roleModel -> roleModel.getContainer() instanceof RealmModel);
}
@Override
public Stream getClientRoleMappingsStream(ClientModel app) {
final String clientId = app.getId();
return getRoleMappingsStream()
.filter(roleModel -> roleModel.getContainer() instanceof ClientModel)
.filter(roleModel -> roleModel.getContainer().getId().equals(clientId));
}
@Override
public boolean hasDirectRole(RoleModel role) {
Set grantedRoles = groupValue.getGrantedRoles();
return grantedRoles != null && grantedRoles.contains(role.getId());
}
@Override
public boolean hasRole(RoleModel role) {
if (RoleUtils.hasRole(getRoleMappingsStream(), role)) return true;
GroupModel parent = getParent();
return parent != null && parent.hasRole(role);
}
@Override
public void grantRole(RoleModel role) {
groupValue.addGrantedRole(role.getId());
provider.markChanged(realm.getId());
}
@Override
public Stream getRoleMappingsStream() {
Set grantedRoles = groupValue.getGrantedRoles();
return grantedRoles == null ? Stream.empty() : grantedRoles.stream()
.map(roleId -> session.roles().getRoleById(realm, roleId));
}
@Override
public void deleteRoleMapping(RoleModel role) {
groupValue.removeGrantedRole(role.getId());
provider.markChanged(realm.getId());
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy