Kawai Wiki

Rev

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

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