📄 menurepository.java
字号:
/* * MenuRepository.java * * Created on January 29, 2001, 9:51 AM */package net.sf.navigator.menu;import java.io.InputStream;import java.util.*;import javax.servlet.ServletContext;import net.sf.navigator.displayer.MenuDisplayerMapping;import net.sf.navigator.util.LoadableResource;import net.sf.navigator.util.LoadableResourceException;import org.apache.commons.collections.FastHashMap;import org.apache.commons.digester.Digester;import org.apache.commons.logging.Log;import org.apache.commons.logging.LogFactory;/** * * @author ssayles, mraible * @version */public class MenuRepository implements LoadableResource { //~ Static fields/initializers ============================================= public static final String MENU_REPOSITORY_KEY = "net.sf.navigator.menu.MENU_REPOSITORY"; private static Log log = LogFactory.getLog(MenuRepository.class); //~ Instance fields ======================================================== protected String config = null; protected String name = null; protected ServletContext servletContext = null; protected FastHashMap menus = new FastHashMap(); protected FastHashMap displayers = new FastHashMap(); protected FastHashMap templates = new FastHashMap(); //~ Methods ================================================================ public Set getMenuNames() { return menus.keySet(); } /** * Convenience method for dynamic menus - returns the top-level menus * only. * @return */ public List getTopMenus() { List topMenus = new ArrayList(); if (menus == null) { log.warn("No menus found in repository!"); return topMenus; } for (Iterator it = menus.keySet().iterator(); it.hasNext();) { String name = (String) it.next(); MenuComponent menu = getMenu(name); if (menu.getParent() == null) { topMenus.add(menu); } } return topMenus; } public MenuComponent getMenu(String menuName) { return (MenuComponent) menus.get(menuName); } public MenuDisplayerMapping getMenuDisplayerMapping(String displayerName) { MenuDisplayerMapping mapping = (MenuDisplayerMapping) displayers.get(displayerName); return mapping; } protected Digester initDigester() { Digester digester = new Digester(); digester.setClassLoader(Thread.currentThread().getContextClassLoader()); digester.push(this); //digester.setDebug(getDebug()); // 1 digester.addObjectCreate("MenuConfig/Menus/Menu", "net.sf.navigator.menu.MenuComponent", "type"); digester.addSetProperties("MenuConfig/Menus/Menu"); digester.addSetNext("MenuConfig/Menus/Menu", "addMenu"); // 2 digester.addObjectCreate("MenuConfig/Menus/Menu/Item", "net.sf.navigator.menu.MenuComponent", "type"); digester.addSetProperties("MenuConfig/Menus/Menu/Item"); digester.addSetNext("MenuConfig/Menus/Menu/Item", "addMenuComponent", "net.sf.navigator.menu.MenuComponent"); // 3 digester.addObjectCreate("MenuConfig/Menus/Menu/Item/Item", "net.sf.navigator.menu.MenuComponent", "type"); digester.addSetProperties("MenuConfig/Menus/Menu/Item/Item"); digester.addSetNext("MenuConfig/Menus/Menu/Item/Item", "addMenuComponent", "net.sf.navigator.menu.MenuComponent"); // 4 digester.addObjectCreate("MenuConfig/Menus/Menu/Item/Item/Item", "net.sf.navigator.menu.MenuComponent", "type"); digester.addSetProperties("MenuConfig/Menus/Menu/Item/Item/Item"); digester.addSetNext("MenuConfig/Menus/Menu/Item/Item/Item", "addMenuComponent", "net.sf.navigator.menu.MenuComponent"); // 5 digester.addObjectCreate("MenuConfig/Menus/Menu/Item/Item/Item/Item", "net.sf.navigator.menu.MenuComponent", "type"); digester.addSetProperties("MenuConfig/Menus/Menu/Item/Item/Item/Item"); digester.addSetNext("MenuConfig/Menus/Menu/Item/Item/Item/Item", "addMenuComponent", "net.sf.navigator.menu.MenuComponent"); // 6 digester.addObjectCreate("MenuConfig/Menus/Menu/Item/Item/Item/Item", "net.sf.navigator.menu.MenuComponent", "type"); digester.addSetProperties("MenuConfig/Menus/Menu/Item/Item/Item/Item"); digester.addSetNext("MenuConfig/Menus/Menu/Item/Item/Item/Item", "addMenuComponent", "net.sf.navigator.menu.MenuComponent"); // 7 digester.addObjectCreate("MenuConfig/Menus/Menu/Item/Item/Item/Item", "net.sf.navigator.menu.MenuComponent", "type"); digester.addSetProperties("MenuConfig/Menus/Menu/Item/Item/Item/Item"); digester.addSetNext("MenuConfig/Menus/Menu/Item/Item/Item/Item", "addMenuComponent", "net.sf.navigator.menu.MenuComponent"); digester.addObjectCreate("MenuConfig/Displayers/Displayer", "net.sf.navigator.displayer.MenuDisplayerMapping", "mapping"); digester.addSetProperties("MenuConfig/Displayers/Displayer"); digester.addSetNext("MenuConfig/Displayers/Displayer", "addMenuDisplayerMapping", "net.sf.navigator.displayer.MenuDisplayerMapping"); digester.addSetProperty("MenuConfig/Displayers/Displayer/SetProperty", "property", "value"); return digester; } /** * Adds a new menu. This is called when parsing the menu xml definition. * * @param menu The menu component to add. */ public void addMenu(MenuComponent menu) { if (menus.containsKey(menu.getName())) { if (log.isDebugEnabled()) { log.warn("Menu '" + menu.getName() + "' already exists in repository"); } List children = getMenu(menu.getName()).getComponents(); if (children != null && menu.getComponents() != null) { for (Iterator it = children.iterator();it.hasNext();) { MenuComponent child = (MenuComponent) it.next(); menu.addMenuComponent(child); } } } menus.put(menu.getName(), menu); } public void addMenuDisplayerMapping(MenuDisplayerMapping displayerMapping) { displayers.put(displayerMapping.getName(), displayerMapping); } /** * This method is so menu repositories can retrieve displayers from the * default repository specified in menu-config.xml * @return the displayers specified in this repository */ public FastHashMap getDisplayers() { return displayers; } /** * Allow the displayers to be set as a whole. This should only be used * when copying the displayers from the default repository to a newly * created repository. * @param displayers */ public void setDisplayers(FastHashMap displayers) { this.displayers = displayers; } public void load() throws LoadableResourceException { if (getServletContext() == null) { throw new LoadableResourceException("no reference to servlet context found"); } InputStream input = null; Digester digester = initDigester(); try { input = getServletContext().getResourceAsStream(config); digester.parse(input); menus.setFast(true); } catch (Exception e) { e.printStackTrace(); throw new LoadableResourceException("Error parsing resource file: " + config + " nested exception is: " + e.getMessage()); } finally { try { input.close(); } catch (Exception e) {} } } public void reload() throws LoadableResourceException { menus.setFast(false); menus.clear(); displayers.setFast(false); displayers.clear(); load(); } public void setLoadParam(String loadParam) { config = loadParam; } public String getLoadParam() { return config; } public void setName(String name) { this.name = name; } public String getName() { return name; } public ServletContext getServletContext() { return servletContext; } public void setServletContext(ServletContext context) { this.servletContext = context; }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -