Kawai Wiki

Rev

Rev 136 | Rev 200 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 136 Rev 191
Line 12... Line 12...
12
import org.kawai.model.Preview;
12
import org.kawai.model.Preview;
13
import org.kawai.model.Revision;
13
import org.kawai.model.Revision;
14
import org.kawai.model.User;
14
import org.kawai.model.User;
15
import org.mentabean.BeanSession;
15
import org.mentabean.BeanSession;
16
16
-
 
17
/**
-
 
18
 * DAO class JdbcPageDAO.
-
 
19
 *
-
 
20
 * @author Sergio Oliveira
-
 
21
 *
-
 
22
 */
17
public class JdbcPageDAO extends AbstractJdbcDAO implements PageDAO {
23
public class JdbcPageDAO extends AbstractJdbcDAO implements PageDAO {
18
       
-
 
19
        public JdbcPageDAO(BeanSession session) {
-
 
20
                super(session);
-
 
21
        }
-
 
22
24
23
        @Override
-
 
24
        public Page load(int id) {
-
 
25
               
-
 
26
                Page p = new Page();
-
 
27
                p.setId(id);
-
 
28
               
-
 
29
                if (session.load(p)) {
-
 
30
                        loadUsers(p);
-
 
31
                        return p;
-
 
32
                }
-
 
33
               
-
 
34
                return null;
-
 
35
        }
-
 
36
       
-
 
37
        @Override
-
 
38
        public Page loadByName(String name, Language lang) {
-
 
39
                return loadByName(name, lang, -1);
-
 
40
        }
-
 
41
       
-
 
42
        @Override
-
 
43
        public Page loadByName(String name, Language lang, int revision) {
-
 
44
                Page p = new Page();
-
 
45
                p.setName(name);
-
 
46
                p.setLanguageId(lang.getId());
-
 
47
                p.setDeleted(false);
-
 
48
                p = session.loadUnique(p);
-
 
-
 
25
        /**
-
 
26
         * Parametric constructor.
-
 
27
         * @param session BeanSession
-
 
28
         */
-
 
29
    public JdbcPageDAO(BeanSession session) {
-
 
30
        super(session);
-
 
31
    }
49
32
50
                if (p != null) {
-
 
51
                        if (revision >= 0) {
-
 
52
                                Revision r = loadRevision(revision, name, lang);
-
 
53
                                if (r != null) {
-
 
54
                                        p.setCreatedById(r.getUserId());
-
 
55
                                        p.setCreatedOn(r.getCreatedOn());
-
 
56
                                        p.setModifiedById(-1);
-
 
57
                                        p.setModifiedOn(null);
-
 
58
                                        p.setRevision(true);
-
 
59
                                        p.setRevisionNumber(r.getRevision());
-
 
60
                                        p.setTitle(r.getNewTitle());
-
 
61
                                        p.setBody(r.getNewBody());
-
 
62
                                }
-
 
63
                        }
-
 
64
                        loadUsers(p);
-
 
65
                }
-
 
66
                return p;
-
 
67
        }
-
 
68
       
-
 
69
        @Override
-
 
70
        public Page loadFrontPage(Language lang) {
-
 
71
                Page p = new Page();
-
 
72
                p.setLanguageId(lang.getId());
-
 
73
                p.setFrontPage(true);
-
 
74
                p.setDeleted(false);
-
 
75
                p = session.loadUnique(p);
-
 
76
                if (p != null) {
-
 
77
                        loadUsers(p);
-
 
78
                }
-
 
79
                return p;
-
 
80
        }
-
 
81
       
-
 
82
        private void loadUsers(Page p) {
-
 
83
                User modifier = new User();
-
 
84
                modifier.setId(p.getModifiedById());
-
 
85
               
-
 
86
                if (p.getModifiedById() > 0) {
-
 
87
                        if (session.load(modifier)) {
-
 
88
                                p.setModifiedBy(modifier);
-
 
89
                        } else {
-
 
90
                                throw new IllegalStateException("Cannot load user by id: " + p.getModifiedById());
-
 
91
                        }
-
 
92
                }
-
 
93
               
-
 
94
                User creator = new User();
-
 
95
                creator.setId(p.getCreatedById());
-
 
96
               
-
 
97
                if (p.getCreatedById() > 0) {
-
 
98
                        if (session.load(creator)) {
-
 
99
                                p.setCreatedBy(creator);
-
 
100
                        } else {
-
 
101
                                throw new IllegalStateException("Cannot load user by id: " + p.getCreatedById());
-
 
102
                        }
-
 
103
                }
-
 
104
        }
-
 
105
       
-
 
106
        @Override
-
 
107
        public void update(Page p) {
-
 
108
                session.update(p);
-
 
109
        }
-
 
110
       
-
 
111
        @Override
-
 
112
        public void insert(Page p) {
-
 
113
                p.setDeleted(false);
-
 
114
                session.insert(p);
-
 
115
        }
-
 
116
       
-
 
117
        @Override
-
 
118
        public boolean exists(String name, Language lang) {
-
 
119
                return loadByName(name, lang) != null;
-
 
120
        }
-
 
121
       
-
 
122
        @Override
-
 
123
        public boolean isSystemPage(String name) {
-
 
124
                Page page = new Page();
-
 
125
                page.setName(name);
-
 
126
                page.setDeleted(false);
-
 
127
                List<Page> list = session.loadList(page);
-
 
128
                for(Page thePage : list) {
-
 
129
                        if (thePage.isSystemPage()) return true;
-
 
130
                }
-
 
131
                return false;
-
 
132
        }
-
 
133
       
-
 
134
        @Override
-
 
135
        public List<Page> loadAll(boolean includeSystemPages) {
-
 
136
               
-
 
137
                String[] propsToExclude = { "body" };
-
 
138
               
-
 
139
                PreparedStatement stmt = null;
-
 
140
                ResultSet rset = null;
-
 
141
               
-
 
142
                try {
-
 
-
 
33
    /**
-
 
34
     * Loads the page object by id.
-
 
35
     * @return Page
-
 
36
     */
-
 
37
    @Override
-
 
38
    public Page load(int id) {
143
39
144
                        StringBuilder query = new StringBuilder(512);
-
 
145
                        query.append("select ").append(session.buildSelectMinus(Page.class, "p", propsToExclude));
-
 
146
                        query.append(", ").append(session.buildSelect(User.class, "creator"));
-
 
147
                        query.append(", ").append(session.buildSelect(User.class, "modifier"));
-
 
148
                        query.append(" from Pages p");
-
 
149
                        query.append(" join Users creator on p.created_by = creator.id");
-
 
150
                        query.append(" left join Users modifier on p.modified_by = modifier.id");
-
 
151
                        query.append(" where p.deleted = 'F'");
-
 
152
                        if (!includeSystemPages) {
-
 
153
                                query.append(" and p.system_page = 'F'");
-
 
154
                        }
-
 
155
                        query.append(" order by p.system_page, p.front_page, p.name, p.language_id");
-
 
156
                       
-
 
157
                        stmt = conn.prepareStatement(query.toString());
-
 
158
                       
-
 
159
                        rset = stmt.executeQuery();
-
 
160
                       
-
 
161
                        List<Page> pages = new LinkedList<Page>();
-
 
162
                       
-
 
163
                        while(rset.next()) {
-
 
164
                               
-
 
165
                                Page p = new Page();
-
 
166
                                session.populateBeanMinus(rset, p, "p", propsToExclude);
-
 
167
                               
-
 
168
                                User creator = new User();
-
 
169
                                session.populateBean(rset, creator, "creator");
-
 
170
                                p.setCreatedBy(creator);
-
 
171
                               
-
 
172
                                if (rset.getInt("modifier_id") > 0) {
-
 
173
                                        User modifier = new User();
-
 
174
                                        session.populateBean(rset, modifier, "modifier");
-
 
175
                                        p.setModifiedBy(modifier);
-
 
176
                                }
-
 
177
                               
-
 
178
                                pages.add(p);
-
 
179
                        }
-
 
180
                       
-
 
181
                        return pages;
-
 
182
                       
-
 
183
                } catch(Exception e) {
-
 
184
                        throw new RuntimeException(e);
-
 
185
                } finally {
-
 
186
                        close(stmt, rset);
-
 
187
                }
-
 
188
        }
-
 
189
       
-
 
190
        private Page get(List<Page> pages, Language lang) {
-
 
191
                for(Page p : pages) {
-
 
192
                        if (p.getLanguage() == lang) return p;
-
 
193
                }
-
 
194
                return null;
-
 
195
        }
-
 
196
       
-
 
197
        @Override
-
 
198
        public boolean setNewFrontPage(Page p) {
-
 
199
               
-
 
200
                if (p.isSystemPage() || p.isFrontPage() || p.isDeleted()) return false;
-
 
201
               
-
 
202
                Page page = new Page();
-
 
203
                page.setFrontPage(true);
-
 
204
                page.setDeleted(false);
-
 
205
               
-
 
206
                List<Page> frontPages = session.loadList(page);
-
 
207
                Page currFrontPage = get(frontPages, p.getLanguage());
-
 
208
               
-
 
209
                if (currFrontPage != null) {
-
 
210
                        // it is not front-page anymore...
-
 
211
                        session.load(currFrontPage); // reload to attach to session...
-
 
212
                        currFrontPage.setFrontPage(false);
-
 
213
                        session.update(currFrontPage);
-
 
214
                }
-
 
215
               
-
 
216
                p.setFrontPage(true);
-
 
217
                session.update(p);
-
 
218
               
-
 
219
                return true;
-
 
220
        }
-
 
221
       
-
 
222
        @Override
-
 
223
        public boolean delete(Page p) {
-
 
224
                if (p.isDeleted() || p.isSystemPage() || p.isFrontPage()) return false;
-
 
225
                p.setDeleted(true);
-
 
226
                session.update(p);
-
 
227
                return true;
-
 
228
        }
-
 
229
       
-
 
230
        @Override
-
 
231
        public Preview loadPreview(int userId, String name, Language lang) {
-
 
232
                Preview p = new Preview();
-
 
233
                p.setName(name);
-
 
234
                p.setLanguageId(lang.getId());
-
 
235
                p.setUserId(userId);
-
 
236
               
-
 
237
                p = session.loadUnique(p);
-
 
238
               
-
 
239
                if (p != null) {
-
 
240
                        User user = new User();
-
 
241
                        user.setId(userId);
-
 
242
                        session.load(user);
-
 
243
                        p.setUser(user);
-
 
244
                       
-
 
245
                        Page page = loadByName(name, lang);
-
 
246
                        if (page != null) {
-
 
247
                                p.setNew(false);
-
 
248
                                p.setSystemPage(page.isSystemPage());
-
 
249
                        } else {
-
 
250
                                p.setNew(true);
-
 
251
                                p.setSystemPage(false);
-
 
252
                        }
-
 
253
                }
-
 
254
               
-
 
255
                return p;
-
 
256
        }
-
 
257
       
-
 
258
        @Override
-
 
259
        public Preview insertPreview(int userId, Page page, String comment) {
-
 
260
                Preview preview = loadPreview(userId, page.getName(), page.getLanguage());
-
 
261
                if (preview != null) {
-
 
262
                        preview.setTitle(page.getTitle());
-
 
263
                        preview.setBody(page.getBody());
-
 
264
                        preview.setComment(comment);
-
 
265
                        session.update(preview);
-
 
266
                } else {
-
 
267
                        preview = new Preview();
-
 
268
                        preview.setName(page.getName());
-
 
269
                        preview.setLanguageId(page.getLanguageId());
-
 
270
                        preview.setUserId(userId);
-
 
271
                        preview.setTitle(page.getTitle());
-
 
272
                        preview.setBody(page.getBody());
-
 
273
                        preview.setComment(comment);
-
 
274
                        session.insert(preview);
-
 
275
                }
-
 
276
                return preview;
-
 
277
        }
-
 
278
       
-
 
279
        @Override
-
 
280
        public String getFrontPage(Language lang) {
-
 
281
                Page page = new Page();
-
 
282
                page.setLanguageId(lang.getId());
-
 
283
                page.setFrontPage(true);
-
 
284
               
-
 
285
                Page front = session.loadUnique(page);
-
 
286
                if (front != null) {
-
 
287
                        return front.getName();
-
 
288
                }
-
 
289
                return null;
-
 
290
        }
-
 
291
       
-
 
292
        @Override
-
 
293
        public Page loadByNameWithPreview(int userId, String name, Language lang) {
-
 
294
                Page p = loadByName(name, lang);
-
 
295
                if (p == null) {
-
 
296
                        // we may still have a preview...
-
 
297
                        Preview preview = loadPreview(userId, name, lang);
-
 
298
                        if (preview != null) {
-
 
299
                                preview.setNew(true);
-
 
300
                                return preview.getPage();
-
 
301
                        }
-
 
302
                        return null;
-
 
303
                } else {
-
 
304
                        // check if we have a preview for this page...
-
 
305
                        Preview preview = loadPreview(userId, name, lang);
-
 
306
                        if (preview != null) {
-
 
307
                                preview.setNew(false);
-
 
308
                                p.setPreview(preview);
-
 
309
                        }
-
 
310
                        return p;
-
 
311
                }
-
 
312
        }
-
 
313
       
-
 
314
        @Override
-
 
315
        public void deletePreview(int userId, String name, Language lang) {
-
 
316
                Preview preview = loadPreview(userId, name, lang);
-
 
317
                if (preview != null) {
-
 
318
                        Preview p = new Preview();
-
 
319
                        p.setId(preview.getId());
-
 
320
                        session.delete(p);
-
 
321
                }
-
 
322
        }
-
 
323
       
-
 
324
        @Override
-
 
325
        public Revision loadRevision(int revision, String name, Language lang) {
-
 
326
                Revision r = new Revision();
-
 
327
                r.setRevision(revision);
-
 
328
                r.setName(name);
-
 
329
                r.setLanguageId(lang.getId());
-
 
330
                return session.loadUnique(r);
-
 
331
        }
-
 
332
       
-
 
333
        @Override
-
 
334
        public void insertRevision(Revision r) {
-
 
335
               
-
 
336
                PreparedStatement stmt = null;
-
 
337
                ResultSet rset = null;
-
 
338
               
-
 
339
                try {
-
 
340
                       
-
 
341
                        // first time, lock whole table 
-
 
342
                        stmt = conn.prepareStatement("LOCK TABLES Revisions WRITE"); // this works as a synchronized block locked on the database... (I tested it!)
-
 
343
                        stmt.execute();
-
 
344
                        stmt.close();
-
 
345
                       
-
 
346
                        stmt = conn.prepareStatement("select max(revision) from Revisions where name = ? and language_id = ?");
-
 
347
                        stmt.setString(1, r.getName());
-
 
348
                        stmt.setInt(2, r.getLanguageId());
-
 
349
                        rset = stmt.executeQuery();
-
 
350
                        rset.next();
-
 
351
                        int revisionNumber = rset.getInt(1) + 1;
-
 
352
                       
-
 
353
                        if (rset.wasNull()) {
-
 
354
                                // inserting for the very first time... (page creatiion, not modification)
-
 
355
                                revisionNumber = 0;
-
 
356
                        }
-
 
357
                       
-
 
358
                        rset.close();
-
 
359
                        stmt.close();
-
 
360
                       
-
 
361
                        r.setRevision(revisionNumber);
-
 
362
                        session.insert(r);
-
 
-
 
40
        Page p = new Page();
-
 
41
        p.setId(id);
363
42
364
                        stmt = conn.prepareStatement("UNLOCK TABLES");
-
 
365
                        stmt.execute();
-
 
366
                       
-
 
367
                } catch(Exception e) {
-
 
368
                        throw new RuntimeException(e);
-
 
369
                } finally {
-
 
370
                        close(stmt, rset);
-
 
371
                }
-
 
372
        }
-
 
373
       
-
 
374
        @Override
-
 
375
        public List<Revision> loadRevisions(String name, Language lang) {
-
 
376
               
-
 
377
                String[] propsToExclude = { "oldTitle", "newTitle", "oldBody", "newBody" };
-
 
378
               
-
 
379
                PreparedStatement stmt = null;
-
 
380
                ResultSet rset = null;
-
 
381
               
-
 
382
                try {
-
 
383
                       
-
 
384
                        StringBuilder query = new StringBuilder(256);
-
 
385
                        query.append("select ").append(session.buildSelectMinus(Revision.class, "r", propsToExclude));
-
 
386
                        query.append(", ").append(session.buildSelect(User.class, "u"));
-
 
387
                        query.append(", p.system_page p_system_page");
-
 
388
                        query.append(", p.front_page p_front_page");
-
 
389
                        query.append(", p.title p_title");
-
 
390
                        query.append(" from Revisions r join Users u on r.user_id = u.id");
-
 
391
                        query.append(" join Pages p on r.name = p.name and r.language_id = p.language_id");
-
 
392
                        query.append(" where r.name = ? and r.language_id = ?");
-
 
393
                        query.append(" order by revision desc");
-
 
394
                        query.append(" limit 50");
-
 
395
                       
-
 
396
                        stmt = conn.prepareStatement(query.toString());
-
 
397
                        stmt.setString(1, name);
-
 
398
                        stmt.setInt(2, lang.getId());
-
 
399
                       
-
 
400
                        rset = stmt.executeQuery();
-
 
401
                       
-
 
402
                        List<Revision> revisions = new ArrayList<Revision>(50);
-
 
403
                       
-
 
404
                        while(rset.next()) {
-
 
405
                               
-
 
406
                                Revision r = new Revision();
-
 
407
                                session.populateBeanMinus(rset, r, "r", propsToExclude);
-
 
408
                               
-
 
409
                                User u = new User();
-
 
410
                                session.populateBean(rset, u, "u");
-
 
411
                                r.setUser(u);
-
 
412
                               
-
 
413
                                boolean isSystemPage = rset.getString("p_system_page").equals("T");
-
 
414
                                r.setSystemPage(isSystemPage);
-
 
415
                               
-
 
416
                                boolean isFrontPage = rset.getString("p_front_page").equals("T");
-
 
417
                                r.setFrontPage(isFrontPage);
-
 
418
                               
-
 
419
                                String title = rset.getString("p_title");
-
 
420
                                r.setTitle(title);
-
 
421
                               
-
 
422
                                revisions.add(r);
-
 
423
                        }
-
 
424
                       
-
 
425
                        return revisions;
-
 
426
                } catch(Exception e) {
-
 
427
                        throw new RuntimeException(e);
-
 
428
                } finally {
-
 
429
                        close(stmt, rset);
-
 
430
                }
-
 
431
        }
-
 
432
       
-
 
433
        @Override
-
 
434
        public List<Revision> loadLastRevisions(Language lang, boolean includeSystemPages) {
-
 
435
               
-
 
436
                String[] propsToExclude = { "oldTitle", "newTitle", "oldBody", "newBody" };
-
 
437
               
-
 
438
                PreparedStatement stmt = null;
-
 
439
                ResultSet rset = null;
-
 
440
               
-
 
441
                try {
-
 
442
                        StringBuilder sb = new StringBuilder(512);
-
 
443
                        sb.append("select ").append(session.buildSelectMinus(Revision.class, "r", propsToExclude));
-
 
444
                        sb.append(", ").append(session.buildSelect(User.class, "u"));
-
 
445
                        sb.append(", p.system_page p_system_page");
-
 
446
                        sb.append(", p.front_page p_front_page");
-
 
447
                        sb.append(", p.title p_title");
-
 
448
                        sb.append(" from Revisions r join Users u on r.user_id = u.id");
-
 
449
                        sb.append(" join Pages p on r.name = p.name and r.language_id = p.language_id");
-
 
450
                        sb.append(" where r.language_id = ?");
-
 
451
                        if (!includeSystemPages) {
-
 
452
                                sb.append(" and p.system_page = 'F'");
-
 
453
                        }
-
 
454
                        sb.append(" order by r.created_on desc");
-
 
455
                        sb.append(" limit 50");
-
 
456
                       
-
 
457
                        stmt = conn.prepareStatement(sb.toString());
-
 
458
                        stmt.setInt(1, lang.getId());
-
 
459
                       
-
 
460
                        rset = stmt.executeQuery();
-
 
461
                       
-
 
462
                        List<Revision> results = new ArrayList<Revision>(50);
-
 
463
                       
-
 
464
                        while(rset.next()) {
-
 
465
                                Revision r = new Revision();
-
 
466
                                session.populateBeanMinus(rset, r, "r", propsToExclude);
-
 
467
                               
-
 
468
                                User u = new User();
-
 
469
                                session.populateBean(rset, u, "u");
-
 
470
                                r.setUser(u);
-
 
471
                               
-
 
472
                                boolean isSystemPage = rset.getString("p_system_page").equals("T");
-
 
473
                                r.setSystemPage(isSystemPage);
-
 
474
                               
-
 
475
                                boolean isFrontPage = rset.getString("p_front_page").equals("T");
-
 
476
                                r.setFrontPage(isFrontPage);
-
 
477
                               
-
 
478
                                String title = rset.getString("p_title");
-
 
479
                                r.setTitle(title);
-
 
480
                               
-
 
481
                                results.add(r);
-
 
482
                        }
-
 
483
                       
-
 
484
                        return results;
-
 
485
                       
-
 
486
                } catch(Exception e) {
-
 
487
                        throw new RuntimeException(e);
-
 
488
                } finally {
-
 
489
                        close(stmt, rset);
-
 
490
                }
-
 
491
               
-
 
492
        }
-
 
493
}
-
 
-
 
43
        if (session.load(p)) {
-
 
44
            loadUsers(p);
-
 
45
            return p;
-
 
46
        }
-
 
47
-
 
48
        return null;
-
 
49
    }
-
 
50
-
 
51
    /**
-
 
52
     * Loads the page object by name and language.
-
 
53
     * @return Page
-
 
54
     */
-
 
55
    @Override
-
 
56
    public Page loadByName(String name, Language lang) {
-
 
57
        return loadByName(name, lang, -1);
-
 
58
    }
-
 
59
-
 
60
    /**
-
 
61
     * Loads the page object by name, language and revision.
-
 
62
     * @return Page
-
 
63
     */
-
 
64
    @Override
-
 
65
    public Page loadByName(String name, Language lang, int revision) {
-
 
66
        Page p = new Page();
-
 
67
        p.setName(name);
-
 
68
        p.setLanguageId(lang.getId());
-
 
69
        p.setDeleted(false);
-
 
70
        p = session.loadUnique(p);
-
 
71
-
 
72
        if (p != null) {
-
 
73
            if (revision >= 0) {
-
 
74
                Revision r = loadRevision(revision, name, lang);
-
 
75
                if (r != null) {
-
 
76
                    p.setCreatedById(r.getUserId());
-
 
77
                    p.setCreatedOn(r.getCreatedOn());
-
 
78
                    p.setModifiedById(-1);
-
 
79
                    p.setModifiedOn(null);
-
 
80
                    p.setRevision(true);
-
 
81
                    p.setRevisionNumber(r.getRevision());
-
 
82
                    p.setTitle(r.getNewTitle());
-
 
83
                    p.setBody(r.getNewBody());
-
 
84
                }
-
 
85
            }
-
 
86
            loadUsers(p);
-
 
87
        }
-
 
88
        return p;
-
 
89
    }
-
 
90
-
 
91
    /**
-
 
92
     * Loads the front page by language.
-
 
93
     * @return Page
-
 
94
     */
-
 
95
    @Override
-
 
96
    public Page loadFrontPage(Language lang) {
-
 
97
        Page p = new Page();
-
 
98
        p.setLanguageId(lang.getId());
-
 
99
        p.setFrontPage(true);
-
 
100
        p.setDeleted(false);
-
 
101
        p = session.loadUnique(p);
-
 
102
        if (p != null) {
-
 
103
            loadUsers(p);
-
 
104
        }
-
 
105
        return p;
-
 
106
    }
-
 
107
-
 
108
    private void loadUsers(Page p) {
-
 
109
        User modifier = new User();
-
 
110
        modifier.setId(p.getModifiedById());
-
 
111
-
 
112
        if (p.getModifiedById() > 0) {
-
 
113
            if (session.load(modifier)) {
-
 
114
                p.setModifiedBy(modifier);
-
 
115
            } else {
-
 
116
                throw new IllegalStateException("Cannot load user by id: " + p.getModifiedById());
-
 
117
            }
-
 
118
        }
-
 
119
-
 
120
        User creator = new User();
-
 
121
        creator.setId(p.getCreatedById());
-
 
122
-
 
123
        if (p.getCreatedById() > 0) {
-
 
124
            if (session.load(creator)) {
-
 
125
                p.setCreatedBy(creator);
-
 
126
            } else {
-
 
127
                throw new IllegalStateException("Cannot load user by id: " + p.getCreatedById());
-
 
128
            }
-
 
129
        }
-
 
130
    }
-
 
131
-
 
132
    /**
-
 
133
     * Updates the page on database.
-
 
134
     * @param p Page
-
 
135
     */
-
 
136
    @Override
-
 
137
    public void update(Page p) {
-
 
138
        session.update(p);
-
 
139
    }
-
 
140
-
 
141
    /**
-
 
142
     * Persist the page on database.
-
 
143
     * @param p Page
-
 
144
     */
-
 
145
    @Override
-
 
146
    public void insert(Page p) {
-
 
147
        p.setDeleted(false);
-
 
148
        session.insert(p);
-
 
149
    }
-
 
150
-
 
151
    /**
-
 
152
     * Checks if page exists by name and language.
-
 
153
     * @param name String
-
 
154
     * @param lang Language
-
 
155
     * @return boolean
-
 
156
     */
-
 
157
    @Override
-
 
158
    public boolean exists(String name, Language lang) {
-
 
159
        return loadByName(name, lang) != null;
-
 
160
    }
-
 
161
-
 
162
    /**
-
 
163
     * Checks if is system page.
-
 
164
     * @param name String
-
 
165
     * @return boolean
-
 
166
     */
-
 
167
    @Override
-
 
168
    public boolean isSystemPage(String name) {
-
 
169
        Page page = new Page();
-
 
170
        page.setName(name);
-
 
171
        page.setDeleted(false);
-
 
172
        List<Page> list = session.loadList(page);
-
 
173
        for(Page thePage : list) {
-
 
174
            if (thePage.isSystemPage()) return true;
-
 
175
        }
-
 
176
        return false;
-
 
177
    }
-
 
178
-
 
179
    /**
-
 
180
     * Load all page including system pages.
-
 
181
     * @return List < Page >
-
 
182
     */
-
 
183
    @Override
-
 
184
    public List<Page> loadAll(boolean includeSystemPages) {
-
 
185
-
 
186
        String[] propsToExclude = { "body" };
-
 
187
-
 
188
        PreparedStatement stmt = null;
-
 
189
        ResultSet rset = null;
-
 
190
-
 
191
        try {
-
 
192
-
 
193
            StringBuilder query = new StringBuilder(512);
-
 
194
            query.append("select ").append(session.buildSelectMinus(Page.class, "p", propsToExclude));
-
 
195
            query.append(", ").append(session.buildSelect(User.class, "creator"));
-
 
196
            query.append(", ").append(session.buildSelect(User.class, "modifier"));
-
 
197
            query.append(" from Pages p");
-
 
198
            query.append(" join Users creator on p.created_by = creator.id");
-
 
199
            query.append(" left join Users modifier on p.modified_by = modifier.id");
-
 
200
            query.append(" where p.deleted = 'F'");
-
 
201
            if (!includeSystemPages) {
-
 
202
                query.append(" and p.system_page = 'F'");
-
 
203
            }
-
 
204
            query.append(" order by p.system_page, p.front_page, p.name, p.language_id");
-
 
205
-
 
206
            stmt = conn.prepareStatement(query.toString());
-
 
207
-
 
208
            rset = stmt.executeQuery();
-
 
209
-
 
210
            List<Page> pages = new LinkedList<Page>();
-
 
211
-
 
212
            while(rset.next()) {
-
 
213
-
 
214
                Page p = new Page();
-
 
215
                session.populateBeanMinus(rset, p, "p", propsToExclude);
-
 
216
-
 
217
                User creator = new User();
-
 
218
                session.populateBean(rset, creator, "creator");
-
 
219
                p.setCreatedBy(creator);
-
 
220
-
 
221
                if (rset.getInt("modifier_id") > 0) {
-
 
222
                    User modifier = new User();
-
 
223
                    session.populateBean(rset, modifier, "modifier");
-
 
224
                    p.setModifiedBy(modifier);
-
 
225
                }
-
 
226
-
 
227
                pages.add(p);
-
 
228
            }
-
 
229
-
 
230
            return pages;
-
 
231
-
 
232
        } catch(Exception e) {
-
 
233
            throw new RuntimeException(e);
-
 
234
        } finally {
-
 
235
            close(stmt, rset);
-
 
236
        }
-
 
237
    }
-
 
238
-
 
239
    private Page get(List<Page> pages, Language lang) {
-
 
240
        for(Page p : pages) {
-
 
241
            if (p.getLanguage() == lang) return p;
-
 
242
        }
-
 
243
        return null;
-
 
244
    }
-
 
245
-
 
246
    /**
-
 
247
     * Sets the new front page.
-
 
248
     * @param p Page
-
 
249
     * @return boolean
-
 
250
     */
-
 
251
    @Override
-
 
252
    public boolean setNewFrontPage(Page p) {
-
 
253
-
 
254
        if (p.isSystemPage() || p.isFrontPage() || p.isDeleted()) return false;
-
 
255
-
 
256
        Page page = new Page();
-
 
257
        page.setFrontPage(true);
-
 
258
        page.setDeleted(false);
-
 
259
-
 
260
        List<Page> frontPages = session.loadList(page);
-
 
261
        Page currFrontPage = get(frontPages, p.getLanguage());
-
 
262
-
 
263
        if (currFrontPage != null) {
-
 
264
            // it is not front-page anymore...
-
 
265
            session.load(currFrontPage); // reload to attach to session...
-
 
266
            currFrontPage.setFrontPage(false);
-
 
267
            session.update(currFrontPage);
-
 
268
        }
-
 
269
-
 
270
        p.setFrontPage(true);
-
 
271
        session.update(p);
-
 
272
-
 
273
        return true;
-
 
274
    }
-
 
275
-
 
276
    @Override
-
 
277
    public boolean delete(Page p) {
-
 
278
        if (p.isDeleted() || p.isSystemPage() || p.isFrontPage()) return false;
-
 
279
        p.setDeleted(true);
-
 
280
        session.update(p);
-
 
281
        return true;
-
 
282
    }
-
 
283
-
 
284
    @Override
-
 
285
    public Preview loadPreview(int userId, String name, Language lang) {
-
 
286
        Preview p = new Preview();
-
 
287
        p.setName(name);
-
 
288
        p.setLanguageId(lang.getId());
-
 
289
        p.setUserId(userId);
-
 
290
-
 
291
        p = session.loadUnique(p);
-
 
292
-
 
293
        if (p != null) {
-
 
294
            User user = new User();
-
 
295
            user.setId(userId);
-
 
296
            session.load(user);
-
 
297
            p.setUser(user);
-
 
298
-
 
299
            Page page = loadByName(name, lang);
-
 
300
            if (page != null) {
-
 
301
                p.setNew(false);
-
 
302
                p.setSystemPage(page.isSystemPage());
-
 
303
            } else {
-
 
304
                p.setNew(true);
-
 
305
                p.setSystemPage(false);
-
 
306
            }
-
 
307
        }
-
 
308
-
 
309
        return p;
-
 
310
    }
-
 
311
-
 
312
    @Override
-
 
313
    public Preview insertPreview(int userId, Page page, String comment) {
-
 
314
        Preview preview = loadPreview(userId, page.getName(), page.getLanguage());
-
 
315
        if (preview != null) {
-
 
316
            preview.setTitle(page.getTitle());
-
 
317
            preview.setBody(page.getBody());
-
 
318
            preview.setComment(comment);
-
 
319
            session.update(preview);
-
 
320
        } else {
-
 
321
            preview = new Preview();
-
 
322
            preview.setName(page.getName());
-
 
323
            preview.setLanguageId(page.getLanguageId());
-
 
324
            preview.setUserId(userId);
-
 
325
            preview.setTitle(page.getTitle());
-
 
326
            preview.setBody(page.getBody());
-
 
327
            preview.setComment(comment);
-
 
328
            session.insert(preview);
-
 
329
        }
-
 
330
        return preview;
-
 
331
    }
-
 
332
-
 
333
    @Override
-
 
334
    public String getFrontPage(Language lang) {
-
 
335
        Page page = new Page();
-
 
336
        page.setLanguageId(lang.getId());
-
 
337
        page.setFrontPage(true);
-
 
338
-
 
339
        Page front = session.loadUnique(page);
-
 
340
        if (front != null) {
-
 
341
            return front.getName();
-
 
342
        }
-
 
343
        return null;
-
 
344
    }
-
 
345
-
 
346
    @Override
-
 
347
    public Page loadByNameWithPreview(int userId, String name, Language lang) {
-
 
348
        Page p = loadByName(name, lang);
-
 
349
        if (p == null) {
-
 
350
            // we may still have a preview...
-
 
351
            Preview preview = loadPreview(userId, name, lang);
-
 
352
            if (preview != null) {
-
 
353
                preview.setNew(true);
-
 
354
                return preview.getPage();
-
 
355
            }
-
 
356
            return null;
-
 
357
        } else {
-
 
358
            // check if we have a preview for this page...
-
 
359
            Preview preview = loadPreview(userId, name, lang);
-
 
360
            if (preview != null) {
-
 
361
                preview.setNew(false);
-
 
362
                p.setPreview(preview);
-
 
363
            }
-
 
364
            return p;
-
 
365
        }
-
 
366
    }
-
 
367
-
 
368
    @Override
-
 
369
    public void deletePreview(int userId, String name, Language lang) {
-
 
370
        Preview preview = loadPreview(userId, name, lang);
-
 
371
        if (preview != null) {
-
 
372
            Preview p = new Preview();
-
 
373
            p.setId(preview.getId());
-
 
374
            session.delete(p);
-
 
375
        }
-
 
376
    }
-
 
377
-
 
378
    @Override
-
 
379
    public Revision loadRevision(int revision, String name, Language lang) {
-
 
380
        Revision r = new Revision();
-
 
381
        r.setRevision(revision);
-
 
382
        r.setName(name);
-
 
383
        r.setLanguageId(lang.getId());
-
 
384
        return session.loadUnique(r);
-
 
385
    }
-
 
386
-
 
387
    @Override
-
 
388
    public void insertRevision(Revision r) {
-
 
389
-
 
390
        PreparedStatement stmt = null;
-
 
391
        ResultSet rset = null;
-
 
392
-
 
393
        try {
-
 
394
-
 
395
            // first time, lock whole table
-
 
396
            stmt = conn.prepareStatement("LOCK TABLES Revisions WRITE"); // this works as a synchronized block locked on the database... (I tested it!)
-
 
397
            stmt.execute();
-
 
398
            stmt.close();
-
 
399
-
 
400
            stmt = conn.prepareStatement("select max(revision) from Revisions where name = ? and language_id = ?");
-
 
401
            stmt.setString(1, r.getName());
-
 
402
            stmt.setInt(2, r.getLanguageId());
-
 
403
            rset = stmt.executeQuery();
-
 
404
            rset.next();
-
 
405
            int revisionNumber = rset.getInt(1) + 1;
-
 
406
-
 
407
            if (rset.wasNull()) {
-
 
408
                // inserting for the very first time... (page creatiion, not modification)
-
 
409
                revisionNumber = 0;
-
 
410
            }
-
 
411
-
 
412
            rset.close();
-
 
413
            stmt.close();
-
 
414
-
 
415
            r.setRevision(revisionNumber);
-
 
416
            session.insert(r);
-
 
417
-
 
418
            stmt = conn.prepareStatement("UNLOCK TABLES");
-
 
419
            stmt.execute();
-
 
420
-
 
421
        } catch(Exception e) {
-
 
422
            throw new RuntimeException(e);
-
 
423
        } finally {
-
 
424
            close(stmt, rset);
-
 
425
        }
-
 
426
    }
-
 
427
-
 
428
    @Override
-
 
429
    public List<Revision> loadRevisions(String name, Language lang) {
-
 
430
-
 
431
        String[] propsToExclude = { "oldTitle", "newTitle", "oldBody", "newBody" };
-
 
432
-
 
433
        PreparedStatement stmt = null;
-
 
434
        ResultSet rset = null;
-
 
435
-
 
436
        try {
-
 
437
-
 
438
            StringBuilder query = new StringBuilder(256);
-
 
439
            query.append("select ").append(session.buildSelectMinus(Revision.class, "r", propsToExclude));
-
 
440
            query.append(", ").append(session.buildSelect(User.class, "u"));
-
 
441
            query.append(", p.system_page p_system_page");
-
 
442
            query.append(", p.front_page p_front_page");
-
 
443
            query.append(", p.title p_title");
-
 
444
            query.append(" from Revisions r join Users u on r.user_id = u.id");
-
 
445
            query.append(" join Pages p on r.name = p.name and r.language_id = p.language_id");
-
 
446
            query.append(" where r.name = ? and r.language_id = ?");
-
 
447
            query.append(" order by revision desc");
-
 
448
            query.append(" limit 50");
-
 
449
-
 
450
            stmt = conn.prepareStatement(query.toString());
-
 
451
            stmt.setString(1, name);
-
 
452
            stmt.setInt(2, lang.getId());
-
 
453
-
 
454
            rset = stmt.executeQuery();
-
 
455
-
 
456
            List<Revision> revisions = new ArrayList<Revision>(50);
-
 
457
-
 
458
            while(rset.next()) {
-
 
459
-
 
460
                Revision r = new Revision();
-
 
461
                session.populateBeanMinus(rset, r, "r", propsToExclude);
-
 
462
-
 
463
                User u = new User();
-
 
464
                session.populateBean(rset, u, "u");
-
 
465
                r.setUser(u);
-
 
466
-
 
467
                boolean isSystemPage = rset.getString("p_system_page").equals("T");
-
 
468
                r.setSystemPage(isSystemPage);
-
 
469
-
 
470
                boolean isFrontPage = rset.getString("p_front_page").equals("T");
-
 
471
                r.setFrontPage(isFrontPage);
-
 
472
-
 
473
                String title = rset.getString("p_title");
-
 
474
                r.setTitle(title);
-
 
475
-
 
476
                revisions.add(r);
-
 
477
            }
-
 
478
-
 
479
            return revisions;
-
 
480
        } catch(Exception e) {
-
 
481
            throw new RuntimeException(e);
-
 
482
        } finally {
-
 
483
            close(stmt, rset);
-
 
484
        }
-
 
485
    }
-
 
486
-
 
487
    @Override
-
 
488
    public List<Revision> loadLastRevisions(Language lang, boolean includeSystemPages) {
-
 
489
-
 
490
        String[] propsToExclude = { "oldTitle", "newTitle", "oldBody", "newBody" };
-
 
491
-
 
492
        PreparedStatement stmt = null;
-
 
493
        ResultSet rset = null;
-
 
494
-
 
495
        try {
-
 
496
            StringBuilder sb = new StringBuilder(512);
-
 
497
            sb.append("select ").append(session.buildSelectMinus(Revision.class, "r", propsToExclude));
-
 
498
            sb.append(", ").append(session.buildSelect(User.class, "u"));
-
 
499
            sb.append(", p.system_page p_system_page");
-
 
500
            sb.append(", p.front_page p_front_page");
-
 
501
            sb.append(", p.title p_title");
-
 
502
            sb.append(" from Revisions r join Users u on r.user_id = u.id");
-
 
503
            sb.append(" join Pages p on r.name = p.name and r.language_id = p.language_id");
-
 
504
            sb.append(" where r.language_id = ?");
-
 
505
            if (!includeSystemPages) {
-
 
506
                sb.append(" and p.system_page = 'F'");
-
 
507
            }
-
 
508
            sb.append(" order by r.created_on desc");
-
 
509
            sb.append(" limit 50");
-
 
510
-
 
511
            stmt = conn.prepareStatement(sb.toString());
-
 
512
            stmt.setInt(1, lang.getId());
-
 
513
-
 
514
            rset = stmt.executeQuery();
-
 
515
-
 
516
            List<Revision> results = new ArrayList<Revision>(50);
-
 
517
-
 
518
            while(rset.next()) {
-
 
519
                Revision r = new Revision();
-
 
520
                session.populateBeanMinus(rset, r, "r", propsToExclude);
-
 
521
-
 
522
                User u = new User();
-
 
523
                session.populateBean(rset, u, "u");
-
 
524
                r.setUser(u);
-
 
525
-
 
526
                boolean isSystemPage = rset.getString("p_system_page").equals("T");
-
 
527
                r.setSystemPage(isSystemPage);
-
 
528
-
 
529
                boolean isFrontPage = rset.getString("p_front_page").equals("T");
-
 
530
                r.setFrontPage(isFrontPage);
-
 
531
-
 
532
                String title = rset.getString("p_title");
-
 
533
                r.setTitle(title);
-
 
534
-
 
535
                results.add(r);
-
 
536
            }
-
 
537
-
 
538
            return results;
-
 
539
-
 
540
        } catch(Exception e) {
-
 
541
            throw new RuntimeException(e);
-
 
542
        } finally {
-
 
543
            close(stmt, rset);
-
 
544
        }
-
 
545
-
 
546
    }
-
 
547
}