package tudu.service.impl; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.mail.SimpleMailMessage; import org.springframework.mail.javamail.JavaMailSenderImpl; import org.springframework.orm.ObjectRetrievalFailureException; import org.springframework.security.context.SecurityContext; import org.springframework.security.context.SecurityContextHolder; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import tudu.Constants; import tudu.domain.RolesEnum; import tudu.domain.dao.*; import tudu.domain.model.*; import tudu.service.UserAlreadyExistsException; import tudu.service.UserManager; import java.util.Calendar; import java.util.Date; import java.util.List; /** * Implementation of the tudu.service.UserManager interface. * * @author Julien Dubois */ @Service @Transactional public class UserManagerImpl implements UserManager { private final Log log = LogFactory.getLog(UserManagerImpl.class); @Autowired private UserDAO userDAO; @Autowired private RoleDAO roleDAO; @Autowired private TodoListDAO todoListDAO; @Autowired private TodoDAO todoDAO; @Autowired private PropertyDAO propertyDAO; /** * Get the number of users. * * @see tudu.service.UserManager#getNumberOfUsers() */ @Transactional(readOnly = true) public long getNumberOfUsers() { return userDAO.getNumberOfUsers(); } /** * Find a user by login. * * @see tudu.service.UserManager#findUser(String) */ @Transactional(readOnly = true) public User findUser(String login) { User user = userDAO.getUser(login); if (user == null) { if (log.isDebugEnabled()) { log.debug("Could not find User ID=" + login); } throw new ObjectRetrievalFailureException(User.class, login); } if (log.isDebugEnabled()) { log.debug("User ID=" + login + " found, user is called " + user.getFirstName() + " " + user.getLastName()); } return user; } /** * Find all users with a login starting with the "loginStart" string. * * @see tudu.service.UserManager#findUsersByLogin(java.lang.String) */ @Transactional(readOnly = true) public List<User> findUsersByLogin(String loginStart) { return userDAO.findUsersByLogin(loginStart); } /** * Find the current Tudu List user. * * @see tudu.service.UserManager#getCurrentUser() */ @Transactional(readOnly = true) public User getCurrentUser() { SecurityContext securityContext = SecurityContextHolder.getContext(); org.springframework.security.userdetails.User springSecurityUser = (org.springframework.security.userdetails.User) securityContext .getAuthentication().getPrincipal(); return this.findUser(springSecurityUser.getUsername()); } /** * Update a user's information. * * @see tudu.service.UserManager#updateUser(tudu.domain.model.User) */ public void updateUser(User user) { if (log.isDebugEnabled()) { log.debug("Updating user '" + user.getLogin() + "'."); } userDAO.updateUser(user); } /** * Enable a user account. * * @param login * The user login */ public void enableUser(String login) { User user = this.findUser(login); user.setEnabled(true); } /** * Disable a user account. * * @param login * The user login */ public void disableUser(String login) { User user = this.findUser(login); user.setEnabled(false); } /** * Create a new user. * * @see tudu.service.UserManager#createUser(tudu.domain.model.User) */ public void createUser(User user) throws UserAlreadyExistsException { if (log.isDebugEnabled()) { log.debug("Creating user '" + user.getLogin() + "'."); } User testUser = userDAO.getUser(user.getLogin()); if (testUser != null) { if (log.isDebugEnabled()) { log.debug("User login '" + user.getLogin() + "' already exists."); } throw new UserAlreadyExistsException("User already exists."); } user.setEnabled(true); Date now = Calendar.getInstance().getTime(); user.setCreationDate(now); user.setLastAccessDate(now); user.setDateFormat(Constants.DATEFORMAT_US); Role role = roleDAO.getRole(RolesEnum.ROLE_USER.toString()); user.getRoles().add(role); userDAO.saveUser(user); TodoList todoList = new TodoList(); todoList.setName("Welcome!"); todoList.setLastUpdate(Calendar.getInstance().getTime()); todoListDAO.saveTodoList(todoList); user.getTodoLists().add(todoList); todoList.getUsers().add(user); Todo welcomeTodo = new Todo(); welcomeTodo.setDescription("Welcome to Tudu Lists!"); welcomeTodo.setPriority(100); welcomeTodo.setCreationDate(now); welcomeTodo.setCompletionDate(now); welcomeTodo.setTodoList(todoList); todoList.getTodos().add(welcomeTodo); todoDAO.saveTodo(welcomeTodo); todoListDAO.updateTodoList(todoList); } /** * @see tudu.service.UserManager#sendPassword(tudu.domain.model.User) */ @Transactional(readOnly = true) public void sendPassword(User user) { if (log.isDebugEnabled()) { log.debug("Send password of user '" + user.getLogin() + "'."); } JavaMailSenderImpl sender = new JavaMailSenderImpl(); Property smtpHost = propertyDAO.getProperty("smtp.host"); sender.setHost(smtpHost.getValue()); Property smtpPort = propertyDAO.getProperty("smtp.port"); int port = 25; try { port = Integer.parseInt(smtpPort.getValue()); } catch (NumberFormatException e) { log.error("The supplied SMTP port is not a number."); } sender.setPort(port); Property smtpUser = propertyDAO.getProperty("smtp.user"); sender.setUsername(smtpUser.getValue()); Property smtpPassword = propertyDAO.getProperty("smtp.password"); sender.setPassword(smtpPassword.getValue()); SimpleMailMessage message = new SimpleMailMessage(); Property smtpFrom = propertyDAO.getProperty("smtp.from"); message.setTo(user.getEmail()); message.setFrom(smtpFrom.getValue()); message.setSubject("Your Tudu Lists password"); message .setText("Dear " + user.getFirstName() + " " + user.getLastName() + ",\n\n" + "Your Tudu Lists password is \"" + user.getPassword() + "\".\n" + "Now that this password has been sent by e-mail, we recommend that " + "you change it as soon as possible.\n\n" + "Regards,\n\n" + "Tudu Lists."); sender.send(message); } }