Kawai Wiki

Rev

Rev 79 | Rev 86 | 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.dao.jdbc;
2
 
49 soliveira 3
import java.sql.PreparedStatement;
4
import java.sql.ResultSet;
80 soliveira 5
import java.util.ArrayList;
49 soliveira 6
import java.util.LinkedList;
39 soliveira 7
import java.util.List;
8
 
11 soliveira 9
import org.kawai.dao.PageDAO;
22 soliveira 10
import org.kawai.model.Language;
11 soliveira 11
import org.kawai.model.Page;
60 soliveira 12
import org.kawai.model.Preview;
78 soliveira 13
import org.kawai.model.Revision;
25 soliveira 14
import org.kawai.model.User;
11 soliveira 15
import org.mentabean.BeanSession;
16
 
12 soliveira 17
public class JdbcPageDAO extends AbstractJdbcDAO implements PageDAO {
11 soliveira 18
 
12 soliveira 19
        public JdbcPageDAO(BeanSession session) {
20
                super(session);
11 soliveira 21
        }
12 soliveira 22
 
11 soliveira 23
        @Override
24
        public Page load(int id) {
25
 
26
                Page p = new Page();
27
                p.setId(id);
28
 
25 soliveira 29
                if (session.load(p)) {
30
                        loadUsers(p);
31
                        return p;
11 soliveira 32
                }
25 soliveira 33
 
34
                return null;
11 soliveira 35
        }
36
 
37
        @Override
22 soliveira 38
        public Page loadByName(String name, Language lang) {
11 soliveira 39
                Page p = new Page();
40
                p.setName(name);
27 soliveira 41
                p.setLanguageId(lang.getId());
57 soliveira 42
                p.setDeleted(false);
25 soliveira 43
                p = session.loadUnique(p);
44
                if (p != null) {
45
                        loadUsers(p);
11 soliveira 46
                }
25 soliveira 47
                return p;
11 soliveira 48
        }
49
 
50
        @Override
24 soliveira 51
        public Page loadFrontPage(Language lang) {
52
                Page p = new Page();
27 soliveira 53
                p.setLanguageId(lang.getId());
24 soliveira 54
                p.setFrontPage(true);
57 soliveira 55
                p.setDeleted(false);
25 soliveira 56
                p = session.loadUnique(p);
57
                if (p != null) {
58
                        loadUsers(p);
59
                }
60
                return p;
61
        }
62
 
63
        private void loadUsers(Page p) {
64
                User modifier = new User();
65
                modifier.setId(p.getModifiedById());
24 soliveira 66
 
25 soliveira 67
                if (p.getModifiedById() > 0) {
68
                        if (session.load(modifier)) {
69
                                p.setModifiedBy(modifier);
70
                        } else {
71
                                throw new IllegalStateException("Cannot load user by id: " + p.getModifiedById());
72
                        }
24 soliveira 73
                }
25 soliveira 74
 
75
                User creator = new User();
76
                creator.setId(p.getCreatedById());
77
 
78
                if (p.getCreatedById() > 0) {
79
                        if (session.load(creator)) {
80
                                p.setCreatedBy(creator);
81
                        } else {
82
                                throw new IllegalStateException("Cannot load user by id: " + p.getCreatedById());
83
                        }
84
                }
85
        }
24 soliveira 86
 
87
        @Override
11 soliveira 88
        public void update(Page p) {
25 soliveira 89
                session.update(p);
11 soliveira 90
        }
38 soliveira 91
 
92
        @Override
93
        public void insert(Page p) {
61 soliveira 94
                p.setDeleted(false);
38 soliveira 95
                session.insert(p);
96
        }
39 soliveira 97
 
98
        @Override
99
        public boolean exists(String name, Language lang) {
100
                return loadByName(name, lang) != null;
101
        }
102
 
103
        @Override
104
        public boolean isSystemPage(String name) {
105
                Page page = new Page();
106
                page.setName(name);
57 soliveira 107
                page.setDeleted(false);
39 soliveira 108
                List<Page> list = session.loadList(page);
109
                for(Page thePage : list) {
110
                        if (thePage.isSystemPage()) return true;
111
                }
112
                return false;
113
        }
49 soliveira 114
 
115
        @Override
77 soliveira 116
        public List<Page> loadAll(boolean includeSystemPages) {
49 soliveira 117
 
118
                PreparedStatement stmt = null;
119
                ResultSet rset = null;
120
 
121
                try {
122
 
123
                        StringBuilder query = new StringBuilder(512);
124
                        query.append("select ").append(session.buildSelect(Page.class, "p"));
125
                        query.append(", ").append(session.buildSelect(User.class, "creator"));
126
                        query.append(", ").append(session.buildSelect(User.class, "modifier"));
127
                        query.append(" from Pages p");
128
                        query.append(" join Users creator on p.created_by = creator.id");
129
                        query.append(" left join Users modifier on p.modified_by = modifier.id");
77 soliveira 130
                        query.append(" where p.deleted = 'F'");
131
                        if (!includeSystemPages) {
132
                                query.append(" and p.system_page = 'F'");
133
                        }
134
                        query.append(" order by p.system_page, p.front_page, p.name, p.language_id");
49 soliveira 135
 
136
                        stmt = conn.prepareStatement(query.toString());
137
 
138
                        rset = stmt.executeQuery();
139
 
140
                        List<Page> pages = new LinkedList<Page>();
141
 
142
                        while(rset.next()) {
143
 
144
                                Page p = new Page();
145
                                session.populateBean(rset, p, "p");
146
 
147
                                User creator = new User();
148
                                session.populateBean(rset, creator, "creator");
149
                                p.setCreatedBy(creator);
150
 
151
                                if (rset.getInt("modifier_id") > 0) {
152
                                        User modifier = new User();
153
                                        session.populateBean(rset, modifier, "modifier");
154
                                        p.setModifiedBy(modifier);
155
                                }
156
 
157
                                pages.add(p);
158
                        }
159
 
160
                        return pages;
161
 
162
                } catch(Exception e) {
163
                        throw new RuntimeException(e);
164
                } finally {
165
                        close(stmt, rset);
166
                }
167
        }
56 soliveira 168
 
169
        private Page get(List<Page> pages, Language lang) {
170
                for(Page p : pages) {
171
                        if (p.getLanguage() == lang) return p;
172
                }
173
                return null;
174
        }
175
 
176
        @Override
177
        public boolean setNewFrontPage(Page p) {
178
 
57 soliveira 179
                if (p.isSystemPage() || p.isFrontPage() || p.isDeleted()) return false;
56 soliveira 180
 
181
                Page page = new Page();
182
                page.setFrontPage(true);
57 soliveira 183
                page.setDeleted(false);
56 soliveira 184
 
185
                List<Page> frontPages = session.loadList(page);
186
                Page currFrontPage = get(frontPages, p.getLanguage());
187
 
188
                if (currFrontPage != null) {
189
                        // it is not front-page anymore...
190
                        session.load(currFrontPage); // reload to attach to session...
191
                        currFrontPage.setFrontPage(false);
192
                        session.update(currFrontPage);
193
                }
194
 
195
                p.setFrontPage(true);
196
                session.update(p);
197
 
198
                return true;
199
        }
57 soliveira 200
 
201
        @Override
202
        public boolean delete(Page p) {
203
                if (p.isDeleted() || p.isSystemPage() || p.isFrontPage()) return false;
204
                p.setDeleted(true);
205
                session.update(p);
206
                return true;
207
        }
60 soliveira 208
 
209
        @Override
61 soliveira 210
        public Preview loadPreview(int userId, String name, Language lang) {
60 soliveira 211
                Preview p = new Preview();
212
                p.setName(name);
213
                p.setLanguageId(lang.getId());
214
                p.setUserId(userId);
215
 
63 soliveira 216
                p = session.loadUnique(p);
217
 
218
                if (p != null) {
219
                        User user = new User();
220
                        user.setId(userId);
221
                        session.load(user);
222
                        p.setUser(user);
73 soliveira 223
 
224
                        Page page = loadByName(name, lang);
225
                        if (page != null) {
226
                                p.setNew(false);
227
                                p.setSystemPage(page.isSystemPage());
228
                        } else {
229
                                p.setNew(true);
230
                                p.setSystemPage(false);
231
                        }
63 soliveira 232
                }
233
 
234
                return p;
60 soliveira 235
        }
236
 
237
        @Override
61 soliveira 238
        public Preview insertPreview(int userId, Page page) {
239
                Preview preview = loadPreview(userId, page.getName(), page.getLanguage());
60 soliveira 240
                if (preview != null) {
241
                        preview.setTitle(page.getTitle());
242
                        preview.setBody(page.getBody());
243
                        session.update(preview);
244
                } else {
245
                        preview = new Preview();
246
                        preview.setName(page.getName());
247
                        preview.setLanguageId(page.getLanguageId());
248
                        preview.setUserId(userId);
249
                        preview.setTitle(page.getTitle());
250
                        preview.setBody(page.getBody());
251
                        session.insert(preview);
252
                }
253
                return preview;
254
        }
61 soliveira 255
 
256
        @Override
257
        public String getFrontPage(Language lang) {
258
                Page page = new Page();
259
                page.setLanguageId(lang.getId());
260
                page.setFrontPage(true);
261
 
262
                Page front = session.loadUnique(page);
263
                if (front != null) {
264
                        return front.getName();
265
                }
266
                return null;
267
        }
268
 
269
        @Override
270
        public Page loadByNameWithPreview(int userId, String name, Language lang) {
271
                Page p = loadByName(name, lang);
272
                if (p == null) {
273
                        // we may still have a preview...
274
                        Preview preview = loadPreview(userId, name, lang);
65 soliveira 275
                        if (preview != null) {
276
                                preview.setNew(true);
277
                                return preview.getPage();
278
                        }
61 soliveira 279
                        return null;
280
                } else {
281
                        // check if we have a preview for this page...
282
                        Preview preview = loadPreview(userId, name, lang);
65 soliveira 283
                        if (preview != null) {
284
                                preview.setNew(false);
285
                                p.setPreview(preview);
286
                        }
61 soliveira 287
                        return p;
288
                }
289
        }
63 soliveira 290
 
291
        @Override
292
        public void deletePreview(int userId, String name, Language lang) {
293
                Preview preview = loadPreview(userId, name, lang);
294
                if (preview != null) {
295
                        Preview p = new Preview();
296
                        p.setId(preview.getId());
297
                        session.delete(p);
298
                }
299
        }
78 soliveira 300
 
301
        @Override
302
        public Revision loadRevision(int revision, String name, Language lang) {
303
                Revision r = new Revision();
304
                r.setRevision(revision);
305
                r.setName(name);
306
                r.setLanguageId(lang.getId());
307
                return session.loadUnique(r);
308
        }
309
 
310
        @Override
311
        public void insertRevision(Revision r) {
312
 
313
                PreparedStatement stmt = null;
314
                ResultSet rset = null;
315
 
316
                try {
317
 
318
                        // first time, lock whole table 
319
                        stmt = conn.prepareStatement("LOCK TABLES Revisions WRITE"); // this works as a synchronized block locked on the database... (I tested it!)
320
                        stmt.execute();
321
                        stmt.close();
322
 
323
                        stmt = conn.prepareStatement("select max(revision) from Revisions where name = ? and language_id = ?");
324
                        stmt.setString(1, r.getName());
325
                        stmt.setInt(2, r.getLanguageId());
326
                        rset = stmt.executeQuery();
327
                        rset.next();
328
                        int revisionNumber = rset.getInt(1) + 1;
329
                        rset.close();
330
                        stmt.close();
331
 
332
                        r.setRevision(revisionNumber);
333
                        session.insert(r);
334
 
335
                        stmt = conn.prepareStatement("UNLOCK TABLES");
336
                        stmt.execute();
337
 
338
                } catch(Exception e) {
339
                        throw new RuntimeException(e);
340
                } finally {
341
                        close(stmt, rset);
342
                }
343
        }
79 soliveira 344
 
345
        @Override
346
        public List<Revision> loadRevisions(String name, Language lang) {
347
 
80 soliveira 348
                PreparedStatement stmt = null;
349
                ResultSet rset = null;
79 soliveira 350
 
80 soliveira 351
                try {
352
 
353
                        StringBuilder query = new StringBuilder(256);
354
                        query.append("select ").append(session.buildSelect(Revision.class, "r"));
355
                        query.append(", ").append(session.buildSelect(User.class, "u"));
356
                        query.append(" from Revisions r join Users u on r.user_id = u.id");
357
                        query.append(" where r.name = ? and r.language_id = ?");
358
                        query.append(" order by revision desc");
359
                        query.append(" limit 50");
360
 
361
                        stmt = conn.prepareStatement(query.toString());
362
                        stmt.setString(1, name);
363
                        stmt.setInt(2, lang.getId());
364
 
365
                        rset = stmt.executeQuery();
366
 
367
                        List<Revision> revisions = new ArrayList<Revision>(50);
368
 
369
                        while(rset.next()) {
370
 
371
                                Revision r = new Revision();
372
 
373
                                session.populateBean(rset, r, "r");
374
 
375
                                User u = new User();
376
 
377
                                session.populateBean(rset, u, "u");
378
 
379
                                r.setUser(u);
380
 
381
                                revisions.add(r);
382
                        }
383
 
384
                        return revisions;
385
                } catch(Exception e) {
386
                        throw new RuntimeException(e);
387
                } finally {
388
                        close(stmt, rset);
389
                }
79 soliveira 390
        }
11 soliveira 391
}