KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > riotfamily > riot > form > ui > BaseFormController


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.riot.form.ui;
25
26 import java.io.PrintWriter JavaDoc;
27 import java.io.StringWriter JavaDoc;
28 import java.util.HashMap JavaDoc;
29 import java.util.Map JavaDoc;
30
31 import javax.servlet.http.HttpServletRequest JavaDoc;
32 import javax.servlet.http.HttpServletResponse JavaDoc;
33
34 import org.riotfamily.common.util.ResourceUtils;
35 import org.riotfamily.forms.Form;
36 import org.riotfamily.forms.controller.ButtonFactory;
37 import org.riotfamily.forms.controller.FormSubmissionHandler;
38 import org.riotfamily.forms.factory.FormRepository;
39 import org.riotfamily.forms.factory.RepositoryFormController;
40 import org.riotfamily.riot.dao.InvalidPropertyValueException;
41 import org.riotfamily.riot.dao.RioDaoException;
42 import org.riotfamily.riot.dao.RiotDao;
43 import org.riotfamily.riot.editor.EditorConstants;
44 import org.riotfamily.riot.editor.EditorDefinitionUtils;
45 import org.riotfamily.riot.editor.EditorRepository;
46 import org.riotfamily.riot.editor.FormReference;
47 import org.riotfamily.riot.editor.ListDefinition;
48 import org.riotfamily.riot.editor.ObjectEditorDefinition;
49 import org.springframework.transaction.PlatformTransactionManager;
50 import org.springframework.transaction.TransactionDefinition;
51 import org.springframework.transaction.TransactionStatus;
52 import org.springframework.transaction.support.DefaultTransactionDefinition;
53 import org.springframework.util.Assert;
54 import org.springframework.web.servlet.ModelAndView;
55
56 /**
57  *
58  */

