1 16 package org.outerj.daisy.frontend.admin; 17 18 import org.apache.cocoon.components.flow.apples.AppleRequest; 19 import org.apache.cocoon.components.flow.apples.AppleResponse; 20 import org.apache.cocoon.forms.formmodel.Form; 21 import org.apache.cocoon.forms.formmodel.Repeater; 22 import org.apache.cocoon.forms.formmodel.Field; 23 import org.apache.cocoon.forms.formmodel.Action; 24 import org.apache.cocoon.forms.binding.Binding; 25 import org.apache.cocoon.forms.event.ActionListener; 26 import org.apache.cocoon.forms.event.ActionEvent; 27 import org.apache.cocoon.forms.FormContext; 28 import org.apache.avalon.framework.service.Serviceable; 29 import org.apache.avalon.framework.service.ServiceManager; 30 import org.apache.avalon.framework.service.ServiceException; 31 import org.apache.avalon.framework.activity.Disposable; 32 import org.outerj.daisy.frontend.util.FormHelper; 33 import org.outerj.daisy.frontend.util.AbstractDaisyApple; 34 import org.outerj.daisy.frontend.PageContext; 35 import org.outerj.daisy.frontend.SkinConfHelper; 36 import org.outerj.daisy.frontend.WikiHelper; 37 import org.outerj.daisy.repository.schema.PartType; 38 import org.outerj.daisy.repository.schema.FieldType; 39 import org.outerj.daisy.repository.schema.RepositorySchema; 40 import org.outerj.daisy.repository.schema.DocumentType; 41 import org.outerj.daisy.repository.Repository; 42 43 import java.util.Map ; 44 import java.util.HashMap ; 45 import java.util.Locale ; 46 47 public class DocumentTypeEditorApple extends AbstractDaisyApple implements Serviceable, Disposable { 48 private ServiceManager serviceManager; 49 private boolean init = false; 50 private Form form; 51 private Binding binding; 52 private Map viewData; 53 private Locale locale; 54 55 private DocumentType documentType; 56 private RepositorySchema repositorySchema; 57 58 private AdminLocales adminLocales; 59 60 public void service(ServiceManager serviceManager) throws ServiceException { 61 this.serviceManager = serviceManager; 62 adminLocales = (AdminLocales)serviceManager.lookup(AdminLocales.ROLE); 63 } 64 65 public void dispose() { 66 serviceManager.release(adminLocales); 67 } 68 69 protected void processInternal(AppleRequest appleRequest, AppleResponse appleResponse) throws Exception { 70 if (!init) { 71 locale = WikiHelper.getLocale(appleRequest.getCocoonRequest()); 72 73 form = FormHelper.createForm(serviceManager, "resources/form/documenttype_definition.xml"); 74 binding = FormHelper.createBinding(serviceManager, "resources/form/documenttype_binding.xml"); 75 76 String [] supportedLocales = adminLocales.getLocales().getAsStrings(); 78 Repeater repeater = (Repeater)form.getChild("displaydata"); 79 for (int i = 0; i < supportedLocales.length; i++) { 80 Repeater.RepeaterRow row = repeater.addRow(); 81 row.getChild("locale").setValue(supportedLocales[i]); 82 } 83 84 PartType[] partTypes; 85 FieldType[] fieldTypes; 86 87 Repository repository = WikiHelper.getRepository(appleRequest.getCocoonRequest(), serviceManager); 88 repositorySchema = repository.getRepositorySchema(); 89 partTypes = repositorySchema.getAllPartTypes(false).getArray(); 90 fieldTypes = repositorySchema.getAllFieldTypes(false).getArray(); 91 92 final Field availablePartTypes = (Field)form.getChild("availablePartTypes"); 93 availablePartTypes.setSelectionList(partTypes, "id", "name"); 94 final Field availableFieldTypes = (Field)form.getChild("availableFieldTypes"); 95 availableFieldTypes.setSelectionList(fieldTypes, "id", "name"); 96 97 Action addPartType = (Action)form.getChild("addPartType"); 98 addPartType.addActionListener(new ActionListener() { 99 public void actionPerformed(ActionEvent event) { 100 try { 101 Long partTypeId = (Long )availablePartTypes.getValue(); 102 PartType partType = repositorySchema.getPartTypeById(partTypeId.longValue(), false); 103 Repeater.RepeaterRow row = ((Repeater)form.getChild("partTypes")).addRow(); 104 row.getChild("id").setValue(partTypeId); 105 row.getChild("name").setValue(partType.getName()); 106 row.getChild("required").setValue(Boolean.TRUE); 107 } catch (Exception e) { 108 throw new RuntimeException (e); 109 } 110 } 111 }); 112 113 Action addFieldType = (Action)form.getChild("addFieldType"); 114 addFieldType.addActionListener(new ActionListener() { 115 public void actionPerformed(ActionEvent event) { 116 try { 117 Long fieldTypeId = (Long )availableFieldTypes.getValue(); 118 FieldType fieldType = repositorySchema.getFieldTypeById(fieldTypeId.longValue(), false); 119 Repeater.RepeaterRow row = ((Repeater)form.getChild("fieldTypes")).addRow(); 120 row.getChild("id").setValue(fieldTypeId); 121 row.getChild("name").setValue(fieldType.getName()); 122 row.getChild("required").setValue(Boolean.TRUE); 123 } catch (Exception e) { 124 throw new RuntimeException (e); 125 } 126 } 127 }); 128 129 String documentTypeId = appleRequest.getSitemapParameter("id", null); 130 131 if (documentTypeId != null) { 132 documentType = repositorySchema.getDocumentTypeById(Long.parseLong(documentTypeId), true); 133 binding.loadFormFromModel(form, documentType); 134 } else { 135 documentTypeId = "new"; 136 } 137 138 form.setAttribute("DaisyRepository", repository); 140 141 String path = getMountPoint() + "/admin/documentType/" + documentTypeId + "/edit/" + getContinuationId(); 142 143 viewData = new HashMap (); 144 viewData.put("submitPath", path); 145 if (documentType != null) 146 viewData.put("documentType", documentType); 147 viewData.put("locale", locale); 148 viewData.put("pageContext", new PageContext(getMountPoint(), repository, getLayoutType(), getSkin(), SkinConfHelper.getGlobalSkinConf(serviceManager), getContext())); 149 viewData.put("CocoonFormsInstance", form); 150 viewData.put("entityName", "documenttype"); 151 152 init = true; 153 154 appleResponse.redirectTo(path); 155 } else { 156 String methodName = appleRequest.getCocoonRequest().getMethod(); 157 if (methodName.equals("GET")) { 158 appleResponse.sendPage("Form-documenttype-Pipe", viewData); 160 } else if (methodName.equals("POST")) { 161 boolean endProcessing = form.process(new FormContext(appleRequest.getCocoonRequest(), locale)); 163 164 if (!endProcessing) { 165 appleResponse.sendPage("Form-documenttype-Pipe", viewData); 166 } else { 167 if (documentType == null) { 168 documentType = repositorySchema.createDocumentType((String )form.getChild("name").getValue()); 169 viewData.put("documentType", documentType); } 171 binding.saveFormToModel(form, documentType); 172 documentType.save(); 173 appleResponse.redirectTo(getMountPoint() + "/admin/documentType"); 174 } 175 } else { 176 throw new Exception ("Unsupported HTTP method: " + methodName); 177 } 178 } 179 } 180 181 } 182 | Popular Tags |