KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > info > magnolia > module > admininterface > pages > RolesACLPage


1 package info.magnolia.module.admininterface.pages;
2
3 import info.magnolia.cms.beans.config.ContentRepository;
4 import info.magnolia.cms.core.Content;
5 import info.magnolia.cms.gui.control.Button;
6 import info.magnolia.cms.gui.control.Edit;
7 import info.magnolia.cms.gui.control.Hidden;
8 import info.magnolia.cms.gui.control.Select;
9 import info.magnolia.cms.gui.dialog.DialogBox;
10 import info.magnolia.cms.gui.dialog.DialogButton;
11 import info.magnolia.cms.gui.dialog.DialogControlImpl;
12 import info.magnolia.cms.gui.dialog.DialogFactory;
13 import info.magnolia.cms.gui.misc.CssConstants;
14 import info.magnolia.cms.i18n.Messages;
15 import info.magnolia.cms.i18n.MessagesManager;
16 import info.magnolia.cms.security.Permission;
17 import info.magnolia.cms.util.ContentUtil;
18 import info.magnolia.module.admininterface.SimplePageMVCHandler;
19
20 import java.io.IOException JavaDoc;
21 import java.io.PrintWriter JavaDoc;
22 import java.util.ArrayList JavaDoc;
23 import java.util.Arrays JavaDoc;
24 import java.util.Iterator JavaDoc;
25 import java.util.List JavaDoc;
26
27 import javax.jcr.RepositoryException;
28 import javax.servlet.http.HttpServletRequest JavaDoc;
29 import javax.servlet.http.HttpServletResponse JavaDoc;
30
31 import org.apache.commons.collections.map.ListOrderedMap;
32 import org.apache.commons.lang.StringUtils;
33
34
35 /**
36  * @author Fabrizio Giustina
37  * @version $Id:RolesACLPage.java 2516 2006-03-31 13:08:03Z philipp $
38  */

