1 24 package org.riotfamily.riot.form.ui; 25 26 import java.io.PrintWriter ; 27 import java.io.StringWriter ; 28 import java.util.HashMap ; 29 import java.util.Map ; 30 31 import javax.servlet.http.HttpServletRequest ; 32 import javax.servlet.http.HttpServletResponse ; 33 34 import org.riotfamily.common.util.ResourceUtils; 35 import org.riotfamily.forms.Form; 36 import org.riotfamily.forms.controller.ButtonFactory; 37 import org.riotfamily.forms.controller.FormSubmissionHandler; 38 import org.riotfamily.forms.factory.FormRepository; 39 import org.riotfamily.forms.factory.RepositoryFormController; 40 import org.riotfamily.riot.dao.InvalidPropertyValueException; 41 import org.riotfamily.riot.dao.RioDaoException; 42 import org.riotfamily.riot.dao.RiotDao; 43 import org.riotfamily.riot.editor.EditorConstants; 44 import org.riotfamily.riot.editor.EditorDefinitionUtils; 45 import org.riotfamily.riot.editor.EditorRepository; 46 import org.riotfamily.riot.editor.FormReference; 47 import org.riotfamily.riot.editor.ListDefinition; 48 import org.riotfamily.riot.editor.ObjectEditorDefinition; 49 import org.springframework.transaction.PlatformTransactionManager; 50 import org.springframework.transaction.TransactionDefinition; 51 import org.springframework.transaction.TransactionStatus; 52 import org.springframework.transaction.support.DefaultTransactionDefinition; 53 import org.springframework.util.Assert; 54 import org.springframework.web.servlet.ModelAndView; 55 56 59 public abstract class BaseFormController extends RepositoryFormController 60 implements FormSubmissionHandler { 61 62 protected static final String EDITOR_DEFINITION_ATTR = 63 FormController.class.getName() + ".editorDefinition"; 64 65 private static final DefaultTransactionDefinition TRANSACTION_DEFINITION = 66 new DefaultTransactionDefinition( 67 TransactionDefinition.PROPAGATION_REQUIRED); 68 69 private EditorRepository editorRepository; 70 71 private PlatformTransactionManager transactionManager; 72 73 private String viewName = ResourceUtils.getPath( 74 BaseFormController.class, "FormView.ftl"); 75 76 public BaseFormController(EditorRepository editorRepository, 77 FormRepository formRepository, 78 PlatformTransactionManager transactionManager) { 79 80 super(formRepository); 81 this.editorRepository = editorRepository; 82 this.transactionManager = transactionManager; 83 ButtonFactory buttonFactory = new ButtonFactory(this); 84 buttonFactory.setLabelKey("label.form.button.save"); 85 buttonFactory.setCssClass("button button-save"); 86 addButton(buttonFactory); 87 } 88 89 public void setViewName(String viewName) { 90 this.viewName = viewName; 91 } 92 93 protected String getSessionAttribute(HttpServletRequest request) { 94 return BaseFormController.class.getName() 95 + request.getAttribute(EditorConstants.EDITOR_ID); 96 } 97 98 protected ObjectEditorDefinition getObjectEditorDefinition(HttpServletRequest request) { 99 ObjectEditorDefinition editorDefinition = (ObjectEditorDefinition) 100 request.getAttribute(EDITOR_DEFINITION_ATTR); 101 102 if (editorDefinition == null) { 103 String editorId = (String ) request.getAttribute(EditorConstants.EDITOR_ID); 104 Assert.notNull(editorId, "An editorId attribute must be set"); 105 editorDefinition = (ObjectEditorDefinition) editorRepository.getEditorDefinition(editorId); 106 Assert.notNull(editorDefinition, "No such editor: " + editorId); 107 request.setAttribute(EDITOR_DEFINITION_ATTR, editorDefinition); 108 } 109 return editorDefinition; 110 } 111 112 protected String getObjectId(HttpServletRequest request) { 113 return (String ) request.getAttribute(EditorConstants.OBJECT_ID); 114 } 115 116 protected String getParentId(HttpServletRequest request) { 117 return request.getParameter(EditorConstants.PARENT_ID); 118 } 119 120 protected String getFormId(HttpServletRequest request) { 121 FormReference ref = (FormReference) getObjectEditorDefinition(request); 122 return ref.getFormId(); 123 } 124 125 protected Form createForm(HttpServletRequest request) { 126 Form form = super.createForm(request); 127 FormUtils.setObjectId(form, getObjectId(request)); 128 FormUtils.setParentId(form, getParentId(request)); 129 FormUtils.setEditorDefinition(form, getObjectEditorDefinition(request)); 130 return form; 131 } 132 133 136 protected Object getFormBackingObject(HttpServletRequest request) { 137 ObjectEditorDefinition editorDefinition = getObjectEditorDefinition(request); 138 String objectId = getObjectId(request); 139 if (objectId == null) { 140 return null; 141 } 142 return EditorDefinitionUtils.loadBean(editorDefinition, objectId); 143 } 144 145 protected Map createModel(Form form, ObjectEditorDefinition formDefinition, 146 HttpServletRequest request, HttpServletResponse response) { 147 148 HashMap model = new HashMap (); 149 model.put(EditorConstants.EDITOR_ID, formDefinition.getId()); 150 model.put(EditorConstants.PARENT_ID, FormUtils.getParentId(form)); 151 model.put(EditorConstants.OBJECT_ID, FormUtils.getObjectId(form)); 152 model.put("formId", form.getId()); 153 return model; 154 } 155 156 159 protected ModelAndView showForm(Form form, HttpServletRequest request, 160 HttpServletResponse response) { 161 162 StringWriter sw = new StringWriter (); 163 renderForm(form, new PrintWriter (sw)); 164 Map model = createModel(form, getObjectEditorDefinition(request), 165 request, response); 166 167 model.put("form", sw.toString()); 168 return new ModelAndView(viewName, model); 169 } 170 171 172 public final ModelAndView handleFormSubmission(Form form, 173 HttpServletRequest request, HttpServletResponse response) 174 throws Exception { 175 176 try { 177 return handleFormSubmissionInternal(form, request, response); 178 } 179 catch (InvalidPropertyValueException e) { 180 form.getErrors().rejectValue(e.getField(), e.getCode(), 181 e.getArguments(), e.getMessage()); 182 183 return showForm(form, request, response); 184 } 185 catch (RioDaoException e) { 186 form.getErrors().reject(e.getCode(), e.getArguments(), e.getMessage()); 187 return showForm(form, request, response); 188 } 189 } 190 191 protected ModelAndView handleFormSubmissionInternal(Form form, 192 HttpServletRequest request, HttpServletResponse response) 193 throws Exception { 194 195 Object bean = form.populateBackingObject(); 196 ObjectEditorDefinition editorDef = getObjectEditorDefinition(request); 197 198 ListDefinition listDef = EditorDefinitionUtils.getParentListDefinition(editorDef); 199 RiotDao dao = listDef.getListConfig().getDao(); 200 201 ModelAndView modelAndView; 202 TransactionStatus status = transactionManager.getTransaction(TRANSACTION_DEFINITION); 203 try { 204 if (form.isNew()) { 205 log.debug("Saving entity ..."); 206 String parentId = FormUtils.getParentId(form); 207 Object parent = EditorDefinitionUtils.loadParent(listDef, parentId); 208 dao.save(bean, parent); 209 FormUtils.setObjectId(form, dao.getObjectId(bean)); 210 form.setValue(bean); 211 modelAndView = afterSave(form, editorDef, request, response); 212 } 213 else { 214 log.debug("Updating entity ..."); 215 dao.update(bean); 216 modelAndView = afterUpdate(form, editorDef, request, response); 217 } 218 } 219 catch (Exception e) { 220 transactionManager.rollback(status); 221 throw e; 222 } 223 transactionManager.commit(status); 224 return modelAndView; 225 } 226 227 228 229 protected abstract ModelAndView afterSave(Form form, ObjectEditorDefinition editorDefinition, 230 HttpServletRequest request, HttpServletResponse response); 231 232 protected abstract ModelAndView afterUpdate(Form form, ObjectEditorDefinition editorDefinition, 233 HttpServletRequest request, HttpServletResponse response); 234 235 } 236 | Popular Tags |