@Override public boolean isComposite() { if (updated != null) return updated.isComposite(); return cached.isComposite(); }
/** * 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; }
@Override public boolean isComposite() { if (isUpdated()) return updated.isComposite(); return cached.isComposite(); }
/** * 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(); }
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); }
public static RoleRepresentation toRepresentation(RoleModel role) { RoleRepresentation rep = new RoleRepresentation(); rep.setId(role.getId()); rep.setName(role.getName()); rep.setDescription(role.getDescription()); rep.setScopeParamRequired(role.isScopeParamRequired()); rep.setComposite(role.isComposite()); return rep; }