Kawai Wiki

Rev

Rev 77 | Rev 79 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
11 soliveira 1
package org.kawai.action;
2
 
49 soliveira 3
import java.util.List;
4
 
11 soliveira 5
import org.kawai.dao.PageDAO;
22 soliveira 6
import org.kawai.dao.UserDAO;
77 soliveira 7
import org.kawai.model.Group;
24 soliveira 8
import org.kawai.model.Language;
22 soliveira 9
import org.kawai.model.Page;
63 soliveira 10
import org.kawai.model.Preview;
78 soliveira 11
import org.kawai.model.Revision;
11 soliveira 12
import org.mentawai.filter.AuthenticationFree;
39 soliveira 13
import org.mentawai.rule.MethodRule;
68 soliveira 14
import org.mentawai.rule.RegexRule;
39 soliveira 15
import org.mentawai.validation.Validatable;
48 soliveira 16
import org.mentawai.validation.ValidationInterceptor;
39 soliveira 17
import org.mentawai.validation.Validator;
11 soliveira 18
 
48 soliveira 19
public class PageAction extends AbstractAction implements AuthenticationFree, Validatable, ValidationInterceptor {
11 soliveira 20
 
22 soliveira 21
        private static final String LEFT_COLUMN_KEY = "leftColumn";
24 soliveira 22
        private static final String BODY_COLUMN_KEY = "bodyColumn";
31 soliveira 23
        private static final String CSS_KEY = "css";
75 soliveira 24
        private static final String LOGO_KEY = "logo";
11 soliveira 25
 
22 soliveira 26
        public PageAction(UserDAO userDAO, PageDAO pageDAO) {
27
                super(userDAO, pageDAO);
11 soliveira 28
        }
29
 
30
        @Override
31
        public boolean bypassAuthentication(String method) {
32
 
33
                return true;
34
        }
35
 
39 soliveira 36
        @Override
37
        public void prepareValidator(Validator val, String method) {
38
 
39
                if (method != null && method.equals("add") && isPost()) {
40
 
41
                        val.requiredFields("Required field!", "newPage.name", "newPage.title", "newPage.body", "newPage.languageId");
42
 
43
                        val.requiredLists("Required field!", "newPage.languageId");
44
 
68 soliveira 45
                        val.add("newPage.name", RegexRule.getInstance("[A-Za-z0-9_\\-]+"), "Invalid name for page!");
46
 
39 soliveira 47
                        val.add("newPage.name", MethodRule.getInstance(this, "checkPageDoesNotExist"), "This page already exists!");
48
 
49
                        val.add("newPage.name", MethodRule.getInstance(this, "checkNotSystemPage"), "Cannot create a system page!");
50
                }              
51
        }
52
 
48 soliveira 53
        @Override
54
        public boolean beforeValidation(String method) {
55
                return true; // go ahead with validation...
56
        }
57
 
58
        @Override
59
        public void afterValidation(String method, boolean wasOk) {
39 soliveira 60
                if (method == null) return;
61
 
62
                if (method.equals("add") && !wasOk) {
63
                        output.setValue("showForm", method);
64
                }
65
        }
66
 
47 soliveira 67
        public boolean checkPageDoesNotExist() {
39 soliveira 68
                Page p = input.getObject(Page.class, "newPage");
69
                if (p.getName() == null || p.getLanguage() == null) {
70
                        return true;
71
                }
72
                return !pageDAO.exists(p.getName(), p.getLanguage());
73
        }
74
 
47 soliveira 75
        public boolean checkNotSystemPage() {
39 soliveira 76
                Page p = input.getObject(Page.class, "newPage");
77
                if (p.getName() == null) {
78
                        return true;
79
                }
80
                return !pageDAO.isSystemPage(p.getName());
81
        }
82
 
41 soliveira 83
        private Page loadLeftColumn(Language lang) {
73 soliveira 84
                if (sessionUser != null) {
85
                        return pageDAO.loadByNameWithPreview(sessionUser.getId(), Page.LEFT_COLUMN, lang);
86
                } else {
87
                        return pageDAO.loadByName(Page.LEFT_COLUMN, lang);
88
                }
22 soliveira 89
        }
90
 
75 soliveira 91
        private Page loadLogo(Language lang) {
92
                if (sessionUser != null) {
93
                        return pageDAO.loadByNameWithPreview(sessionUser.getId(), Page.LOGO, lang);
94
                } else {
95
                        return pageDAO.loadByName(Page.LOGO, lang);
96
                }
97
        }
98
 
99
        private void setLogo(Language lang) {
100
                Page logo = loadLogo(lang);
101
                output.setValue(LOGO_KEY, logo);
102
        }
103
 
41 soliveira 104
        private void setLeftColumn(Language lang) {
105
                Page lc = loadLeftColumn(lang);
22 soliveira 106
                output.setValue(LEFT_COLUMN_KEY, lc);
107
        }
108
 
31 soliveira 109
        private Page loadCSS() {
74 soliveira 110
                if (sessionUser != null) {
111
                        return pageDAO.loadByNameWithPreview(sessionUser.getId(), Page.CSS, Language.ENGLISH);
112
                } else {
113
                        return pageDAO.loadByName(Page.CSS, Language.ENGLISH); // we only have one CSS (in English)...
114
                }
31 soliveira 115
        }
116
 
117
        private void setCSS() {
118
                Page css = loadCSS();
119
                output.setValue(CSS_KEY, css);
120
        }
121
 
12 soliveira 122
        // for ajax
41 soliveira 123
        public String get() {
28 soliveira 124
                String name = input.getString("name");
41 soliveira 125
                String lang = input.getString("lang");
63 soliveira 126
                Language language = Language.fromString(lang);
127
                if (name != null && language != null) {
128
                        Page page = pageDAO.loadByName(name, language);
28 soliveira 129
                        if (page != null) {
130
                                output.setValue("page", page);
131
                        }
132
                }
22 soliveira 133
                return AJAX;
11 soliveira 134
        }
135
 
63 soliveira 136
        public String getPreview() {
137
                String name = input.getString("name");
138
                String lang = input.getString("lang");
139
                Language language = Language.fromString(lang);
140
                Page page = null;
141
                if (name != null && language != null) {
142
                        if (sessionUser != null) {
143
                                Preview preview = pageDAO.loadPreview(sessionUser.getId(), name, language);
144
                                if (preview != null) {
145
                                        page = preview.getPage();
146
                                }
147
                        }
148
                        if (page != null) {
149
                                output.setValue("page", page);
150
                        }
151
                }
152
                return AJAX;
153
        }
154
 
31 soliveira 155
        public String getCSS() {
156
                setCSS();
157
                return SUCCESS;
158
        }
159
 
160
        public String getPrintCSS() {
161
                Page page = pageDAO.loadByName(Page.PRINT_CSS, Language.ENGLISH);
162
                output.setValue(CSS_KEY, page);
163
                return SUCCESS;
164
        }
165
 
61 soliveira 166
        private Language getLanguage() {
167
                return getLanguage(input.getString("lang"));
168
        }
169
 
170
        private Language getLanguage(String lang) {
171
                if (lang == null) return language;
172
                Language l = Language.fromString(lang);
173
                if (l == null) return language;
174
                return l;
175
        }
176
 
177
        private String getName() {
178
                String name = input.getString("name");
179
                return getName(name);
180
        }
181
 
182
        private String getName(String name) {
183
                if (name == null) {
184
                        name = pageDAO.getFrontPage(language);
62 soliveira 185
                        if (name == null) {
186
                                throw new IllegalStateException("There is no front page defined for language: " + language);
187
                        }
61 soliveira 188
                }
189
                return name;
190
        }
191
 
32 soliveira 192
        @Override
24 soliveira 193
        public String execute() {
61 soliveira 194
                String name = getName();
195
                Language language = getLanguage();
196
                Page page;
197
                if (sessionUser != null) {
198
                        page = pageDAO.loadByNameWithPreview(sessionUser.getId(), name, language);
24 soliveira 199
                } else {
61 soliveira 200
                        page = pageDAO.loadByName(name, language);
24 soliveira 201
                }
74 soliveira 202
                if (page == null || page.isDeleted() || page.isSystemPage()) {
61 soliveira 203
                        return INDEX;
204
                }
205
                setCSS();
206
                setLeftColumn(page.getLanguage());
75 soliveira 207
                setLogo(page.getLanguage());
24 soliveira 208
                output.setValue(BODY_COLUMN_KEY, page);
11 soliveira 209
                return SUCCESS;
210
        }
211
 
40 soliveira 212
        private void setPageRedirParams(Page page) {
41 soliveira 213
                if (!page.isSystemPage()) {
214
                        output.setValue("name", page.getName());
215
                        output.setValue("lang", page.getLanguage().getLocale());
216
                }
40 soliveira 217
        }
218
 
69 soliveira 219
        public String savePreview() {
220
                String name = input.getString("name");
221
                Language lang = Language.fromString(input.getString("lang"));
222
                int userId = sessionUser.getId();
223
                Preview preview = pageDAO.loadPreview(userId, name, lang);
224
                if (preview != null) {
225
                        Page page = pageDAO.loadByName(name, lang);
226
                        if (page != null) {
78 soliveira 227
 
228
                                String oldTitle = page.getTitle();
229
                                String oldBody = page.getBody();
230
 
69 soliveira 231
                                page.setTitle(preview.getTitle());
232
                                page.setBody(preview.getBody());
233
                                page.setModifiedById(preview.getUserId());
234
                                pageDAO.update(page);
78 soliveira 235
 
236
                                insertRevision(page, oldTitle, oldBody);
237
 
69 soliveira 238
                                pageDAO.deletePreview(userId, name, lang);
239
                        } else {
240
                                page = preview.getPage();
241
                                pageDAO.insert(page);
242
                                pageDAO.deletePreview(userId, name, lang);
243
                        }
244
                        setPageRedirParams(page);
245
                }
246
                return SUCCESS;
247
        }
248
 
78 soliveira 249
        private void insertRevision(Page page, String oldTitle, String oldBody) {
250
                Revision r = new Revision();
251
                r.setName(page.getName());
252
                r.setLanguageId(page.getLanguageId());
253
                r.setUserId(sessionUser.getId());
254
                r.setNewTitle(page.getTitle());
255
                r.setNewBody(page.getBody());
256
                r.setOldTitle(oldTitle);
257
                r.setOldBody(oldBody);
258
                pageDAO.insertRevision(r);
259
        }
260
 
41 soliveira 261
        public String edit() {
262
                if (!isPost()) return INDEX;
28 soliveira 263
                String name = input.getString("name");
41 soliveira 264
                String lang = input.getString("lang");
31 soliveira 265
                if (name.equals("CSS")) {
266
                        // does not make sense to have CSS in different languages... (well, maybe it does, but we do NOT want to maintain more than one CSS)
41 soliveira 267
                        lang = "en";
31 soliveira 268
                }
41 soliveira 269
                Page page = pageDAO.loadByName(name, Language.fromString(lang));
28 soliveira 270
                if (page != null) {
78 soliveira 271
 
272
                        String oldTitle = page.getTitle();
273
                        String oldBody = page.getBody();
274
 
28 soliveira 275
                        input.inject(page);
78 soliveira 276
 
28 soliveira 277
                        page.setModifiedById(sessionUser.getId());
78 soliveira 278
 
65 soliveira 279
                        if (input.getBoolean("isPreview")) {
280
                                pageDAO.insertPreview(sessionUser.getId(), page);
281
                        } else {
282
                                pageDAO.update(page);
78 soliveira 283
 
284
                                insertRevision(page, oldTitle, oldBody);
285
 
65 soliveira 286
                                // and now you have to delete the preview!
287
                                pageDAO.deletePreview(sessionUser.getId(), page.getName(), page.getLanguage());
288
                        }
41 soliveira 289
                        setPageRedirParams(page);
28 soliveira 290
                }
11 soliveira 291
                return UPDATED;
292
        }
38 soliveira 293
 
66 soliveira 294
        public String discardPreview() {
295
                String name = input.getString("name");
296
                Language lang = Language.fromString(input.getString("lang"));
297
                int userId = sessionUser.getId();
298
                pageDAO.deletePreview(userId, name, lang);
299
                output.setValue("name", name);
300
                output.setValue("lang", lang.getLocale());
301
                return REMOVED;
302
        }
303
 
38 soliveira 304
        public String add() {
40 soliveira 305
                if (!isPost()) return INDEX;
39 soliveira 306
                Page p = input.getObject(Page.class, "newPage");
38 soliveira 307
                p.setCreatedById(sessionUser.getId());
63 soliveira 308
 
309
                if (input.getBoolean("isPreview")) {
310
                        pageDAO.insertPreview(sessionUser.getId(), p);
311
                } else {
312
                        pageDAO.insert(p);
313
                        // and now you have to delete the preview!
314
                        pageDAO.deletePreview(sessionUser.getId(), p.getName(), p.getLanguage());
315
                }
41 soliveira 316
                setPageRedirParams(p);
38 soliveira 317
                return CREATED;
318
        }
49 soliveira 319
 
320
        public String list() {
77 soliveira 321
                List<Page> pages = pageDAO.loadAll(sessionUser.getGroup() == Group.ADMIN);
49 soliveira 322
                output.setValue("pages", pages);
323
                return AJAX;
324
        }
56 soliveira 325
 
326
        public String setFrontPage() {
327
                int id = input.getInt("pageId");
328
                Page p = pageDAO.load(id);
329
                if (p != null) {
57 soliveira 330
                        if (pageDAO.setNewFrontPage(p)) {
331
                                output.setValue("lang", p.getLang());
332
                        }
56 soliveira 333
                }
334
                return UPDATED;
335
        }
57 soliveira 336
 
337
        public String delete() {
338
                int id = input.getInt("pageId");
339
                Page p = pageDAO.load(id);
340
                if (p != null ) {
341
                        pageDAO.delete(p);
342
                }
343
                return UPDATED;
344
        }
11 soliveira 345
}