1 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 ; 42 import java.util.HashMap ; 43 import java.util.Locale ; 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 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 { 58 Request request = appleRequest.getCocoonRequest(); 59 60 if (!init) { 61 if (!request.getMethod().equals("POST")) 62 throw new HttpMethodNotAllowedException(request.getMethod()); 63 64 String 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 { 107 Map viewData = new HashMap (); 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(); 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 (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 )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 )entry.getChild("subjectValue").getValue()).longValue(); 150 if (subjectType == BookAclSubjectType.ROLE) { 151 String roleName; 152 try { 153 roleName = userManager.getRole(subjectValue, false).getName(); 154 } catch (Exception e) { 155 roleName = "(error)"; 156 } 157 entry.getChild("subjectValueLabel").setValue(roleName); 158 } else if (subjectType == BookAclSubjectType.USER) { 159 String userName; 160 try { 161 userName = userManager.getUserLogin(subjectValue); 162 } catch (Exception 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 |