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 31 import javax.servlet.http.HttpServletRequest ; 32 import javax.servlet.http.HttpServletResponse ; 33 34 import org.riotfamily.common.web.util.ServletUtils; 35 import org.riotfamily.forms.Element; 36 import org.riotfamily.forms.Form; 37 import org.riotfamily.forms.event.EventPropagation; 38 import org.riotfamily.forms.event.JavaScriptEvent; 39 import org.riotfamily.forms.event.JavaScriptEventAdapter; 40 import org.riotfamily.forms.resource.Resources; 41 import org.riotfamily.forms.resource.ScriptResource; 42 import org.springframework.context.MessageSource; 43 import org.springframework.context.MessageSourceAware; 44 import org.springframework.web.servlet.ModelAndView; 45 import org.springframework.web.servlet.support.RequestContextUtils; 46 47 48 51 public abstract class AjaxFormController extends AbstractFormController 52 implements MessageSourceAware { 53 54 private MessageSource messageSource; 55 56 57 public void setMessageSource(MessageSource messageSource) { 58 this.messageSource = messageSource; 59 } 60 61 protected ModelAndView handleFormRequest(Form form, 62 HttpServletRequest request, HttpServletResponse response) 63 throws Exception { 64 65 if (ServletUtils.isXmlHttpRequest(request)) { 66 processAjaxRequest(form, request, response); 67 return null; 68 } 69 else { 70 return super.handleFormRequest(form, request, response); 71 } 72 } 73 74 protected void initForm(Form form, HttpServletRequest request) { 75 form.addResource(new ScriptResource("form/ajax.js", "propagate", 76 Resources.PROTOTYPE)); 77 } 78 79 protected boolean isEventRequest(HttpServletRequest request) { 80 return request.getParameter("event.type") != null; 81 } 82 83 86 protected boolean isInitialRequest(HttpServletRequest request) { 87 return super.isInitialRequest(request) 88 && !ServletUtils.isXmlHttpRequest(request); 89 } 90 91 protected void processAjaxRequest(Form form, HttpServletRequest request, 92 HttpServletResponse response) throws IOException { 93 94 AjaxResponse ajaxResponse = new AjaxResponse(response); 95 if (form != null) { 96 form.getFormContext().setWriter(response.getWriter()); 97 form.setFormListener(ajaxResponse); 98 if (isEventRequest(request)) { 99 processEventRequest(form, request); 100 } 101 else { 102 processForm(form, request); 103 } 104 form.setFormListener(null); 105 } 106 else { 107 String message = messageSource.getMessage( 108 "error.sessionExpired", null, "Your session has expired", 109 RequestContextUtils.getLocale(request)); 110 111 ajaxResponse.alert(message); 112 } 113 ajaxResponse.close(); 114 } 115 116 protected void processEventRequest(Form form, HttpServletRequest request) { 117 String id = request.getParameter("event.source"); 118 log.debug("Processing AJAX request triggered by element " + id); 119 Element element = form.getElementById(id); 120 JavaScriptEvent event = new JavaScriptEvent(request); 121 if (element instanceof JavaScriptEventAdapter) { 122 JavaScriptEventAdapter ea = (JavaScriptEventAdapter) element; 123 ea.handleJavaScriptEvent(event); 124 } 125 else { 126 log.error("Element does not implement JavaScriptEventAdapter"); 127 } 128 } 129 130 protected void renderForm(Form form, PrintWriter writer) { 131 form.render(writer); 132 133 writer.print("<script>"); 134 writer.print("document.getElementById('"); 135 writer.print(form.getId()); 136 writer.print("').ajaxUrl = '"); 137 writer.print(form.getFormContext().getFormUrl()); 138 writer.print("';\n"); 139 140 ArrayList propagations = new ArrayList (); 141 Iterator it = form.getRegisteredElements().iterator(); 142 while (it.hasNext()) { 143 Element element = (Element) it.next(); 144 if (element instanceof JavaScriptEventAdapter) { 145 JavaScriptEventAdapter adapter = (JavaScriptEventAdapter) element; 146 EventPropagation.addPropagations(adapter, propagations); 147 } 148 } 149 150 if (!propagations.isEmpty()) { 151 writer.print("Resources.waitFor('propagate', function() {"); 152 it = propagations.iterator(); 153 while (it.hasNext()) { 154 EventPropagation p = (EventPropagation) it.next(); 155 writer.print("propagate('"); 156 writer.print(p.getId()); 157 writer.print("', '"); 158 writer.print(p.getType()); 159 writer.print("');\n"); 160 } 161 writer.print("});"); 162 } 163 writer.print("</script>"); 164 } 165 166 } 167 | Popular Tags |