1 24 package org.riotfamily.forms.controller; 25 26 import java.io.IOException ; 27 import java.io.PrintWriter ; 28 import java.util.HashSet ; 29 import java.util.Iterator ; 30 import java.util.LinkedHashSet ; 31 import java.util.LinkedList ; 32 import java.util.List ; 33 34 import javax.servlet.http.HttpServletResponse ; 35 36 import org.apache.commons.logging.Log; 37 import org.apache.commons.logging.LogFactory; 38 import org.riotfamily.common.markup.TagWriter; 39 import org.riotfamily.forms.DHTMLElement; 40 import org.riotfamily.forms.Element; 41 import org.riotfamily.forms.FormListener; 42 import org.riotfamily.forms.event.EventPropagation; 43 import org.riotfamily.forms.event.JavaScriptEventAdapter; 44 import org.riotfamily.forms.resource.FormResource; 45 import org.riotfamily.forms.resource.LoadingCodeGenerator; 46 import org.riotfamily.forms.resource.ResourceElement; 47 48 49 55 public class AjaxResponse implements FormListener { 56 57 private Log log = LogFactory.getLog(AjaxResponse.class); 58 59 private PrintWriter writer; 60 61 private LinkedHashSet resources = new LinkedHashSet (); 62 63 private List propagations = new LinkedList (); 64 65 private List dhtmlElements = new LinkedList (); 66 67 private HashSet validatedElements = new HashSet (); 68 69 private Element focusedElement; 70 71 public AjaxResponse(HttpServletResponse response) throws IOException { 72 response.setContentType("text/xml;charset=UTF-8"); 73 response.setCharacterEncoding("UTF-8"); 74 setCacheControlHeaders(response); 75 this.writer = response.getWriter(); 76 writer.println("<?xml version=\"1.0\" encoding=\"UTF-8\"?>"); 77 78 writer.println("<!DOCTYPE html " + 79 "PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\" " + 80 "\"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">"); 81 82 writer.print("<html xmlns=\"http://www.w3.org/1999/xhtml\">"); 83 } 84 85 protected void setCacheControlHeaders(HttpServletResponse response) { 86 response.setHeader("Pragma", "no-cache"); 87 response.setHeader("Expires", "0"); 88 response.setHeader("Cache-Control", "no-store"); 89 } 90 91 public void elementChanged(Element element) { 92 TagWriter tag = new TagWriter(writer); 93 tag.start("replace"); 94 log.debug("Replacing element " + element.getId()); 95 tag.attribute("ref", element.getId()); 96 tag.body(); 97 element.render(writer); 98 tag.end(); 99 validatedElements.add(element); 100 } 101 102 public void elementValidated(Element element) { 103 validatedElements.add(element); 104 } 105 106 public void elementRemoved(Element element) { 107 TagWriter tag = new TagWriter(writer); 108 tag.startEmpty("remove"); 109 tag.attribute("ref", element.getId()); 110 tag.end(); 111 } 112 113 public void elementAdded(Element element) { 114 TagWriter tag = new TagWriter(writer); 115 tag.start("insert"); 116 tag.attribute("ref", element.getParent().getId()); 117 tag.body(); 118 element.render(writer); 119 tag.end(); 120 } 121 122 public void elementFocused(Element element) { 123 log.debug("Focus requested for: " + element.getId()); 124 focusedElement = element; 125 } 126 127 public void elementEnabled(Element element) { 128 TagWriter tag = new TagWriter(writer); 129 tag.startEmpty("enable"); 130 tag.attribute("ref", element.getId()); 131 tag.attribute("state", element.isEnabled() ? 1 : 0); 132 tag.end(); 133 } 134 135 public void elementRendered(Element element) { 136 log.debug("Element rendered: " + element); 137 if (element instanceof JavaScriptEventAdapter) { 138 JavaScriptEventAdapter adapter = (JavaScriptEventAdapter) element; 139 EventPropagation.addPropagations(adapter, propagations); 140 } 141 if (element instanceof ResourceElement) { 142 ResourceElement re = (ResourceElement) element; 143 FormResource res = re.getResource(); 144 if (res != null) { 145 resources.add(res); 146 } 147 } 148 if (element instanceof DHTMLElement) { 149 log.debug("DHTML element registered"); 150 dhtmlElements.add(element); 151 } 152 } 153 154 public void refresh(Element element) { 155 TagWriter tag = new TagWriter(writer); 156 tag.startEmpty("refresh"); 157 tag.attribute("ref", element.getId()); 158 tag.end(); 159 } 160 161 public void alert(String message) { 162 TagWriter tag = new TagWriter(writer); 163 tag.start("eval"); 164 tag.body("alert('" + message + "');"); 165 tag.end(); 166 } 167 168 protected void renderPropagations() { 169 Iterator it = propagations.iterator(); 170 while (it.hasNext()) { 171 EventPropagation p = (EventPropagation) it.next(); 172 renderPropagation(p); 173 } 174 } 175 176 protected void renderPropagation(EventPropagation propagation) { 177 log.debug("Propagating " + propagation.getType() + 178 " events for element " + propagation.getId()); 179 180 TagWriter tag = new TagWriter(writer); 181 tag.startEmpty("propagate"); 182 tag.attribute("ref", propagation.getId()); 183 tag.attribute("type", propagation.getType()); 184 tag.end(); 185 } 186 187 protected void renderScripts() { 188 Iterator it = dhtmlElements.iterator(); 189 while (it.hasNext()) { 190 DHTMLElement e = (DHTMLElement) it.next(); 191 String script = e.getInitScript(); 192 if (script != null) { 193 log.debug("Evaluating init script ..."); 194 TagWriter tag = new TagWriter(writer); 195 tag.start("eval").body(); 196 if (e instanceof ResourceElement) { 197 ResourceElement resEle = (ResourceElement) e; 198 FormResource res = resEle.getResource(); 199 if (res != null) { 200 tag.print("Resources.execWhenLoaded(['"); 201 tag.print(res.getUrl()); 202 tag.print("'], function() {"); 203 tag.print(script); 204 tag.print("})"); 205 } 206 else { 207 tag.print(script); 208 } 209 } 210 else { 211 tag.print(script); 212 } 213 tag.end(); 214 } 215 } 216 } 217 218 protected void renderResources() { 219 TagWriter tag = new TagWriter(writer); 220 tag.start("eval").body(); 221 LoadingCodeGenerator.renderLoadingCode(resources, writer); 222 tag.end(); 223 } 224 225 protected void renderFocus() { 226 if (focusedElement != null) { 227 log.debug("Focusing element " + focusedElement.getId()); 228 TagWriter tag = new TagWriter(writer); 229 tag.startEmpty("focus"); 230 tag.attribute("ref", focusedElement.getId()); 231 tag.end(); 232 } 233 } 234 235 protected void renderErrors() { 236 Iterator it = validatedElements.iterator(); 237 while (it.hasNext()) { 238 Element element = (Element) it.next(); 239 if (element.getForm().getErrors().getErrors(element) != null) { 240 TagWriter tag = new TagWriter(writer); 241 tag.start("error"); 242 tag.attribute("ref", element.getId()); 243 tag.attribute("valid", element.getForm().getErrors().hasErrors(element) ? 0 : 1); 244 tag.body(); 245 element.getForm().getErrors().renderErrors(element); 246 tag.end(); 247 } 248 } 249 } 250 251 protected void onClose() { 252 renderResources(); 253 renderFocus(); 254 renderPropagations(); 255 renderScripts(); 256 renderErrors(); 257 } 258 259 public void close() { 260 onClose(); 261 writer.println("</html>"); 262 writer.flush(); 263 writer.close(); 264 } 265 266 } 267 | Popular Tags |