KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > info > jtrac > JtracImpl


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;
18
19 import info.jtrac.domain.AbstractItem;
20 import info.jtrac.domain.Attachment;
21 import info.jtrac.domain.Config;
22 import info.jtrac.domain.Counts;
23 import info.jtrac.domain.CountsHolder;
24 import info.jtrac.domain.Field;
25 import info.jtrac.domain.History;
26 import info.jtrac.domain.Item;
27 import info.jtrac.domain.ItemItem;
28 import info.jtrac.domain.ItemSearch;
29 import info.jtrac.domain.Metadata;
30 import info.jtrac.domain.Space;
31 import info.jtrac.domain.SpaceSequence;
32 import info.jtrac.domain.User;
33 import info.jtrac.domain.UserSpaceRole;
34 import info.jtrac.lucene.IndexSearcher;
35 import info.jtrac.lucene.Indexer;
36 import info.jtrac.mail.MailSender;
37 import java.util.ArrayList JavaDoc;
38 import java.util.Collection JavaDoc;
39 import java.util.Collections JavaDoc;
40 import java.util.Date JavaDoc;
41 import java.util.HashMap JavaDoc;
42 import java.util.HashSet JavaDoc;
43 import java.util.LinkedHashMap JavaDoc;
44 import java.util.LinkedHashSet JavaDoc;
45
46 import java.util.List JavaDoc;
47 import java.util.Locale JavaDoc;
48 import java.util.Map JavaDoc;
49 import java.util.Random JavaDoc;
50 import java.util.Set JavaDoc;
51
52
53 import org.acegisecurity.providers.encoding.PasswordEncoder;
54 import org.acegisecurity.userdetails.UserDetails;
55 import org.acegisecurity.userdetails.UsernameNotFoundException;
56 import org.apache.commons.logging.Log;
57 import org.apache.commons.logging.LogFactory;
58 import org.springframework.context.MessageSource;
59 import org.springframework.util.StringUtils;
60
61 /**
62  * Jtrac Service Layer implementation
63  * This is where all the business logic is
64  * For data persistence this delegates to JtracDao
65  */

