KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > riotfamily > forms > controller > AjaxResponse


1 /* ***** BEGIN LICENSE BLOCK *****
2  * Version: MPL 1.1
3  * The contents of this file are subject to the Mozilla Public License Version
4  * 1.1 (the "License"); you may not use this file except in compliance with
5  * the License. You may obtain a copy of the License at
6  * http://www.mozilla.org/MPL/
7  *
8  * Software distributed under the License is distributed on an "AS IS" basis,
9  * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
10  * for the specific language governing rights and limitations under the
11  * License.
12  *
13  * The Original Code is Riot.
14  *
15  * The Initial Developer of the Original Code is
16  * Neteye GmbH.
17  * Portions created by the Initial Developer are Copyright (C) 2006
18  * the Initial Developer. All Rights Reserved.
19  *
20  * Contributor(s):
21  * Felix Gnass [fgnass at neteye dot de]
22  *
23  * ***** END LICENSE BLOCK ***** */

24 package org.riotfamily.forms.controller;
25
26 import java.io.IOException JavaDoc;
27 import java.io.PrintWriter JavaDoc;
28 import java.util.HashSet JavaDoc;
29 import java.util.Iterator JavaDoc;
30 import java.util.LinkedHashSet JavaDoc;
31 import java.util.LinkedList JavaDoc;
32 import java.util.List JavaDoc;
33
34 import javax.servlet.http.HttpServletResponse JavaDoc;
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 /**
50  * FormListener implementation used by the
51  * {@link org.riotfamily.forms.controller.AjaxFormController AjaxFormController} to
52  * notify the client of structural changes. It creates an XML document that
53  * contains the modifications to be performed on the client side DOM.
54  */

55 public class AjaxResponse implements FormListener {
56
57     private Log log = LogFactory.getLog(AjaxResponse.class);
58     
59     private PrintWriter JavaDoc writer;
60     
61     private LinkedHashSet JavaDoc resources = new LinkedHashSet JavaDoc();
62     
63     private List JavaDoc propagations = new LinkedList JavaDoc();
64     
65     private List JavaDoc dhtmlElements = new LinkedList JavaDoc();
66     
67     private HashSet JavaDoc validatedElements = new HashSet JavaDoc();
68     
69     private Element focusedElement;
70     
71     public AjaxResponse(HttpServletResponse JavaDoc response) throws IOException JavaDoc {
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 JavaDoc 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 JavaDoc 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 JavaDoc 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 JavaDoc it = dhtmlElements.iterator();
189         while (it.hasNext()) {
190             DHTMLElement e = (DHTMLElement) it.next();
191             String JavaDoc 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 JavaDoc 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