Kawai Wiki

Rev

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

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