KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > info > jtrac > hibernate > HibernateJtracDao


1 /*
2  * Copyright 2002-2005 the original author or authors.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */

16
17 package info.jtrac.hibernate;
18
19 import info.jtrac.JtracDao;
20 import info.jtrac.domain.AbstractItem;
21 import info.jtrac.domain.Attachment;
22 import info.jtrac.domain.Config;
23 import info.jtrac.domain.Field;
24 import info.jtrac.domain.Item;
25 import info.jtrac.domain.ItemSearch;
26 import info.jtrac.domain.Metadata;
27 import info.jtrac.domain.Space;
28 import info.jtrac.domain.SpaceSequence;
29 import info.jtrac.domain.State;
30 import info.jtrac.domain.User;
31 import info.jtrac.domain.Counts;
32 import info.jtrac.domain.CountsHolder;
33 import info.jtrac.domain.History;
34 import info.jtrac.domain.ItemItem;
35 import info.jtrac.domain.UserSpaceRole;
36 import java.util.Collection JavaDoc;
37
38 import java.util.List JavaDoc;
39
40 import org.apache.commons.logging.Log;
41 import org.apache.commons.logging.LogFactory;
42 import org.hibernate.Criteria;
43 import org.hibernate.FetchMode;
44 import org.hibernate.Session;
45 import org.hibernate.criterion.DetachedCriteria;
46 import org.hibernate.criterion.Order;
47 import org.hibernate.criterion.Projections;
48 import org.hibernate.criterion.Restrictions;
49 import org.springframework.orm.hibernate3.HibernateCallback;
50 import org.springframework.orm.hibernate3.HibernateJdbcException;
51 import org.springframework.orm.hibernate3.HibernateTemplate;
52 import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
53
54 /**
55  * DAO Implementation using Spring Hibernate template
56  * note usage of the Spring "init-method" and "destroy-method" options
57  */

