KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > com > blandware > atleap > webapp > menu > MenuRepository


1 /*
2  * Copyright 2004 Blandware (http://www.blandware.com)
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */

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 JavaDoc;
24 import java.io.InputStream JavaDoc;
25 import java.util.ArrayList JavaDoc;
26 import java.util.Iterator JavaDoc;
27 import java.util.List JavaDoc;
28 import java.util.Set JavaDoc;
29
30
31 /**
32  * <p>Provides functionality to load menu components from config</p>
33  * <p>This class was copied from Struts Menu and slightly modified</p>
34  * <p><a HREF="MenuBase.java.htm"><i>View Source</i></a></p>
35  *
36  * @author Scott Sayles
37  * @author Matt Raible
38  * @author Sergey Zubtcovskii <a HREF="mailto:sergey.zubtcovskii@blandware.com">&lt;sergey.zubtcovskii@blandware.com&gt;</a>
39  */

40 public class MenuRepository implements LoadableResource {
41     //~ Static fields/initializers =============================================
42

43     public static final String JavaDoc MENU_REPOSITORY_KEY =
44             "com.blandware.atleap.webapp.menu.MENU_REPOSITORY";
45     protected transient Log log = LogFactory.getLog(MenuRepository.class);
46
47     //~ Instance fields ========================================================
48

49     protected String JavaDoc config = null;
50     protected String JavaDoc name = null;
51     protected ServletContext JavaDoc servletContext = null;
52     protected FastHashMap menus = new FastHashMap();
53     protected FastHashMap templates = new FastHashMap();
54
55     //~ Methods ================================================================
56

57     /**
58      * Returns set of top-level menu names
59      *
60      * @return Set of top-level menu names
61      */

62     public Set JavaDoc getMenuNames() {
63         return menus.keySet();
64     }
65
66     /**
67      * Convenience method for dynamic menus - returns the top-level menus only.
68      *
69      * @return Top-level menus
70      */

71     public List JavaDoc getTopMenus() {
72         List JavaDoc topMenus = new ArrayList JavaDoc();
73         if ( menus == null ) {
74             log.warn("No menus found in repository!");
75             return topMenus;
76         }
77
78         for ( Iterator JavaDoc it = menus.keySet().iterator(); it.hasNext(); ) {
79             String JavaDoc name = (String JavaDoc) it.next();
80             MenuComponent menu = getMenu(name);
81             if ( menu.getParent() == null ) {
82                 topMenus.add(menu);
83             }
84         }
85         return topMenus;
86     }
87
88     /**
89      * Returns top-level menu by its name
90      *
91      * @param menuName Name of menu to return
92      * @return Top-level menu by name
93      */

94     public MenuComponent getMenu(String JavaDoc menuName) {
95         return (MenuComponent) menus.get(menuName);
96     }
97
98     /**
99      * Initializes digester to get menus from config
100      *
101      * @return Initialized digester instance
102      */

103     protected Digester initDigester() {
104         Digester digester = new Digester();
105         digester.setClassLoader(Thread.currentThread().getContextClassLoader());
106         digester.push(this);
107
108         // 1
109
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         // 2
115
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         // 3
122
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         // 4
129
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         // 5
136
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         // 6
143
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         // 7
150
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     /**
160      * Adds a new menu. This is called when parsing the menu xml definition.
161      *
162      * @param menu The menu component to add.
163      */

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 JavaDoc children = getMenu(menu.getName()).getComponents();
171             if ( children != null && menu.getComponents() != null ) {
172                 for ( Iterator JavaDoc 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     /**
182      * Allows easy removal of a menu by its name.
183      *
184      * @param name Name of menu to remove
185      */

186     public void removeMenu(String JavaDoc name) {
187         if ( menus.containsKey(name) ) {
188             menus.remove(getMenu(name));
189         }
190     }
191
192     /**
193      * Loads the menu repository
194      *
195      * @throws LoadableResourceException
196      */

197     public void load() throws LoadableResourceException {
198         if ( getServletContext() == null ) {
199             throw new LoadableResourceException("no reference to servlet context found");
200         }
201
202         InputStream JavaDoc 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 JavaDoc 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 JavaDoc e ) {
218             }
219         }
220     }
221
222     /**
223      * Reloads the menu repository
224      *
225      * @throws LoadableResourceException
226      */

227     public void reload() throws LoadableResourceException {
228         menus.setFast(false);
229         menus.clear();
230         load();
231     }
232
233     /**
234      * Sets load parameter
235      *
236      * @param loadParam the parameter to set
237      */

238     public void setLoadParam(String JavaDoc loadParam) {
239         config = loadParam;
240     }
241
242     /**
243      * Returns load parameter
244      *
245      * @return load parameter
246      */

247     public String JavaDoc getLoadParam() {
248         return config;
249     }
250
251     /**
252      * Sets name
253      *
254      * @param name name to set
255      */

256     public void setName(String JavaDoc name) {
257         this.name = name;
258     }
259
260     /**
261      * Returns name
262      *
263      * @return name
264      */

265     public String JavaDoc getName() {
266         return name;
267     }
268
269     /**
270      * Returns servlet context
271      *
272      * @return servlet context
273      */

274     public ServletContext JavaDoc getServletContext() {
275         return servletContext;
276     }
277
278     /**
279      * Sets servlet context
280      *
281      * @param context servlet context to set
282      */

283     public void setServletContext(ServletContext JavaDoc context) {
284         this.servletContext = context;
285     }
286 }
287
Popular Tags