Kawai Wiki

Rev

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

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