1 16 package com.blandware.atleap.webapp.menu; 17 18 import org.apache.commons.collections.FastHashMap; 19 import org.apache.commons.digester.Digester; 20 import org.apache.commons.logging.Log; 21 import org.apache.commons.logging.LogFactory; 22 23 import javax.servlet.ServletContext ; 24 import java.io.InputStream ; 25 import java.util.ArrayList ; 26 import java.util.Iterator ; 27 import java.util.List ; 28 import java.util.Set ; 29 30 31 40 public class MenuRepository implements LoadableResource { 41 43 public static final String MENU_REPOSITORY_KEY = 44 "com.blandware.atleap.webapp.menu.MENU_REPOSITORY"; 45 protected transient Log log = LogFactory.getLog(MenuRepository.class); 46 47 49 protected String config = null; 50 protected String name = null; 51 protected ServletContext servletContext = null; 52 protected FastHashMap menus = new FastHashMap(); 53 protected FastHashMap templates = new FastHashMap(); 54 55 57 62 public Set getMenuNames() { 63 return menus.keySet(); 64 } 65 66 71 public List getTopMenus() { 72 List topMenus = new ArrayList (); 73 if ( menus == null ) { 74 log.warn("No menus found in repository!"); 75 return topMenus; 76 } 77 78 for ( Iterator it = menus.keySet().iterator(); it.hasNext(); ) { 79 String name = (String ) it.next(); 80 MenuComponent menu = getMenu(name); 81 if ( menu.getParent() == null ) { 82 topMenus.add(menu); 83 } 84 } 85 return topMenus; 86 } 87 88 94 public MenuComponent getMenu(String menuName) { 95 return (MenuComponent) menus.get(menuName); 96 } 97 98 103 protected Digester initDigester() { 104 Digester digester = new Digester(); 105 digester.setClassLoader(Thread.currentThread().getContextClassLoader()); 106 digester.push(this); 107 108 digester.addObjectCreate("MenuConfig/Menus/Menu", 110 "com.blandware.atleap.webapp.menu.MenuComponent", "type"); 111 digester.addSetProperties("MenuConfig/Menus/Menu"); 112 digester.addSetNext("MenuConfig/Menus/Menu", "addMenu"); 113 114 digester.addObjectCreate("MenuConfig/Menus/Menu/Item", 116 "com.blandware.atleap.webapp.menu.MenuComponent", "type"); 117 digester.addSetProperties("MenuConfig/Menus/Menu/Item"); 118 digester.addSetNext("MenuConfig/Menus/Menu/Item", "addMenuComponent", 119 "com.blandware.atleap.webapp.menu.MenuComponent"); 120 121 digester.addObjectCreate("MenuConfig/Menus/Menu/Item/Item", 123 "com.blandware.atleap.webapp.menu.MenuComponent", "type"); 124 digester.addSetProperties("MenuConfig/Menus/Menu/Item/Item"); 125 digester.addSetNext("MenuConfig/Menus/Menu/Item/Item", 126 "addMenuComponent", "com.blandware.atleap.webapp.menu.MenuComponent"); 127 128 digester.addObjectCreate("MenuConfig/Menus/Menu/Item/Item/Item", 130 "com.blandware.atleap.webapp.menu.MenuComponent", "type"); 131 digester.addSetProperties("MenuConfig/Menus/Menu/Item/Item/Item"); 132 digester.addSetNext("MenuConfig/Menus/Menu/Item/Item/Item", 133 "addMenuComponent", "com.blandware.atleap.webapp.menu.MenuComponent"); 134 135 digester.addObjectCreate("MenuConfig/Menus/Menu/Item/Item/Item/Item", 137 "com.blandware.atleap.webapp.menu.MenuComponent", "type"); 138 digester.addSetProperties("MenuConfig/Menus/Menu/Item/Item/Item/Item"); 139 digester.addSetNext("MenuConfig/Menus/Menu/Item/Item/Item/Item", 140 "addMenuComponent", "com.blandware.atleap.webapp.menu.MenuComponent"); 141 142 digester.addObjectCreate("MenuConfig/Menus/Menu/Item/Item/Item/Item/Item", 144 "com.blandware.atleap.webapp.menu.MenuComponent", "type"); 145 digester.addSetProperties("MenuConfig/Menus/Menu/Item/Item/Item/Item/Item"); 146 digester.addSetNext("MenuConfig/Menus/Menu/Item/Item/Item/Item/Item", 147 "addMenuComponent", "com.blandware.atleap.webapp.menu.MenuComponent"); 148 149 digester.addObjectCreate("MenuConfig/Menus/Menu/Item/Item/Item/Item/Item/Item", 151 "com.blandware.atleap.webapp.menu.MenuComponent", "type"); 152 digester.addSetProperties("MenuConfig/Menus/Menu/Item/Item/Item/Item/Item/Item"); 153 digester.addSetNext("MenuConfig/Menus/Menu/Item/Item/Item/Item/Item/Item", 154 "addMenuComponent", "com.blandware.atleap.webapp.menu.MenuComponent"); 155 156 return digester; 157 } 158 159 164 public void addMenu(MenuComponent menu) { 165 if ( menus.containsKey(menu.getName()) ) { 166 if ( log.isDebugEnabled() ) { 167 log.warn("Menu '" + menu.getName() 168 + "' already exists in repository"); 169 } 170 List children = getMenu(menu.getName()).getComponents(); 171 if ( children != null && menu.getComponents() != null ) { 172 for ( Iterator it = children.iterator(); it.hasNext(); ) { 173 MenuComponent child = (MenuComponent) it.next(); 174 menu.addMenuComponent(child); 175 } 176 } 177 } 178 menus.put(menu.getName(), menu); 179 } 180 181 186 public void removeMenu(String name) { 187 if ( menus.containsKey(name) ) { 188 menus.remove(getMenu(name)); 189 } 190 } 191 192 197 public void load() throws LoadableResourceException { 198 if ( getServletContext() == null ) { 199 throw new LoadableResourceException("no reference to servlet context found"); 200 } 201 202 InputStream input = null; 203 Digester digester = initDigester(); 204 205 try { 206 input = getServletContext().getResourceAsStream(config); 207 digester.parse(input); 208 209 menus.setFast(true); 210 } catch ( Exception e ) { 211 e.printStackTrace(); 212 throw new LoadableResourceException("Error parsing resource file: " + 213 config + " nested exception is: " + e.getMessage()); 214 } finally { 215 try { 216 input.close(); 217 } catch ( Exception e ) { 218 } 219 } 220 } 221 222 227 public void reload() throws LoadableResourceException { 228 menus.setFast(false); 229 menus.clear(); 230 load(); 231 } 232 233 238 public void setLoadParam(String loadParam) { 239 config = loadParam; 240 } 241 242 247 public String getLoadParam() { 248 return config; 249 } 250 251 256 public void setName(String name) { 257 this.name = name; 258 } 259 260 265 public String getName() { 266 return name; 267 } 268 269 274 public ServletContext getServletContext() { 275 return servletContext; 276 } 277 278 283 public void setServletContext(ServletContext context) { 284 this.servletContext = context; 285 } 286 } 287 | Popular Tags |