001: /* ***** BEGIN LICENSE BLOCK *****
002: * Version: MPL 1.1
003: * The contents of this file are subject to the Mozilla Public License Version
004: * 1.1 (the "License"); you may not use this file except in compliance with
005: * the License. You may obtain a copy of the License at
006: * http://www.mozilla.org/MPL/
007: *
008: * Software distributed under the License is distributed on an "AS IS" basis,
009: * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
010: * for the specific language governing rights and limitations under the
011: * License.
012: *
013: * The Original Code is Riot.
014: *
015: * The Initial Developer of the Original Code is
016: * Neteye GmbH.
017: * Portions created by the Initial Developer are Copyright (C) 2006
018: * the Initial Developer. All Rights Reserved.
019: *
020: * Contributor(s):
021: * Felix Gnass [fgnass at neteye dot de]
022: *
023: * ***** END LICENSE BLOCK ***** */
024: package org.riotfamily.forms.controller;
025:
026: import java.io.IOException;
027: import java.io.PrintWriter;
028: import java.util.ArrayList;
029: import java.util.Iterator;
030:
031: import javax.servlet.http.HttpServletRequest;
032: import javax.servlet.http.HttpServletResponse;
033:
034: import org.riotfamily.common.web.util.ServletUtils;
035: import org.riotfamily.forms.Element;
036: import org.riotfamily.forms.Form;
037: import org.riotfamily.forms.event.EventPropagation;
038: import org.riotfamily.forms.event.JavaScriptEvent;
039: import org.riotfamily.forms.event.JavaScriptEventAdapter;
040: import org.riotfamily.forms.resource.Resources;
041: import org.riotfamily.forms.resource.ScriptResource;
042: import org.springframework.context.MessageSource;
043: import org.springframework.context.MessageSourceAware;
044: import org.springframework.web.servlet.ModelAndView;
045: import org.springframework.web.servlet.support.RequestContextUtils;
046:
047: /**
048: *
049: */
050: public abstract class AjaxFormController extends AbstractFormController
051: implements MessageSourceAware {
052:
053: private MessageSource messageSource;
054:
055: public void setMessageSource(MessageSource messageSource) {
056: this .messageSource = messageSource;
057: }
058:
059: protected ModelAndView handleFormRequest(Form form,
060: HttpServletRequest request, HttpServletResponse response)
061: throws Exception {
062:
063: if (ServletUtils.isXmlHttpRequest(request)) {
064: processAjaxRequest(form, request, response);
065: return null;
066: } else {
067: return super .handleFormRequest(form, request, response);
068: }
069: }
070:
071: protected void initForm(Form form, HttpServletRequest request) {
072: form.addResource(new ScriptResource("form/ajax.js",
073: "propagate", Resources.PROTOTYPE));
074: }
075:
076: protected boolean isEventRequest(HttpServletRequest request) {
077: return request.getParameter("event.type") != null;
078: }
079:
080: /**
081: * Returns whether the given request is an initial form request.
082: */
083: protected boolean isInitialRequest(HttpServletRequest request) {
084: return super .isInitialRequest(request)
085: && !ServletUtils.isXmlHttpRequest(request);
086: }
087:
088: protected void processAjaxRequest(Form form,
089: HttpServletRequest request, HttpServletResponse response)
090: throws IOException {
091:
092: AjaxResponse ajaxResponse = new AjaxResponse(response);
093: if (form != null) {
094: form.getFormContext().setWriter(response.getWriter());
095: form.setFormListener(ajaxResponse);
096: if (isEventRequest(request)) {
097: processEventRequest(form, request);
098: } else {
099: processForm(form, request);
100: }
101: form.setFormListener(null);
102: } else {
103: String message = messageSource.getMessage(
104: "error.sessionExpired", null,
105: "Your session has expired", RequestContextUtils
106: .getLocale(request));
107:
108: ajaxResponse.alert(message);
109: }
110: ajaxResponse.close();
111: }
112:
113: protected void processEventRequest(Form form,
114: HttpServletRequest request) {
115: String id = request.getParameter("event.source");
116: log.debug("Processing AJAX request triggered by element " + id);
117: Element element = form.getElementById(id);
118: JavaScriptEvent event = new JavaScriptEvent(request);
119: if (element instanceof JavaScriptEventAdapter) {
120: JavaScriptEventAdapter ea = (JavaScriptEventAdapter) element;
121: ea.handleJavaScriptEvent(event);
122: } else {
123: log
124: .error("Element does not implement JavaScriptEventAdapter");
125: }
126: }
127:
128: protected void renderForm(Form form, PrintWriter writer) {
129: form.render(writer);
130:
131: writer.print("<script>");
132: writer.print("document.getElementById('");
133: writer.print(form.getId());
134: writer.print("').ajaxUrl = '");
135: writer.print(form.getFormContext().getFormUrl());
136: writer.print("';\n");
137:
138: ArrayList propagations = new ArrayList();
139: Iterator it = form.getRegisteredElements().iterator();
140: while (it.hasNext()) {
141: Element element = (Element) it.next();
142: if (element instanceof JavaScriptEventAdapter) {
143: JavaScriptEventAdapter adapter = (JavaScriptEventAdapter) element;
144: EventPropagation.addPropagations(adapter, propagations);
145: }
146: }
147:
148: if (!propagations.isEmpty()) {
149: writer.print("Resources.waitFor('propagate', function() {");
150: it = propagations.iterator();
151: while (it.hasNext()) {
152: EventPropagation p = (EventPropagation) it.next();
153: writer.print("propagate('");
154: writer.print(p.getId());
155: writer.print("', '");
156: writer.print(p.getType());
157: writer.print("');\n");
158: }
159: writer.print("});");
160: }
161: writer.print("</script>");
162: }
163:
164: }
|