From 2ce3b5073ad52862ff9d1aa6c2690941f94d8429 Mon Sep 17 00:00:00 2001
From: Jan Kozusznik <jan@kozusznik.cz>
Date: Wed, 22 Nov 2017 15:25:42 +0100
Subject: [PATCH] show progress for download

---
 .../cz/it4i/fiji/haas/CheckStatusOfHaaS.java  | 25 ++++++++++++++++-
 .../src/main/java/cz/it4i/fiji/haas/Job.java  | 27 +++++++++----------
 .../java/cz/it4i/fiji/haas/JobManager.java    | 13 ++++++---
 .../java/cz/it4i/fiji/haas/RunWithHaaS.java   |  1 -
 .../fiji/haas_java_client/HaaSClient.java     |  9 +++----
 5 files changed, 49 insertions(+), 26 deletions(-)

diff --git a/haas-imagej-client/src/main/java/cz/it4i/fiji/haas/CheckStatusOfHaaS.java b/haas-imagej-client/src/main/java/cz/it4i/fiji/haas/CheckStatusOfHaaS.java
index 984cde4f..b38ce51f 100644
--- a/haas-imagej-client/src/main/java/cz/it4i/fiji/haas/CheckStatusOfHaaS.java
+++ b/haas-imagej-client/src/main/java/cz/it4i/fiji/haas/CheckStatusOfHaaS.java
@@ -5,6 +5,7 @@ import java.io.File;
 import java.io.IOException;
 import java.nio.file.Path;
 import java.nio.file.Paths;
+import java.util.Collection;
 
 import org.scijava.Context;
 import org.scijava.command.Command;
@@ -18,6 +19,8 @@ import org.scijava.widget.UIComponent;
 import cz.it4i.fiji.haas.JobManager.JobInfo;
 import javafx.application.Platform;
 import net.imagej.ImageJ;
