/* * JBoss, Home of Professional Open Source * * Distributable under LGPL license. * See terms of license at gnu.org. */ package org.jboss.seam.wiki.core.action; import org.jboss.seam.ScopeType; import org.jboss.seam.Component; import org.jboss.seam.security.Identity; import org.jboss.seam.annotations.*; import org.jboss.seam.log.Log; import org.jboss.seam.wiki.core.action.prefs.WikiPreferences; import org.jboss.seam.wiki.core.dao.WikiNodeDAO; import org.jboss.seam.wiki.core.model.WikiDirectory; import org.jboss.seam.wiki.core.model.WikiTreeNode; import org.jboss.seam.wiki.core.cache.PageFragmentCache; import org.jboss.seam.wiki.preferences.Preferences; import java.io.Serializable; import java.util.List; /** * Holds the nodes that are displayed in the site menu * * @author Christian Bauer */ @Name("menu") @Scope(ScopeType.SESSION) public class Menu implements Serializable { public static final String CACHE_REGION = "wiki.MainMenu"; public static final String CACHE_KEY = "MainMenuForAccessLevel"; @Logger Log log; @In Integer currentAccessLevel; List<WikiTreeNode<WikiDirectory>> tree; public List<WikiTreeNode<WikiDirectory>> getTree() { if (tree == null) { refreshTree(); } return tree; } public String getCacheRegion() { return CACHE_REGION; } public String getCacheKey() { return CACHE_KEY + currentAccessLevel; } // Logout invalidates the session context, so we don't need to refresh afterwards @Observer(value = { "Node.updated", "Node.removed", Identity.EVENT_LOGIN_SUCCESSFUL}) public void invalidateCache() { log.debug("invaliding menu items tree cache"); PageFragmentCache.instance().removeAll(CACHE_REGION); tree = null; } private void refreshTree() { log.debug("Loading menu items tree"); WikiPreferences wikiPreferences = Preferences.instance().get(WikiPreferences.class); tree = WikiNodeDAO.instance().findMenuItemTree( (WikiDirectory)Component.getInstance("wikiRoot"), wikiPreferences.getMainMenuDepth(), wikiPreferences.getMainMenuLevels(), wikiPreferences.isMainMenuShowAdminOnly() ); } }