Kawai Wiki

Rev

Rev 77 | Rev 79 | Go to most recent revision | Only display areas with differences | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

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