From 97e1cce284ff09f3d208fbc776fc9692af9bde0a Mon Sep 17 00:00:00 2001
From: Kai Reinhard <K.Reinhard@micromata.de>
Date: Sat, 05 Jan 2019 17:15:44 +0000
Subject: [PATCH] Some required synchronizations...

---
 borgbutler-core/src/main/java/de/micromata/borgbutler/jobs/JobQueue.java   |   40 +++++++++----------
 borgbutler-core/src/main/java/de/micromata/borgbutler/data/Repository.java |   30 +++++++++++---
 borgbutler-core/src/test/java/de/micromata/borgbutler/cache/CacheTest.java |    2 
 3 files changed, 43 insertions(+), 29 deletions(-)

diff --git a/borgbutler-core/src/main/java/de/micromata/borgbutler/data/Repository.java b/borgbutler-core/src/main/java/de/micromata/borgbutler/data/Repository.java
index 103c9d8..67b0a10 100644
--- a/borgbutler-core/src/main/java/de/micromata/borgbutler/data/Repository.java
+++ b/borgbutler-core/src/main/java/de/micromata/borgbutler/data/Repository.java
@@ -11,6 +11,8 @@
 import org.slf4j.LoggerFactory;
 
 import java.io.Serializable;
+import java.util.Collection;
+import java.util.Collections;
 import java.util.SortedSet;
 import java.util.TreeSet;
 
@@ -69,15 +71,18 @@
     /**
      * Might be null.
      */
-    @Getter
     @Setter
     private SortedSet<Archive> archives;
 
     public Repository add(Archive archive) {
-        if (this.archives == null) {
-            this.archives = new TreeSet<>();
+        synchronized (this) {
+            if (this.archives == null) {
+                this.archives = new TreeSet<>();
+            }
         }
-        this.archives.add(archive);
+        synchronized (this.archives) {
+            this.archives.add(archive);
+        }
         return this;
     }
 
@@ -86,9 +91,11 @@
             log.warn("Can't get archive '" + idOrName + "' from repository '" + name + "'. Archives not yet loaded or don't exist.");
             return null;
         }
-        for (Archive archive : archives) {
-            if (StringUtils.equals(idOrName, archive.getId()) || StringUtils.equals(idOrName, archive.getName())) {
-                return archive;
+        synchronized (this.archives) {
+            for (Archive archive : archives) {
+                if (StringUtils.equals(idOrName, archive.getId()) || StringUtils.equals(idOrName, archive.getName())) {
+                    return archive;
+                }
             }
         }
         log.warn("Archive '" + idOrName + "' not found in repository '" + name + "'.");
@@ -103,4 +110,13 @@
     public boolean isArchivesLoaded() {
         return CollectionUtils.isNotEmpty(archives);
     }
+
+    public Collection<Archive> getArchives() {
+        if (this.archives == null) {
+            return null;
+        }
+        synchronized (this.archives) {
+            return Collections.unmodifiableSet(this.archives);
+        }
+    }
 }
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 cf28884..7ce762e 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
@@ -1,7 +1,6 @@
 package de.micromata.borgbutler.jobs;
 
 import lombok.Getter;
-import org.apache.commons.collections4.CollectionUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -23,7 +22,9 @@
     }
 
     public List<AbstractJob<T>> getDoneJobs() {
-        return Collections.unmodifiableList(doneJobs);
+        synchronized (doneJobs) {
+            return Collections.unmodifiableList(doneJobs);
+        }
     }
 
     /**
@@ -41,31 +42,22 @@
                 }
             }
             queue.add(job.setStatus(AbstractJob.Status.QUEUED));
-            job.setFuture(executorService.submit(new CallableTask(job)));
-            return job;
         }
+        job.setFuture(executorService.submit(new CallableTask(job)));
+        return job;
     }
 
     public AbstractJob getQueuedJob(Object id) {
-        for (AbstractJob job : queue) {
-            if (Objects.equals(job.getId(), id)) {
-                return job;
+        synchronized (queue) {
+            for (AbstractJob job : queue) {
+                if (Objects.equals(job.getId(), id)) {
+                    return job;
+                }
             }
         }
         return null;
     }
 
-    void waitForQueue(int seconds) {
-        int counter = seconds / 10;
-        while (CollectionUtils.isNotEmpty(queue) && counter > 0) {
-            try {
-                Thread.sleep(100);
-            } catch (InterruptedException ex) {
-                log.error(ex.getMessage(), ex);
-            }
-        }
-    }
-
     private void organizeQueue() {
         synchronized (queue) {
             if (queue.isEmpty()) {
@@ -76,13 +68,19 @@
                 AbstractJob<T> job = it.next();
                 if (job.isFinished()) {
                     it.remove();
-                    doneJobs.add(0, job);
+                    synchronized (doneJobs) {
+                        doneJobs.add(0, job);
+                    }
                 }
-                while (doneJobs.size() > MAX_DONE_JOBS_SIZE) {
-                    doneJobs.remove(doneJobs.size() - 1);
+                synchronized (doneJobs) {
+                    while (doneJobs.size() > MAX_DONE_JOBS_SIZE) {
+                        doneJobs.remove(doneJobs.size() - 1);
+                    }
                 }
             }
         }
+
+
     }
 
     private class CallableTask implements Callable<JobResult<T>> {
diff --git a/borgbutler-core/src/test/java/de/micromata/borgbutler/cache/CacheTest.java b/borgbutler-core/src/test/java/de/micromata/borgbutler/cache/CacheTest.java
index 85e21e3..dbbf8a7 100644
--- a/borgbutler-core/src/test/java/de/micromata/borgbutler/cache/CacheTest.java
+++ b/borgbutler-core/src/test/java/de/micromata/borgbutler/cache/CacheTest.java
@@ -48,7 +48,7 @@
             repoConfig = repoConfigs.get(0);
             Repository rerepositoryoList = ButlerCache.getInstance().getRepositoryArchives(repoConfig.getRepo());
             if (rerepositoryoList != null && CollectionUtils.isNotEmpty(rerepositoryoList.getArchives())) {
-                archive = rerepositoryoList.getArchives().first();
+                archive = rerepositoryoList.getArchives().iterator().next();
             }
         }
         {

--
Gitblit v1.10.0