1 24 package org.riotfamily.forms.controller; 25 26 import java.io.IOException ; 27 import java.io.PrintWriter ; 28 import java.util.ArrayList ; 29 import java.util.Iterator ; 30 import java.util.List ; 31 32 import javax.servlet.http.HttpServletRequest ; 33 import javax.servlet.http.HttpServletResponse ; 34 import javax.servlet.http.HttpSession ; 35 36 import org.apache.commons.logging.Log; 37 import org.apache.commons.logging.LogFactory; 38 import org.riotfamily.forms.Container; 39 import org.riotfamily.forms.ContentElement; 40 import org.riotfamily.forms.Element; 41 import org.riotfamily.forms.Form; 42 import org.springframework.web.servlet.ModelAndView; 43 import org.springframework.web.servlet.mvc.Controller; 44 45 46 51 public abstract class AbstractFormController implements Controller { 52 53 public static final String FORM_SUBMISSION_HANDLER = "formSubmissionHandler"; 54 55 protected static final String BUTTON_CONTAINER_ID = "buttons"; 56 57 private static final String CONTENT_PARAM = "_content"; 58 59 private static final String EXCLUSIVE_PARAM = "_exclusive"; 60 61 protected Log log = LogFactory.getLog(getClass()); 62 63 private FormContextFactory formContextFactory; 64 65 private boolean processNewForms; 66 67 private List buttonFactories; 68 69 70 public void setFormContextFactory(FormContextFactory contextFactory) { 71 this.formContextFactory = contextFactory; 72 } 73 74 public final void setProcessNewForms(boolean processNewForms) { 75 this.processNewForms = processNewForms; 76 } 77 78 public void setButtonFactories(List buttonFactories) { 79 this.buttonFactories = buttonFactories; 80 } 81 82 protected void addButton(ButtonFactory buttonFactory) { 83 if (buttonFactories == null) { 84 buttonFactories = new ArrayList (); 85 } 86 buttonFactories.add(buttonFactory); 87 } 88 89 protected final void initController() { 90 } 91 92 110 public ModelAndView handleRequest(HttpServletRequest request, 111 HttpServletResponse response) throws Exception { 112 113 Form form = null; 114 if (!isInitialRequest(request)) { 115 form = getForm(request); 116 } 117 if (form == null) { 118 form = createAndInitForm(request, response); 119 } 120 121 if (isContentRequest(request)) { 122 return handleContentRequest(form, request, response); 123 } 124 else { 125 return handleFormRequest(form, request, response); 126 } 127 } 128 129 protected ModelAndView handleFormRequest(Form form, 130 HttpServletRequest request, HttpServletResponse response) 131 throws Exception { 132 133 if (!isInitialRequest(request) || processNewForms) { 134 processForm(form, request); 135 } 136 return createModelAndView(form, request, response); 137 } 138 139 145 protected Form getForm(HttpServletRequest request) { 146 log.debug("Retrieving Form from session"); 147 HttpSession session = request.getSession(); 148 String attrName = getSessionAttribute(request); 149 Form form = (Form) session.getAttribute(attrName); 150 return form; 151 } 152 153 protected ModelAndView showForm(Form form, 154 HttpServletRequest request, HttpServletResponse response) 155 throws Exception { 156 157 PrintWriter writer = getWriter(request,response); 158 renderForm(form, writer); 159 return null; 160 } 161 162 protected PrintWriter getWriter(HttpServletRequest request, 163 HttpServletResponse response) throws IOException { 164 165 return response.getWriter(); 166 } 167 168 protected void renderForm(Form form, PrintWriter writer) { 169 form.render(writer); 170 } 171 172 177 protected boolean isInitialRequest(HttpServletRequest request) { 178 return "GET".equals(request.getMethod()) && !isContentRequest(request); 179 } 180 181 184 protected boolean isContentRequest(HttpServletRequest request) { 185 return request.getParameter(CONTENT_PARAM) != null; 186 } 187 188 protected boolean isExclusiveRequest(HttpServletRequest request) { 189 return request.getParameter(EXCLUSIVE_PARAM) != null; 190 } 191 192 protected ModelAndView handleContentRequest(Form form, 193 HttpServletRequest request, HttpServletResponse response) 194 throws IOException { 195 196 if (form != null) { 197 String id = request.getParameter(CONTENT_PARAM); 198 Element element = form.getElementById(id); 199 if (element instanceof ContentElement) { 200 ContentElement ce = (ContentElement) element; 201 ce.handleContentRequest(request, response); 202 return null; 203 } 204 } 205 response.sendError(HttpServletResponse.SC_NOT_FOUND); 206 return null; 207 } 208 209 212 protected Form createAndInitForm(HttpServletRequest request, 213 HttpServletResponse response) throws Exception { 214 215 Form form = createForm(request); 216 form.setFormContext(formContextFactory.createFormContext(request, response)); 217 218 if (buttonFactories != null && !buttonFactories.isEmpty()) { 219 Container container = form.createContainer(BUTTON_CONTAINER_ID); 220 Iterator it = buttonFactories.iterator(); 221 while (it.hasNext()) { 222 ButtonFactory buttonFactory = (ButtonFactory) it.next(); 223 container.addElement(buttonFactory.createButton()); 224 } 225 } 226 227 populateForm(form, request); 228 form.init(); 229 initForm(form, request); 230 231 String attrName = getSessionAttribute(request); 232 request.getSession().setAttribute(attrName, form); 233 234 return form; 235 } 236 237 protected void processForm(Form form, HttpServletRequest request) { 238 if (isExclusiveRequest(request)) { 239 String id = request.getParameter(EXCLUSIVE_PARAM); 240 form.processExclusiveRequest(id, request); 241 } 242 else { 243 form.processRequest(request); 244 } 245 } 246 247 252 protected void populateForm(Form form, HttpServletRequest request) 253 throws Exception { 254 255 form.setValue(getFormBackingObject(request)); 256 } 257 258 263 protected Object getFormBackingObject(HttpServletRequest request) 264 throws Exception { 265 266 return null; 267 } 268 269 273 protected abstract Form createForm(HttpServletRequest request); 274 275 279 protected void initForm(Form form, HttpServletRequest request) { 280 } 281 282 protected final ModelAndView createModelAndView(Form form, 283 HttpServletRequest request, HttpServletResponse response) 284 throws Exception { 285 286 FormSubmissionHandler handler = (FormSubmissionHandler) 287 form.getAttribute(FORM_SUBMISSION_HANDLER); 288 289 form.setAttribute(FORM_SUBMISSION_HANDLER, null); 290 291 if (handler != null && !form.hasErrors()) { 292 return handler.handleFormSubmission(form, request, response); 293 } 294 return showForm(form, request, response); 295 } 296 297 protected String getSessionAttribute(HttpServletRequest request) { 298 return AbstractFormController.class.getName() + ".form"; 299 } 300 301 } 302 | Popular Tags |