59 public abstract class BaseFormController extends RepositoryFormController
60         implements FormSubmissionHandler {
61
62     protected static final String JavaDoc EDITOR_DEFINITION_ATTR =
63             FormController.class.getName() + ".editorDefinition";
64
65     private static final DefaultTransactionDefinition TRANSACTION_DEFINITION =
66             new DefaultTransactionDefinition(
67             TransactionDefinition.PROPAGATION_REQUIRED);
68     
69     private EditorRepository editorRepository;
70
71     private PlatformTransactionManager transactionManager;
72
73     private String JavaDoc viewName = ResourceUtils.getPath(
74             BaseFormController.class, "FormView.ftl");
75
76     public BaseFormController(EditorRepository editorRepository,
77             FormRepository formRepository,
78             PlatformTransactionManager transactionManager) {
79
80         super(formRepository);
81         this.editorRepository = editorRepository;
82         this.transactionManager = transactionManager;
83         ButtonFactory buttonFactory = new ButtonFactory(this);
84         buttonFactory.setLabelKey("label.form.button.save");
85         buttonFactory.setCssClass("button button-save");
86         addButton(buttonFactory);
87     }
88
89     public void setViewName(String JavaDoc viewName) {
90         this.viewName = viewName;
91     }
92
93     protected String JavaDoc getSessionAttribute(HttpServletRequest JavaDoc request) {
94         return BaseFormController.class.getName()
95                 + request.getAttribute(EditorConstants.EDITOR_ID);
96     }
97
98     protected ObjectEditorDefinition getObjectEditorDefinition(HttpServletRequest JavaDoc request) {
99         ObjectEditorDefinition editorDefinition = (ObjectEditorDefinition)
100                 request.getAttribute(EDITOR_DEFINITION_ATTR);
101
102         if (editorDefinition == null) {
103             String JavaDoc editorId = (String JavaDoc) request.getAttribute(EditorConstants.EDITOR_ID);
104             Assert.notNull(editorId, "An editorId attribute must be set");
105             editorDefinition = (ObjectEditorDefinition) editorRepository.getEditorDefinition(editorId);
106             Assert.notNull(editorDefinition, "No such editor: " + editorId);
107             request.setAttribute(EDITOR_DEFINITION_ATTR, editorDefinition);
108         }
109         return editorDefinition;
110     }
111
112     protected String JavaDoc getObjectId(HttpServletRequest JavaDoc request) {
113         return (String JavaDoc) request.getAttribute(EditorConstants.OBJECT_ID);
114     }
115
116     protected String JavaDoc getParentId(HttpServletRequest JavaDoc request) {
117         return request.getParameter(EditorConstants.PARENT_ID);
118     }
119
120     protected String JavaDoc getFormId(HttpServletRequest JavaDoc request) {
121         FormReference ref = (FormReference) getObjectEditorDefinition(request);
122         return ref.getFormId();
123     }
124     
125     protected Form createForm(HttpServletRequest JavaDoc request) {
126         Form form = super.createForm(request);
127         FormUtils.setObjectId(form, getObjectId(request));
128         FormUtils.setParentId(form, getParentId(request));
129         FormUtils.setEditorDefinition(form, getObjectEditorDefinition(request));
130         return form;
131     }
132
133     /**
134      * @see org.riotfamily.forms.factory.RepositoryFormController#getFormBackingObject(javax.servlet.http.HttpServletRequest)
135      */

136     protected Object JavaDoc getFormBackingObject(HttpServletRequest JavaDoc request) {
137         ObjectEditorDefinition editorDefinition = getObjectEditorDefinition(request);
138         String JavaDoc objectId = getObjectId(request);
139         if (objectId == null) {
140             return null;
141         }
142         return EditorDefinitionUtils.loadBean(editorDefinition, objectId);
143     }
144
145     protected Map JavaDoc createModel(Form form, ObjectEditorDefinition formDefinition,
146             HttpServletRequest JavaDoc request, HttpServletResponse JavaDoc response) {
147
148         HashMap JavaDoc model = new HashMap JavaDoc();
149         model.put(EditorConstants.EDITOR_ID, formDefinition.getId());
150         model.put(EditorConstants.PARENT_ID, FormUtils.getParentId(form));
151         model.put(EditorConstants.OBJECT_ID, FormUtils.getObjectId(form));
152         model.put("formId", form.getId());
153         return model;
154     }
155
156     /**
157      * @see org.riotfamily.forms.controller.AbstractFormController#showForm(org.riotfamily.forms.Form, javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse)
158      */

159     protected ModelAndView showForm(Form form, HttpServletRequest JavaDoc request,
160             HttpServletResponse JavaDoc response) {
161
162         StringWriter JavaDoc sw = new StringWriter JavaDoc();
163         renderForm(form, new PrintWriter JavaDoc(sw));
164         Map JavaDoc model = createModel(form, getObjectEditorDefinition(request),
165                 request, response);
166
167         model.put("form", sw.toString());
168         return new ModelAndView(viewName, model);
169     }
170
171
172     public final ModelAndView handleFormSubmission(Form form,
173             HttpServletRequest JavaDoc request, HttpServletResponse JavaDoc response)
174             throws Exception JavaDoc {
175
176         try {
177             return handleFormSubmissionInternal(form, request, response);
178         }
179         catch (InvalidPropertyValueException e) {
180             form.getErrors().rejectValue(e.getField(), e.getCode(),
181                     e.getArguments(), e.getMessage());
182
183             return showForm(form, request, response);
184         }
185         catch (RioDaoException e) {
186             form.getErrors().reject(e.getCode(), e.getArguments(), e.getMessage());
187             return showForm(form, request, response);
188         }
189     }
190
191     protected ModelAndView handleFormSubmissionInternal(Form form,
192             HttpServletRequest JavaDoc request, HttpServletResponse JavaDoc response)
193             throws Exception JavaDoc {
194         
195         Object JavaDoc bean = form.populateBackingObject();
196         ObjectEditorDefinition editorDef = getObjectEditorDefinition(request);
197
198         ListDefinition listDef = EditorDefinitionUtils.getParentListDefinition(editorDef);
199         RiotDao dao = listDef.getListConfig().getDao();
200         
201         ModelAndView modelAndView;
202         TransactionStatus status = transactionManager.getTransaction(TRANSACTION_DEFINITION);
203         try {
204             if (form.isNew()) {
205                 log.debug("Saving entity ...");
206                 String JavaDoc parentId = FormUtils.getParentId(form);
207                 Object JavaDoc parent = EditorDefinitionUtils.loadParent(listDef, parentId);
208                 dao.save(bean, parent);
209                 FormUtils.setObjectId(form, dao.getObjectId(bean));
210                 form.setValue(bean);
211                 modelAndView = afterSave(form, editorDef, request, response);
212             }
213             else {
214                 log.debug("Updating entity ...");
215                 dao.update(bean);
216                 modelAndView = afterUpdate(form, editorDef, request, response);
217             }
218         }
219         catch (Exception JavaDoc e) {
220             transactionManager.rollback(status);
221             throw e;
222         }
223         transactionManager.commit(status);
224         return modelAndView;
225     }
226     
227     
228
229     protected abstract ModelAndView afterSave(Form form, ObjectEditorDefinition editorDefinition,
230             HttpServletRequest JavaDoc request, HttpServletResponse JavaDoc response);
231
232     protected abstract ModelAndView afterUpdate(Form form, ObjectEditorDefinition editorDefinition,
233             HttpServletRequest JavaDoc request, HttpServletResponse JavaDoc response);
234
235 }
236
Popular Tags