core/src/main/java/org/springframework/security/access/hierarchicalroles/RoleHierarchyImpl.java
private void buildRolesReachableInOneOrMoreStepsMap() {
		this.rolesReachableInOneOrMoreStepsMap = new HashMap<>();
		// iterate over all higher roles from rolesReachableInOneStepMap

		for (GrantedAuthority role : this.rolesReachableInOneStepMap.keySet()) {
			Set<GrantedAuthority> rolesToVisitSet = new HashSet<>();

			if (this.rolesReachableInOneStepMap.containsKey(role)) {
				rolesToVisitSet.addAll(this.rolesReachableInOneStepMap.get(role));
			}

			Set<GrantedAuthority> visitedRolesSet = new HashSet<>();

			while (!rolesToVisitSet.isEmpty()) {
				// take a role from the rolesToVisit set
				GrantedAuthority aRole = rolesToVisitSet.iterator().next();
				rolesToVisitSet.remove(aRole);
				addReachableRoles(visitedRolesSet, aRole);
				if (this.rolesReachableInOneStepMap.containsKey(aRole)) {
					Set<GrantedAuthority> newReachableRoles = this.rolesReachableInOneStepMap
							.get(aRole);

					// definition of a cycle: you can reach the role you are starting from
					if (rolesToVisitSet.contains(role)
							|| visitedRolesSet.contains(role)) {
						throw new CycleInRoleHierarchyException();
					}
					else {
						// no cycle
						rolesToVisitSet.addAll(newReachableRoles);
					}
				}
			}
			this.rolesReachableInOneOrMoreStepsMap.put(role, visitedRolesSet);

			logger.debug("buildRolesReachableInOneOrMoreStepsMap() - From role " + role
					+ " one can reach " + visitedRolesSet + " in one or more steps.");
		}

	}
private void buildRolesReachableInOneOrMoreStepsMap() {
		this.rolesReachableInOneOrMoreStepsMap = new HashMap<>();
		// iterate over all higher roles from rolesReachableInOneStepMap

		for (GrantedAuthority role : this.rolesReachableInOneStepMap.keySet()) {
			Set<GrantedAuthority> rolesToVisitSet = new HashSet<>();

			if (this.rolesReachableInOneStepMap.containsKey(role)) {
				rolesToVisitSet.addAll(this.rolesReachableInOneStepMap.get(role));
			}

			Set<GrantedAuthority> visitedRolesSet = new HashSet<>();

			while (!rolesToVisitSet.isEmpty()) {
				// take a role from the rolesToVisit set
				GrantedAuthority aRole = rolesToVisitSet.iterator().next();
				rolesToVisitSet.remove(aRole);
				addReachableRoles(visitedRolesSet, aRole);
				if (this.rolesReachableInOneStepMap.containsKey(aRole)) {
					Set<GrantedAuthority> newReachableRoles = this.rolesReachableInOneStepMap
							.get(aRole);

					// definition of a cycle: you can reach the role you are starting from
					if (rolesToVisitSet.contains(role)
							|| visitedRolesSet.contains(role)) {
						throw new CycleInRoleHierarchyException();
					}
					else {
						// no cycle
						rolesToVisitSet.addAll(newReachableRoles);
					}
				}
			}
			this.rolesReachableInOneOrMoreStepsMap.put(role, visitedRolesSet);

			logger.debug("buildRolesReachableInOneOrMoreStepsMap() - From role " + role
					+ " one can reach " + visitedRolesSet + " in one or more steps.");
		}

	}
private void buildRolesReachableInOneOrMoreStepsMap ( ) { this . rolesReachableInOneOrMoreStepsMap = new HashMap <> ( ) ; // iterate over all higher roles from rolesReachableInOneStepMap for ( GrantedAuthority role : this . rolesReachableInOneStepMap . keySet ( ) ) { Set < GrantedAuthority > rolesToVisitSet = new HashSet <> ( ) ; if ( this . rolesReachableInOneStepMap . containsKey ( role ) ) { rolesToVisitSet . addAll ( this . rolesReachableInOneStepMap . get ( role ) ) ; } Set < GrantedAuthority > visitedRolesSet = new HashSet <> ( ) ; while ( ! rolesToVisitSet . isEmpty ( ) ) { // take a role from the rolesToVisit set GrantedAuthority aRole = rolesToVisitSet . iterator ( ) . next ( ) ; rolesToVisitSet . remove ( aRole ) ; addReachableRoles ( visitedRolesSet , aRole ) ; if ( this . rolesReachableInOneStepMap . containsKey ( aRole ) ) { Set < GrantedAuthority > newReachableRoles = this . rolesReachableInOneStepMap . get ( aRole ) ; // definition of a cycle: you can reach the role you are starting from if ( rolesToVisitSet . contains ( role ) || visitedRolesSet . contains ( role ) ) { throw new CycleInRoleHierarchyException ( ) ; } else { // no cycle rolesToVisitSet . addAll ( newReachableRoles ) ; } } } this . rolesReachableInOneOrMoreStepsMap . put ( role , visitedRolesSet ) ; logger . debug ( "buildRolesReachableInOneOrMoreStepsMap() - From role " + role + " one can reach " + visitedRolesSet + " in one or more steps." ) ; } }
For every higher role from rolesReachableInOneStepMap store all roles that are
reachable from it in the map of roles reachable in one or more steps. (Or throw a
CycleInRoleHierarchyException if a cycle in the role hierarchy definition is
detected)
For every higher role from rolesReachableInOneStepMap store all roles that are reachable from it in the map of roles reachable in one or more steps . ( Or throw a CycleInRoleHierarchyException if a cycle in the role hierarchy definition is detected )