58 public class HibernateJtracDao extends HibernateDaoSupport implements JtracDao {
59     
60     private final Log logger = LogFactory.getLog(getClass());
61     
62     private SchemaHelper schemaHelper;
63     
64     public void setSchemaHelper(SchemaHelper schemaHelper) {
65         this.schemaHelper = schemaHelper;
66     }
67     
68     public void storeItem(Item item) {
69         getHibernateTemplate().merge(item);
70     }
71     
72     public Item loadItem(long id) {
73         return (Item) getHibernateTemplate().get(Item.class, id);
74     }
75     
76     public History loadHistory(long id) {
77         return (History) getHibernateTemplate().get(History.class, id);
78     }
79     
80     public List JavaDoc<Item> findItems(long sequenceNum, String JavaDoc prefixCode) {
81         Object JavaDoc[] params = new Object JavaDoc[] { sequenceNum, prefixCode };
82         return getHibernateTemplate().find("from Item item where item.sequenceNum = ? and item.space.prefixCode = ?", params);
83     }
84     
85     public List JavaDoc<Item> findItems(ItemSearch itemSearch) {
86         int pageSize = itemSearch.getPageSize();
87         if (pageSize == -1) {
88             List JavaDoc<Item> list = getHibernateTemplate().findByCriteria(itemSearch.getCriteria());
89             itemSearch.setResultCount(list.size());
90             return list;
91         } else {
92             // pagination
93
int firstResult = pageSize * itemSearch.getCurrentPage();
94             List JavaDoc<Item> list = getHibernateTemplate().findByCriteria(itemSearch.getCriteria(), firstResult, pageSize);
95             DetachedCriteria criteria = itemSearch.getCriteriaForCount();
96             criteria.setProjection(Projections.rowCount());
97             Integer JavaDoc count = (Integer JavaDoc) getHibernateTemplate().findByCriteria(criteria).get(0);
98             itemSearch.setResultCount(count);
99             return list;
100         }
101     }
102     
103     public List JavaDoc<AbstractItem> findAllItems() {
104         return getHibernateTemplate().loadAll(AbstractItem.class);
105     }
106     
107     public void removeItem(Item item) {
108         getHibernateTemplate().delete(item);
109     }
110     
111     public void removeItemItem(ItemItem itemItem) {
112         getHibernateTemplate().delete(itemItem);
113     }
114     
115     public void storeAttachment(Attachment attachment) {
116         getHibernateTemplate().merge(attachment);
117     }
118     
119     public void storeMetadata(Metadata metadata) {
120         getHibernateTemplate().merge(metadata);
121     }
122     
123     public Metadata loadMetadata(long id) {
124         return (Metadata) getHibernateTemplate().get(Metadata.class, id);
125     }
126     
127     public void storeSpace(Space space) {
128         getHibernateTemplate().merge(space);
129     }
130     
131     public Space loadSpace(long id) {
132         return (Space) getHibernateTemplate().get(Space.class, id);
133     }
134     
135     public UserSpaceRole loadUserSpaceRole(long id) {
136         return (UserSpaceRole) getHibernateTemplate().get(UserSpaceRole.class, id);
137     }
138     
139     public SpaceSequence loadSpaceSequence(long id) {
140         return (SpaceSequence) getHibernateTemplate().get(SpaceSequence.class, id);
141     }
142     
143     public void storeSpaceSequence(SpaceSequence spaceSequence) {
144         getHibernateTemplate().merge(spaceSequence);
145         // very important, needed to guarantee unique sequenceNum on item insert !
146
// see JtracImpl.storeItem() for complete picture
147
getHibernateTemplate().flush();
148     }
149     
150     public List JavaDoc<Space> findSpacesByPrefixCode(String JavaDoc prefixCode) {
151         return getHibernateTemplate().find("from Space space where space.prefixCode = ?", prefixCode);
152     }
153     
154     public List JavaDoc<Space> findAllSpaces() {
155         return getHibernateTemplate().find("from Space space order by space.prefixCode");
156     }
157     
158     public List JavaDoc<Space> findSpacesWhereGuestAllowed() {
159         return getHibernateTemplate().find("from Space space where space.guestAllowed = true");
160     }
161     
162     public void removeSpace(Space space) {
163         getHibernateTemplate().delete(space);
164     }
165     
166     public void storeUser(User user) {
167         getHibernateTemplate().merge(user);
168     }
169     
170     public User loadUser(long id) {
171         return (User) getHibernateTemplate().get(User.class, id);
172     }
173     
174     public List JavaDoc<User> findAllUsers() {
175         return getHibernateTemplate().find("from User user order by user.name");
176     }
177     
178     public List JavaDoc<User> findUsersByLoginName(final String JavaDoc loginName) {
179         // using criteria query to override lazy loading during authentication
180
return (List JavaDoc<User>) getHibernateTemplate().execute(new HibernateCallback() {
181             public Object JavaDoc doInHibernate(Session session) {
182                 Criteria criteria = session.createCriteria(User.class);
183                 criteria.setFetchMode("userSpaceRoles", FetchMode.JOIN);
184                 criteria.add(Restrictions.eq("loginName", loginName));
185                 return criteria.list();
186             }
187         });
188     }
189     
190     public List JavaDoc<User> findUsersByEmail(final String JavaDoc email) {
191         // using criteria query to override lazy loading during authentication
192
return (List JavaDoc<User>) getHibernateTemplate().execute(new HibernateCallback() {
193             public Object JavaDoc doInHibernate(Session session) {
194                 Criteria criteria = session.createCriteria(User.class);
195                 criteria.setFetchMode("userSpaceRoles", FetchMode.JOIN);
196                 criteria.add(Restrictions.eq("email", email));
197                 return criteria.list();
198             }
199         });
200     }
201     
202     public List JavaDoc<UserSpaceRole> findUserRolesForSpace(final long spaceId) {
203         // return getHibernateTemplate().find("select usr from User user" +
204
// " join user.userSpaceRoles as usr where usr.space.id = ? order by user.name", spaceId);
205
// same as above commented, but forcing eager load of user object
206
// done this way to avoid n + 1 selects on item / item_view
207
// screens when rendering users to notify, drop down etc.
208
return (List JavaDoc<UserSpaceRole>) getHibernateTemplate().execute(new HibernateCallback() {
209             public Object JavaDoc doInHibernate(Session session) {
210                 Criteria criteria = session.createCriteria(UserSpaceRole.class);
211                 criteria.setFetchMode("user", FetchMode.JOIN);
212                 criteria.add(Restrictions.eq("space.id", spaceId));
213                 return criteria.list();
214             }
215         });
216     }
217     
218     public List JavaDoc<User> findUsersWithRoleForSpace(long spaceId, String JavaDoc roleKey) {
219         return getHibernateTemplate().find("from User user"
220                 + " join user.userSpaceRoles as usr where usr.space.id = ?"
221                 + " and usr.roleKey = ? order by user.name", new Object JavaDoc[] { spaceId, roleKey });
222     }
223     
224     //==========================================================================
225

226     public CountsHolder loadCountsForUser(User user) {
227         Collection JavaDoc<Space> spaces = user.getSpaces();
228         if (spaces.size() == 0) {
229             return null;
230         }
231         StringBuffer JavaDoc sb = new StringBuffer JavaDoc();
232         sb.append('(');
233         Space space = null; // holds the only space if only one
234
for (Space s : spaces) {
235             sb.append(s.getId());
236             sb.append(',');
237             space = s;
238         }
239         sb.setCharAt(sb.length() - 1, ')');
240         CountsHolder ch = new CountsHolder();
241         HibernateTemplate ht = getHibernateTemplate();
242         List JavaDoc<Object JavaDoc[]> loggedByList = ht.find("select item.space.id, count(item) from Item item"
243                 + " where item.loggedBy.id = ? group by item.space.id", user.getId());
244         List JavaDoc<Object JavaDoc[]> assignedToList = ht.find("select item.space.id, count(item) from Item item"
245                 + " where item.assignedTo.id = ? group by item.space.id", user.getId());
246         List JavaDoc<Object JavaDoc[]> statusList = ht.find("select item.space.id, count(item) from Item item"
247                 + " where item.space.id in " + sb.toString() + " group by item.space.id");
248         for(Object JavaDoc[] oa : loggedByList) {
249             ch.add((Long JavaDoc) oa[0], Counts.LOGGED_BY_ME, 0, (Integer JavaDoc) oa[1]);
250         }
251         for(Object JavaDoc[] oa : assignedToList) {
252             ch.add((Long JavaDoc) oa[0], Counts.ASSIGNED_TO_ME, 0, (Integer JavaDoc) oa[1]);
253         }
254         for(Object JavaDoc[] oa : statusList) {
255             ch.add((Long JavaDoc) oa[0], Counts.TOTAL, 0, (Integer JavaDoc) oa[1]);
256         }
257         return ch;
258     }
259     
260     public Counts loadCountsForUserSpace(User user, Space space) {
261         HibernateTemplate ht = getHibernateTemplate();
262         List JavaDoc<Object JavaDoc[]> loggedByList = ht.find("select status, count(item) from Item item"
263                 + " where item.loggedBy.id = ? and item.space.id = ? group by item.status", new Object JavaDoc[] { user.getId(), space.getId() });
264         List JavaDoc<Object JavaDoc[]> assignedToList = ht.find("select status, count(item) from Item item"
265                 + " where item.assignedTo.id = ? and item.space.id = ? group by item.status", new Object JavaDoc[] { user.getId(), space.getId() });
266         List JavaDoc<Object JavaDoc[]> statusList = ht.find("select status, count(item) from Item item"
267                 + " where item.space.id = ? group by item.status", space.getId());
268         Counts c = new Counts();
269         for(Object JavaDoc[] oa : loggedByList) {
270             c.add(Counts.LOGGED_BY_ME, (Integer JavaDoc) oa[0], (Integer JavaDoc) oa[1]);
271         }
272         for(Object JavaDoc[] oa : assignedToList) {
273             c.add(Counts.ASSIGNED_TO_ME, (Integer JavaDoc) oa[0], (Integer JavaDoc) oa[1]);
274         }
275         for(Object JavaDoc[] oa : statusList) {
276             c.add(Counts.TOTAL, (Integer JavaDoc) oa[0], (Integer JavaDoc) oa[1]);
277         }
278         return c;
279     }
280     
281     //==========================================================================
282

283     public List JavaDoc<User> findUsersForSpace(long spaceId) {
284         return getHibernateTemplate().find("select distinct user from User user join user.userSpaceRoles as usr"
285                 + " where usr.space.id = ? order by user.name", spaceId);
286     }
287     
288     public List JavaDoc<User> findUsersForSpaceSet(Collection JavaDoc<Space> spaces) {
289         Criteria criteria = getSession().createCriteria(User.class);
290         criteria.createCriteria("userSpaceRoles").add(Restrictions.in("space", spaces));
291         criteria.addOrder(Order.asc("name"));
292         return criteria.list();
293     }
294     
295     public void removeUserSpaceRole(UserSpaceRole userSpaceRole) {
296         getHibernateTemplate().delete(userSpaceRole);
297     }
298     
299     public List JavaDoc<Config> findAllConfig() {
300         return getHibernateTemplate().loadAll(Config.class);
301     }
302     
303     public void storeConfig(Config config) {
304         getHibernateTemplate().merge(config);
305     }
306     
307     public Config loadConfig(String JavaDoc param) {
308         return (Config) getHibernateTemplate().get(Config.class, param);
309     }
310
311     public int loadCountOfRecordsHavingFieldNotNull(Space space, Field field) {
312         Criteria criteria = getSession().createCriteria(Item.class);
313         criteria.add(Restrictions.eq("space", space));
314         criteria.add(Restrictions.isNotNull(field.getName().toString()));
315         criteria.setProjection(Projections.rowCount());
316         int itemCount = (Integer JavaDoc) criteria.list().get(0);
317         // even when no item has this field not null currently, items may have history with this field not null
318
// because of the "parent" difference, cannot use AbstractItem and have to do a separate Criteria query
319
criteria = getSession().createCriteria(History.class);
320         criteria.createCriteria("parent").add(Restrictions.eq("space", space));
321         criteria.add(Restrictions.isNotNull(field.getName().toString()));
322         criteria.setProjection(Projections.rowCount());
323         return itemCount + (Integer JavaDoc) criteria.list().get(0);
324     }
325
326     public int bulkUpdateFieldToNull(Space space, Field field) {
327         int itemCount = getHibernateTemplate().bulkUpdate("update Item item set item." + field.getName() + " = null"
328                 + " where item.space.id = ?", space.getId());
329         logger.info("no of Item rows where " + field.getName() + " set to null = " + itemCount);
330         int historyCount = getHibernateTemplate().bulkUpdate("update History history set history." + field.getName() + " = null"
331                 + " where history.parent in ( from Item item where item.space.id = ? )", space.getId());
332         logger.info("no of History rows where " + field.getName() + " set to null = " + historyCount);
333         return itemCount;
334     }
335
336     public int loadCountOfRecordsHavingFieldWithValue(Space space, Field field, int optionKey) {
337         Criteria criteria = getSession().createCriteria(Item.class);
338         criteria.add(Restrictions.eq("space", space));
339         criteria.add(Restrictions.eq(field.getName().toString(), optionKey));
340         criteria.setProjection(Projections.rowCount());
341         int itemCount = (Integer JavaDoc) criteria.list().get(0);
342         // even when no item has this field value currently, items may have history with this field value
343
// because of the "parent" difference, cannot use AbstractItem and have to do a separate Criteria query
344
criteria = getSession().createCriteria(History.class);
345         criteria.createCriteria("parent").add(Restrictions.eq("space", space));
346         criteria.add(Restrictions.eq(field.getName().toString(), optionKey));
347         criteria.setProjection(Projections.rowCount());
348         return itemCount + (Integer JavaDoc) criteria.list().get(0);
349     }
350
351     public int bulkUpdateFieldToNullForValue(Space space, Field field, int optionKey) {
352         int itemCount = getHibernateTemplate().bulkUpdate("update Item item set item." + field.getName() + " = null"
353                 + " where item.space.id = ?"
354                 + " and item." + field.getName() + " = ?", new Object JavaDoc[] { space.getId(), optionKey });
355         logger.info("no of Item rows where " + field.getName() + " value '" + optionKey + "' replaced with null = " + itemCount);
356         int historyCount = getHibernateTemplate().bulkUpdate("update History history set history." + field.getName() + " = null"
357                 + " where history." + field.getName() + " = ?"
358                 + " and history.parent in ( from Item item where item.space.id = ? )", new Object JavaDoc[] { optionKey, space.getId(), });
359         logger.info("no of History rows where " + field.getName() + " value '" + optionKey + "' replaced with null = " + historyCount);
360         return itemCount;
361     }
362     
363     public int loadCountOfRecordsHavingStatus(Space space, int status) {
364         Criteria criteria = getSession().createCriteria(Item.class);
365         criteria.add(Restrictions.eq("space", space));
366         criteria.add(Restrictions.eq("status", status));
367         criteria.setProjection(Projections.rowCount());
368         int itemCount = (Integer JavaDoc) criteria.list().get(0);
369         // even when no item has this status currently, items may have history with this status
370
// because of the "parent" difference, cannot use AbstractItem and have to do a separate Criteria query
371
criteria = getSession().createCriteria(History.class);
372         criteria.createCriteria("parent").add(Restrictions.eq("space", space));
373         criteria.add(Restrictions.eq("status", status));
374         criteria.setProjection(Projections.rowCount());
375         return itemCount + (Integer JavaDoc) criteria.list().get(0);
376     }
377     
378     public int bulkUpdateStatusToOpen(Space space, int status) {
379         int itemCount = getHibernateTemplate().bulkUpdate("update Item item set item.status = " + State.OPEN
380                 + " where item.status = ? and item.space.id = ?", new Object JavaDoc[] { status, space.getId() });
381         logger.info("no of Item rows where status changed from " + status + " to " + State.OPEN + " = " + itemCount);
382         int historyCount = getHibernateTemplate().bulkUpdate("update History history set history.status = " + State.OPEN
383                 + " where history.status = ?"
384                 + " and history.parent in ( from Item item where item.space.id = ? )", new Object JavaDoc[] { status, space.getId() });
385         logger.info("no of History rows where status changed from " + status + " to " + State.OPEN + " = " + historyCount);
386         return itemCount;
387     }
388     
389     public int bulkUpdateRenameSpaceRole(Space space, String JavaDoc oldRoleKey, String JavaDoc newRoleKey) {
390         return getHibernateTemplate().bulkUpdate("update UserSpaceRole usr set usr.roleKey = ?"
391                 + " where usr.roleKey = ? and usr.space.id = ?", new Object JavaDoc[] { newRoleKey, oldRoleKey, space.getId() });
392     }
393     
394     public int bulkUpdateDeleteSpaceRole(Space space, String JavaDoc roleKey) {
395         if (roleKey == null) {
396             return getHibernateTemplate().bulkUpdate("delete UserSpaceRole usr where usr.space.id = ?", space.getId());
397         } else {
398             return getHibernateTemplate().bulkUpdate("delete UserSpaceRole usr"
399                     + " where usr.space.id = ? and usr.roleKey = ?", new Object JavaDoc[] { space.getId(), roleKey });
400         }
401     }
402     
403     public int bulkUpdateDeleteItemsForSpace(Space space) {
404         int historyCount = getHibernateTemplate().bulkUpdate("delete History history where history.parent in"
405                 + " ( from Item item where item.space.id = ? )", space.getId());
406         logger.debug("deleted " + historyCount + " records from history");
407         int itemItemCount = getHibernateTemplate().bulkUpdate("delete ItemItem itemItem where itemItem.item in"
408                 + " ( from Item item where item.space.id = ? )", space.getId());
409         logger.debug("deleted " + itemItemCount + " records from item_items");
410         int itemCount = getHibernateTemplate().bulkUpdate("delete Item item where item.space.id = ?", space.getId());
411         logger.debug("deleted " + itemCount + " records from items");
412         return historyCount + itemItemCount + itemCount;
413     }
414     
415     //==========================================================================
416

417     /**
418      * note that this is automatically configured to run on startup
419      * as a spring bean "init-method"
420      */

421     public void createSchema() {
422         try {
423             getHibernateTemplate().find("from Item item where item.id = 1");
424         } catch (HibernateJdbcException e) {
425             logger.warn("database schema not found, proceeding to create");
426             schemaHelper.createSchema();
427             User admin = new User();
428             admin.setLoginName("admin");
429             admin.setName("Admin");
430             admin.setEmail("admin");
431             admin.setPassword("21232f297a57a5a743894a0e4a801fc3");
432             admin.addSpaceWithRole(null, "ROLE_ADMIN");
433             logger.info("inserting default admin user into database");
434             storeUser(admin);
435             logger.info("schema creation complete");
436             return;
437         }
438         logger.info("database schema exists, normal startup");
439     }
440     
441     /**
442      * note that this is automatically configured to run on context shutdown
443      * as a spring bean "destroy-method"
444      */

445     public void stopEmbeddedDb() throws Exception JavaDoc {
446         schemaHelper.stopEmbeddedDb();
447     }
448     
449 }
450
Popular Tags