docs: private Set<String> getAllGroupNames() {
  
          // First get the topmost role (should be root admin)
  
          CmsRole root = this;
          while (root.getParentRole() != null) {
              root = root.getParentRole();
          }
          List<CmsRole> allRoles = root.getChildren(true);
          allRoles.add(root);
  
          // now build multimap from children to parent roles for all roles reachable from root
  
          HashMultimap<CmsRole, CmsRole> mapOfParents = HashMultimap.create();
          for (CmsRole parent : allRoles) {
              for (CmsRole child : parent.getChildren(false)) {
                  mapOfParents.put(child, parent);
              }
          }
  
          // now traverse the parent map, starting from this role, to find all parent roles
          // (we can't just use the getParentRole() method instead of the parent map here,
          // since roles may have multiple logical parents (roles which have them as a child).
  
          Set<CmsRole> visited = Sets.newHashSet();
          Set<CmsRole> workingSet = Sets.newHashSet();
          Set<String> result = Sets.newHashSet();
          workingSet.add(this);
          while (!workingSet.isEmpty()) {
              CmsRole current = workingSet.iterator().next();
              result.add(current.getGroupName());
              workingSet.remove(current);
              for (CmsRole parent : mapOfParents.get(current)) {
                  if (!visited.contains(parent)) {
                      workingSet.add(parent);
                  }
              }
              visited.add(current);
          }
          return result;
      }