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