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 | } |