@Override public Set<RoleModel> getComposites() { if (updated != null) return updated.getComposites(); Set<RoleModel> set = new HashSet<RoleModel>(); for (String id : cached.getComposites()) { RoleModel role = realm.getRoleById(id); if (role == null) { throw new IllegalStateException("Could not find composite: " + id); } set.add(role); } return set; }
/** * Deep search if given role is descendant of composite role * * @param role role to check * @param composite composite role * @param visited set of already visited roles (used for recursion) * @return true if "role" is descendant of "composite" */ public static boolean searchFor(RoleModel role, RoleModel composite, Set<RoleModel> visited) { if (visited.contains(composite)) return false; visited.add(composite); Set<RoleModel> composites = composite.getComposites(); if (composites.contains(role)) return true; for (RoleModel contained : composites) { if (!contained.isComposite()) continue; if (searchFor(role, contained, visited)) return true; } return false; }
/** * Recursively expands composite roles into their composite. * @param role * @param visited Track roles, which were already visited. Those will be ignored and won't be added to the stream. Besides that, * the "visited" set itself will be updated as a result of this method call and all the tracked roles will be added to it * @return Stream of containing all of the composite roles and their components. */ private static Stream<RoleModel> expandCompositeRolesStream(RoleModel role, Set<RoleModel> visited) { Stream.Builder<RoleModel> sb = Stream.builder(); if (!visited.contains(role)) { Deque<RoleModel> stack = new ArrayDeque<>(); stack.add(role); while (!stack.isEmpty()) { RoleModel current = stack.pop(); sb.add(current); if (current.isComposite()) { current.getComposites().stream() .filter(r -> !visited.contains(r)) .forEach(r -> { visited.add(r); stack.add(r); }); } } } return sb.build(); }
@Override public Set<RoleModel> getComposites() { if (isUpdated()) return updated.getComposites(); if (composites == null) { composites = new HashSet<RoleModel>(); for (String id : cached.getComposites()) { RoleModel role = realm.getRoleById(id); if (role == null) { throw new IllegalStateException("Could not find composite in role " + getName() + ": " + id); } composites.add(role); } } return composites; }
RoleRepresentation roleRep = ModelToRepresentation.toRepresentation(role); Set<RoleModel> composites = role.getComposites(); if (composites != null && composites.size() > 0) { Set<String> compositeRealmRoles = null;
public CachedRole(RoleModel model, RealmModel realm) { composite = model.isComposite(); description = model.getDescription(); id = model.getId(); name = model.getName(); scopeParamRequired = model.isScopeParamRequired(); this.realm = realm.getId(); if (composite) { for (RoleModel child : model.getComposites()) { composites.add(child.getId()); } } }
public CachedRole(Long revision, RoleModel model, RealmModel realm) { super(revision, model.getId()); composite = model.isComposite(); description = model.getDescription(); name = model.getName(); this.realm = realm.getId(); if (composite) { for (RoleModel child : model.getComposites()) { composites.add(child.getId()); } } attributes = new DefaultLazyLoader<>(roleModel -> new MultivaluedHashMap<>(roleModel.getAttributes()), MultivaluedHashMap::new); }
for (RoleModel composite : roleModel.getComposites()) {