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.dao.TodoDAO;
import tudu.domain.model.Todo;
import tudu.domain.model.TodoList;
import tudu.domain.model.User;
import tudu.domain.model.comparator.TodoByDueDateComparator;
import tudu.security.PermissionDeniedException;
import tudu.service.TodoListsManager;
import tudu.service.TodosManager;
import tudu.service.UserManager;
import java.util.*;
/**
* Implementation of the tudu.service.TodosManager interface.
*
* @author Julien Dubois
*/
@Service
@Transactional
public class TodosManagerImpl implements TodosManager {
private final Log log = LogFactory.getLog(TodosManagerImpl.class);
@Autowired
private TodoDAO todoDAO;
@Autowired
private TodoListsManager todoListsManager;
@Autowired
private UserManager userManager;
/**
* Find a Todo by ID.
*
* @see tudu.service.TodosManager#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 = todoDAO.getTodo(todoId);
TodoList todoList = todo.getTodoList();
User user = userManager.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.TodosManager#findUrgentTodos()
*/
@Transactional(readOnly = true)
public Collection<Todo> findUrgentTodos() {
User user = userManager.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.TodosManager#findAssignedTodos()
*/
@Transactional(readOnly = true)
public Collection<Todo> findAssignedTodos() {
User user = userManager.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.TodosManager#createTodo( java.lang.String listId,
* tudu.domain.model.Todo)
*/
public void createTodo(final String listId, final Todo todo) {
Date now = Calendar.getInstance().getTime();
todo.setCreationDate(now);
TodoList todoList = todoListsManager.findTodoList(listId);
todo.setTodoList(todoList);
todoList.getTodos().add(todo);
todoDAO.saveTodo(todo);
todoListsManager.updateTodoList(todoList);
}
/**
* Update a Todo.
*
* @see tudu.service.TodosManager#updateTodo(tudu.domain.model.Todo)
*/
public void updateTodo(final Todo todo) {
todoDAO.updateTodo(todo);
todoListsManager.updateTodoList(todo.getTodoList());
}
/**
* Delete a Todo.
*
* @see tudu.service.TodosManager#deleteTodo(java.lang.String)
*/
public void deleteTodo(final String todoId) {
Todo todo = this.findTodo(todoId);
TodoList todoList = todo.getTodoList();
todoList.getTodos().remove(todo);
todoDAO.removeTodo(todoId);
todoListsManager.updateTodoList(todoList);
}
/**
* @see tudu.service.TodosManager#deleteAllCompletedTodos(java.lang.String)
*/
public void deleteAllCompletedTodos(String listId) {
TodoList todoList = todoListsManager.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) {
todoDAO.removeTodo(todo.getTodoId());
}
todoListsManager.updateTodoList(todoList);
}
/**
* @see tudu.service.TodosManager#completeTodo(java.lang.String)
*/
public Todo completeTodo(String todoId) {
Todo todo = this.findTodo(todoId);
todo.setCompleted(true);
todo.setCompletionDate(Calendar.getInstance().getTime());
todoListsManager.updateTodoList(todo.getTodoList());
return todo;
}
/**
* @see tudu.service.TodosManager#reopenTodo(java.lang.String)
*/
public Todo reopenTodo(String todoId) {
Todo todo = this.findTodo(todoId);
todo.setCompleted(false);
todo.setCompletionDate(null);
todoListsManager.updateTodoList(todo.getTodoList());
return todo;
}
}