package tudu.service.impl;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.mail.SimpleMailMessage;
import org.springframework.mail.javamail.JavaMailSenderImpl;
import org.springframework.orm.ObjectRetrievalFailureException;
import org.springframework.security.core.context.SecurityContext;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import tudu.Constants;
import tudu.domain.*;
import tudu.service.UserAlreadyExistsException;
import tudu.service.UserService;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
/**
* Implementation of the tudu.service.UserService interface.
*
* @author Julien Dubois
*/
@Service
@Transactional
public class UserServiceImpl implements UserService {
private final Log log = LogFactory.getLog(UserServiceImpl.class);
@PersistenceContext
private EntityManager em;
/**
* Get the number of users.
*
* @see tudu.service.UserService#getNumberOfUsers()
*/
@Transactional(readOnly = true)
public long getNumberOfUsers() {
Query query = em.createNamedQuery("User.getNumberOfUsers");
return (Long) query.getSingleResult();
}
/**
* Find a user by login.
*
* @see tudu.service.UserService#findUser(String)
*/
@Transactional(readOnly = true)
public User findUser(String login) {
User user = em.find(User.class, 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.UserService#findUsersByLogin(java.lang.String)
*/
@Transactional(readOnly = true)
public List<User> findUsersByLogin(String loginStart) {
Query query = em.createNamedQuery("User.findUsersByLogin");
query.setParameter("login", loginStart + "%");
query.setMaxResults(200);
List<User> users = query.getResultList();
return users;
}
/**
* Find the current Tudu List user.
*
* @see tudu.service.UserService#getCurrentUser()
*/
@Transactional(readOnly = true)
public User getCurrentUser() {
SecurityContext securityContext = SecurityContextHolder.getContext();
org.springframework.security.core.userdetails.User springSecurityUser = (org.springframework.security.core.userdetails.User) securityContext
.getAuthentication().getPrincipal();
return this.findUser(springSecurityUser.getUsername());
}
/**
* Update a user's information.
*/
public void updateUser(User user) {
if (log.isDebugEnabled()) {
log.debug("Updating user '" + user.getLogin() + "'.");
}
em.merge(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.UserService#createUser(tudu.domain.User)
*/
public void createUser(User user) throws UserAlreadyExistsException {
if (log.isDebugEnabled()) {
log.debug("Creating user '" + user.getLogin() + "'.");
}
User testUser = em.find(User.class, 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 = em.find(Role.class, RolesEnum.ROLE_USER.name());
user.getRoles().add(role);
em.persist(user);
TodoList todoList = new TodoList();
todoList.setName("Welcome!");
todoList.setLastUpdate(Calendar.getInstance().getTime());
em.persist(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);
em.persist(welcomeTodo);
if (log.isDebugEnabled()) {
log.debug("User '" + user.getLogin() + "' successfully created.");
}
}
/**
* @see tudu.service.UserService#sendPassword(tudu.domain.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 = em.find(Property.class, "smtp.host");
sender.setHost(smtpHost.getValue());
Property smtpPort = em.find(Property.class, "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 = em.find(Property.class, "smtp.user");
sender.setUsername(smtpUser.getValue());
Property smtpPassword = em.find(Property.class, "smtp.password");
sender.setPassword(smtpPassword.getValue());
SimpleMailMessage message = new SimpleMailMessage();
Property smtpFrom = em.find(Property.class, "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);
}
}