--- dao/DaoAdresseVedligehold/src/main/java/dk/daoas/adressevedligehold/tasks/Task.java 2016/01/25 21:43:59 2844 +++ dao/DaoAdresseVedligehold/src/main/java/dk/daoas/adressevedligehold/tasks/Task.java 2016/02/05 10:11:06 2926 @@ -1,14 +1,19 @@ package dk.daoas.adressevedligehold.tasks; import dk.daoas.adressevedligehold.util.TimingHelper; +import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; public abstract class Task implements Runnable { + private TaskLogger logger = TaskLogger.getInstance(); + public enum TaskState { STATE_QUEUED, STATE_RUNNING, STATE_DONE, STATE_ABORTED; } + @SuppressFBWarnings("URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD")//bliver læst via gson - og det forvirrer findbugs public static class TaskBean { + public int id; public String description; public String detail; public String errorMessage; @@ -16,49 +21,89 @@ public String state; } - protected boolean abort = false; - protected TaskState state = TaskState.STATE_QUEUED; + protected volatile boolean abort = false;//mark volatile to make sure value isn't cached by threads + protected volatile TaskState state = TaskState.STATE_QUEUED; protected TaskManager manager; private String errorMsg; - public void setManager(TaskManager manager) { + private String logMessages; + + private int id; + + public final void setManager(TaskManager manager) { this.manager = manager; } @Override public final void run() { + + TaskLogger.getInstance().reset(); + TimingHelper timing = new TimingHelper(); - System.out.println("Starting " + this.getDescription() ); + + + logger.info("Starting " + this.getDescription() ); this.state = TaskState.STATE_RUNNING; manager.setCurrentTask(this); try { taskRun(); - this.state = TaskState.STATE_DONE; + + if (this.state != TaskState.STATE_ABORTED) { //just to make sure we wasn't aborted + this.state = TaskState.STATE_DONE; + } + + } catch (Exception e) { + logger.warning("Error during taskrun", e); this.errorMsg = e.getMessage(); - e.printStackTrace(); this.state = TaskState.STATE_ABORTED; } manager.setCurrentTask(null); - System.out.println("Done " + this.getDescription() + " " + timing.getElapsed() + "ms"); + logger.info("Done " + this.getDescription() + " " + timing.getElapsed() + "ms"); + + logMessages = TaskLogger.getInstance().getBuffer(); + } + + public final String getLog() { + if (this.state == TaskState.STATE_RUNNING) { + return TaskLogger.getInstance().getBuffer(); //if live return current log buffer content + } else { + return logMessages; + } } + public final void setId(int newId) { + this.id = newId; + } + + public final int getId() { + return this.id; + } - public TaskState getState() { + public final TaskState getState() { return this.state; } + public boolean isAborted() { + return this.abort; + } + public void doAbort() { this.abort = true; } + public void doAbort(Exception e) { + this.abort = true; + this.errorMsg = e.getMessage(); + } + public TaskBean getTaskBean() { TaskBean bean = new TaskBean(); - + bean.id = this.getId(); bean.description = this.getDescription(); bean.detail = this.getDetail(); bean.percentCompleted = this.getPercentCompleted(); @@ -72,6 +117,21 @@ return this.errorMsg; } + @Override + public int hashCode() { + return this.id; + } + + @Override + public boolean equals(Object o) { + if (! (o instanceof Task)) + return false; + + Task otherTask = (Task) o; + + return this.getId() == otherTask.getId(); + } + /** * @throws Exception * @@ -82,6 +142,6 @@ public abstract String getDescription(); public abstract String getDetail(); - public abstract short getPercentCompleted(); + public abstract double getPercentCompleted(); }