Source code: org/roller/presentation/tags/menu/RollerMenuModel.java
1
2 package org.roller.presentation.tags.menu;
3
4 import org.apache.commons.digester.Digester;
5 import org.apache.commons.logging.Log;
6 import org.apache.commons.logging.LogFactory;
7 import org.roller.pojos.UserData;
8 import org.roller.presentation.RollerRequest;
9 import org.xml.sax.SAXException;
10
11 import java.io.InputStream;
12 import java.util.Hashtable;
13 import java.util.Vector;
14
15 import javax.servlet.ServletContext;
16 import javax.servlet.http.HttpServletRequest;
17
18 //////////////////////////////////////////////////////////////////////////////
19
20 /**
21 * @author David M Johnson
22 */
23 public class RollerMenuModel implements MenuModel
24 {
25 private static Log mLogger =
26 LogFactory.getFactory().getInstance(RollerMenuModel.class);
27
28 private String mMenuId = null;
29
30 /** Vector of MenuImpl objects */
31 private Vector mMenus = new Vector();
32
33 /** Key used to store selected menu in request */
34 public static final String MENU_KEY = "rmk";
35
36 /** Key used to store selected menu item in request */
37 public static final String MENU_ITEM_KEY = "rmik";
38
39 //------------------------------------------------------------------------
40
41 /** Construct menu model based on hardcoded menu data */
42 public RollerMenuModel( String menuId, String config, ServletContext ctx )
43 {
44 try
45 {
46 mMenuId = menuId;
47
48 Digester digester = new Digester();
49 digester.push(this);
50 //digester.setDebug(99);
51 //digester.setClassLoader( getClass().getClassLoader() );
52 //digester.setValidating(true);
53
54 String menuPath = "menu-bar/menu";
55 String menuItemPath = "menu-bar/menu/menu-item";
56
57 digester.addObjectCreate( menuPath,
58 "org.roller.presentation.tags.menu.MenuImpl");
59 digester.addSetProperties( menuPath );
60 digester.addSetNext( menuPath,"addMenu",
61 "org.roller.presentation.tags.menu.Menu");
62
63 digester.addObjectCreate( menuItemPath,
64 "org.roller.presentation.tags.menu.MenuItemImpl");
65 digester.addSetProperties( menuItemPath );
66 digester.addSetNext( menuItemPath, "addItem",
67 "org.roller.presentation.tags.menu.MenuItemImpl");
68
69 InputStream input = ctx.getResourceAsStream(config);
70 try
71 {
72 digester.parse(input);
73
74 if ( getMenus() != null )
75 {
76 // Set first menu as default
77 MenuImpl m0 = (MenuImpl)getMenus().elementAt(0);
78 if ( m0 != null )
79 {
80 m0.setDefault(true);
81 }
82 // Set first menu item in each menu as default
83 Vector menus = getMenus();
84 for (int i=0; i<menus.size(); i++)
85 {
86 MenuImpl menu = (MenuImpl)menus.elementAt(i);
87 menu.setMenuId( mMenuId );
88 Vector menuItems = menu.getMenuItems();
89 if ( menuItems != null )
90 {
91 MenuItemImpl i0=(MenuItemImpl)menuItems.elementAt(0);
92 i0.setDefault(true);
93
94 for (int j=0; j<menuItems.size(); j++ )
95 {
96 MenuItemImpl item =
97 (MenuItemImpl)menuItems.elementAt(j);
98 item.setMenuId( mMenuId );
99 }
100 }
101 }
102 }
103 }
104 catch (SAXException e)
105 {
106 mLogger.error("Unexpected exception",e);
107 }
108 finally
109 {
110 if ( input!=null )
111 {
112 try { input.close(); }
113 catch (Exception e) { mLogger.error("Unexpected exception",e); };
114 }
115 }
116 }
117 catch (Exception e)
118 {
119 mLogger.error("Unexpected exception",e);
120 }
121 }
122
123 //----------------------------------------------- MenuModel implementation
124
125 public Vector getMenus()
126 {
127 return mMenus;
128 }
129
130 //----------------------------------------------------
131 public Menu getSelectedMenu( HttpServletRequest req )
132 {
133 MenuImpl def = null;
134 MenuImpl selected = null;
135 for ( int i=0; i<mMenus.size(); i++ )
136 {
137 MenuImpl menu = (MenuImpl)mMenus.elementAt(i);
138 if ( menu.isSelected( req ) )
139 {
140 selected = menu;
141 break;
142 }
143 if ( menu.isDefault() )
144 {
145 def = menu;
146 }
147 }
148 if ( selected != null )
149 {
150 return selected;
151 }
152 else
153 {
154 return def;
155
156 }
157 }
158
159 //----------------------------------------------------
160 public void addMenu( Menu menu )
161 {
162 mMenus.addElement( menu );
163 }
164
165 //------------------------------------------------------------------------
166
167 /** Create params based on incoming request */
168 static Hashtable createParams( HttpServletRequest req )
169 {
170 Hashtable params = new Hashtable();
171 RollerRequest rreq = RollerRequest.getRollerRequest(req);
172 try
173 {
174 UserData user = rreq.getUser();
175 String fid =
176 rreq.getFolder()==null ? null : rreq.getFolder().getId();
177 if ( user != null )
178 {
179 params.put( RollerRequest.USERNAME_KEY, user.getUserName() );
180 }
181 if ( fid != null )
182 {
183 params.put( RollerRequest.FOLDERID_KEY, fid );
184 }
185 }
186 catch (Exception e)
187 {
188 mLogger.error("ERROR getting user in menu model", e);
189 }
190 return params;
191 }
192 }
193
194