Kawai Wiki

Rev

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

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