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 | } |