39 public class RolesACLPage extends SimplePageMVCHandler {
40
41     public static int TYPE_ALL = 3; // 11 : subs and this
42

43     public static int TYPE_SUBS = 2; // 10
44

45     public static int TYPE_THIS = 1; // 01
46

47     /**
48      * Stable serialVersionUID.
49      */

50     private static final long serialVersionUID = 222L;
51
52     /**
53      * Do not show this repositories in the dialog. A module may change this list
54      */

55     public static List JavaDoc excludedRepositories = new ArrayList JavaDoc(Arrays.asList(new String JavaDoc[]{"mgnlVersion", "mgnlSystem"}));
56
57     // todo: permission global available somewhere
58
private static final long PERMISSION_ALL = Permission.ALL;
59
60     private static final long PERMISSION_READ = Permission.READ;
61
62     private static final long PERMISSION_NO = 0;
63
64     private static final String JavaDoc CSS_ACL_DIV = "aclDynamicTable"; //$NON-NLS-1$
65

66     public RolesACLPage(String JavaDoc name, HttpServletRequest JavaDoc request, HttpServletResponse JavaDoc response) {
67         super(name, request, response);
68     }
69
70     private static String JavaDoc getHtmlRowInner(HttpServletRequest JavaDoc request, String JavaDoc dynamicTable, String JavaDoc repository) {
71         boolean small = true;
72         Messages msgs = MessagesManager.getMessages();
73
74         Select accessRight = new Select();
75         accessRight.setSaveInfo(false);
76         accessRight.setName("'+prefix+'AccessRight"); //$NON-NLS-1$
77
accessRight.setCssClass("mgnlDialogControlSelect"); //$NON-NLS-1$
78
accessRight.setOptions(escapeJs(msgs.get("roles.permission.readWrite")), Long.toString(PERMISSION_ALL)); //$NON-NLS-1$
79
accessRight.setOptions(escapeJs(msgs.get("roles.permission.readOnly")), Long.toString(PERMISSION_READ)); //$NON-NLS-1$
80
accessRight.setOptions(escapeJs(msgs.get("roles.permission.deny")), Long.toString(PERMISSION_NO)); //$NON-NLS-1$
81
accessRight.setValue("' + object.accessRight + '"); //$NON-NLS-1$
82

83         Select accessType = new Select();
84         accessType.setSaveInfo(false);
85         accessType.setName("'+prefix+'AccessType"); //$NON-NLS-1$
86
accessType.setCssClass("mgnlDialogControlSelect"); //$NON-NLS-1$
87
if (repository.equals(ContentRepository.WEBSITE)) {
88             accessType.setOptions(escapeJs(msgs.get("roles.edit.thisAndSubPages")), String.valueOf(TYPE_ALL)); //$NON-NLS-1$
89
accessType.setOptions(escapeJs(msgs.get("roles.edit.subPages")), String.valueOf(TYPE_SUBS)); //$NON-NLS-1$
90
}
91         else {
92             if (repository.equals(ContentRepository.CONFIG)) {
93                 accessType.setOptions(escapeJs(msgs.get("roles.edit.thisNode")), String.valueOf(TYPE_THIS)); //$NON-NLS-1$
94
}
95             accessType.setOptions(escapeJs(msgs.get("roles.edit.thisAndSubNodes")), String.valueOf(TYPE_ALL)); //$NON-NLS-1$
96
accessType.setOptions(escapeJs(msgs.get("roles.edit.subNodes")), String.valueOf(TYPE_SUBS)); //$NON-NLS-1$
97
}
98         accessType.setValue("' + object.accessType + '"); //$NON-NLS-1$
99

100         Edit path = new Edit();
101         path.setSaveInfo(false);
102         path.setName("'+prefix+'Path"); //$NON-NLS-1$
103
path.setValue("'+object.path+'"); //$NON-NLS-1$
104
path.setCssClass(CssConstants.CSSCLASS_EDIT);
105         path.setCssStyles("width", "100%"); //$NON-NLS-1$ //$NON-NLS-2$
106

107         Button choose = new Button();
108         choose.setLabel(escapeJs(msgs.get("buttons.choose"))); //$NON-NLS-1$
109
choose.setOnclick("aclChoose(\\''+prefix+'\\',\\'" + repository + "\\');"); //$NON-NLS-1$ //$NON-NLS-2$
110
choose.setSmall(small);
111
112         Button delete = new Button();
113         delete.setLabel(escapeJs(msgs.get("buttons.delete"))); //$NON-NLS-1$
114
delete.setOnclick(dynamicTable + ".del('+index+');"); //$NON-NLS-1$
115
delete.setSmall(small);
116
117         StringBuffer JavaDoc html = new StringBuffer JavaDoc();
118         // set as table since ie/win does not support setting of innerHTML of a
119
// tr
120
html.append("<table cellpadding=\"0\" cellspacing=\"0\" width=\"100%\"><tr>"); //$NON-NLS-1$
121
html.append("<td width=\"1\" class=\"" //$NON-NLS-1$
122
+ CssConstants.CSSCLASS_EDITWITHBUTTON
123             + "\">" //$NON-NLS-1$
124
+ accessRight.getHtml()
125             + "</td>"); //$NON-NLS-1$
126
html.append("<td width=\"1\" class=\"mgnlDialogBoxInput\"></td>"); //$NON-NLS-1$
127

128         if (!repository.equals(ContentRepository.USERS) && !repository.equals(ContentRepository.USER_ROLES)) {
129             html.append("<td width=\"1\" class=\"" //$NON-NLS-1$
130
+ CssConstants.CSSCLASS_EDITWITHBUTTON
131                 + "\">" //$NON-NLS-1$
132
+ accessType.getHtml()
133                 + "</td>"); //$NON-NLS-1$
134
html.append("<td width=\"1\"></td>"); //$NON-NLS-1$
135
}
136         else {
137             html
138                 .append("<input type=\"hidden\" id=\"' + prefix + 'AccessType\" name=\"' + prefix + 'AccessType\" value=\"sub\"/>"); //$NON-NLS-1$
139
}
140
141         html.append("<td width=\"100%\"class=\"" //$NON-NLS-1$
142
+ CssConstants.CSSCLASS_EDITWITHBUTTON
143             + "\">" //$NON-NLS-1$
144
+ path.getHtml()
145             + "</td>"); //$NON-NLS-1$
146
html.append("<td width=\"1\"></td>"); //$NON-NLS-1$
147
html.append("<td width=\"1\" class=\"" //$NON-NLS-1$
148
+ CssConstants.CSSCLASS_EDITWITHBUTTON
149             + "\">" //$NON-NLS-1$
150
+ choose.getHtml()
151             + "</td>"); //$NON-NLS-1$
152
html.append("<td width=\"1\"></td>"); //$NON-NLS-1$
153
html.append("<td width=\"1\" class=\"" //$NON-NLS-1$
154
+ CssConstants.CSSCLASS_EDITWITHBUTTON
155             + "\">" //$NON-NLS-1$
156
+ delete.getHtml()
157             + "</td>"); //$NON-NLS-1$
158
html.append("</tr></table>"); //$NON-NLS-1$
159

160         return html.toString();
161     }
162
163     /**
164      * @throws Exception
165      * @see info.magnolia.cms.servlets.BasePageServlet#render(HttpServletRequest, HttpServletResponse)
166      */

167     protected void render(HttpServletRequest JavaDoc request, HttpServletResponse JavaDoc response) throws Exception JavaDoc {
168         PrintWriter JavaDoc out = response.getWriter();
169         Messages msgs = MessagesManager.getMessages();
170
171         DialogControlImpl dialogControl = (DialogControlImpl) request.getAttribute("dialogObject"); //$NON-NLS-1$
172
Content role = dialogControl.getWebsiteNode();
173
174         // select the repository
175
Select repositorySelect = getRepositorySelect(request);
176
177         out.print(repositorySelect.getHtml());
178         out.print("<p><p/>"); //$NON-NLS-1$
179
Iterator JavaDoc repositoryNames = ContentRepository.getAllRepositoryNames();
180
181         while (repositoryNames.hasNext()) {
182             String JavaDoc name = (String JavaDoc) repositoryNames.next();
183             // exclude system repositories
184
if (!excludedRepositories.contains(name)) {
185                 writeRepositoryTable(request, response, msgs, out, role, name);
186             }
187         }
188
189         // out.print("<p>&nbsp;<p>&nbsp;<p>&nbsp;<input type=\"button\" onclick=\"aclChangeRepository('website')\">");
190
out.println("<script type=\"text/javascript\">aclChangeRepository('website');</script>"); //$NON-NLS-1$
191

192     }
193
194     /**
195      * @param request
196      * @param out
197      * @param role
198      * @throws RepositoryException
199      * @throws IOException
200      */

201     private void writeRepositoryTable(HttpServletRequest JavaDoc request, HttpServletResponse JavaDoc response, Messages msgs,
202         PrintWriter JavaDoc out, Content role, String JavaDoc repository) throws RepositoryException, IOException JavaDoc {
203         String JavaDoc tableName = "acl" + repository + "Table"; //$NON-NLS-1$ //$NON-NLS-2$
204
String JavaDoc dynamicTableName = "acl" + repository + "DynamicTable"; //$NON-NLS-1$ //$NON-NLS-2$
205
String JavaDoc hiddenFieldName = "acl" + repository + "List"; //$NON-NLS-1$ //$NON-NLS-2$
206

207         out.println("<div id=\"acl" + repository + "Div\" class=\"" + CSS_ACL_DIV + "\">"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
208
out.println(new Hidden(hiddenFieldName, StringUtils.EMPTY, false).getHtml());
209
210         // the table
211
out.println("<table id=\"" //$NON-NLS-1$
212
+ tableName
213             + "\" cellpadding=\"0\" cellspacing=\"0\" border=\"0\" width=\"100%\"><tr><td></td></tr></table>"); //$NON-NLS-1$
214

215         // add button
216

217         out.println("<table width=\"100%\">"); //$NON-NLS-1$
218
DialogButton add = DialogFactory.getDialogButtonInstance(request, response, null, null);
219         add.setBoxType(DialogBox.BOXTYPE_1COL);
220         add.setConfig("buttonLabel", msgs.get("buttons.add")); //$NON-NLS-1$ //$NON-NLS-2$
221
add.setConfig("onclick", dynamicTableName + ".addNew();"); //$NON-NLS-1$ //$NON-NLS-2$
222
add.drawHtml(out);
223         out.println("</table>"); //$NON-NLS-1$
224

225         out.println("</div>"); //$NON-NLS-1$
226

227         out.println("<script type=\"text/javascript\">"); //$NON-NLS-1$
228
// register the repository
229
out.println("aclRepositories[aclRepositories.length]= '" + repository + "';"); //$NON-NLS-1$ //$NON-NLS-2$
230

231         // make renderer function
232
out.println("function acl" + repository + "RenderFunction(cell, prefix, index, object)"); //$NON-NLS-1$ //$NON-NLS-2$
233
out.println("{"); //$NON-NLS-1$
234

235         // get some debug informations
236
out.println("mgnlDebug('acl" + repository + "RenderFunction: prefix = ' + prefix, 'acl', object)");
237         out.println("cell.innerHTML= '" + getHtmlRowInner(request, dynamicTableName, repository) + "';\n"); //$NON-NLS-1$ //$NON-NLS-2$
238
out.println("document.getElementById(prefix + 'AccessType').value = object.accessType;\n"); //$NON-NLS-1$
239

240         out.println("document.getElementById(prefix + 'AccessRight').value = object.accessRight;\n"); //$NON-NLS-1$
241

242         out.println("}"); //$NON-NLS-1$
243

244         // create the dynamicTable
245
out.println(dynamicTableName + " = new MgnlDynamicTable('" //$NON-NLS-1$
246
+ tableName
247             + "',document.mgnlFormMain." //$NON-NLS-1$
248
+ hiddenFieldName
249             + ", aclGetNewPermissionObject, aclGetPermissionObject, acl" //$NON-NLS-1$
250
+ repository
251             + "RenderFunction, null);"); //$NON-NLS-1$
252

253         // add existing acls to table (by js, so the same mechanism as at
254
// adding rows can be used)
255
addExistingAclToTable(out, role, dynamicTableName, repository);
256
257         out.println("</script>"); //$NON-NLS-1$
258
}
259
260     /**
261      * @param out
262      * @param role
263      */

264     private void addExistingAclToTable(PrintWriter JavaDoc out, Content role, String JavaDoc dynamicTableName, String JavaDoc repository) {
265         // keeps acls per path
266
ACLS acls = new ACLS();
267
268         Content aclsNode = ContentUtil.getContent(role, "acl_" + repository); //$NON-NLS-1$
269
if (aclsNode == null || aclsNode.getChildren().size() == 0) {
270             out.println(dynamicTableName + ".addNew();"); //$NON-NLS-1$
271
return;
272         }
273
274         Iterator JavaDoc it = aclsNode.getChildren().iterator();
275         while (it.hasNext()) {
276             Content c = (Content) it.next();
277             String JavaDoc path = c.getNodeData("path").getString(); //$NON-NLS-1$
278
String JavaDoc accessRight = c.getNodeData("permissions").getString(); //$NON-NLS-1$
279
acls.register(path, Integer.valueOf(accessRight).intValue());
280         }
281
282         for (Iterator JavaDoc iter = acls.values().iterator(); iter.hasNext();) {
283             ACL acl = (ACL) iter.next();
284             out.println(dynamicTableName + ".add({accessRight:" //$NON-NLS-1$
285
+ acl.accessRight
286                 + ",accessType:'" //$NON-NLS-1$
287
+ acl.type
288                 + "',path:'" //$NON-NLS-1$
289
+ acl.path
290                 + "'});"); //$NON-NLS-1$
291
}
292     }
293
294     /**
295      * @param request
296      * @return
297      */

298     private Select getRepositorySelect(HttpServletRequest JavaDoc request) {
299         Select repositorySelect = new Select();
300         repositorySelect.setName("aclRepository"); //$NON-NLS-1$
301
repositorySelect.setCssClass("mgnlDialogControlSelect"); //$NON-NLS-1$
302
repositorySelect.setEvent("onchange", "aclChangeRepository(this.value)"); //$NON-NLS-1$ //$NON-NLS-2$
303
repositorySelect.setSaveInfo(false);
304         repositorySelect.setValue(ContentRepository.WEBSITE);
305
306         // loop through the repositories
307
Iterator JavaDoc repositoryNames = ContentRepository.getAllRepositoryNames();
308         while (repositoryNames.hasNext()) {
309             String JavaDoc name = (String JavaDoc) repositoryNames.next();
310             if (!excludedRepositories.contains(name)) {
311                 String JavaDoc label = MessagesManager.get("repository." + name); //$NON-NLS-1$
312
repositorySelect.setOptions(label, name);
313             }
314         }
315         return repositorySelect;
316     }
317
318     private static String JavaDoc escapeJs(String JavaDoc value) {
319         return StringUtils.replace(value, "'", "\\'");
320     }
321
322     /**
323      * A concrete gui acl
324      * @author Philipp Bracher
325      * @version $Revision: 6489 $ ($Author: fgiust $)
326      */

327     protected class ACL {
328
329         int type = 0;
330
331         String JavaDoc path;
332
333         int accessRight;
334
335         void registerEntry(String JavaDoc path) {
336             if (path.equals("/*")) {
337                 type = TYPE_ALL;
338             }
339             else if (path.endsWith("/*")) {
340                 type = type | TYPE_SUBS;
341             }
342             else {
343                 type = type | TYPE_THIS;
344             }
345         }
346     }
347
348     /**
349      * Used to create the gui values out of the entries in the repository
350      * @author Philipp Bracher
351      * @version $Revision: 6489 $ ($Author: fgiust $)
352      */

353     protected class ACLS extends ListOrderedMap {
354
355         /**
356          *
357          */

358         private static final long serialVersionUID = 1L;
359
360         /**
361          * Register an entry
362          * @param path the not cleaned path
363          * @param accessRight the access right
364          */

365         void register(String JavaDoc path, int accessRight) {
366             String JavaDoc cleanPath = StringUtils.removeEnd(path, "/*");
367             if (StringUtils.isEmpty(cleanPath)) {
368                 cleanPath = "/";
369             }
370             String JavaDoc key = cleanPath + ":" + accessRight;
371             if (!this.containsKey(key)) {
372                 ACL acl = new ACL();
373                 acl.path = cleanPath;
374                 acl.accessRight = accessRight;
375                 this.put(key, acl);
376             }
377             ((ACL) this.get(key)).registerEntry(path);
378         }
379     }
380
381 }
Popular Tags