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 658b31d6bb58c00d83e0f479e38e96e376250044..f55d820e4853d852b5b929f89459c49266126b62 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 @@ -258,6 +258,12 @@ public class Job { } } + public List<String> getFileContents(List<String> logs) { + try (HaaSFileTransfer transfer = haasClientSupplier.get().startFileTransfer(getId(), new DummyProgressNotifier())) { + return transfer.getContent(logs); + } + } + diff --git a/haas-java-client/src/main/java/cz/it4i/fiji/haas_java_client/HaaSFileTransfer.java b/haas-java-client/src/main/java/cz/it4i/fiji/haas_java_client/HaaSFileTransfer.java index e3b427f2a1cdbdfbaef67fbfa10b3a5d9bc789a8..c6c8a4b9b31142c0b5041b1ccf1882bae1a82b4d 100644 --- a/haas-java-client/src/main/java/cz/it4i/fiji/haas_java_client/HaaSFileTransfer.java +++ b/haas-java-client/src/main/java/cz/it4i/fiji/haas_java_client/HaaSFileTransfer.java @@ -18,4 +18,5 @@ public interface HaaSFileTransfer extends Closeable { List<Long> obtainSize(List<String> files); + List<String> getContent(List<String> logs); } diff --git a/haas-java-client/src/main/java/cz/it4i/fiji/haas_java_client/HaaSFileTransferImp.java b/haas-java-client/src/main/java/cz/it4i/fiji/haas_java_client/HaaSFileTransferImp.java index 6d59b42f6240640ab78a8f692f43d17e00e39bad..bf07f5bda386340a0279b94f9e7e4b0fa8d52abb 100644 --- a/haas-java-client/src/main/java/cz/it4i/fiji/haas_java_client/HaaSFileTransferImp.java +++ b/haas-java-client/src/main/java/cz/it4i/fiji/haas_java_client/HaaSFileTransferImp.java @@ -1,9 +1,11 @@ package cz.it4i.fiji.haas_java_client; +import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; import java.nio.file.Path; import java.rmi.RemoteException; +import java.util.LinkedList; import java.util.List; import java.util.stream.Collectors; import java.util.stream.StreamSupport; @@ -21,6 +23,7 @@ import cz.it4i.fiji.scpclient.ScpClient; class HaaSFileTransferImp implements HaaSFileTransfer { + @SuppressWarnings("unused") private static Logger log = LoggerFactory.getLogger(cz.it4i.fiji.haas_java_client.HaaSFileTransferImp.class); private FileTransferMethodExt ft; @@ -115,4 +118,37 @@ class HaaSFileTransferImp implements HaaSFileTransfer { } + //TASK merge with download - stream provider for file, consumer for stream + @Override + public List<String> getContent(List<String> files) { + List<String> result = new LinkedList<>(); + List<Long> fileSizes; + try { + fileSizes = HaaSClient.getSizes(StreamSupport.stream(files.spliterator(), false) + .map(filename -> "'" + ft.getSharedBasepath() + "/" + filename + "'").collect(Collectors.toList()), + scpClient, new P_ProgressNotifierDecorator4Size(notifier)); + + final long totalFileSize = fileSizes.stream().mapToLong(i -> i.longValue()).sum(); + TransferFileProgressForHaaSClient progress = new TransferFileProgressForHaaSClient(totalFileSize, notifier); + int idx = 0; + for (String fileName : files) { + fileName = fileName.replaceFirst("/", ""); + try(ByteArrayOutputStream os = new ByteArrayOutputStream()) { + String fileToDownload = "'" + ft.getSharedBasepath() + "/" + fileName + "'"; + String item; + progress.addItem(item = fileName); + progress.startNewFile(fileSizes.get(idx)); + scpClient.download(fileToDownload, os, progress); + os.flush(); + progress.itemDone(item); + idx++; + result.add(os.toString()); + } + } + } catch (JSchException | IOException e) { + throw new HaaSClientException(e); + } + return result; + } + } diff --git a/haas-spim-benchmark/src/main/java/cz/it4i/fiji/haas_spim_benchmark/core/BenchmarkJobManager.java b/haas-spim-benchmark/src/main/java/cz/it4i/fiji/haas_spim_benchmark/core/BenchmarkJobManager.java index fba4aba1cc71338aa91b4839f474f1fe678a249c..432729852937ac4330c0283b3f9b74286b52da36 100644 --- a/haas-spim-benchmark/src/main/java/cz/it4i/fiji/haas_spim_benchmark/core/BenchmarkJobManager.java +++ b/haas-spim-benchmark/src/main/java/cz/it4i/fiji/haas_spim_benchmark/core/BenchmarkJobManager.java @@ -374,6 +374,11 @@ public class BenchmarkJobManager { @Override public List<Long> getFileSizes(List<String> names) { return job.getFileSizes(names); + } + + @Override + public List<String> getFileContents(List<String> logs) { + return job.getFileContents(logs); }; }; diff --git a/haas-spim-benchmark/src/main/java/cz/it4i/fiji/haas_spim_benchmark/core/SPIMComputationAccessor.java b/haas-spim-benchmark/src/main/java/cz/it4i/fiji/haas_spim_benchmark/core/SPIMComputationAccessor.java index 086f97440db414c27f0637c698c56939e77cacea..3b1a6a9bbd69528d4eabc6c1c9ec41dec980e383 100644 --- a/haas-spim-benchmark/src/main/java/cz/it4i/fiji/haas_spim_benchmark/core/SPIMComputationAccessor.java +++ b/haas-spim-benchmark/src/main/java/cz/it4i/fiji/haas_spim_benchmark/core/SPIMComputationAccessor.java @@ -15,4 +15,6 @@ public interface SPIMComputationAccessor extends HaaSOutputHolder { Collection<String> getChangedFiles(); List<Long> getFileSizes(List<String> names); + + List<String> getFileContents(List<String> logs); } diff --git a/haas-spim-benchmark/src/main/java/cz/it4i/fiji/haas_spim_benchmark/core/SPIMComputationAccessorDecoratorWithTimeout.java b/haas-spim-benchmark/src/main/java/cz/it4i/fiji/haas_spim_benchmark/core/SPIMComputationAccessorDecoratorWithTimeout.java index 11e132499ce68a9ee53b562413575b232c642de5..3f9b2ce48d1a6a3a2832d13241891cdf8613d3af 100644 --- a/haas-spim-benchmark/src/main/java/cz/it4i/fiji/haas_spim_benchmark/core/SPIMComputationAccessorDecoratorWithTimeout.java +++ b/haas-spim-benchmark/src/main/java/cz/it4i/fiji/haas_spim_benchmark/core/SPIMComputationAccessorDecoratorWithTimeout.java @@ -55,6 +55,11 @@ public class SPIMComputationAccessorDecoratorWithTimeout implements SPIMComputat public List<Long> getFileSizes(List<String> names) { return decorated.getFileSizes(names); } + + @Override + public List<String> getFileContents(List<String> logs) { + return decorated.getFileContents(logs); + } private void initAllowedTypes(Set<SynchronizableFileType> allowedTypes) { for (SynchronizableFileType type : allowedTypes) { diff --git a/haas-spim-benchmark/src/main/java/cz/it4i/fiji/haas_spim_benchmark/core/TaskComputation.java b/haas-spim-benchmark/src/main/java/cz/it4i/fiji/haas_spim_benchmark/core/TaskComputation.java index 39802fe262facf4522329945e3ec2b64c49a63ea..f34934f4f6b9de56e192c09ba1a359c892c11a81 100644 --- a/haas-spim-benchmark/src/main/java/cz/it4i/fiji/haas_spim_benchmark/core/TaskComputation.java +++ b/haas-spim-benchmark/src/main/java/cz/it4i/fiji/haas_spim_benchmark/core/TaskComputation.java @@ -14,7 +14,6 @@ import com.google.common.collect.Streams; import cz.it4i.fiji.haas_java_client.JobState; import cz.it4i.fiji.haas_java_client.SynchronizableFileType; -import io.scif.jj2000.j2k.NotImplementedError; public class TaskComputation { @@ -34,6 +33,28 @@ public class TaskComputation { public String getContent() { return content; } + + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (getClass() != obj.getClass()) + return false; + Log other = (Log) obj; + if (content == null) { + if (other.content != null) + return false; + } else if (!content.equals(other.content)) + return false; + if (name == null) { + if (other.name != null) + return false; + } else if (!name.equals(other.name)) + return false; + return true; + } } public static class File { @@ -62,7 +83,6 @@ public class TaskComputation { private int positionInOutput; private Collection<String> inputs; - @SuppressWarnings("unused") private Collection<String> outputs; private Collection<String> logs; private Long id; @@ -116,7 +136,10 @@ public class TaskComputation { } public Collection<Log> getLogs() { - throw new NotImplementedError(); + List<String> logNames = new LinkedList<>(logs); + List<String> contents = computationAccessor.getFileContents(logNames); + return Streams.<String, String, Log>zip(logNames.stream(), contents.stream(), + (name, content) -> new Log(name, content)).collect(Collectors.toList()); } /** diff --git a/haas-spim-benchmark/src/main/java/cz/it4i/fiji/haas_spim_benchmark/ui/SPIMPipelineProgressViewController.java b/haas-spim-benchmark/src/main/java/cz/it4i/fiji/haas_spim_benchmark/ui/SPIMPipelineProgressViewController.java index a50ce0cdfe7227e5d03cb3ffd70e3d62685eac1b..57813409aefdf5daa4a805de5ed0fb4f622cdb61 100644 --- a/haas-spim-benchmark/src/main/java/cz/it4i/fiji/haas_spim_benchmark/ui/SPIMPipelineProgressViewController.java +++ b/haas-spim-benchmark/src/main/java/cz/it4i/fiji/haas_spim_benchmark/ui/SPIMPipelineProgressViewController.java @@ -123,7 +123,7 @@ public class SPIMPipelineProgressViewController extends BorderPane implements Cl Window w = new Window(); w.addWindowListener(new WindowAdapter() { @Override - public void windowClosed(WindowEvent e) { + public void windowClosing(WindowEvent e) { adapter.close(); } }); diff --git a/haas-spim-benchmark/src/main/java/cz/it4i/fiji/haas_spim_benchmark/ui/TaskComputationAdapter.java b/haas-spim-benchmark/src/main/java/cz/it4i/fiji/haas_spim_benchmark/ui/TaskComputationAdapter.java index 10ae4fdeae86bf6087dd66f7d4fb5f6d3f7eadf1..40750677982308c630b1d48ec805b2e96bd61f42 100644 --- a/haas-spim-benchmark/src/main/java/cz/it4i/fiji/haas_spim_benchmark/ui/TaskComputationAdapter.java +++ b/haas-spim-benchmark/src/main/java/cz/it4i/fiji/haas_spim_benchmark/ui/TaskComputationAdapter.java @@ -6,23 +6,31 @@ import java.util.List; import java.util.Map; import java.util.Timer; import java.util.TimerTask; +import java.util.stream.Collectors; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import cz.it4i.fiji.haas_spim_benchmark.core.Constants; import cz.it4i.fiji.haas_spim_benchmark.core.TaskComputation; +import cz.it4i.fiji.haas_spim_benchmark.core.TaskComputation.Log; import javafx.beans.value.ObservableValue; import javafx.beans.value.ObservableValueBase; -//TASK: Dodělat naplnění logs, aktualizace a getXXX -// Pokračovat zapojením do UI - akce v SPIMPipelineProgressViewWindow -// pro zobrazení TaskComputation +//TASK: Pokračovat zapojením do UI - upravit pro TaskComputation +//TASK: dodělat progress dialog + modalita +// public class TaskComputationAdapter implements Closeable { + @SuppressWarnings("unused") + private static Logger log = LoggerFactory + .getLogger(cz.it4i.fiji.haas_spim_benchmark.ui.TaskComputationAdapter.class); + private final TaskComputation computation; private final List<ObservableValue<RemoteFileInfo>> outputs = new LinkedList<>(); - @SuppressWarnings("unused") - private final List<ObservableValue<String>> logs = new LinkedList<>(); + private final List<ObservableLog> logs = new LinkedList<>(); private final Timer timer; @@ -31,6 +39,7 @@ public class TaskComputationAdapter implements Closeable { timer = new Timer(); Map<String, Long> sizes = computation.getOutFileSizes(); computation.getOutputs().forEach(outputFile -> addOutputFile(outputFile, sizes.get(outputFile))); + computation.getLogs().forEach(log->logs.add(new ObservableLog(log))); timer.scheduleAtFixedRate(new P_TimerTask(), Constants.HAAS_TIMEOUT, Constants.HAAS_TIMEOUT); } @@ -42,22 +51,16 @@ public class TaskComputationAdapter implements Closeable { public List<ObservableValue<RemoteFileInfo>> getOutputs() { return outputs; } + + public List<ObservableLog> getLogs() { + return logs; + } private void addOutputFile(String outputFile, Long size) { outputs.add(new ObservableOutputFile(outputFile, size)); } - public static class Log { - public String getName() { - return null; - } - - public ObservableValue<String> getContent() { - return null; - } - } - - public class ObservableOutputFile extends ObservableValueBase<RemoteFileInfo> { + private class ObservableOutputFile extends ObservableValueBase<RemoteFileInfo> { private final String name; @@ -95,11 +98,65 @@ public class TaskComputationAdapter implements Closeable { } } + public static class ObservableLog { + + private final String name; + + private final P_ObservableString value; + + public ObservableLog(Log content) { + this.value = new P_ObservableString(content.getContent()); + this.name = log.getName(); + } + + public String getName() { + return name; + } + + public ObservableValue<String> getContent() { + return value; + } + + public void setContentValue(Log log) { + if (!log.getName().equals(log.getName())) { + throw new IllegalArgumentException( + "this.name=" + getName() + ", log.name=" + log.getName()); + } + value.setValue(log.getContent()); + } + + private class P_ObservableString extends ObservableValueBase<String> { + + private String value; + + public P_ObservableString(String value) { + this.value = value; + } + + @Override + public String getValue() { + return value; + } + + public void setValue(String value) { + if(this.value != null && !this.value.equals(value) || + value != null && !value.equals(this.value)) { + this.value = value; + fireValueChangedEvent(); + } + } + } + + } + private class P_TimerTask extends TimerTask { @Override public void run() { Map<String, Long> sizes = computation.getOutFileSizes(); + Map<String, Log> logs = computation.getLogs().stream() + .collect(Collectors.<Log, String, Log>toMap((Log log) -> log.getName(), (Log log) -> log)); + TaskComputationAdapter.this.logs.forEach(log->((ObservableLog) log).setContentValue(logs.get(log.getName()))); outputs.forEach(value -> ((ObservableOutputFile) value).setSize(sizes.get(value.getValue().getName()))); }