Kawai Wiki

Rev

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