public void findAllPages(
      SimplePageItem pageItem,
      List<PageEntry> entries,
      Map<Long, SimplePage> pageMap,
      Set<Long> topLevelPages,
      Set<Long> sharedPages,
      int level,
      boolean toplevel,
      boolean canEditPage) {
    // System.out.println("in findallpages " + pageItem.getName() + " " + toplevel);
    Long pageId = Long.valueOf(pageItem.getSakaiId());

    if (pageId == 0L) return;

    try {
      if (pageItem.isPrerequisite() || simplePageBean.getItemGroups(pageItem, null, false) != null)
        somePagesHavePrerequisites = true;
    } catch (IdUnusedException exe) {
      // underlying item missing. should be impossible for a page
      return;
    }

    // implement hidden.
    if (!canEditPage) {
      SimplePage page = simplePageToolDao.getPage(pageId);
      if (page.isHidden()) return;
      if (page.getReleaseDate() != null && page.getReleaseDate().after(new Date())) return;
      if (toplevel) {
        if (page.getToolId() != null) {
          // getCurrentSite is cached, so it's reasonable to get it at this level
          Site site = simplePageBean.getCurrentSite();
          SitePage sitePage = site.getPage(page.getToolId());
          List<ToolConfiguration> tools = sitePage.getTools();
          // If all the tools on a page require site.upd then only users with site.upd will see
          // the page in the site nav of Charon... not sure about the other Sakai portals floating
          // about
          boolean visible = false;
          for (ToolConfiguration placement : tools) {
            Properties roleConfig = placement.getPlacementConfig();
            String roleList = roleConfig.getProperty("functions.require");
            String visibility = roleConfig.getProperty("sakai-portal:visible");
            // System.out.println("roles " + roleList + " visi " + visibility);
            // doesn't require site update, so visible
            if ((visibility == null || !visibility.equals("false"))
                && (roleList == null || roleList.indexOf(SITE_UPD) < 0)) {
              // only need one tool on the page to be visible
              visible = true;
              break;
            }
          }

          // not visible, ignore it
          if (!visible) return;
        }
      }
    }

    PageEntry entry = new PageEntry();
    entry.pageId = pageId;
    entry.itemId = pageItem.getId();
    entry.title = pageItem.getName();
    entry.level = level;
    entry.toplevel = toplevel;

    // add entry
    entries.add(entry);

    // if page has already been done, don't do the subpages. Otherwise we can
    // get into infinite loops

    // already done if removed from map.
    // however for top level pages, expand them for their primary entry,
    // i.e. when toplevel is set.
    if (pageMap.get(pageId) == null || (topLevelPages.contains(pageId) && !toplevel)) {
      sharedPages.add(pageId);
      return;
    }

    // say done
    pageMap.remove(pageId);

    // now recursively do subpages

    List<SimplePageItem> items = simplePageToolDao.findItemsOnPage(pageId);
    List<SimplePageItem> nexts = new ArrayList<SimplePageItem>();

    // subpages done in place
    for (SimplePageItem item : items) {
      if (item.getType() == SimplePageItem.PAGE) {
        Long pageNum = Long.valueOf(item.getSakaiId());

        // ignore top-level pages.

        // show next pages (including top level pages) after all the subpages
        // so stick it on the delayed display list.
        if (item.getNextPage()) nexts.add(item);
        else {
          // System.out.println("call for subpage " + item.getName() + " " + false);
          findAllPages(
              item, entries, pageMap, topLevelPages, sharedPages, level + 1, false, canEditPage);
        }
      }
    }
    // nexts done afterwards
    for (SimplePageItem item : nexts) {
      if (item.getType() == SimplePageItem.PAGE) {
        // System.out.println("calling findallpage " + item.getName() + " " + false);
        findAllPages(item, entries, pageMap, topLevelPages, sharedPages, level, false, canEditPage);
      }
    }
  }