From ee61540c5d359c0bd6fccab7bdbeb306989415c5 Mon Sep 17 00:00:00 2001
From: Jan Kozusznik <jan@kozusznik.cz>
Date: Wed, 22 Nov 2017 16:30:23 +0100
Subject: [PATCH] inspect size correctly

---
 .../fiji/haas/CheckStatusOfHaaSWindow.java    |  5 +-
 .../haas/ui/CheckStatusOfHaaSController.java  |  9 +++-
 .../fiji/haas_java_client/HaaSClient.java     | 17 +++---
 .../cz/it4i/fiji/scpclient/ScpClient.java     | 54 ++++++++++++++++++-
 java-scpclient/src/test/java/TestSCP.java     |  2 +-
 5 files changed, 76 insertions(+), 11 deletions(-)

diff --git a/haas-imagej-client/src/main/java/cz/it4i/fiji/haas/CheckStatusOfHaaSWindow.java b/haas-imagej-client/src/main/java/cz/it4i/fiji/haas/CheckStatusOfHaaSWindow.java
index 00928d7f..b206ea2b 100644
--- a/haas-imagej-client/src/main/java/cz/it4i/fiji/haas/CheckStatusOfHaaSWindow.java
+++ b/haas-imagej-client/src/main/java/cz/it4i/fiji/haas/CheckStatusOfHaaSWindow.java
@@ -16,12 +16,15 @@ public class CheckStatusOfHaaSWindow extends FXFrame<CheckStatusOfHaaSController
 	private Context context;
 	
 	private CheckStatusOfHaaSController controller;
+
+	private Frame applicationFrame;
 	public CheckStatusOfHaaSWindow(Frame applicationFrame, Context context) {
 		super(applicationFrame,"/cz/it4i/fiji/haas/ui/CheckStatusOfHaaS.fxml");
 		this.context = context;
 		init(this::initController);
 		this.setResizable(false);
 		this.setTitle("Manage status of HaaS jobs");
+		this.applicationFrame = applicationFrame;
 	}
 	
 	public void addJob(JobInfo job) {
@@ -31,7 +34,7 @@ public class CheckStatusOfHaaSWindow extends FXFrame<CheckStatusOfHaaSController
 	private void initController(CheckStatusOfHaaSController controller) {
 		this.controller = controller;
 		context.inject(controller);
-		controller.init();
+		controller.init(applicationFrame);
 	}
 
 }
diff --git a/haas-imagej-client/src/main/java/cz/it4i/fiji/haas/ui/CheckStatusOfHaaSController.java b/haas-imagej-client/src/main/java/cz/it4i/fiji/haas/ui/CheckStatusOfHaaSController.java
index b8119d97..fa9f59dd 100644
--- a/haas-imagej-client/src/main/java/cz/it4i/fiji/haas/ui/CheckStatusOfHaaSController.java
+++ b/haas-imagej-client/src/main/java/cz/it4i/fiji/haas/ui/CheckStatusOfHaaSController.java
@@ -1,11 +1,13 @@
 package cz.it4i.fiji.haas.ui;
 
+import java.awt.Frame;
 import java.util.function.Function;
 
 import org.scijava.log.LogService;
 import org.scijava.plugin.Parameter;
 
 import cz.it4i.fiji.haas.JobManager.JobInfo;
+import javafx.application.Platform;
 import javafx.event.ActionEvent;
 import javafx.event.EventHandler;
 import javafx.fxml.FXML;
@@ -24,6 +26,8 @@ public class CheckStatusOfHaaSController {
 	@FXML
 	private TableView<JobInfo> jobs;
 
+	private Frame root;
+
 	public CheckStatusOfHaaSController() {
 
 	}
@@ -32,13 +36,14 @@ public class CheckStatusOfHaaSController {
 		jobs.getItems().add(job);
 	}
 
-	public void init() {
+	public void init(Frame root) {
 		initTable();
 		initMenu();
+		this.root = root;
 	}
 
 	private void downloadData(ActionEvent event) {
-		jobs.getSelectionModel().getSelectedItem().downloadData(new ProgressDialog(null));
+		Platform.runLater(() -> jobs.getSelectionModel().getSelectedItem().downloadData(new ProgressDialog(root)));
 	}
 	
 	private void initMenu() {
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 af64b4b3..9266e90f 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
@@ -254,8 +254,8 @@ public class HaaSClient {
 			try (ScpClient scpClient = getScpClient(ft)) {
 				String[] files = getFileTransfer().listChangedFilesForJob(jobId, getSessionID());
 				List<Long> fileSizes = getSizes(Arrays.asList(files).stream()
-						.map(filename -> ft.getSharedBasepath() + "/" + filename).collect(Collectors.toList()),
-						scpClient);
+						.map(filename -> "'" + ft.getSharedBasepath() + "/" + filename + "'").collect(Collectors.toList()),
+						scpClient, notifier);
 				final long totalFileSize = fileSizes.stream().mapToLong(i -> i.longValue()).sum();
 				int[] idx = { 0 };
 				final int[] totalDownloaded = { 0 };
@@ -280,8 +280,8 @@ public class HaaSClient {
 						public void dataTransfered(long bytesTransfered) {
 							totalDownloaded[0] += bytesTransfered;
 							fileDownloaded[0] += bytesTransfered;
-							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));
+							notifier.setCount((int) (totalDownloaded[0] >> 10), (int) (totalFileSize>> 10));
+							notifier.setItemCount((int) (fileDownloaded[0] >> 10), (int) ( fileSizes.get(idx[0]) >> 10));
 
 						}
 					});
@@ -297,11 +297,16 @@ public class HaaSClient {
 		}
 	}
 
