1 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 ; 38 import java.util.Collection ; 39 import java.util.Collections ; 40 import java.util.Date ; 41 import java.util.HashMap ; 42 import java.util.HashSet ; 43 import java.util.LinkedHashMap ; 44 import java.util.LinkedHashSet ; 45 46 import java.util.List ; 47 import java.util.Locale ; 48 import java.util.Map ; 49 import java.util.Random ; 50 import java.util.Set ; 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 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 <String , String > locales; 76 private String defaultLocale; 77 78 public void setLocaleList(String [] array) { 79 locales = new LinkedHashMap <String , String >(); 80 for(String localeString : array) { 81 Locale 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 113 public String generatePassword() { 114 byte[] ab = new byte[1]; 115 Random r = new Random (); 116 r.nextBytes(ab); 117 return passwordEncoder.encodePassword(new String (ab), null).substring(24); 118 } 119 120 124 public String encodeClearText(String clearText) { 125 return passwordEncoder.encodePassword(clearText, null); 126 } 127 128 public Map <String , String > getLocales() { 129 return locales; 130 } 131 132 public String getDefaultLocale() { 133 return defaultLocale; 134 } 135 136 140 public void init() { 141 142 Map <String , String > config = loadAllConfig(); 143 144 String 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 this.mailSender = new MailSender(config, messageSource, defaultLocale); 155 156 157 } 158 159 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 now = new Date (); 170 item.setTimeStamp(now); 171 history.setTimeStamp(now); 172 item.add(history); 173 long ssId = item.getSpace().getSpaceSequence().getId(); 177 SpaceSequence spaceSequence = dao.loadSpaceSequence(ssId); 178 item.setSequenceNum(spaceSequence.next()); 179 dao.storeSpaceSequence(spaceSequence); 180 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 for(Field field : item.getEditableFieldList(history.getLoggedBy())) { 194 Object 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()); } 203 item.setItemUsers(history.getItemUsers()); 204 history.setTimeStamp(new Date ()); 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 prefixCode) { 224 List <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 <Item> findItems(ItemSearch itemSearch) { 236 String summary = itemSearch.getSummary(); 237 if (summary != null) { 238 List <Long > 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 oldRoleKey, String newRoleKey) { 281 return dao.bulkUpdateRenameSpaceRole(space, oldRoleKey, newRoleKey); 282 } 283 284 public int bulkUpdateDeleteSpaceRole(Space space, String roleKey) { 285 return dao.bulkUpdateDeleteSpaceRole(space, roleKey); 286 } 287 288 290 public void rebuildIndexes() { 291 indexer.clearIndexes(); 292 List <AbstractItem> items = dao.findAllItems(); 293 for (AbstractItem item : items) { 294 indexer.index(item); 295 } 296 } 297 298 public UserDetails loadUserByUsername(String loginName) { 300 List <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 loginName) { 320 List <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 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 <User> findAllUsers() { 341 return dao.findAllUsers(); 342 } 343 344 public List <User> findUsersForSpace(long spaceId) { 345 return dao.findUsersForSpace(spaceId); 346 } 347 348 public List <UserSpaceRole> findUserRolesForSpace(long spaceId) { 349 return dao.findUserRolesForSpace(spaceId); 350 } 351 352 public List <User> findUsersWithRoleForSpace(long spaceId, String roleKey) { 353 return dao.findUsersWithRoleForSpace(spaceId, roleKey); 354 } 355 356 public List <User> findUsersForUser(User user) { 357 Collection <Space> spaces = new HashSet <Space>(user.getUserSpaceRoles().size()); 358 for (UserSpaceRole usr : user.getUserSpaceRoles()) { 359 spaces.add(usr.getSpace()); 360 } 361 List <User> users = dao.findUsersForSpaceSet(spaces); 363 Set <User> userSet = new LinkedHashSet <User>(users); 364 return new ArrayList <User>(userSet); 365 } 366 367 public List <User> findUnallocatedUsersForSpace(long spaceId) { 368 List <User> users = findAllUsers(); 369 List <UserSpaceRole> userSpaceRoles = findUserRolesForSpace(spaceId); 370 for(UserSpaceRole userSpaceRole : userSpaceRoles) { 371 users.remove(userSpaceRole.getUser()); 372 } 373 return users; 374 } 375 376 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 388 public void storeUserSpaceRole(User user, Space space, String 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.removeUserSpaceRole(userSpaceRole); 398 } 399 400 public UserSpaceRole loadUserSpaceRole(long id) { 401 return dao.loadUserSpaceRole(id); 402 } 403 404 406 public Space loadSpace(long id) { 407 return dao.loadSpace(id); 408 } 409 410 public Space loadSpace(String prefixCode) { 411 List <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 <Space> findAllSpaces() { 423 return dao.findAllSpaces(); 424 } 425 426 public List <Space> findSpacesWhereGuestAllowed() { 427 return dao.findSpacesWhereGuestAllowed(); 428 } 429 430 public List <Space> findUnallocatedSpacesForUser(long userId) { 431 List <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 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 <String , String > loadAllConfig() { 458 List <Config> list = dao.findAllConfig(); 459 Map <String , String > allConfig = new HashMap <String , String >(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 init(); 471 } 472 473 public String loadConfig(String param) { 474 Config config = dao.loadConfig(param); 475 if (config == null) { 476 return null; 477 } 478 String value = config.getValue(); 479 if (value == null || value.trim().equals("")) { 480 return null; 481 } 482 return value; 483 } 484 485 } 486 | Popular Tags |