KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > apache > roller > ui > core > tags > menu > BaseRollerMenu


1 /*
2  * Licensed to the Apache Software Foundation (ASF) under one or more
3  * contributor license agreements. The ASF licenses this file to You
4  * under the Apache License, Version 2.0 (the "License"); you may not
5  * 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. For additional information regarding
15  * copyright in this work, please see the NOTICE file in the top level
16  * directory of this distribution.
17  */

18
19 package org.apache.roller.ui.core.tags.menu;
20
21 import java.util.ArrayList JavaDoc;
22 import java.util.Arrays JavaDoc;
23 import java.util.Hashtable JavaDoc;
24 import java.util.Iterator JavaDoc;
25 import java.util.List JavaDoc;
26 import javax.servlet.http.HttpServletRequest JavaDoc;
27 import javax.servlet.jsp.PageContext JavaDoc;
28 import org.apache.struts.util.RequestUtils;
29 import org.apache.roller.RollerException;
30 import org.apache.roller.config.RollerConfig;
31 import org.apache.roller.model.Roller;
32 import org.apache.roller.model.RollerFactory;
33 import org.apache.roller.pojos.FolderData;
34 import org.apache.roller.pojos.PermissionsData;
35 import org.apache.roller.pojos.UserData;
36 import org.apache.roller.pojos.WeblogCategoryData;
37 import org.apache.roller.pojos.WeblogEntryData;
38 import org.apache.roller.pojos.WebsiteData;
39 import org.apache.roller.ui.core.BasePageModel;
40 import org.apache.roller.ui.core.RequestConstants;
41 import org.apache.roller.ui.core.RollerSession;
42 import org.apache.roller.ui.rendering.util.WeblogPageRequest;
43 import org.apache.roller.util.Utilities;
44
45
46 /**
47  * Base class for Roller menu objects.
48  */

