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); } } }