+import net.imagej.ui.swing.updater.ProgressDialog;
+import net.imagej.updater.util.Progress;
 
 /**
  * 
@@ -50,7 +53,27 @@ public class CheckStatusOfHaaS implements Command {
 			} else {
 				CheckStatusOfHaaSWindow window;
 				(window = new CheckStatusOfHaaSWindow(getFrame(),context)).setVisible(true);
-				Platform.runLater(() -> jobManager.getJobs().forEach(job -> window.addJob(job)));
+				
+				Platform.runLater(() -> {
+					Progress dialog = new ProgressDialog(getFrame());
+					dialog.setTitle("Downloading info about jobs");
+					Collection<JobInfo> jobs = jobManager.getJobs();
+					int count = 0;
+					for(JobInfo ji: jobs) {
+						String item;
+						dialog.addItem(item = "job id:" + ji.getId());
+						try {
+							ji.updateInfo();
+						} catch (IOException e) {
+							log.error(e);
+						}
+						window.addJob(ji);
+						dialog.itemDone(item);
+						dialog.setCount(count, jobs.size());
+						count++;
+					}
+					dialog.done();
+				});
 			}
 		} catch (IOException e) {
 			log.error(e);
diff --git a/haas-imagej-client/src/main/java/cz/it4i/fiji/haas/Job.java b/haas-imagej-client/src/main/java/cz/it4i/fiji/haas/Job.java
index 8dc3b344..9b66280f 100644
--- a/haas-imagej-client/src/main/java/cz/it4i/fiji/haas/Job.java
+++ b/haas-imagej-client/src/main/java/cz/it4i/fiji/haas/Job.java
@@ -41,12 +41,9 @@ public class Job {
 	private Supplier<HaaSClient> haasClientSupplier;
 
 	private JobState state;
-
 	private Boolean needsDownload;
-
-	private Long jobId;
-
 	private JobInfo jobInfo;
+	private Long jobId;
 
 	final private Progress dummy = new Progress() {
 		
@@ -81,15 +78,13 @@ public class Job {
 		long id = client.start(files, "TestOutRedirect", Collections.emptyList(), new P_ProgressNotifierAdapter(progress));
 		jobDir = path.resolve("" + id);
 		Files.createDirectory(jobDir);
-		state = updateJobInfo().getState();
-		saveJobinfo();
+		updateState();
 	}
 
 	public Job(Path p, Supplier<HaaSClient> haasClientSupplier) throws IOException {
 		this(haasClientSupplier);
 		jobDir = p;
 		loadJobInfo();
-		updateState();
 	}
 
 	private Job(Supplier<HaaSClient> haasClientSupplier) {
@@ -141,6 +136,14 @@ public class Job {
 		return state;
 	}
 
+	public Calendar getStartTime() {
+		return jobInfo.getStartTime();
+	}
+
+	public Calendar getEndTime() {
+		return jobInfo.getEndTime();
+	}
+
 	private synchronized void saveJobinfo() throws IOException {
 		try (OutputStream ow = Files.newOutputStream(jobDir.resolve(JOB_INFO_FILE),
 				StandardOpenOption.TRUNCATE_EXISTING, StandardOpenOption.CREATE)) {
@@ -175,15 +178,9 @@ public class Job {
 	private static long getJobId(Path path) {
 		return Long.parseLong(path.getFileName().toString());
 	}
-
-	public Calendar getStartTime() {
-		return jobInfo.getStartTime();
-	}
-
-	public Calendar getEndTime() {
-		return jobInfo.getEndTime();
-	}
 	
+	
+
 	private class P_ProgressNotifierAdapter implements ProgressNotifier {
 		private Progress progress;
 
diff --git a/haas-imagej-client/src/main/java/cz/it4i/fiji/haas/JobManager.java b/haas-imagej-client/src/main/java/cz/it4i/fiji/haas/JobManager.java
index e18b72e7..1517be71 100644
--- a/haas-imagej-client/src/main/java/cz/it4i/fiji/haas/JobManager.java
+++ b/haas-imagej-client/src/main/java/cz/it4i/fiji/haas/JobManager.java
@@ -6,6 +6,7 @@ import java.nio.file.Path;
 import java.util.Collection;
 import java.util.Iterator;
 import java.util.LinkedList;
+import java.util.stream.Collectors;
 
 import org.scijava.Context;
 
@@ -25,7 +26,6 @@ public class JobManager {
 	private Context context;
 
 	public JobManager(Path workDirectory, Context ctx) throws IOException {
-		super();
 		this.context = ctx;
 		this.workDirectory = workDirectory;
 		context.inject(this);
@@ -39,6 +39,7 @@ public class JobManager {
 
 	}
 
+	
 	private Job inject(Job job) {
 		context.inject(job);
 		return job;
@@ -52,8 +53,8 @@ public class JobManager {
 		return () -> jobs.stream().filter(j -> j.needsDownload()).map(j -> new JobInfo(j)).iterator();
 	}
 
-	public Iterable<JobInfo> getJobs() {
-		return () -> jobs.stream().map(j -> new JobInfo(j)).iterator();
+	public Collection<JobInfo> getJobs() {
+		return jobs.stream().map(j -> new JobInfo(j)).collect(Collectors.toList());
 	}
 
 	public void downloadJob(Long id) {
@@ -97,11 +98,15 @@ public class JobManager {
 		public String getEndTime() {
 			return job.getEndTime() != null ? job.getEndTime().getTime().toString() : "N/A";
 		}
-
+		
 		public void downloadData(Progress progress) {
 			job.download(progress);
 			fireValueChangedEvent();
 		}
+		
+		public void updateInfo() throws IOException {
+			job.updateState();
+		}
 
 		@Override
 		public JobInfo getValue() {
diff --git a/haas-imagej-client/src/main/java/cz/it4i/fiji/haas/RunWithHaaS.java b/haas-imagej-client/src/main/java/cz/it4i/fiji/haas/RunWithHaaS.java
index d0c2f2f6..200b77e3 100644
--- a/haas-imagej-client/src/main/java/cz/it4i/fiji/haas/RunWithHaaS.java
+++ b/haas-imagej-client/src/main/java/cz/it4i/fiji/haas/RunWithHaaS.java
@@ -16,7 +16,6 @@ import org.scijava.plugin.Plugin;
 
 import net.imagej.ImageJ;
 import net.imagej.ui.swing.updater.ProgressDialog;
-import net.imagej.updater.util.Progress;
 /**
  * 
  * @author koz01
diff --git a/haas-java-client/src/main/java/cz/it4i/fiji/haas_java_client/HaaSClient.java b/haas-java-client/src/main/java/cz/it4i/fiji/haas_java_client/HaaSClient.java
index 9b74bd88..af64b4b3 100644
--- a/haas-java-client/src/main/java/cz/it4i/fiji/haas_java_client/HaaSClient.java
+++ b/haas-java-client/src/main/java/cz/it4i/fiji/haas_java_client/HaaSClient.java
@@ -249,6 +249,7 @@ public class HaaSClient {
 
 	public void download(long jobId, Path workDirectory, final ProgressNotifier notifier) {
 		try {
+			notifier.setTitle("Downloading");
 			FileTransferMethodExt ft = getFileTransfer().getFileTransferMethod(jobId, getSessionID());
 			try (ScpClient scpClient = getScpClient(ft)) {
 				String[] files = getFileTransfer().listChangedFilesForJob(jobId, getSessionID());
@@ -256,8 +257,6 @@ public class HaaSClient {
 						.map(filename -> ft.getSharedBasepath() + "/" + filename).collect(Collectors.toList()),
 						scpClient);
 				final long totalFileSize = fileSizes.stream().mapToLong(i -> i.longValue()).sum();
-				
-				notifier.setTitle("Downloading");
 				int[] idx = { 0 };
 				final int[] totalDownloaded = { 0 };
 				for (String fileName : files) {
@@ -281,8 +280,8 @@ public class HaaSClient {
 						public void dataTransfered(long bytesTransfered) {
 							totalDownloaded[0] += bytesTransfered;
 							fileDownloaded[0] += bytesTransfered;
-							notifier.setCount((int) (totalDownloaded[0]), (int) (totalFileSize >> 10));
-							notifier.setItemCount((int) (fileDownloaded[0]), (int) (fileSizes.get(idx[0]) >> 10));
+							notifier.setCount((int) (totalDownloaded[0] >> 10), (int) (Math.max(totalFileSize,totalDownloaded[0]) >> 10));
+							notifier.setItemCount((int) (fileDownloaded[0] >> 10), (int) ( Math.max(fileSizes.get(idx[0]),fileDownloaded[0]) >> 10));
 
 						}
 					});
@@ -301,7 +300,7 @@ public class HaaSClient {
 	private List<Long> getSizes(List<String> asList, ScpClient scpClient) throws JSchException, IOException {
 		List<Long> result = new LinkedList<>();
 		for (String lfile : asList) {
-			result.add(scpClient.size(lfile).get(0));
+			result.add(0l);//scpClient.size(lfile).get(0));
 		}
 		return result;
 	}
-- 
GitLab