49 public abstract class BaseRollerMenu {
50     
51     protected String JavaDoc mName = null;
52     protected String JavaDoc mForward = null;
53     protected String JavaDoc mSubforwards = null;
54     protected String JavaDoc mEnabledProperty = null;
55     protected String JavaDoc mDisabledProperty = null;
56     protected List JavaDoc mRoles = new ArrayList JavaDoc();
57     protected List JavaDoc mPerms = new ArrayList JavaDoc();
58     
59     public BaseRollerMenu() {
60         init();
61     }
62     
63     public BaseRollerMenu(String JavaDoc name, String JavaDoc forward) {
64         mName = name;
65         mForward = forward;
66         init();
67     }
68     
69     /**
70      * Set defaults as described in WEB-INF/editor-menu.xml
71      */

72     public void init() {
73         mRoles.add("admin");
74         mRoles.add("editor");
75         
76         mPerms.add("admin");
77         mPerms.add("author");
78     }
79     
80     /** Name of menu */
81     public void setName( String JavaDoc v ) { mName = v; }
82     
83     /** Name of menu */
84     public String JavaDoc getName() { return mName; }
85     
86     /** Struts forward */
87     public String JavaDoc getForward() { return mForward; }
88     
89     /** Struts forward */
90     public void setForward( String JavaDoc forward ) { mForward = forward; }
91     
92     /** Subforward: other forwards grouped under this menu */
93     public String JavaDoc getSubforwards() { return mSubforwards; }
94     
95     /** Subforwards: other forwards grouped under this menu */
96     public void setSubforwards( String JavaDoc subforwards ) { mSubforwards = subforwards; }
97     
98     /** Roles allowed to view menu, comma separated */
99     public void setRoles( String JavaDoc roles ) {
100         mRoles = Arrays.asList(Utilities.stringToStringArray(roles,","));
101     }
102     
103     /** Website permissions required to view menu, comma separated */
104     public void setPerms( String JavaDoc perms ) {
105         mPerms = Arrays.asList(Utilities.stringToStringArray(perms,","));
106     }
107     
108     /** Name of property that enables menu (or null if always enabled) */
109     public void setEnabledProperty(String JavaDoc enabledProperty) {
110         mEnabledProperty = enabledProperty;
111     }
112     
113     /** Name of property that disable menu (or null if always enabled) */
114     public void setDisabledProperty(String JavaDoc disabledProperty) {
115         mDisabledProperty = disabledProperty;
116     }
117     
118     /** Determine if menu should be shown to use of specified request */
119     public boolean isPermitted(HttpServletRequest JavaDoc req) throws RollerException {
120         // first, bail out if menu is disabled
121
if (mEnabledProperty != null) {
122             String JavaDoc enabledProp = RollerConfig.getProperty(mEnabledProperty);
123             if (enabledProp != null && enabledProp.equalsIgnoreCase("false")) {
124                 return false;
125             }
126         }
127         if (mDisabledProperty != null) {
128             String JavaDoc disabledProp = RollerConfig.getProperty(mDisabledProperty);
129             if (disabledProp != null && disabledProp.equalsIgnoreCase("true")) {
130                 return false;
131             }
132         }
133         RollerSession rses = RollerSession.getRollerSession(req);
134         boolean ret = true;
135         
136         if (rses != null && rses.isGlobalAdminUser()) return true;
137         
138         // next, make sure that users role permits it
139
if (mRoles != null && mRoles.size() > 0) {
140             ret = false;
141             Iterator JavaDoc roles = mRoles.iterator();
142             while (roles.hasNext()) {
143                 String JavaDoc role = (String JavaDoc)roles.next();
144                 if (req.isUserInRole(role) || role.equals("any")) {
145                     ret = true;
146                     break;
147                 }
148             }
149         }
150         
151         // finally make sure that user has required website permissions
152
if (ret && mPerms != null && mPerms.size() > 0) {
153             UserData user = null;
154             if (rses != null) user = rses.getAuthenticatedUser();
155             
156             WebsiteData website = getRequestedWeblog(req);
157             BasePageModel pageModel = (BasePageModel)req.getAttribute("model");
158             if (pageModel != null) {
159                 website = pageModel.getWebsite();
160             }
161             
162             PermissionsData permsData = null;
163             if (user != null && website != null) {
164                 permsData = RollerFactory.getRoller()
165                 .getUserManager().getPermissions(website, user);
166             }
167             ret = false;
168             Iterator JavaDoc perms = mPerms.iterator();
169             while (perms.hasNext()) {
170                 String JavaDoc perm = (String JavaDoc)perms.next();
171                 if (perm.equals("any")) {
172                     ret = true; // any permission will do (including none)
173
break;
174                 }
175                 if (permsData != null &&
176                         ((perm.equals("admin") && permsData.has(PermissionsData.ADMIN))
177                         || (perm.equals("author") && permsData.has(PermissionsData.AUTHOR))
178                         || (perm.equals("limited") && permsData.has(PermissionsData.LIMITED)))) {
179                     ret = true; // user has one of the required permissions
180
break;
181                 }
182             }
183         }
184         return ret;
185     }
186     
187     /** Name of Struts forward menu item should link to */
188     public String JavaDoc getUrl( PageContext JavaDoc pctx ) {
189         String JavaDoc url = null;
190         try {
191             Hashtable JavaDoc params = RollerMenuModel.createParams(
192                     (HttpServletRequest JavaDoc)pctx.getRequest());
193             params.put( RollerMenuModel.MENU_ITEM_KEY, getName() );
194             url = RequestUtils.computeURL(
195                     pctx,
196                     mForward, // forward
197
null, // href
198
null, // page
199
null,
200                     params, // params
201
null, // anchor
202
false ); // redirect
203
} catch (Exception JavaDoc e) {
204             pctx.getServletContext().log(
205                     "ERROR in menu item creating URL",e);
206         }
207         return url;
208     }
209     
210     /**
211      * Currently, the menu tag can be used in both the authoring UI and the
212      * rendering system, so we have to check both forms of URL to determine
213      * the selected weblog.
214      *
215      * TODO 3.0: more simple/consistent method for conveying weblog state across requests
216      *
217      * NOTE: even better would be to separate this into 2 versions, one for
218      * the authoring/admin UI and one for rendering. it doesn't make
219      * sense for this strange intermixing to be happening.
220      */

221     protected static WebsiteData getRequestedWeblog(HttpServletRequest JavaDoc request) throws RollerException {
222         WebsiteData weblog = null;
223         Roller roller = RollerFactory.getRoller();
224         // first check authoring form of URL
225
if (request.getParameter(RequestConstants.WEBLOG) != null) {
226             String JavaDoc weblogHandle = request.getParameter(RequestConstants.WEBLOG);
227             weblog = roller.getUserManager().getWebsiteByHandle(weblogHandle);
228         } else if (request.getParameter(RequestConstants.WEBLOG_ID) != null) {
229             String JavaDoc weblogId = request.getParameter(RequestConstants.WEBLOG_ID);
230             weblog = roller.getUserManager().getWebsite(weblogId);
231         } else if (request.getParameter(RequestConstants.WEBLOGENTRY_ID) != null) {
232             String JavaDoc entryId = request.getParameter(RequestConstants.WEBLOGENTRY_ID);
233             WeblogEntryData entry = roller.getWeblogManager().getWeblogEntry(entryId);
234             if(entry != null) {
235                 weblog = entry.getWebsite();
236             }
237         } else if (request.getParameter(RequestConstants.WEBLOGCATEGORY_ID) != null) {
238             String JavaDoc catId = request.getParameter(RequestConstants.WEBLOGCATEGORY_ID);
239             WeblogCategoryData cat = roller.getWeblogManager().getWeblogCategory(catId);
240             if(cat != null) {
241                 weblog = cat.getWebsite();
242             }
243         } else if (request.getParameter(RequestConstants.FOLDER_ID) != null) {
244             String JavaDoc folderId = request.getParameter(RequestConstants.FOLDER_ID);
245             FolderData folder = roller.getBookmarkManager().getFolder(folderId);
246             if(folder != null) {
247                 weblog = folder.getWebsite();
248             }
249         } else if (request.getSession().getAttribute(RequestConstants.WEBLOG_SESSION_STASH) != null) {
250             String JavaDoc handle = (String JavaDoc)request.getSession().getAttribute(RequestConstants.WEBLOG_SESSION_STASH);
251             weblog = roller.getUserManager().getWebsiteByHandle(handle);
252         } else {
253             // check rendering system form of URL
254
// TODO: hack. we expect the parsed request as an HttpRequest attr
255
WeblogPageRequest pageRequest = (WeblogPageRequest) request.getAttribute("pageRequest");
256             if(pageRequest != null) {
257                 weblog = pageRequest.getWeblog();
258             }
259         }
260         return weblog;
261     }
262 }
263
Popular Tags