From 6ff74e6e78e27fbcb751dcf20c9e61dafb78caed Mon Sep 17 00:00:00 2001
From: Kai Reinhard <K.Reinhard@micromata.de>
Date: Fri, 04 Jan 2019 22:58:46 +0000
Subject: [PATCH] Job progress...

---
 borgbutler-core/src/main/java/de/micromata/borgbutler/BorgJob.java |   48 +++++++++++++++++++++++++++++++++++++++++++++++-
 1 files changed, 47 insertions(+), 1 deletions(-)

diff --git a/borgbutler-core/src/main/java/de/micromata/borgbutler/BorgJob.java b/borgbutler-core/src/main/java/de/micromata/borgbutler/BorgJob.java
index a2db33a..dac519a 100644
--- a/borgbutler-core/src/main/java/de/micromata/borgbutler/BorgJob.java
+++ b/borgbutler-core/src/main/java/de/micromata/borgbutler/BorgJob.java
@@ -2,8 +2,13 @@
 
 import de.micromata.borgbutler.config.BorgRepoConfig;
 import de.micromata.borgbutler.config.ConfigurationHandler;
+import de.micromata.borgbutler.data.Archive;
 import de.micromata.borgbutler.jobs.AbstractCommandLineJob;
+import de.micromata.borgbutler.json.JsonUtils;
+import de.micromata.borgbutler.json.borg.ProgressMessage;
+import lombok.AccessLevel;
 import lombok.Getter;
+import lombok.Setter;
 import org.apache.commons.exec.CommandLine;
 import org.apache.commons.exec.environment.EnvironmentUtils;
 import org.apache.commons.lang3.StringUtils;
@@ -17,19 +22,29 @@
  * A queue is important because Borg doesn't support parallel calls for one repository.
  * For each repository one single queue is allocated.
  */
-public class BorgJob<T> extends AbstractCommandLineJob {
+public class BorgJob<T> extends AbstractCommandLineJob implements Cloneable {
     private Logger log = LoggerFactory.getLogger(BorgJob.class);
     @Getter
     private BorgCommand command;
+    /**
+     * Some jobs may store here the result of the command (e. g. {@link BorgCommands#listArchiveContent(BorgRepoConfig, Archive)}).
+     */
     @Getter
     protected T payload;
 
+    @Getter
+    @Setter(AccessLevel.PROTECTED)
+    private ProgressMessage progressMessage;
+
     public BorgJob(BorgCommand command) {
         this.command = command;
         setWorkingDirectory(command.getWorkingDir());
         setDescription(command.getDescription());
     }
 
+    private BorgJob() {
+    }
+
     @Override
     protected CommandLine buildCommandLine() {
         CommandLine commandLine = new CommandLine(ConfigurationHandler.getConfiguration().getBorgCommand());
@@ -52,6 +67,24 @@
         return commandLine;
     }
 
+    protected void processStdErrLine(String line, int level) {
+        log.info(line);
+        try {
+            if (StringUtils.startsWith(line, "{\"message")) {
+                ProgressMessage message = JsonUtils.fromJson(ProgressMessage.class, line);
+                if (message != null) {
+                    log.info(JsonUtils.toJson(progressMessage));
+                    progressMessage = message;
+                    return;
+                }
+            }
+            errorOutputStream.write(line.getBytes());
+            errorOutputStream.write("\n".getBytes());
+        } catch (IOException ex) {
+            log.error(ex.getMessage(), ex);
+        }
+    }
+
     @Override
     protected Map<String, String> getEnvironment() throws IOException {
         BorgRepoConfig repoConfig = command.getRepoConfig();
@@ -70,4 +103,17 @@
         }
         return env;
     }
+
+    @Override
+    public BorgJob<?> clone() {
+        BorgJob<?> clone = new BorgJob<>();
+        clone.setTitle(getTitle());
+        clone.setExecuteStarted(isExecuteStarted());
+        clone.setCommandLineAsString(getCommandLineAsString());
+        clone.setCancelledRequested(isCancelledRequested());
+        clone.setStatus(getStatus());
+        clone.setWorkingDirectory(getWorkingDirectory());
+        clone.setDescription(getDescription());
+        return clone;
+    }
 }

--
Gitblit v1.10.0