KickJava   Java API By Example, From Geeks To Geeks.

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


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.ArrayList JavaDoc;
29 import java.util.Iterator JavaDoc;
30
31 import javax.servlet.http.HttpServletRequest JavaDoc;
32 import javax.servlet.http.HttpServletResponse JavaDoc;
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 /**
49  *
50  */

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 JavaDoc request, HttpServletResponse JavaDoc response)
63             throws Exception JavaDoc {
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 JavaDoc request) {
75         form.addResource(new ScriptResource("form/ajax.js", "propagate",
76                 Resources.PROTOTYPE));
77     }
78     
79     protected boolean isEventRequest(HttpServletRequest JavaDoc request) {
80         return request.getParameter("event.type") != null;
81     }
82     
83     /**
84      * Returns whether the given request is an initial form request.
85      */

86     protected boolean isInitialRequest(HttpServletRequest JavaDoc request) {
87         return super.isInitialRequest(request)
88                 && !ServletUtils.isXmlHttpRequest(request);
89     }
90     
91     protected void processAjaxRequest(Form form, HttpServletRequest JavaDoc request,
92             HttpServletResponse JavaDoc response) throws IOException JavaDoc {
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 JavaDoc 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 JavaDoc request) {
117         String JavaDoc 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 JavaDoc 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 JavaDoc propagations = new ArrayList JavaDoc();
141         Iterator JavaDoc 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