KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > outerj > daisy > books > frontend > BookAclEditorApple


1 /*
2  * Copyright 2004 Outerthought bvba and Schaubroeck nv
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 org.outerj.daisy.books.frontend;
17
18 import org.outerj.daisy.frontend.util.AbstractDaisyApple;
19 import org.outerj.daisy.frontend.util.FormHelper;
20 import org.outerj.daisy.frontend.util.HttpMethodNotAllowedException;
21 import org.outerj.daisy.frontend.util.EncodingUtil;
22 import org.outerj.daisy.frontend.WikiHelper;
23 import org.outerj.daisy.frontend.PageContext;
24 import org.outerj.daisy.frontend.SkinConfHelper;
25 import org.outerj.daisy.books.store.*;
26 import org.outerj.daisy.books.store.impl.AclResult;
27 import org.outerj.daisy.books.store.impl.BookAclEvaluator;
28 import org.outerj.daisy.repository.Repository;
29 import org.outerj.daisy.repository.user.UserManager;
30 import org.apache.cocoon.components.flow.apples.AppleRequest;
31 import org.apache.cocoon.components.flow.apples.AppleResponse;
32 import org.apache.cocoon.forms.formmodel.*;
33 import org.apache.cocoon.forms.validation.WidgetValidator;
34 import org.apache.cocoon.forms.util.I18nMessage;
35 import org.apache.cocoon.forms.FormContext;
36 import org.apache.cocoon.environment.Request;
37 import org.apache.avalon.framework.service.Serviceable;
38 import org.apache.avalon.framework.service.ServiceManager;
39 import org.apache.avalon.framework.service.ServiceException;
40
41 import java.util.Map JavaDoc;
42 import java.util.HashMap JavaDoc;
43 import java.util.Locale JavaDoc;
44
45 public class BookAclEditorApple extends AbstractDaisyApple implements Serviceable {
46     private ServiceManager serviceManager;
47     private boolean init = false;
48     private Form form;
49     private BookInstance bookInstance;
50     private Repository repository;
51     private Locale JavaDoc locale;
52
53     public void service(ServiceManager serviceManager) throws ServiceException {
54         this.serviceManager = serviceManager;
55     }
56
57     protected void processInternal(AppleRequest appleRequest, AppleResponse appleResponse) throws Exception JavaDoc {
58         Request request = appleRequest.getCocoonRequest();
59
60         if (!init) {
61             if (!request.getMethod().equals("POST"))
62                 throw new HttpMethodNotAllowedException(request.getMethod());
63
64             String JavaDoc bookInstanceName = appleRequest.getSitemapParameter("bookInstanceName");
65             repository = WikiHelper.getRepository(request, serviceManager);
66             BookStore bookStore = (BookStore)repository.getExtension("BookStore");
67             bookInstance = bookStore.getBookInstance(bookInstanceName);
68             BookAcl bookAcl = bookInstance.getAcl();
69
70             form = FormHelper.createForm(serviceManager, "resources/form/bookacl_definition.xml");
71             form.getChild("editmode").setValue("gui");
72             form.getChild("editmode").setState(WidgetState.INVISIBLE);
73             initForm(form, repository);
74             load(form, bookAcl);
75             annotateAclSubjectValues(form, repository);
76
77             locale = WikiHelper.getLocale(request);
78
79             init = true;
80             appleResponse.redirectTo(EncodingUtil.encodePath(getMountPoint() + "/books/" + bookInstanceName + "/acl/" + getContinuationId()));
81             return;
82         }
83
84         if (request.getMethod().equals("GET")) {
85             showForm(appleResponse);
86         } else if (request.getMethod().equals("POST")) {
87             boolean finished = form.process(new FormContext(request, locale));
88             if (finished) {
89                 BookAcl bookAcl = getBookAcl(form);
90                 bookInstance.lock();
91                 try {
92                     bookInstance.setAcl(bookAcl);
93                 } finally {
94                     bookInstance.unlock();
95                 }
96                 appleResponse.redirectTo(EncodingUtil.encodePath(getMountPoint() + "/books"));
97             } else {
98                 showForm(appleResponse);
99             }
100         } else {
101             throw new HttpMethodNotAllowedException(request.getMethod());
102         }
103
104     }
105
106     private void showForm(AppleResponse appleResponse) throws Exception JavaDoc {
107         Map JavaDoc viewData = new HashMap JavaDoc();
108         viewData.put("CocoonFormsInstance", form);
109         viewData.put("locale", locale);
110         viewData.put("pageContext", new PageContext(getMountPoint(), repository, getLayoutType(), getSkin(), SkinConfHelper.getGlobalSkinConf(serviceManager), getContext()));
111         appleResponse.sendPage("Form-bookacl-Pipe", viewData);
112     }
113
114     public static void load(Form form, BookAcl bookAcl) {
115         Repeater entriesRepeater = (Repeater)form.lookupWidget("editors/gui/entries");
116         entriesRepeater.clear(); // in case load is called on an already loaded form
117
BookAclEntry[] entries = bookAcl.getEntries();
118         for (int i = 0; i < entries.length; i++) {
119             BookAclEntry entry = entries[i];
120             Repeater.RepeaterRow row = entriesRepeater.addRow();
121             row.getChild("subjectType").setValue(entry.getSubjectType());
122             row.getChild("subjectValue").setValue(new Long JavaDoc(entry.getSubjectValue()));
123             row.getChild("readPerm").setValue(entry.getReadPermission());
124             row.getChild("managePerm").setValue(entry.getManagePermission());
125         }
126     }
127
128     public static BookAcl getBookAcl(Form form) {
129         Repeater entriesRepeater = (Repeater)form.lookupWidget("editors/gui/entries");
130         BookAclEntry[] entries = new BookAclEntry[entriesRepeater.getSize()];
131         for (int i = 0; i < entries.length; i++) {
132             Repeater.RepeaterRow row = entriesRepeater.getRow(i);
133             BookAclSubjectType subjectType = (BookAclSubjectType)row.getChild("subjectType").getValue();
134             long subjectValue = ((Long JavaDoc)row.getChild("subjectValue").getValue()).longValue();
135             BookAclActionType readPerm = (BookAclActionType)row.getChild("readPerm").getValue();
136             BookAclActionType managePerm = (BookAclActionType)row.getChild("managePerm").getValue();
137             entries[i] = new BookAclEntry(subjectType, subjectValue, readPerm, managePerm);
138         }
139         return new BookAcl(entries);
140     }
141
142     public static void annotateAclSubjectValues(Form form, Repository repository) {
143         UserManager userManager = repository.getUserManager();
144         Repeater entriesRepeater = (Repeater)form.lookupWidget("editors/gui/entries");
145         for (int k = 0; k < entriesRepeater.getSize(); k++) {
146             Repeater.RepeaterRow entry = entriesRepeater.getRow(k);
147             BookAclSubjectType subjectType = (BookAclSubjectType)entry.getChild("subjectType").getValue();
148             long subjectValue;
149             subjectValue = ((Long JavaDoc)entry.getChild("subjectValue").getValue()).longValue();
150             if (subjectType == BookAclSubjectType.ROLE) {
151                 String JavaDoc roleName;
152                 try {
153                     roleName = userManager.getRole(subjectValue, false).getName();
154                 } catch (Exception JavaDoc e) {
155                     roleName = "(error)";
156                 }
157                 entry.getChild("subjectValueLabel").setValue(roleName);
158             } else if (subjectType == BookAclSubjectType.USER) {
159                 String JavaDoc userName;
160                 try {
161                     userName = userManager.getUserLogin(subjectValue);
162                 } catch (Exception JavaDoc e) {
163                     userName = "(error)";
164                 }
165                 entry.getChild("subjectValueLabel").setValue(userName);
166             }
167         }
168     }
169
170     public static void initForm(Form form, Repository repository) {
171         form.lookupWidget("editors/gui/entries").addValidator(new AclFormValidator(repository));
172     }
173
174     public static class AclFormValidator implements WidgetValidator {
175         private Repository repository;
176
177         public AclFormValidator(Repository repository) {
178             this.repository = repository;
179         }
180
181         public boolean validate(Widget widget) {
182             Form form = widget.getForm();
183             AclResult result = BookAclEvaluator.evaluate(getBookAcl(form), repository.getUserId(), repository.getActiveRoleIds());
184             if (!result.canManage()) {
185                 ((Messages)form.lookupWidget("editors/gui/messages")).addMessage(new I18nMessage("bookacl.error-cannot-exclude-yourself"));
186                 return false;
187             } else {
188                 return true;
189             }
190         }
191     }
192
193 }
194
Popular Tags