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.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import tudu.domain.Todo;
import tudu.domain.TodoList;
import tudu.domain.User;
import tudu.domain.comparator.TodoByDueDateComparator;
import tudu.security.PermissionDeniedException;
import tudu.service.TodoListsService;
import tudu.service.TodosService;
import tudu.service.UserService;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import java.util.*;
/**
* Implementation of the tudu.service.TodosService interface.
*
* @author Julien Dubois
*/
@Service
@Transactional
public class TodosServiceImpl implements TodosService {
private final Log log = LogFactory.getLog(TodosServiceImpl.class);
@PersistenceContext
private EntityManager em;
@Autowired
private TodoListsService todoListsService;
@Autowired
private UserService userService;
/**
* Find a Todo by ID.
*
* @see tudu.service.TodosService#findTodo(java.lang.String)
*/
@Transactional(readOnly = true)
public Todo findTodo(final String todoId) {
if (log.isDebugEnabled()) {
log.debug("Finding Todo with ID " + todoId);
}
Todo todo = em.find(Todo.class, todoId);
if (todo == null) {
if (log.isInfoEnabled()) {
log.info("Todo ID '" + todoId
+ "' does not exist!");
}
return null;
}
TodoList todoList = todo.getTodoList();
User user = userService.getCurrentUser();
if (!user.getTodoLists().contains(todoList)) {
if (log.isInfoEnabled()) {
log.info("Permission denied when finding Todo ID '" + todoId
+ "' for User '" + user.getLogin() + "'");
}
throw new PermissionDeniedException(
"Permission denied to access this Todo.");
}
return todo;
}
/**
* @see tudu.service.TodosService#findUrgentTodos()
*/
@Transactional(readOnly = true)
public Collection<Todo> findUrgentTodos() {
User user = userService.getCurrentUser();
Calendar urgentCal = Calendar.getInstance();
urgentCal.add(Calendar.DATE, 4);
Date urgentDate = urgentCal.getTime();
Set<Todo> urgentTodos = new TreeSet<Todo>(new TodoByDueDateComparator());
for (TodoList todoList : user.getTodoLists()) {
for (Todo todo : todoList.getTodos()) {
if (todo.getDueDate() != null
&& todo.getDueDate().before(urgentDate)
&& !todo.isCompleted()) {
urgentTodos.add(todo);
}
}
}
return urgentTodos;
}
/**
* @see tudu.service.TodosService#findAssignedTodos()
*/
@Transactional(readOnly = true)
public Collection<Todo> findAssignedTodos() {
User user = userService.getCurrentUser();
Set<Todo> assignedTodos = new TreeSet<Todo>();
for (TodoList todoList : user.getTodoLists()) {
for (Todo todo : todoList.getTodos()) {
if (todo.getAssignedUser() != null
&& todo.getAssignedUser().equals(user)
&& !todo.isCompleted()) {
assignedTodos.add(todo);
}
}
}
return assignedTodos;
}
/**
* Create a new Todo.
*
* @see tudu.service.TodosService#createTodo(java.lang.String listId,
* tudu.domain.Todo)
*/
public void createTodo(final String listId, final Todo todo) {
Date now = Calendar.getInstance().getTime();
todo.setCreationDate(now);
TodoList todoList = todoListsService.findTodoList(listId);
todo.setTodoList(todoList);
em.persist(todo);
todoList.getTodos().add(todo);
todoListsService.updateTodoList(todoList);
if (log.isDebugEnabled()) {
log.debug("Created Todo ID=" + todo.getTodoId());
}
}
public void deleteTodo(final Todo todo) {
TodoList todoList = todo.getTodoList();
Set<Todo> todos = todoList.getTodos();
if (todos.contains(todo)) {
todos.remove(todo);
todoListsService.updateTodoList(todoList);
if (log.isDebugEnabled()) {
log.debug("Removed Todo ID=" + todo.getTodoId() + " - list size="
+ todoList.getTodos().size());
}
} else {
log.warn("Todo " + todo.getTodoId() + " should have been in List "
+ todoList.getListId());
}
em.remove(todo);
}
/**
* @see tudu.service.TodosService#deleteAllCompletedTodos(java.lang.String)
*/
public void deleteAllCompletedTodos(String listId) {
TodoList todoList = todoListsService.findTodoList(listId);
List<Todo> todosToRemove = new ArrayList<Todo>();
for (Todo todo : todoList.getTodos()) {
if (todo.isCompleted()) {
todosToRemove.add(todo);
}
}
todoList.getTodos().removeAll(todosToRemove);
for (Todo todo : todosToRemove) {
em.remove(todo);
}
todoListsService.updateTodoList(todoList);
}
/**
* @see tudu.service.TodosService#completeTodo(java.lang.String)
*/
public Todo completeTodo(String todoId) {
Todo todo = this.findTodo(todoId);
todo.setCompleted(true);
todo.setCompletionDate(Calendar.getInstance().getTime());
todoListsService.updateTodoList(todo.getTodoList());
return todo;
}
/**
* @see tudu.service.TodosService#reopenTodo(java.lang.String)
*/
public Todo reopenTodo(String todoId) {
Todo todo = this.findTodo(todoId);
todo.setCompleted(false);
todo.setCompletionDate(null);
todoListsService.updateTodoList(todo.getTodoList());
return todo;
}
public void updateTodo(Todo todo) {
todoListsService.updateTodoList(todo.getTodoList());
}
}