From 8252cc6a94dc6fb2bb2b6d02898ca5113fd3b3a5 Mon Sep 17 00:00:00 2001
From: Kai Reinhard <K.Reinhard@micromata.de>
Date: Tue, 15 Jan 2019 23:13:16 +0000
Subject: [PATCH] Show old jobs...

---
 borgbutler-webapp/src/components/views/jobs/JobMonitorPanel.jsx                   |   60 ++++++++++++++++++++++++------
 borgbutler-core/src/main/java/de/micromata/borgbutler/jobs/JobQueue.java          |    8 +++
 borgbutler-server/src/main/java/de/micromata/borgbutler/server/rest/JobsRest.java |    9 ++--
 borgbutler-core/src/main/java/de/micromata/borgbutler/BorgQueueExecutor.java      |    5 +-
 4 files changed, 63 insertions(+), 19 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 86f2743..ac0eb44 100644
--- a/borgbutler-core/src/main/java/de/micromata/borgbutler/BorgQueueExecutor.java
+++ b/borgbutler-core/src/main/java/de/micromata/borgbutler/BorgQueueExecutor.java
@@ -78,16 +78,17 @@
      * For displaying purposes.
      *
      * @param repoConfig
+     * @param oldJobs If false, the running and queued jobs are returned, otherwise the done ones.
      * @return A list of all jobs of the queue (as copies).
      */