66 public class JtracImpl implements Jtrac {
67     
68     private JtracDao dao;
69     private PasswordEncoder passwordEncoder;
70     private MailSender mailSender;
71     private Indexer indexer;
72     private IndexSearcher indexSearcher;
73     private MessageSource messageSource;
74
75     private Map JavaDoc<String JavaDoc, String JavaDoc> locales;
76     private String JavaDoc defaultLocale;
77     
78     public void setLocaleList(String JavaDoc[] array) {
79         locales = new LinkedHashMap JavaDoc<String JavaDoc, String JavaDoc>();
80         for(String JavaDoc localeString : array) {
81             Locale JavaDoc locale = StringUtils.parseLocaleString(localeString);
82             locales.put(localeString, localeString + " - " + locale.getDisplayName());
83         }
84         logger.info("available locales configured " + locales);
85     }
86     
87     public void setDao(JtracDao dao) {
88         this.dao = dao;
89     }
90     
91     public void setPasswordEncoder(PasswordEncoder passwordEncoder) {
92         this.passwordEncoder = passwordEncoder;
93     }
94
95     public void setIndexSearcher(IndexSearcher indexSearcher) {
96         this.indexSearcher = indexSearcher;
97     }
98
99     public void setIndexer(Indexer indexer) {
100         this.indexer = indexer;
101     }
102
103     public void setMessageSource(MessageSource messageSource) {
104         this.messageSource = messageSource;
105     }
106         
107     private final Log logger = LogFactory.getLog(getClass());
108     
109     /**
110      * this has not been factored into the util package or a helper class
111      * because it depends on the PasswordEncoder configured
112      */

113     public String JavaDoc generatePassword() {
114         byte[] ab = new byte[1];
115         Random JavaDoc r = new Random JavaDoc();
116         r.nextBytes(ab);
117         return passwordEncoder.encodePassword(new String JavaDoc(ab), null).substring(24);
118     }
119     
120     /**
121      * this has not been factored into the util package or a helper class
122      * because it depends on the PasswordEncoder configured
123      */

124     public String JavaDoc encodeClearText(String JavaDoc clearText) {
125         return passwordEncoder.encodePassword(clearText, null);
126     }
127
128     public Map JavaDoc<String JavaDoc, String JavaDoc> getLocales() {
129         return locales;
130     }
131     
132     public String JavaDoc getDefaultLocale() {
133         return defaultLocale;
134     }
135     
136     /**
137      * this is automatically called by spring init-method hook on
138      * startup, also called whenever config is edited to refresh
139      */

140     public void init() {
141         
142         Map JavaDoc<String JavaDoc, String JavaDoc> config = loadAllConfig();
143         
144         // initialize default locale
145
String JavaDoc temp = config.get("locale.default");
146         if (temp == null || !locales.containsKey(temp)) {
147             logger.warn("invalid default locale configured = '" + temp + "', defaulting to 'en'");
148             temp = "en";
149         }
150         logger.info("default locale set to '" + temp + "'");
151         defaultLocale = temp;
152         
153         // initialize mail sender
154
this.mailSender = new MailSender(config, messageSource, defaultLocale);
155         
156        
157     }
158     
159     //==========================================================================
160

161     public void storeItem(Item item, Attachment attachment) {
162         History history = new History(item);
163         if (attachment != null) {
164             dao.storeAttachment(attachment);
165             attachment.setFilePrefix(attachment.getId());
166             item.add(attachment);
167             history.setAttachment(attachment);
168         }
169         Date JavaDoc now = new Date JavaDoc();
170         item.setTimeStamp(now);
171         history.setTimeStamp(now);
172         item.add(history);
173         // SpaceSequence spaceSequence = item.getSpace().getSpaceSequence();
174
// very important - have to do this to guarantee unique sequenceNum !
175
// see HibernateJtracDao.storeSpaceSequence() for complete picture
176
long ssId = item.getSpace().getSpaceSequence().getId();
177         SpaceSequence spaceSequence = dao.loadSpaceSequence(ssId);
178         item.setSequenceNum(spaceSequence.next());
179         dao.storeSpaceSequence(spaceSequence);
180         // this will at the moment execute unnecessary updates (bug in Hibernate handling of "version" property)
181
// se http://opensource.atlassian.com/projects/hibernate/browse/HHH-1401
182
dao.storeItem(item);
183         indexer.index(item);
184         indexer.index(history);
185         if (item.isSendNotifications()) {
186             mailSender.send(item, messageSource);
187         }
188     }
189     
190     public void storeHistoryForItem(Item item, History history, Attachment attachment) {
191         // first apply edits onto item record before we change the item status
192
// the item.getEditableFieldList routine depends on the current State of the item
193
for(Field field : item.getEditableFieldList(history.getLoggedBy())) {
194             Object JavaDoc value = history.getValue(field.getName());
195             if (value != null) {
196                 item.setValue(field.getName(), value);
197             }
198         }
199         if (history.getStatus() != null) {
200             item.setStatus(history.getStatus());
201             item.setAssignedTo(history.getAssignedTo()); // this may be null, when closing
202
}
203         item.setItemUsers(history.getItemUsers());
204         history.setTimeStamp(new Date JavaDoc());
205         if (attachment != null) {
206             dao.storeAttachment(attachment);
207             attachment.setFilePrefix(attachment.getId());
208             item.add(attachment);
209             history.setAttachment(attachment);
210         }
211         item.add(history);
212         dao.storeItem(item);
213         indexer.index(history);
214         if (history.isSendNotifications()) {
215             mailSender.send(item, messageSource);
216         }
217     }
218     
219     public Item loadItem(long id) {
220         return dao.loadItem(id);
221     }
222     
223     public Item loadItem(long sequenceNum, String JavaDoc prefixCode) {
224         List JavaDoc<Item> items = dao.findItems(sequenceNum, prefixCode);
225         if (items.size() == 0) {
226             return null;
227         }
228         return items.get(0);
229     }
230     
231     public History loadHistory(long id) {
232         return dao.loadHistory(id);
233     }
234     
235     public List JavaDoc<Item> findItems(ItemSearch itemSearch) {
236         String JavaDoc summary = itemSearch.getSummary();
237         if (summary != null) {
238             List JavaDoc<Long JavaDoc> hits = indexSearcher.findItemIdsContainingText(summary);
239             if (hits.size() == 0) {
240                 itemSearch.setResultCount(0);
241                 return Collections.<Item>emptyList();
242             }
243             itemSearch.setItemIds(hits);
244         }
245         return dao.findItems(itemSearch);
246     }
247     
248     public void removeItem(Item item) {
249         dao.removeItem(item);
250     }
251     
252     public void removeItemItem(ItemItem itemItem) {
253         dao.removeItemItem(itemItem);
254     }
255     
256     public int loadCountOfRecordsHavingFieldNotNull(Space space, Field field) {
257         return dao.loadCountOfRecordsHavingFieldNotNull(space, field);
258     }
259     
260     public int bulkUpdateFieldToNull(Space space, Field field) {
261         return dao.bulkUpdateFieldToNull(space, field);
262     }
263     
264     public int loadCountOfRecordsHavingFieldWithValue(Space space, Field field, int optionKey) {
265         return dao.loadCountOfRecordsHavingFieldWithValue(space, field, optionKey);
266     }
267     
268     public int bulkUpdateFieldToNullForValue(Space space, Field field, int optionKey) {
269         return dao.bulkUpdateFieldToNullForValue(space, field, optionKey);
270     }
271     
272     public int loadCountOfRecordsHavingStatus(Space space, int status) {
273         return dao.loadCountOfRecordsHavingStatus(space, status);
274     }
275     
276     public int bulkUpdateStatusToOpen(Space space, int status) {
277         return dao.bulkUpdateStatusToOpen(space, status);
278     }
279     
280     public int bulkUpdateRenameSpaceRole(Space space, String JavaDoc oldRoleKey, String JavaDoc newRoleKey) {
281         return dao.bulkUpdateRenameSpaceRole(space, oldRoleKey, newRoleKey);
282     }
283     
284     public int bulkUpdateDeleteSpaceRole(Space space, String JavaDoc roleKey) {
285         return dao.bulkUpdateDeleteSpaceRole(space, roleKey);
286     }
287     
288     //========================================================
289

290     public void rebuildIndexes() {
291         indexer.clearIndexes();
292         List JavaDoc<AbstractItem> items = dao.findAllItems();
293         for (AbstractItem item : items) {
294             indexer.index(item);
295         }
296     }
297     
298     // ========= Acegi UserDetailsService implementation ==========
299
public UserDetails loadUserByUsername(String JavaDoc loginName) {
300         List JavaDoc<User> users = null;
301         if (loginName.indexOf("@") != -1) {
302             users = dao.findUsersByEmail(loginName);
303         } else {
304             users = dao.findUsersByLoginName(loginName);
305         }
306         if (users.size() == 0) {
307             throw new UsernameNotFoundException("User not found for '" + loginName + "'");
308         }
309         logger.debug("acegi: loadUserByUserName success for '" + loginName + "'");
310         User user = users.get(0);
311         logger.debug("spaceRoles: " + user.getUserSpaceRoles());
312         return user;
313     }
314     
315     public User loadUser(long id) {
316         return dao.loadUser(id);
317     }
318     
319     public User loadUser(String JavaDoc loginName) {
320         List JavaDoc<User> users = dao.findUsersByLoginName(loginName);
321         if (users.size() == 0) {
322             return null;
323         }
324         return users.get(0);
325     }
326   
327     public void storeUser(User user) {
328         dao.storeUser(user);
329     }
330     
331     public void storeUser(User user, String JavaDoc password) {
332         if (password == null) {
333             password = generatePassword();
334         }
335         user.setPassword(encodeClearText(password));
336         storeUser(user);
337         mailSender.sendUserPassword(user, password);
338     }
339     
340     public List JavaDoc<User> findAllUsers() {
341         return dao.findAllUsers();
342     }
343     
344     public List JavaDoc<User> findUsersForSpace(long spaceId) {
345         return dao.findUsersForSpace(spaceId);
346     }
347     
348     public List JavaDoc<UserSpaceRole> findUserRolesForSpace(long spaceId) {
349         return dao.findUserRolesForSpace(spaceId);
350     }
351     
352     public List JavaDoc<User> findUsersWithRoleForSpace(long spaceId, String JavaDoc roleKey) {
353         return dao.findUsersWithRoleForSpace(spaceId, roleKey);
354     }
355     
356     public List JavaDoc<User> findUsersForUser(User user) {
357         Collection JavaDoc<Space> spaces = new HashSet JavaDoc<Space>(user.getUserSpaceRoles().size());
358         for (UserSpaceRole usr : user.getUserSpaceRoles()) {
359             spaces.add(usr.getSpace());
360         }
361         // must be a better way to make this unique?
362
List JavaDoc<User> users = dao.findUsersForSpaceSet(spaces);
363         Set JavaDoc<User> userSet = new LinkedHashSet JavaDoc<User>(users);
364         return new ArrayList JavaDoc<User>(userSet);
365     }
366     
367     public List JavaDoc<User> findUnallocatedUsersForSpace(long spaceId) {
368         List JavaDoc<User> users = findAllUsers();
369         List JavaDoc<UserSpaceRole> userSpaceRoles = findUserRolesForSpace(spaceId);
370         for(UserSpaceRole userSpaceRole : userSpaceRoles) {
371             users.remove(userSpaceRole.getUser());
372         }
373         return users;
374     }
375     
376     //==========================================================================
377

378     public CountsHolder loadCountsForUser(User user) {
379         return dao.loadCountsForUser(user);
380     }
381     
382     public Counts loadCountsForUserSpace(User user, Space space) {
383         return dao.loadCountsForUserSpace(user, space);
384     }
385     
386     //==========================================================================
387

388     public void storeUserSpaceRole(User user, Space space, String JavaDoc roleKey) {
389         user.addSpaceWithRole(space, roleKey);
390         dao.storeUser(user);
391     }
392     
393     public void removeUserSpaceRole(UserSpaceRole userSpaceRole) {
394         User user = userSpaceRole.getUser();
395         user.removeSpaceWithRole(userSpaceRole.getSpace(), userSpaceRole.getRoleKey());
396         // dao.storeUser(user);
397
dao.removeUserSpaceRole(userSpaceRole);
398     }
399     
400     public UserSpaceRole loadUserSpaceRole(long id) {
401         return dao.loadUserSpaceRole(id);
402     }
403     
404     //==========================================================================
405

406     public Space loadSpace(long id) {
407         return dao.loadSpace(id);
408     }
409     
410     public Space loadSpace(String JavaDoc prefixCode) {
411         List JavaDoc<Space> spaces = dao.findSpacesByPrefixCode(prefixCode);
412         if (spaces.size() == 0) {
413             return null;
414         }
415         return spaces.get(0);
416     }
417     
418     public void storeSpace(Space space) {
419         dao.storeSpace(space);
420     }
421     
422     public List JavaDoc<Space> findAllSpaces() {
423         return dao.findAllSpaces();
424     }
425     
426     public List JavaDoc<Space> findSpacesWhereGuestAllowed() {
427         return dao.findSpacesWhereGuestAllowed();
428     }
429     
430     public List JavaDoc<Space> findUnallocatedSpacesForUser(long userId) {
431         List JavaDoc<Space> spaces = findAllSpaces();
432         User user = loadUser(userId);
433         for(UserSpaceRole usr : user.getUserSpaceRoles()) {
434             spaces.remove(usr.getSpace());
435         }
436         return spaces;
437     }
438     
439     public void removeSpace(Space space) {
440         logger.info("proceeding to delete space: " + space);
441         dao.bulkUpdateDeleteSpaceRole(space, null);
442         dao.bulkUpdateDeleteItemsForSpace(space);
443         dao.removeSpace(space);
444         logger.info("successfully deleted space");
445     }
446     
447     //==========================================================================
448

449     public void storeMetadata(Metadata metadata) {
450         dao.storeMetadata(metadata);
451     }
452     
453     public Metadata loadMetadata(long id) {
454         return dao.loadMetadata(id);
455     }
456     
457     public Map JavaDoc<String JavaDoc, String JavaDoc> loadAllConfig() {
458         List JavaDoc<Config> list = dao.findAllConfig();
459         Map JavaDoc<String JavaDoc, String JavaDoc> allConfig = new HashMap JavaDoc<String JavaDoc, String JavaDoc>(list.size());
460         for (Config c : list) {
461             allConfig.put(c.getParam(), c.getValue());
462         }
463         return allConfig;
464     }
465     
466     public void storeConfig(Config config) {
467         dao.storeConfig(config);
468         // ugly hack, TODO make smarter in future
469
// init stuff that could have changed
470
init();
471     }
472     
473     public String JavaDoc loadConfig(String JavaDoc param) {
474         Config config = dao.loadConfig(param);
475         if (config == null) {
476             return null;
477         }
478         String JavaDoc value = config.getValue();
479         if (value == null || value.trim().equals("")) {
480             return null;
481         }
482         return value;
483     }
484     
485 }
486
Popular Tags