Kawai Wiki

Rev

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