From bf7101f797e8f2a6c3b966762afb1ec063c4428e Mon Sep 17 00:00:00 2001
From: Kai Reinhard <K.Reinhard@micromata.de>
Date: Sat, 05 Jan 2019 23:03:45 +0000
Subject: [PATCH] Job monitor: Cancellation of jobs modified.

---
 borgbutler-core/src/main/java/de/micromata/borgbutler/jobs/AbstractCommandLineJob.java |    1 -
 borgbutler-core/src/main/java/de/micromata/borgbutler/jobs/JobQueue.java               |   17 ++++++++++++++---
 borgbutler-core/src/main/java/de/micromata/borgbutler/BorgQueueExecutor.java           |   25 ++++++++++++-------------
 3 files changed, 26 insertions(+), 17 deletions(-)

diff --git a/borgbutler-core/src/main/java/de/micromata/borgbutler/BorgQueueExecutor.java b/borgbutler-core/src/main/java/de/micromata/borgbutler/BorgQueueExecutor.java
index 5e440fe..5678da2 100644
--- a/borgbutler-core/src/main/java/de/micromata/borgbutler/BorgQueueExecutor.java
+++ b/borgbutler-core/src/main/java/de/micromata/borgbutler/BorgQueueExecutor.java
@@ -36,25 +36,24 @@
     }
 
     public void cancelJob(long uniqueJobNumber) {
-        AbstractJob<?> job = getQueuedJobByUniqueJobNumber(uniqueJobNumber);
+        AbstractJob<?> job = null;
+        JobQueue<?> queue = null;
+        Iterator<JobQueue<String>> it = queueMap.values().iterator();
+        while (it.hasNext()) {
+            queue = it.next();
+            job = queue.getQueuedJobByUniqueJobNumber(uniqueJobNumber);
+            if (job != null) {
+                break;
+            }
+        }
         if (job == null) {
             log.info("Can't cancel job #" + uniqueJobNumber + ". Not found as queued job (may-be already cancelled or finished). Nothing to do.");
             return;
         }
         job.cancel();
+        queue.refreshQueue();
     }
-
-    private AbstractJob<?> getQueuedJobByUniqueJobNumber(long uniqueJobNumber) {
-        Iterator<JobQueue<String>> it = queueMap.values().iterator();
-        while (it.hasNext()) {
-            AbstractJob<?> job = it.next().getQueuedJobByUniqueJobNumber(uniqueJobNumber);
-            if (job != null) {
-                return job;
-            }
-        }
-        return null;
-    }
-
+    
     /**
      * For displaying purposes.
      *
diff --git a/borgbutler-core/src/main/java/de/micromata/borgbutler/jobs/AbstractCommandLineJob.java b/borgbutler-core/src/main/java/de/micromata/borgbutler/jobs/AbstractCommandLineJob.java
index 591980d..7564241 100644
--- a/borgbutler-core/src/main/java/de/micromata/borgbutler/jobs/AbstractCommandLineJob.java
+++ b/borgbutler-core/src/main/java/de/micromata/borgbutler/jobs/AbstractCommandLineJob.java
@@ -127,7 +127,6 @@
             log.info("Cancelling job #" + getUniqueJobNumber() + ": " + getId());
             watchdog.destroyProcess();
             watchdog = null;
-            setCancelled();
         }
     }
 
diff --git a/borgbutler-core/src/main/java/de/micromata/borgbutler/jobs/JobQueue.java b/borgbutler-core/src/main/java/de/micromata/borgbutler/jobs/JobQueue.java
index 819cb0e..8c9eb47 100644
--- a/borgbutler-core/src/main/java/de/micromata/borgbutler/jobs/JobQueue.java
+++ b/borgbutler-core/src/main/java/de/micromata/borgbutler/jobs/JobQueue.java
@@ -16,7 +16,7 @@
     private List<AbstractJob<T>> doneJobs = new LinkedList<>();
     private ExecutorService executorService = Executors.newSingleThreadExecutor();
 
-    private  static synchronized void setNextJobId(AbstractJob<?> job) {
+    private static synchronized void setNextJobId(AbstractJob<?> job) {
         job.setUniqueJobNumber(jobSequence++);
     }
 
@@ -30,6 +30,7 @@
 
     /**
      * Searches only for queued jobs (not done jobs).
+     *
      * @param uniqueJobNumber
      * @return The job if any job with the given unique job number is queued, otherwise null.
      */
@@ -76,7 +77,13 @@
         return null;
     }
 
-    private void organizeQueue() {
+    /**
+     * Removes all finished or cancelled jobs from the queued list and adds them to the list of done jobs.
+     * Will be called automatically after finishing a job.
+     * <br>
+     * You should call this method after cancelling a job.
+     */
+    public void refreshQueue() {
         synchronized (queue) {
             if (queue.isEmpty()) {
                 return;
@@ -120,7 +127,11 @@
                     // Don't overwrite status failed set by job.
                     job.setStatus(AbstractJob.Status.DONE);
                 }
-                organizeQueue();
+                if (job.isCancellationRequested() && job.getStatus() != AbstractJob.Status.CANCELLED) {
+                    log.info("Job #" + job.getUniqueJobNumber() + " cancelled: " + job.getId());
+                    job.setCancelled();
+                }
+                refreshQueue();
                 return result;
             } catch (Exception ex) {
                 log.error("Error while executing job '" + job.getId() + "': " + ex.getMessage(), ex);

--
Gitblit v1.10.0