package com.netifera.platform.kernel.internal.probe; import java.util.ArrayList; import java.util.Collection; import com.netifera.platform.api.dispatcher.IMessenger; import com.netifera.platform.api.dispatcher.MessengerException; import com.netifera.platform.api.log.ILogger; import com.netifera.platform.api.model.ISpace; import com.netifera.platform.api.model.IWorkspace; import com.netifera.platform.api.probe.IProbe; import com.netifera.platform.api.tasks.ITaskClient; import com.netifera.platform.api.tasks.ITaskOutput; import com.netifera.platform.api.tasks.ITaskRecord; import com.netifera.platform.api.tasks.ITaskStatus; import com.netifera.platform.tasks.TaskConsoleOutput; import com.netifera.platform.tasks.TaskLogOutput; import com.netifera.platform.tasks.TaskStatus; import com.netifera.platform.tasks.messages.TaskCancelMessage; import com.netifera.platform.tasks.messages.TaskListMessage; import com.netifera.platform.tasks.messages.TaskStartMessage; public class TaskClient implements ITaskClient { final private IProbe probe; final private ILogger logger; final private IWorkspace workspace; private long cachedTaskId = 0; private ITaskRecord cachedTaskRecord = null; public TaskClient(IProbe probe, IWorkspace workspace, ILogger logger) { this.probe = probe; this.workspace = workspace; this.logger = logger.getManager().getLogger("Task Client"); } public void createTask(String instance, long taskId, ISpace space) { logger.debug("Creating task with id = " + taskId); final ITaskStatus taskStatus = new TaskStatus(instance, taskId); space.addTaskRecord(taskStatus); } public void startTask(long taskId) { IMessenger messenger = probe.getMessenger(); try { messenger.sendMessage(new TaskStartMessage(taskId)); } catch (MessengerException e) { logger.warning("Starting task failed", e); } } // message handler public void taskChanged(ITaskStatus taskStatus) { logger.debug("taskChanged " + taskStatus); ITaskRecord record = getTaskForId(taskStatus.getTaskId()); if(record == null) { logger.warning("No task found for id: " + taskStatus.getTaskId()); return; } record.updateTaskStatus(taskStatus); } private ITaskRecord getTaskForId(long taskId) { if(cachedTaskId == taskId) return cachedTaskRecord; cachedTaskId = taskId; cachedTaskRecord = workspace.findTaskById(taskId); return cachedTaskRecord; } public IProbe getProbe() { return probe; } // message handler public void addMessage(ITaskOutput output) { logger.debug("Received task output: " + output); ITaskRecord record = getTaskForId(output.getTaskId()); if(record == null) { logger.warning("No task found for id: " + output.getTaskId()); return; } final long localTaskId = output.getTaskId(); output.setTaskId(localTaskId); if(output instanceof TaskLogOutput) { record.addTaskOutput(output); } else if(output instanceof TaskConsoleOutput) { logger.getManager().logRaw( ((TaskConsoleOutput)output).getMessage() + "\n"); } } public ITaskStatus[] getCurrentTasks() { IMessenger messenger = getMessenger(); try { TaskListMessage response = (TaskListMessage) messenger.exchangeMessage(new TaskListMessage()); return response.getTaskList(); } catch (MessengerException e) { logger.warning("Failed sending TaskListMessage", e); } return new ITaskStatus[0]; } public void requestCancel(long taskId) { Collection<Long> taskIdList = new ArrayList<Long>(); taskIdList.add(taskId); requestCancel(taskIdList); } public void requestCancel(Collection<Long> taskIdList) { if(taskIdList == null || taskIdList.isEmpty()) { return; } IMessenger messenger = getMessenger(); try { long taskIdArray[] = new long[taskIdList.size()]; int i = 0; for(Long taskId : taskIdList) { taskIdArray[i++] = taskId; } messenger.emitMessage(new TaskCancelMessage(taskIdArray)); } catch (MessengerException e) { logger.warning("Failed sending TaskCancelMessage", e); } } private IMessenger getMessenger() { IMessenger messenger = probe.getMessenger(); if(messenger == null) { throw new IllegalStateException("No messenger in probe (not connected?)"); } return messenger; } }