-    public List<BorgJob<?>> getJobListCopy(BorgRepoConfig repoConfig) {
+    public List<BorgJob<?>> getJobListCopy(BorgRepoConfig repoConfig, boolean oldJobs) {
         JobQueue<String> origQueue = getQueue(repoConfig);
         List<BorgJob<?>> jobList = new ArrayList<>();
         if (origQueue == null) {
             return jobList;
         }
         synchronized (origQueue) {
-            Iterator<AbstractJob<String>> it = origQueue.getQueueIterator();
+            Iterator<AbstractJob<String>> it = oldJobs ? origQueue.getOldJobsIterator() : origQueue.getQueueIterator();
             while (it.hasNext()) {
                 AbstractJob<String> origJob = it.next();
                 if (!(origJob instanceof BorgJob)) {
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 e040676..439acff 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
@@ -9,7 +9,7 @@
 import java.util.concurrent.Executors;
 
 public class JobQueue<T> {
-    private static final int MAX_OLD_JOBS_SIZE = 50;
+    private static final int MAX_OLD_JOBS_SIZE = 10;
     private static long jobSequence = 0;
     private Logger log = LoggerFactory.getLogger(JobQueue.class);
     private List<AbstractJob<T>> queue = new ArrayList<>();
@@ -43,6 +43,12 @@
         }
     }
 
+    public Iterator<AbstractJob<T>> getOldJobsIterator() {
+        synchronized (oldJobs) {
+            return Collections.unmodifiableList(oldJobs).iterator();
+        }
+    }
+
     /**
      * Searches only for queued jobs (not done jobs).
      *
diff --git a/borgbutler-server/src/main/java/de/micromata/borgbutler/server/rest/JobsRest.java b/borgbutler-server/src/main/java/de/micromata/borgbutler/server/rest/JobsRest.java
index a74ab74..7c6539c 100644
--- a/borgbutler-server/src/main/java/de/micromata/borgbutler/server/rest/JobsRest.java
+++ b/borgbutler-server/src/main/java/de/micromata/borgbutler/server/rest/JobsRest.java
@@ -39,6 +39,7 @@
      */
     public String getJobs(@QueryParam("repo") String repo,
                           @QueryParam("testMode") boolean testMode,
+                          @QueryParam("oldJobs") boolean oldJobs,
                           @QueryParam("prettyPrinter") boolean prettyPrinter) {
         if (testMode) {
             // Return dynamic test queue:
@@ -51,13 +52,13 @@
         BorgQueueExecutor borgQueueExecutor = BorgQueueExecutor.getInstance();
         List<JsonJobQueue> queueList = new ArrayList<>();
         if (validRepo) { // Get only the queue of the given repo:
-            JsonJobQueue queue = getQueue(repo);
+            JsonJobQueue queue = getQueue(repo, oldJobs);
             if (queue != null) {
                 queueList.add(queue);
             }
         } else { // Get all the queues (of all repos).
             for (String rep : borgQueueExecutor.getRepos()) {
-                JsonJobQueue queue = getQueue(rep);
+                JsonJobQueue queue = getQueue(rep, oldJobs);
                 if (queue != null) {
                     queueList.add(queue);
                 }
@@ -66,13 +67,13 @@
         return JsonUtils.toJson(queueList, prettyPrinter);
     }
 
-    private JsonJobQueue getQueue(String repo) {
+    private JsonJobQueue getQueue(String repo, boolean oldJobs) {
         BorgQueueExecutor borgQueueExecutor = BorgQueueExecutor.getInstance();
         BorgRepoConfig repoConfig = ConfigurationHandler.getConfiguration().getRepoConfig(repo);
         if (repoConfig == null) {
             return null;
         }
-        List<BorgJob<?>> borgJobList = borgQueueExecutor.getJobListCopy(repoConfig);
+        List<BorgJob<?>> borgJobList = borgQueueExecutor.getJobListCopy(repoConfig, oldJobs);
         if (CollectionUtils.isEmpty(borgJobList))
             return null;
         JsonJobQueue queue = new JsonJobQueue().setRepo(repoConfig.getDisplayName());
diff --git a/borgbutler-webapp/src/components/views/jobs/JobMonitorPanel.jsx b/borgbutler-webapp/src/components/views/jobs/JobMonitorPanel.jsx
index 759cab2..83fcdbb 100644
--- a/borgbutler-webapp/src/components/views/jobs/JobMonitorPanel.jsx
+++ b/borgbutler-webapp/src/components/views/jobs/JobMonitorPanel.jsx
@@ -1,5 +1,5 @@
 import React from 'react';
-import {Button} from 'reactstrap';
+import {Button, Collapse} from 'reactstrap';
 import {getRestServiceUrl, isDevelopmentMode} from '../../../utilities/global';
 import JobQueue from './JobQueue';
 import ErrorAlert from '../archives/ArchiveView';
@@ -8,12 +8,13 @@
 class JobMonitorPanel extends React.Component {
     state = {
         isFetching: false,
-        testMode: false
+        testMode: false,
+        collapseOldJobs: false
     };
 
     componentDidMount = () => {
-        this.fetchQueues();
-        this.interval = setInterval(() => this.fetchQueues(), 2000);
+        this.fetchQueues(false);
+        this.interval = setInterval(() => this.fetchQueues(false), 2000);
     };
 
     componentWillUnmount() {
@@ -26,14 +27,23 @@
         });
     }
 
-    fetchQueues = () => {
+    toggleOldJobs() {
+        if (!this.state.collapseOldJobs) {
+            this.fetchQueues(true);
+        }
+        this.setState({collapseOldJobs: !this.state.collapseOldJobs});
+    }
+
+
+    fetchQueues = (oldJobs) => {
         this.setState({
             isFetching: true,
             failed: false
         });
         fetch(getRestServiceUrl('jobs', {
             repo: this.props.repo,
-            testMode: this.state.testMode
+            testMode: this.state.testMode,
+            oldJobs: oldJobs
         }), {
             method: 'GET',
             headers: {
@@ -45,10 +55,17 @@
                 const queues = json.map(queue => {
                     return queue;
                 });
-                this.setState({
-                    isFetching: false,
-                    queues
-                });
+                if (oldJobs) {
+                    this.setState({
+                        isFetching: false,
+                        oldJobsQueues: queues
+                    });
+                } else {
+                    this.setState({
+                        isFetching: false,
+                        queues: queues
+                    });
+                }
             })
             .catch(() => this.setState({isFetching: false, failed: true}));
     };
@@ -85,8 +102,24 @@
                 content = <React.Fragment>No jobs are running or queued.</React.Fragment>
             }
         }
+        let oldJobs = 'Old jobs...';
+        if (this.state.oldJobsQueues && this.state.oldJobsQueues.length > 0) {
+            oldJobs = <React.Fragment>
+                {this.state.oldJobsQueues
+                    .map((queue) => <JobQueue
+                        embedded={this.props.embedded}
+                        queue={queue}
+                        key={queue.repo}
+                    />)}
+            </React.Fragment>
+        }
         return <React.Fragment>
             {content}
+            <h5 onClick={this.toggleOldJobs}>Show old jobs
+            </h5>
+            <Collapse isOpen={this.state.collapseOldJobs}>
+                {oldJobs}
+            </Collapse>
         </React.Fragment>;
     }
 
@@ -95,15 +128,18 @@
 
         this.fetchQueues = this.fetchQueues.bind(this);
         this.toggleTestMode = this.toggleTestMode.bind(this);
+        this.toggleOldJobs = this.toggleOldJobs.bind(this);
     }
 }
 
-JobMonitorPanel.propTypes = {
+JobMonitorPanel
+    .propTypes = {
     embedded: PropTypes.bool,
     repo: PropTypes.string
 };
 
-JobMonitorPanel.defaultProps = {
+JobMonitorPanel
+    .defaultProps = {
     embedded: true,
     repo: null
 };

--
Gitblit v1.10.0