-	private List<Long> getSizes(List<String> asList, ScpClient scpClient) throws JSchException, IOException {
+	private List<Long> getSizes(List<String> asList, ScpClient scpClient, ProgressNotifier notifier) throws JSchException, IOException {
 		List<Long> result = new LinkedList<>();
+		
+		String item;
+		notifier.addItem(item = "Checking sizes");
 		for (String lfile : asList) {
-			result.add(0l);//scpClient.size(lfile).get(0));
+			result.add(scpClient.size(lfile));
+			notifier.setItemCount(result.size(), asList.size());
 		}
+		notifier.itemDone(item);
 		return result;
 	}
 
diff --git a/java-scpclient/src/main/java/cz/it4i/fiji/scpclient/ScpClient.java b/java-scpclient/src/main/java/cz/it4i/fiji/scpclient/ScpClient.java
index a979d645..8a69e78d 100644
--- a/java-scpclient/src/main/java/cz/it4i/fiji/scpclient/ScpClient.java
+++ b/java-scpclient/src/main/java/cz/it4i/fiji/scpclient/ScpClient.java
@@ -247,7 +247,7 @@ public class ScpClient implements Closeable {
 	}
 
 	@SuppressWarnings("unchecked")
-	public List<Long> size(String lfile) throws JSchException, IOException {
+	public List<Long> sizeByLs(String lfile) throws JSchException, IOException {
 		Session session = connectionSession();
 
 		// exec 'scp -f rfile' remotely
@@ -352,4 +352,56 @@ public class ScpClient implements Closeable {
 			session = null;
 		}
 	}
+
+	public long size(String lfile) throws JSchException, IOException {
+		Session session = connectionSession();
+	
+		// exec 'scp -f rfile' remotely
+		String command = "scp -f " + lfile;
+		Channel channel = session.openChannel("exec");
+	
+		try {
+			((ChannelExec) channel).setCommand(command);
+	
+			// get I/O streams for remote scp
+			try (OutputStream out = channel.getOutputStream(); InputStream in = channel.getInputStream()) {
+	
+				channel.connect();
+	
+				byte[] buf = new byte[getBufferSize()];
+	
+				// send '\0'
+				buf[0] = 0;
+				out.write(buf, 0, 1);
+				out.flush();
+	
+				while (true) {
+					int c = checkAck(in);
+					if (c != 'C') {
+						break;
+					}
+	
+					// read '0644 '
+					in.read(buf, 0, 5);
+	
+					long filesize = 0L;
+					while (true) {
+						if (in.read(buf, 0, 1) < 0) {
+							// error
+							break;
+						}
+						if (buf[0] == ' ')
+							break;
+						filesize = filesize * 10L + (long) (buf[0] - '0');
+					}
+					return filesize;
+	
+				}
+			}
+	
+		} finally {
+			channel.disconnect();
+		}
+		return -1;
+	}
 }
diff --git a/java-scpclient/src/test/java/TestSCP.java b/java-scpclient/src/test/java/TestSCP.java
index bc70bc6d..5c20cd53 100644
--- a/java-scpclient/src/test/java/TestSCP.java
+++ b/java-scpclient/src/test/java/TestSCP.java
@@ -15,7 +15,7 @@ public class TestSCP {
 		try(ScpClient scp = new ScpClient("salomon.it4i.cz", "koz01", "/home/koz01/.ssh/it4i_rsa-np", null)) {
 //			System.out.println( scp.upload(
 //					Paths.get("/home/koz01/Work/vyzkumnik/fiji/work/aaa/spim-data/exampleSingleChannel(9).czi"), "'/home/koz01/exampleSingleChannel(9).czi'"));
-			System.out.println( scp.size("/home/koz01/exampleSingleChannel(9).czi"));
+			System.out.println( scp.size("'/home/koz01/exampleSingleChannel(9).czi'"));
 			
 		}
 	}
-- 
GitLab