package com.anjlab.spelling.web.services.managers.impl; import java.util.ArrayList; import java.util.Collection; import java.util.List; import org.apache.tapestry5.ioc.annotations.Inject; import com.anjlab.spelling.web.entities.Task; import com.anjlab.spelling.web.services.managers.TaskManager; import com.anjlab.spelling.web.services.managers.WorkerManager; import com.anjlab.spelling.web.services.workers.Worker; public class WorkerManagerImpl implements WorkerManager { @Inject private TaskManager taskManager; private final List workers; public WorkerManagerImpl(Collection workers) { this.workers = new ArrayList(); for (Worker worker : workers) { registerWorker(worker); } } public void registerWorker(Worker worker) { workers.add(worker); } public Iterable workers() { return workers; } public Worker getWorker(int taskId) { for (Worker worker : workers) { Task task = worker.currentTask(); if (task != null && task.getId() == taskId) { return worker; } } return null; } public void cancelTask(int taskId) { boolean canceled = false; Worker worker = getWorker(taskId); if (worker != null) { canceled = worker.cancelTask(taskId); } // In case if no worker running this task we should cancel it here if (!canceled) { taskManager.deleteTask(taskId); } else { taskManager.markAsCanceled(taskId); } } public void submitTask(Task newTask) { if (taskManager.submitTask(newTask)) { taskSubmitted(newTask); } } private void taskSubmitted(Task task) { for (Worker worker : workers) { if (worker.getTaskType().equals(task.getType())) { checkForNewTask(worker); } } } public void taskCompleted(Worker worker) { for (Worker worker2 : workers) { if (worker2 != worker) { checkForNewTask(worker2); } } } public void togglePaused() { for (Worker worker : workers) { boolean paused = worker.togglePaused(); if (!paused) { checkForNewTask(worker); } } } private void checkForNewTask(Worker worker) { worker.checkForNewTask(); } }