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 0e92fe7ac30f71375f580d7eb682609c0310c744..38058e58e35ac021ab6a459c5344e9e21b53e7c3 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 @@ -9,6 +9,7 @@ import java.nio.file.StandardOpenOption; import java.util.Calendar; import java.util.Collections; import java.util.EnumSet; +import java.util.List; import java.util.Properties; import java.util.function.Predicate; import java.util.function.Supplier; @@ -49,73 +50,47 @@ public class Job { private Boolean needsDownload; private JobInfo jobInfo; private Long jobId; - private ProgressNotifier notifier; + - final private Progress dummy = new Progress() { - - @Override - public void setTitle(String title) { - } - - @Override - public void setItemCount(int count, int total) { - } - - @Override - public void setCount(int count, int total) { - } - - @Override - public void itemDone(Object item) { - } - - @Override - public void done() { - } - - @Override - public void addItem(Object item) { - } - }; private String name; - public Job(String name, Path basePath, Supplier<HaaSClient> haasClientSupplier, Progress progress) + public Job(String name, Path basePath, Supplier<HaaSClient> haasClientSupplier) throws IOException { - this(haasClientSupplier, progress); + this(haasClientSupplier); HaaSClient client = this.haasClientSupplier.get(); - long id = client.createJob(name, Collections.emptyList(), notifier); + long id = client.createJob(name, Collections.emptyList()); jobDir = basePath.resolve("" + id); this.name = name; Files.createDirectory(jobDir); - updateState(); + updateNeedsDownload(); } - public Job(Path p, Supplier<HaaSClient> haasClientSupplier, Progress progress) throws IOException { - this(haasClientSupplier, progress); + public Job(Path p, Supplier<HaaSClient> haasClientSupplier) throws IOException { + this(haasClientSupplier); jobDir = p; loadJobInfo(); - updateState(); + updateNeedsDownload(); } - public void uploadFiles(Iterable<UploadingFile> files) { + public void uploadFiles(Iterable<UploadingFile> files, Progress notifier) { HaaSClient client = this.haasClientSupplier.get(); - client.uploadFiles(jobId, files, notifier); + + client.uploadFiles(jobId, files, new P_ProgressNotifierAdapter(notifier)); } - public void uploadFilesByName(Iterable<String> files) { + public void uploadFilesByName(Iterable<String> files, Progress notifier) { Iterable<UploadingFile> uploadingFiles = StreamSupport.stream(files.spliterator(), false) .map((String name) -> HaaSClient.getUploadingFile(jobDir.resolve(name))).collect(Collectors.toList()); - uploadFiles(uploadingFiles); + uploadFiles(uploadingFiles, notifier); } public void submit() { HaaSClient client = this.haasClientSupplier.get(); - client.submitJob(jobId, notifier); + client.submitJob(jobId); } - private Job(Supplier<HaaSClient> haasClientSupplier, Progress progress) throws IOException { - notifier = new P_ProgressNotifierAdapter(progress); + private Job(Supplier<HaaSClient> haasClientSupplier) throws IOException { this.haasClientSupplier = haasClientSupplier; } @@ -130,16 +105,10 @@ public class Job { return jobId; } - synchronized public void updateState() throws IOException { - if (needsDownload == null - && EnumSet.of(JobState.Failed, JobState.Finished, JobState.Canceled).contains(getState())) { - needsDownload = true; - } - saveJobinfo(); - } + - public void download() { - download(x -> true, dummy); + public void download(Progress notifier) { + download(x -> true, notifier); } public Path storeDataInWorkdirectory(UploadingFile uploadingFile) throws IOException { @@ -150,11 +119,11 @@ public class Job { return result; } - synchronized public void download(Predicate<String> predicate, Progress progress) { + synchronized public void download(Predicate<String> predicate, Progress notifier) { if (!needsDownload()) { throw new IllegalStateException("Job: " + getJobId() + " doesn't need download"); } - haasClientSupplier.get().download(getJobId(), jobDir, predicate, new P_ProgressNotifierAdapter(progress)); + haasClientSupplier.get().download(getJobId(), jobDir, predicate, new P_ProgressNotifierAdapter(notifier)); needsDownload = false; try { saveJobinfo(); @@ -179,7 +148,7 @@ public class Job { return jobInfo.getEndTime(); } - public Iterable<String> getOutput(Iterable<JobSynchronizableFile> output) { + public List<String> getOutput(Iterable<JobSynchronizableFile> output) { HaaSClient.SynchronizableFiles taskFileOffset = new HaaSClient.SynchronizableFiles(); long taskId = (Long) getJobInfo().getTasks().toArray()[0]; output.forEach(file -> taskFileOffset.addFile(taskId, file.getType(), file.getOffset())); @@ -200,6 +169,22 @@ public class Job { public String getProperty(String name) throws IOException { return loadPropertiesIfExists().getProperty(name); } + + public void updateInfo() { + updateJobInfo(); + } + + public Path getDirectory() { + return jobDir; + } + + synchronized private void updateNeedsDownload() throws IOException { + if (needsDownload == null + && EnumSet.of(JobState.Failed, JobState.Finished, JobState.Canceled).contains(getState())) { + needsDownload = true; + } + saveJobinfo(); + } private synchronized void saveJobinfo() throws IOException { Properties prop = loadPropertiesIfExists(); @@ -244,6 +229,11 @@ public class Job { private void updateJobInfo() { jobInfo = haasClientSupplier.get().obtainJobInfo(getJobId()); + try { + updateNeedsDownload(); + } catch (IOException e) { + log.error(e.getMessage(), e); + } } private static boolean isValidPath(Path path) { @@ -294,4 +284,6 @@ public class Job { } + + } 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 062f69260d4465940cce5e7d3599ddbfdaa64654..2b5d9913c8a98eb12aea9c969e014629b4c3eda5 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 @@ -8,6 +8,7 @@ import java.util.Calendar; import java.util.Collection; import java.util.Iterator; import java.util.LinkedList; +import java.util.List; import java.util.function.Predicate; import java.util.stream.Collectors; @@ -24,6 +25,7 @@ import net.imagej.updater.util.Progress; public class JobManager { + @SuppressWarnings("unused") private static Logger log = LoggerFactory.getLogger(cz.it4i.fiji.haas.JobManager.class); private Path workDirectory; @@ -34,33 +36,29 @@ public class JobManager { private Settings settings; - public JobManager(Path workDirectory, Settings settings){ + public JobManager(Path workDirectory, Settings settings) { this.workDirectory = workDirectory; this.settings = settings; } - public JobInfo createJob(Progress progress) throws IOException { + public JobInfo createJob() throws IOException { Job job; - if(jobs == null) { + if (jobs == null) { jobs = new LinkedList<>(); } - jobs.add(job = new Job(settings.getJobName(), workDirectory, this::getHaasClient, progress)); + jobs.add(job = new Job(settings.getJobName(), workDirectory, this::getHaasClient)); return new JobInfo(job) { @Override public JobState getState() { - try { - job.updateState(); - } catch (IOException e) { - log.error(e.getMessage(), e); - } + job.updateInfo(); return super.getState(); } }; } - public JobInfo startJob(Iterable<UploadingFile> files, Progress progress) throws IOException { - JobInfo result = createJob(progress); - result.uploadFiles(files); + public JobInfo startJob(Iterable<UploadingFile> files, Progress notifier) throws IOException { + JobInfo result = createJob(); + result.uploadFiles(files, notifier); result.submit(); return result; } @@ -69,12 +67,12 @@ public class JobManager { return () -> jobs.stream().filter(j -> j.needsDownload()).map(j -> new JobInfo(j)).iterator(); } - public Collection<JobInfo> getJobs(Progress progress) throws IOException { - if(jobs == null) { + public Collection<JobInfo> getJobs() throws IOException { + if (jobs == null) { jobs = new LinkedList<>(); Files.list(this.workDirectory).filter(p -> Files.isDirectory(p) && Job.isJobPath(p)).forEach(p -> { try { - jobs.add(new Job(p, this::getHaasClient, progress)); + jobs.add(new Job(p, this::getHaasClient)); } catch (IOException e) { e.printStackTrace(); } @@ -83,10 +81,10 @@ public class JobManager { return jobs.stream().map(j -> new JobInfo(j)).collect(Collectors.toList()); } - public void downloadJob(Long id) { + public void downloadJob(Long id, Progress notifier) { Iterator<Job> job = jobs.stream().filter(j -> j.getJobId() == id).iterator(); assert job.hasNext(); - job.next().download(); + job.next().download(notifier); } @@ -100,18 +98,21 @@ public class JobManager { } return haasClient; } - + public static class JobSynchronizableFile { private SynchronizableFileType type; private long offset; + public JobSynchronizableFile(SynchronizableFileType type, long offset) { super(); this.type = type; this.offset = offset; } + public SynchronizableFileType getType() { return type; } + public long getOffset() { return offset; } @@ -125,12 +126,12 @@ public class JobManager { this.job = job; } - public void uploadFiles(Iterable<UploadingFile> files) { - job.uploadFiles(files); + public void uploadFiles(Iterable<UploadingFile> files, Progress notifier) { + job.uploadFiles(files,notifier); } - - public void uploadFilesByName(Iterable<String> files) { - job.uploadFilesByName(files); + + public void uploadFilesByName(Iterable<String> files, Progress notifier) { + job.uploadFilesByName(files, notifier); } public void submit() { @@ -161,14 +162,14 @@ public class JobManager { return getStringFromTimeSafely(job.getEndTime()); } - public void downloadData(Progress progress) { - downloadData(x->true, progress); + public void downloadData(Progress notifier) { + downloadData(x -> true, notifier); } - - public void downloadData(Predicate<String> predicate, Progress progress) { - job.download(predicate,progress); + + public void downloadData(Predicate<String> predicate, Progress notifier) { + job.download(predicate, notifier); fireValueChangedEvent(); - + } public void waitForStart() { @@ -176,8 +177,8 @@ public class JobManager { } - public void updateInfo() throws IOException { - job.updateState(); + public void updateInfo() { + job.updateInfo(); } @Override @@ -188,11 +189,11 @@ public class JobManager { public Path storeDataInWorkdirectory(UploadingFile uploadingFile) throws IOException { return job.storeDataInWorkdirectory(uploadingFile); } - - public Iterable<String> getOutput(Iterable<JobSynchronizableFile> files) { + + public List<String> getOutput(Iterable<JobSynchronizableFile> files) { return job.getOutput(files); } - + private String getStringFromTimeSafely(Calendar time) { return time != null ? time.getTime().toString() : "N/A"; } @@ -203,15 +204,16 @@ public class JobManager { public void setProperty(String name, String value) throws IOException { job.setProperty(name, value); - + } public String getProperty(String name) throws IOException { return job.getProperty(name); } - - + public Path getDirectory() { + return job.getDirectory(); + } } diff --git a/haas-imagej-client/src/main/java/cz/it4i/fiji/haas/ui/DummyProgress.java b/haas-imagej-client/src/main/java/cz/it4i/fiji/haas/ui/DummyProgress.java new file mode 100644 index 0000000000000000000000000000000000000000..d91a0beb69b97af2c4dbe4c9aa8ee3dd5a74991e --- /dev/null +++ b/haas-imagej-client/src/main/java/cz/it4i/fiji/haas/ui/DummyProgress.java @@ -0,0 +1,37 @@ +package cz.it4i.fiji.haas.ui; + +import net.imagej.updater.util.Progress; + +public class DummyProgress implements Progress { + + @Override + public void setTitle(String title) { + + } + + @Override + public void setCount(int count, int total) { + + } + + @Override + public void addItem(Object item) { + + } + + @Override + public void setItemCount(int count, int total) { + + } + + @Override + public void itemDone(Object item) { + + } + + @Override + public void done() { + + } + +} diff --git a/haas-imagej-client/src/main/java/cz/it4i/fiji/haas/ui/FXFrame.java b/haas-imagej-client/src/main/java/cz/it4i/fiji/haas/ui/FXFrame.java index f3601be3950eeea7c3e7bd1d741b731bb988bd75..d52a841d02d62a04709a509316187212a1faddab 100644 --- a/haas-imagej-client/src/main/java/cz/it4i/fiji/haas/ui/FXFrame.java +++ b/haas-imagej-client/src/main/java/cz/it4i/fiji/haas/ui/FXFrame.java @@ -3,21 +3,35 @@ package cz.it4i.fiji.haas.ui; import java.awt.Dimension; import java.awt.Frame; import java.awt.Window; +import java.awt.im.InputMethodRequests; import java.io.IOException; import java.net.URL; import java.util.function.Consumer; import javax.swing.JDialog; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + import javafx.application.Platform; import javafx.embed.swing.JFXPanel; import javafx.fxml.FXMLLoader; import javafx.scene.Parent; import javafx.scene.Scene; - public class FXFrame<C extends FXFrame.Controller> extends JDialog { + @SuppressWarnings("unused") + private static Logger log = LoggerFactory.getLogger(cz.it4i.fiji.haas.ui.FXFrame.class); + + static public void runOnFxThread(Runnable runnable) { + if (Platform.isFxApplicationThread()) { + runnable.run(); + } else { + Platform.runLater(runnable); + } + } + public interface Controller { void init(Window frame); } @@ -42,18 +56,12 @@ public class FXFrame<C extends FXFrame.Controller> extends JDialog { */ protected void init(Consumer<C> controlerInit) { this.controlerInit = controlerInit; - this.fxPanel = new JFXPanel(); + this.fxPanel = new P_JFXPanel(); Platform.setImplicitExit(false); this.add(this.fxPanel); // The call to runLater() avoid a mix between JavaFX thread and Swing thread. - Platform.runLater(new Runnable() { - @Override - public void run() { - initFX(fxPanel); - } - - }); + runOnFxThread(() -> initFX(fxPanel)); } @@ -69,10 +77,6 @@ public class FXFrame<C extends FXFrame.Controller> extends JDialog { loader.setLocation(res); Parent rootLayout = (Parent) loader.load(); - // Get the controller and add an ImageJ context to it. - controller = loader.<C>getController(); - controlerInit.accept(controller); - controller.init(this); // Show the scene containing the root layout. Scene scene = new Scene(rootLayout); this.fxPanel.setScene(scene); @@ -85,6 +89,10 @@ public class FXFrame<C extends FXFrame.Controller> extends JDialog { this.fxPanel.setPreferredSize(dim); // this.setSize((int) scene.getWidth(), (int) scene.getHeight()); this.pack(); + // Get the controller and add an ImageJ context to it. + controller = loader.<C>getController(); + controlerInit.accept(controller); + controller.init(this); } catch (IOException e) { e.printStackTrace(); @@ -92,4 +100,22 @@ public class FXFrame<C extends FXFrame.Controller> extends JDialog { } + private static class P_JFXPanel extends JFXPanel { + private static final long serialVersionUID = 1L; + + + @Override + public synchronized InputMethodRequests getInputMethodRequests() { + try { + return super.getInputMethodRequests(); + } catch(NullPointerException e) { + //IGNORE FIX ISSUE https://bugs.openjdk.java.net/browse/JDK-8098836 + return null; + } + } + + + + }; + } diff --git a/haas-imagej-client/src/main/java/cz/it4i/fiji/haas/ui/ModalDialogs.java b/haas-imagej-client/src/main/java/cz/it4i/fiji/haas/ui/ModalDialogs.java index de2a03a50f10377d00c540e7bb6f0e1b3440ab83..1a1cb4b54bf5eb3011c92704f1c77346b1dbe065 100644 --- a/haas-imagej-client/src/main/java/cz/it4i/fiji/haas/ui/ModalDialogs.java +++ b/haas-imagej-client/src/main/java/cz/it4i/fiji/haas/ui/ModalDialogs.java @@ -1,12 +1,19 @@ package cz.it4i.fiji.haas.ui; +import java.util.concurrent.CompletableFuture; + import javax.swing.JDialog; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + public class ModalDialogs { + @SuppressWarnings("unused") + private static Logger log = LoggerFactory.getLogger(cz.it4i.fiji.haas.ui.ModalDialogs.class); public static <T extends JDialog>T doModal(T dialog, int operation) { dialog.setModal(true); dialog.setDefaultCloseOperation(operation); - new Thread(()->dialog.setVisible(true)).start(); + CompletableFuture.runAsync(()->dialog.setVisible(true)); return dialog; } } diff --git a/haas-imagej-client/src/main/java/cz/it4i/fiji/haas/ui/ProgressDialog.java b/haas-imagej-client/src/main/java/cz/it4i/fiji/haas/ui/ProgressDialog.java index acd8050822221d2b14cec5c934b6129e4c539d73..6b7b453d5c418640bf3c111a0b2a0e75f7ccb5e0 100644 --- a/haas-imagej-client/src/main/java/cz/it4i/fiji/haas/ui/ProgressDialog.java +++ b/haas-imagej-client/src/main/java/cz/it4i/fiji/haas/ui/ProgressDialog.java @@ -1,5 +1,4 @@ - package cz.it4i.fiji.haas.ui; - +package cz.it4i.fiji.haas.ui; import java.awt.Adjustable; import java.awt.Container; @@ -20,17 +19,22 @@ import javax.swing.JProgressBar; import javax.swing.JScrollPane; import javax.swing.ScrollPaneConstants; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + import net.imagej.ui.swing.updater.SwingTools; import net.imagej.updater.util.Progress; import net.imagej.updater.util.UpdateCanceledException; /** -* TODO -* -* @author Johannes Schindelin -*/ + * TODO + * + * @author Johannes Schindelin + */ @SuppressWarnings("serial") public class ProgressDialog extends JDialog implements Progress { + @SuppressWarnings("unused") + private static Logger log = LoggerFactory.getLogger(cz.it4i.fiji.haas.ui.ProgressDialog.class); JProgressBar progress; JButton detailsToggle; @@ -47,7 +51,7 @@ public class ProgressDialog extends JDialog implements Progress { } public ProgressDialog(final Window owner, final String title) { - super(owner); + super(owner, title); final Container root = getContentPane(); root.setLayout(new BoxLayout(root, BoxLayout.Y_AXIS)); @@ -75,14 +79,12 @@ public class ProgressDialog extends JDialog implements Progress { ProgressDialog.this.dispose(); } }); - buttons.add(cancel); + // buttons.add(cancel); buttons.setMaximumSize(buttons.getMinimumSize()); root.add(buttons); details = new Details(); - detailsScrollPane = - new JScrollPane(details, - ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED, + detailsScrollPane = new JScrollPane(details, ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED, ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED); detailsScrollPane.getVerticalScrollBar().addAdjustmentListener(new AdjustmentListener() { @@ -98,7 +100,8 @@ public class ProgressDialog extends JDialog implements Progress { detailsScrollPane.setVisible(false); root.add(detailsScrollPane); - if (title != null) setTitle(title); + if (title != null) + setTitle(title); pack(); if (owner != null) { @@ -108,15 +111,15 @@ public class ProgressDialog extends JDialog implements Progress { size.width = o.width / 2; setSize(size); } - setLocation(owner.getX() + (o.width - size.width) / 2, owner.getY() + - (o.height - size.height) / 2); + setLocation(owner.getX() + (o.width - size.width) / 2, owner.getY() + (o.height - size.height) / 2); } final KeyAdapter keyAdapter = new KeyAdapter() { @Override public void keyReleased(final KeyEvent e) { - if (e.getKeyCode() == KeyEvent.VK_ESCAPE) cancel(); + if (e.getKeyCode() == KeyEvent.VK_ESCAPE) + cancel(); } }; root.addKeyListener(keyAdapter); @@ -124,7 +127,8 @@ public class ProgressDialog extends JDialog implements Progress { cancel.addKeyListener(keyAdapter); setLocationRelativeTo(null); - if (title != null) setVisible(true); + if (title != null) + setVisible(true); } public void cancel() { @@ -132,7 +136,8 @@ public class ProgressDialog extends JDialog implements Progress { } protected void checkIfCanceled() { - if (canceled) throw new UpdateCanceledException(); + if (canceled) + throw new UpdateCanceledException(); } @Override @@ -147,9 +152,10 @@ public class ProgressDialog extends JDialog implements Progress { SwingTools.invokeOnEDT(new Runnable() { @Override public void run() { - if (detailsScrollPane.isVisible() || latestDetail == null) progress - .setString(title); - else progress.setString(title + ": " + latestDetail.getString()); + if (detailsScrollPane.isVisible() || latestDetail == null) + progress.setString(title); + else + progress.setString(title + ": " + latestDetail.getString()); } }); repaint(); @@ -158,7 +164,8 @@ public class ProgressDialog extends JDialog implements Progress { @Override public void setCount(final int count, final int total) { checkIfCanceled(); - if (updatesTooFast()) return; + if (updatesTooFast()) + return; SwingTools.invokeOnEDT(new Runnable() { @Override public void run() { @@ -173,7 +180,8 @@ public class ProgressDialog extends JDialog implements Progress { public void addItem(final Object item) { checkIfCanceled(); details.addDetail(item.toString()); - if (itemUpdatesTooFast() && !detailsScrollPane.isVisible()) return; + if (itemUpdatesTooFast() && !detailsScrollPane.isVisible()) + return; setTitle(); validate(); repaint(); @@ -182,7 +190,8 @@ public class ProgressDialog extends JDialog implements Progress { @Override public void setItemCount(final int count, final int total) { checkIfCanceled(); - if (itemUpdatesTooFast()) return; + if (itemUpdatesTooFast()) + return; SwingTools.invokeOnEDT(new Runnable() { @Override public void run() { @@ -196,7 +205,9 @@ public class ProgressDialog extends JDialog implements Progress { @Override public void itemDone(final Object item) { checkIfCanceled(); - if (itemUpdatesTooFast() && !detailsScrollPane.isVisible()) return; + if (itemUpdatesTooFast() && !detailsScrollPane.isVisible()) + return; + SwingTools.invokeOnEDT(new Runnable() { @Override public void run() { @@ -207,7 +218,8 @@ public class ProgressDialog extends JDialog implements Progress { @Override public void done() { - if (latestDetail != null) latestDetail.setValue(latestDetail.getMaximum()); + if (latestDetail != null) + latestDetail.setValue(latestDetail.getMaximum()); SwingTools.invokeOnEDT(new Runnable() { @Override public void run() { @@ -228,7 +240,8 @@ public class ProgressDialog extends JDialog implements Progress { setTitle(); final Dimension dimension = getSize(); - if (toggleHeight == -1) toggleHeight = dimension.height + 100; + if (toggleHeight == -1) + toggleHeight = dimension.height + 100; setSize(new Dimension(dimension.width, toggleHeight)); toggleHeight = dimension.height; } @@ -260,13 +273,15 @@ public class ProgressDialog extends JDialog implements Progress { } protected boolean updatesTooFast() { - if (System.currentTimeMillis() - latestUpdate < 50) return true; + if (System.currentTimeMillis() - latestUpdate < 50) + return true; latestUpdate = System.currentTimeMillis(); return false; } protected boolean itemUpdatesTooFast() { - if (System.currentTimeMillis() - itemLatestUpdate < 50) return true; + if (System.currentTimeMillis() - itemLatestUpdate < 50) + return true; itemLatestUpdate = System.currentTimeMillis(); return false; } @@ -277,4 +292,3 @@ public class ProgressDialog extends JDialog implements Progress { dialog.setVisible(true); } } - diff --git a/haas-imagej-client/src/main/java/cz/it4i/fiji/haas/ui/TableViewContextMenu.java b/haas-imagej-client/src/main/java/cz/it4i/fiji/haas/ui/TableViewContextMenu.java new file mode 100644 index 0000000000000000000000000000000000000000..78acda8aa157379f6f30299a2e06635c76995a6e --- /dev/null +++ b/haas-imagej-client/src/main/java/cz/it4i/fiji/haas/ui/TableViewContextMenu.java @@ -0,0 +1,65 @@ +package cz.it4i.fiji.haas.ui; + +import java.util.Collection; +import java.util.LinkedList; +import java.util.function.Consumer; +import java.util.function.Predicate; + +import javafx.event.EventHandler; +import javafx.scene.control.ContextMenu; +import javafx.scene.control.MenuItem; +import javafx.scene.control.TableView; +import javafx.scene.input.ContextMenuEvent; + +public class TableViewContextMenu<T> { + private Collection<P_MenuItem> items = new LinkedList<TableViewContextMenu<T>.P_MenuItem>(); + private ContextMenu cm; + private TableView<T> tableView; + + public TableViewContextMenu(TableView<T> tableView) { + this.cm = new ContextMenu(); + this.tableView = tableView; + tableView.setContextMenu(cm); + tableView.setOnContextMenuRequested(new EventHandler<ContextMenuEvent>() { + @Override + public void handle(ContextMenuEvent event) { + T selected = getSelectedItem(); + for (P_MenuItem item : items) { + item.updateEnable(selected); + } + } + }); + } + + public void addItem(String text, Consumer<T> eventHandler, Predicate<T> enableHandler) { + items.add(new P_MenuItem(text, eventHandler, enableHandler)); + } + + private T getSelectedItem() { + T result = null; + if (tableView.getSelectionModel().getSelectedCells().size() >= 0) { + result = tableView.getSelectionModel().getSelectedItem(); + } + return result; + } + + private class P_MenuItem { + + private MenuItem item; + private Predicate<T> enableHandler; + + public P_MenuItem(String text, Consumer<T> eventHandler, Predicate<T> enableHandler) { + super(); + this.enableHandler = enableHandler; + item = new MenuItem(text); + item.setOnAction(e -> eventHandler.accept(getSelectedItem())); + cm.getItems().add(item); + } + + public void updateEnable(T selected) { + item.setDisable(!enableHandler.test(selected)); + } + + } + +} diff --git a/haas-java-client/.classpath b/haas-java-client/.classpath index af1430be15836d78425a795565a49fcd23d562b4..8433ca6cd09c102eb627ee07ccba5210fb875e64 100644 --- a/haas-java-client/.classpath +++ b/haas-java-client/.classpath @@ -22,5 +22,15 @@ <attribute name="maven.pomderived" value="true"/> </attributes> </classpathentry> + <classpathentry excluding="**" kind="src" output="target/classes" path="src/main/resources"> + <attributes> + <attribute name="maven.pomderived" value="true"/> + </attributes> + </classpathentry> + <classpathentry excluding="**" kind="src" output="target/test-classes" path="src/test/resources"> + <attributes> + <attribute name="maven.pomderived" value="true"/> + </attributes> + </classpathentry> <classpathentry kind="output" path="target/classes"/> </classpath> diff --git a/haas-java-client/src/main/java/cz/it4i/fiji/haas_java_client/.gitignore b/haas-java-client/src/main/java/cz/it4i/fiji/haas_java_client/.gitignore index 702c8b4dfc8d2cf814f8eaa495f6397ba279a113..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 100644 --- a/haas-java-client/src/main/java/cz/it4i/fiji/haas_java_client/.gitignore +++ b/haas-java-client/src/main/java/cz/it4i/fiji/haas_java_client/.gitignore @@ -1 +0,0 @@ -/Constants.java diff --git a/haas-java-client/src/main/java/cz/it4i/fiji/haas_java_client/Configuration.java b/haas-java-client/src/main/java/cz/it4i/fiji/haas_java_client/Configuration.java new file mode 100644 index 0000000000000000000000000000000000000000..363f497302a446de7e8ca749e8eda894cf8911dd --- /dev/null +++ b/haas-java-client/src/main/java/cz/it4i/fiji/haas_java_client/Configuration.java @@ -0,0 +1,26 @@ +package cz.it4i.fiji.haas_java_client; + +import java.io.IOException; +import java.io.InputStream; +import java.util.Properties; + +public class Configuration { + + private Properties properties; + + public Configuration(String configFile) { + try(InputStream is = this.getClass().getClassLoader().getResourceAsStream(configFile)) { + if(is == null) { + throw new IllegalArgumentException("Resource " + configFile + " does not exists. Copy " + configFile + ".template and fill it, please!"); + } + this.properties = new Properties(); + this.properties.load(is); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + protected String getValue(String key) { + return this.properties.getProperty(key); + } +} diff --git a/haas-java-client/src/main/java/cz/it4i/fiji/haas_java_client/Constants.java b/haas-java-client/src/main/java/cz/it4i/fiji/haas_java_client/Constants.java new file mode 100644 index 0000000000000000000000000000000000000000..35f602ac95f040ba9912f83bc9596754673025be --- /dev/null +++ b/haas-java-client/src/main/java/cz/it4i/fiji/haas_java_client/Constants.java @@ -0,0 +1,28 @@ +package cz.it4i.fiji.haas_java_client; + +class Constants extends Configuration{ + + + public Constants() { + super("configuration.properties"); + } + + public String getUserName() { + return getValue("USER_NAME"); + } + + public String getPhone() { + return getValue("PHONE"); + } + + public String getPassword() { + return getValue("PASSWORD"); + } + + public String getEmail() { + return getValue("EMAIL"); + } + + + +} \ No newline at end of file diff --git a/haas-java-client/src/main/java/cz/it4i/fiji/haas_java_client/Constants.java.templ b/haas-java-client/src/main/java/cz/it4i/fiji/haas_java_client/Constants.java.templ deleted file mode 100644 index e2d5e13f220e429b17f68193ceb9cb5041fd6caf..0000000000000000000000000000000000000000 --- a/haas-java-client/src/main/java/cz/it4i/fiji/haas_java_client/Constants.java.templ +++ /dev/null @@ -1,8 +0,0 @@ -package cz.it4i.fiji.haas_java_client; - -interface Constants { - String USER_NAME = ""; - String PASSWORD = ""; - String EMAIL = ""; - String PHONE = ""; -} \ No newline at end of file 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 daa379cfe2eb74610c5daefa40ba5593934348ab..a08e3a1626fbed22b99a2ba35378354ddbb5a3e9 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 @@ -162,17 +162,18 @@ public class HaaSClient { } public long start(Iterable<Path> files, String name, Collection<Entry<String, String>> templateParameters) { - Iterable<UploadingFile> uploadingFiles = StreamSupport.stream(files.spliterator(), false).map(HaaSClient::getUploadingFile).collect(Collectors.toList()); + Iterable<UploadingFile> uploadingFiles = StreamSupport.stream(files.spliterator(), false) + .map(HaaSClient::getUploadingFile).collect(Collectors.toList()); return start(uploadingFiles, name, templateParameters, dummyNotifier); } - public long start(Iterable<UploadingFile> files, String name, - Collection<Entry<String, String>> templateParameters, ProgressNotifier notifier) { + public long start(Iterable<UploadingFile> files, String name, Collection<Entry<String, String>> templateParameters, + ProgressNotifier notifier) { notifier.setTitle("Starting job"); try { - long jobId = doCreateJob(name, templateParameters, notifier); + long jobId = doCreateJob(name, templateParameters); doUploadFiles(jobId, files, notifier); - doSubmitJob(jobId, notifier); + doSubmitJob(jobId); return jobId; } catch (ServiceException | JSchException | IOException e) { throw new RuntimeException(e); @@ -180,10 +181,9 @@ public class HaaSClient { } - public long createJob(String name, Collection<Entry<String, String>> templateParameters, - ProgressNotifier notifier) { + public long createJob(String name, Collection<Entry<String, String>> templateParameters) { try { - return doCreateJob(name, templateParameters, notifier); + return doCreateJob(name, templateParameters); } catch (RemoteException | ServiceException e) { throw new RuntimeException(e); } @@ -197,9 +197,9 @@ public class HaaSClient { } } - public void submitJob(long jobId, ProgressNotifier notifier) { + public void submitJob(long jobId) { try { - doSubmitJob(jobId, notifier); + doSubmitJob(jobId); } catch (RemoteException | ServiceException e) { throw new RuntimeException(e); } @@ -262,7 +262,8 @@ public class HaaSClient { FileTransferMethodExt ft = getFileTransfer().getFileTransferMethod(jobId, getSessionID()); try (ScpClient scpClient = getScpClient(ft)) { String[] filesArray = getFileTransfer().listChangedFilesForJob(jobId, getSessionID()); - Collection<String> files = Arrays.asList(filesArray).stream().filter(function).collect(Collectors.toList()); + Collection<String> files = Arrays.asList(filesArray).stream().filter(function) + .collect(Collectors.toList()); List<Long> fileSizes = getSizes( files.stream().map(filename -> "'" + ft.getSharedBasepath() + "/" + filename + "'").collect( Collectors.toList()), @@ -335,10 +336,8 @@ public class HaaSClient { }; } - private void doSubmitJob(long jobId, ProgressNotifier notifier) throws RemoteException, ServiceException { + private void doSubmitJob(long jobId) throws RemoteException, ServiceException { getJobManagement().submitJob(jobId, getSessionID()); - notifier.itemDone(getNotificationItem4JobId(jobId)); - notifier.done(); } private void doUploadFiles(long jobId, Iterable<UploadingFile> files, ProgressNotifier notifier) @@ -368,20 +367,15 @@ public class HaaSClient { getFileTransfer().endFileTransfer(jobId, fileTransfer, getSessionID()); } - private long doCreateJob(String name, Collection<Entry<String, String>> templateParameters, - ProgressNotifier notifier) throws RemoteException, ServiceException { + private long doCreateJob(String name, Collection<Entry<String, String>> templateParameters) + throws RemoteException, ServiceException { TaskSpecificationExt taskSpec = createTaskSpecification(name, templateId, templateParameters); JobSpecificationExt jobSpecification = createJobSpecification(name, Arrays.asList(taskSpec)); SubmittedJobInfoExt job = getJobManagement().createJob(jobSpecification, getSessionID()); - notifier.addItem(getNotificationItem4JobId(job.getId())); return job.getId(); } - private String getNotificationItem4JobId(long jobId) { - return String.format("Created job: %d\n", jobId); - } - - private List<Long> getSizes(List<String> asList, ScpClient scpClient, ProgressNotifier notifier) + private List<Long> getSizes(List<String> asList, ScpClient scpClient, ProgressNotifier notifier) throws JSchException, IOException { List<Long> result = new LinkedList<>(); diff --git a/haas-java-client/src/main/java/cz/it4i/fiji/haas_java_client/TestingConstants.java b/haas-java-client/src/main/java/cz/it4i/fiji/haas_java_client/TestingConstants.java index 6b91d662a3f7e041a4e9c6dc29693f387ddd7456..389ebe716048fbbcbe0f683c3908ad6b3a415db9 100644 --- a/haas-java-client/src/main/java/cz/it4i/fiji/haas_java_client/TestingConstants.java +++ b/haas-java-client/src/main/java/cz/it4i/fiji/haas_java_client/TestingConstants.java @@ -1,32 +1,29 @@ package cz.it4i.fiji.haas_java_client; interface TestingConstants { - String USER_NAME = "testuser"; - String PASSWORD = "57f9caaf84"; - String EMAIL = "jan.kozusznik@vsb.cz"; - String PHONE = "999111000"; static Settings getSettings(long templateId, int timeOut, long clusterNodeType, String projectId) { + Constants constants = new Constants(); return new Settings() { @Override public String getUserName() { - return USER_NAME; + return constants.getUserName(); } @Override public String getPhone() { - return PHONE; + return constants.getPhone(); } @Override public String getPassword() { - return PASSWORD; + return constants.getPassword(); } @Override public String getEmail() { - return EMAIL; + return constants.getEmail(); } @Override diff --git a/haas-java-client/src/main/resources/.gitignore b/haas-java-client/src/main/resources/.gitignore new file mode 100644 index 0000000000000000000000000000000000000000..b5285f5f9fb3ae9423696a524c0fcf6c5a8d5d0c --- /dev/null +++ b/haas-java-client/src/main/resources/.gitignore @@ -0,0 +1 @@ +/configuration.properties diff --git a/haas-java-client/src/main/resources/configuration.properties.template b/haas-java-client/src/main/resources/configuration.properties.template new file mode 100644 index 0000000000000000000000000000000000000000..892ed0d0a691608a7070d5beb4c3c8e539c074ef --- /dev/null +++ b/haas-java-client/src/main/resources/configuration.properties.template @@ -0,0 +1,4 @@ +USER_NAME= +PASSWORD= +EMAIL= +PHONE= \ No newline at end of file diff --git a/haas-java-client/src/test/resources/.gitignore b/haas-java-client/src/test/resources/.gitignore new file mode 100644 index 0000000000000000000000000000000000000000..b5285f5f9fb3ae9423696a524c0fcf6c5a8d5d0c --- /dev/null +++ b/haas-java-client/src/test/resources/.gitignore @@ -0,0 +1 @@ +/configuration.properties diff --git a/haas-snakemake-spim/src/main/java/cz/it4i/fiji/haas_snakemake_spim/.gitignore b/haas-snakemake-spim/src/main/java/cz/it4i/fiji/haas_snakemake_spim/.gitignore new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/haas-snakemake-spim/src/main/java/cz/it4i/fiji/haas_snakemake_spim/Constants.java b/haas-snakemake-spim/src/main/java/cz/it4i/fiji/haas_snakemake_spim/Constants.java new file mode 100644 index 0000000000000000000000000000000000000000..984071e8fd57bc3f8c3e2fcf500987ed3ffd3066 --- /dev/null +++ b/haas-snakemake-spim/src/main/java/cz/it4i/fiji/haas_snakemake_spim/Constants.java @@ -0,0 +1,31 @@ +package cz.it4i.fiji.haas_snakemake_spim; + +import cz.it4i.fiji.haas_java_client.Configuration; + +public class Constants extends Configuration { + + public Constants() { + super("configuration.properties"); + } + + public String getProjectId() { + return getValue("PROJECT_ID"); + } + + public String getPassword() { + return getValue("PASSWORD"); + } + + public String getUserName() { + return getValue("USER_NAME"); + } + + public String getPhone() { + return getValue("PHONE"); + } + + public String getEmail() { + return getValue("EMAIL"); + } + +} diff --git a/haas-imagej-client/src/main/java/cz/it4i/fiji/haas/TestingConstants.template b/haas-snakemake-spim/src/main/java/cz/it4i/fiji/haas_snakemake_spim/TestingConstants.java similarity index 64% rename from haas-imagej-client/src/main/java/cz/it4i/fiji/haas/TestingConstants.template rename to haas-snakemake-spim/src/main/java/cz/it4i/fiji/haas_snakemake_spim/TestingConstants.java index 6e89e500814d9ffd5ecef6a5d6dd6e9aaa0f9c56..a82879df1059f432a7eed31781d79a7a1936ceb8 100644 --- a/haas-imagej-client/src/main/java/cz/it4i/fiji/haas/TestingConstants.template +++ b/haas-snakemake-spim/src/main/java/cz/it4i/fiji/haas_snakemake_spim/TestingConstants.java @@ -1,39 +1,36 @@ -package cz.it4i.fiji.haas; +package cz.it4i.fiji.haas_snakemake_spim; import cz.it4i.fiji.haas_java_client.Settings; -interface TestingConstants { - String USER_NAME = <user name to haas>; - String PASSWORD = <password to haas>; - String EMAIL = ; - String PHONE = ; - +public interface TestingConstants { static Settings getSettings() { + Constants constants = new Constants(); long templateId = 2l; int timeOut = 9600; long clusterNodeType = 6l; - String projectId = "DD-17-31"; + + return new Settings() { @Override public String getUserName() { - return USER_NAME; + return constants.getUserName(); } @Override public String getPhone() { - return PHONE; + return constants.getPhone(); } @Override public String getPassword() { - return PASSWORD; + return constants.getPassword(); } @Override public String getEmail() { - return EMAIL; + return constants.getEmail(); } @Override @@ -53,7 +50,12 @@ interface TestingConstants { @Override public String getProjectId() { - return projectId; + return constants.getProjectId(); + } + + @Override + public String getJobName() { + return "HaaS-Snakemake-SPIM"; } }; } diff --git a/haas-snakemake-spim/src/main/java/cz/it4i/fiji/haas_snakemake_spim/commands/CheckStatusOfHaaS.java b/haas-snakemake-spim/src/main/java/cz/it4i/fiji/haas_snakemake_spim/commands/CheckStatusOfHaaS.java index 3ea5e71cd4fb5da950249b31f1ffd429bce20977..28961641813b04c9b9ee8f359c500197489c93ae 100644 --- a/haas-snakemake-spim/src/main/java/cz/it4i/fiji/haas_snakemake_spim/commands/CheckStatusOfHaaS.java +++ b/haas-snakemake-spim/src/main/java/cz/it4i/fiji/haas_snakemake_spim/commands/CheckStatusOfHaaS.java @@ -19,10 +19,11 @@ import org.scijava.ui.UIService; import org.scijava.widget.UIComponent; import cz.it4i.fiji.haas.JobManager; -import cz.it4i.fiji.haas.TestingConstants; import cz.it4i.fiji.haas.JobManager.JobInfo; +import cz.it4i.fiji.haas.ui.DummyProgress; import cz.it4i.fiji.haas.ui.ModalDialogs; import cz.it4i.fiji.haas.ui.ProgressDialog; +import cz.it4i.fiji.haas_snakemake_spim.TestingConstants; import cz.it4i.fiji.haas_snakemake_spim.ui.CheckStatusOfHaaSWindow; import net.imagej.ImageJ; @@ -59,16 +60,11 @@ public class CheckStatusOfHaaS implements Command { window = ModalDialogs.doModal(new CheckStatusOfHaaSWindow(getFrame(), context),WindowConstants.DISPOSE_ON_CLOSE); ProgressDialog dialog = ModalDialogs.doModal(new ProgressDialog(window),WindowConstants.DO_NOTHING_ON_CLOSE); dialog.setTitle("Downloading info about jobs"); - Collection<JobInfo> jobs = jobManager.getJobs(dialog); + 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()); @@ -98,7 +94,7 @@ public class CheckStatusOfHaaS implements Command { private void downloadAll() { for (JobInfo id : jobManager.getJobsNeedingDownload()) { System.out.println("Job " + id.getId() + " needs download"); - jobManager.downloadJob(id.getId()); + jobManager.downloadJob(id.getId(), new DummyProgress()); } } diff --git a/haas-snakemake-spim/src/main/java/cz/it4i/fiji/haas_snakemake_spim/commands/RunWithHaaS.java b/haas-snakemake-spim/src/main/java/cz/it4i/fiji/haas_snakemake_spim/commands/RunWithHaaS.java index 3576aa7f8b4b2a25a425ec11f9d29c9c604ab25f..8fc4df618bac9bdbeef26bc3a4ff3777df3967fc 100644 --- a/haas-snakemake-spim/src/main/java/cz/it4i/fiji/haas_snakemake_spim/commands/RunWithHaaS.java +++ b/haas-snakemake-spim/src/main/java/cz/it4i/fiji/haas_snakemake_spim/commands/RunWithHaaS.java @@ -21,10 +21,10 @@ import org.scijava.ui.UIService; import org.scijava.widget.UIComponent; import cz.it4i.fiji.haas.JobManager; -import cz.it4i.fiji.haas.TestingConstants; import cz.it4i.fiji.haas.ui.ModalDialogs; import cz.it4i.fiji.haas.ui.ProgressDialog; import cz.it4i.fiji.haas_java_client.HaaSClient; +import cz.it4i.fiji.haas_snakemake_spim.TestingConstants; import net.imagej.ImageJ; /** @@ -56,9 +56,13 @@ public class RunWithHaaS implements Command { public void run() { try { jobManager = new JobManager(getWorkingDirectoryPath(), TestingConstants.getSettings()); + ProgressDialog dialog = ModalDialogs.doModal(new ProgressDialog(getFrame(), "Starting job"), + WindowConstants.DO_NOTHING_ON_CLOSE); + jobManager.startJob( getContent(dataDirectory).stream().map(HaaSClient::getUploadingFile).collect(Collectors.toList()), - ModalDialogs.doModal(new ProgressDialog(getFrame()), WindowConstants.DO_NOTHING_ON_CLOSE)); + dialog); + dialog.done(); } catch (IOException e) { log.error(e); } diff --git a/haas-snakemake-spim/src/main/java/cz/it4i/fiji/haas_snakemake_spim/ui/.gitignore b/haas-snakemake-spim/src/main/java/cz/it4i/fiji/haas_snakemake_spim/ui/.gitignore new file mode 100644 index 0000000000000000000000000000000000000000..702c8b4dfc8d2cf814f8eaa495f6397ba279a113 --- /dev/null +++ b/haas-snakemake-spim/src/main/java/cz/it4i/fiji/haas_snakemake_spim/ui/.gitignore @@ -0,0 +1 @@ +/Constants.java diff --git a/haas-snakemake-spim/src/main/java/cz/it4i/fiji/haas_snakemake_spim/ui/CheckStatusOfHaaSController.java b/haas-snakemake-spim/src/main/java/cz/it4i/fiji/haas_snakemake_spim/ui/CheckStatusOfHaaSController.java index 4763b20336d312ac689c0b3bb8405f72dc1ed6b5..38092ad763dcea820b46ae9e882b6e27b710a8a0 100644 --- a/haas-snakemake-spim/src/main/java/cz/it4i/fiji/haas_snakemake_spim/ui/CheckStatusOfHaaSController.java +++ b/haas-snakemake-spim/src/main/java/cz/it4i/fiji/haas_snakemake_spim/ui/CheckStatusOfHaaSController.java @@ -22,8 +22,9 @@ import javafx.scene.control.MenuItem; import javafx.scene.control.TableColumn; import javafx.scene.control.TableView; import javafx.scene.input.ContextMenuEvent; +import net.imagej.updater.util.Progress; -public class CheckStatusOfHaaSController implements FXFrame.Controller{ +public class CheckStatusOfHaaSController implements FXFrame.Controller { @Parameter private LogService logService; @@ -42,14 +43,15 @@ public class CheckStatusOfHaaSController implements FXFrame.Controller{ } public void init(Window root) { + this.root = root; initTable(); initMenu(); - this.root = root; } private void downloadData(ActionEvent event) { - Platform.runLater(() -> jobs.getSelectionModel().getSelectedItem() - .downloadData(ModalDialogs.doModal(new ProgressDialog(root), WindowConstants.DO_NOTHING_ON_CLOSE))); + Progress progress = ModalDialogs.doModal(new ProgressDialog(root, "Downloading data"), WindowConstants.DO_NOTHING_ON_CLOSE); + Platform.runLater(() -> jobs.getSelectionModel().getSelectedItem().downloadData(progress)); + progress.done(); } private void initMenu() { diff --git a/haas-snakemake-spim/src/main/resources/.gitignore b/haas-snakemake-spim/src/main/resources/.gitignore new file mode 100644 index 0000000000000000000000000000000000000000..b5285f5f9fb3ae9423696a524c0fcf6c5a8d5d0c --- /dev/null +++ b/haas-snakemake-spim/src/main/resources/.gitignore @@ -0,0 +1 @@ +/configuration.properties diff --git a/haas-snakemake-spim/src/main/resources/configuration.properties.template b/haas-snakemake-spim/src/main/resources/configuration.properties.template new file mode 100644 index 0000000000000000000000000000000000000000..5db03d89f48785d3b2c31be4322b12aced25d6b1 --- /dev/null +++ b/haas-snakemake-spim/src/main/resources/configuration.properties.template @@ -0,0 +1,5 @@ +PROJECT_ID=DD-17-31 +USER_NAME= +PASSWORD= +EMAIL= +PHONE= \ No newline at end of file diff --git a/haas-spim-benchmark/pom.xml b/haas-spim-benchmark/pom.xml index 9a7a84fb8b45c33872e5cc4b1a9df97c7527248e..1dd914065cd78b18f350bb346d1cb29e3beaf6e4 100644 --- a/haas-spim-benchmark/pom.xml +++ b/haas-spim-benchmark/pom.xml @@ -61,7 +61,13 @@ <system>None</system> </ciManagement> + <properties> + <license.licenseName>cc0</license.licenseName> + <license.copyrightOwners>N/A</license.copyrightOwners> + <license.projectName>Plugins for running SPIM automated workflow by + IT4I HaaS.</license.projectName> + </properties> <repositories> <repository> <id>imagej.public</id> @@ -73,8 +79,9 @@ <dependency> <groupId>net.imagej</groupId> <artifactId>imagej</artifactId> + <scope>compile</scope> </dependency> - + <dependency> <groupId>cz.it4i.fiji</groupId> <artifactId>haas-imagej-client</artifactId> @@ -91,4 +98,7 @@ <artifactId>slf4j-simple</artifactId> </dependency> </dependencies> -</project> \ No newline at end of file + <build> + + </build> +</project> diff --git a/haas-spim-benchmark/src/main/java/cz/it4i/fiji/haas_spim_benchmark/commands/BenchmarkSPIMParametersImpl.java b/haas-spim-benchmark/src/main/java/cz/it4i/fiji/haas_spim_benchmark/commands/BenchmarkSPIMParametersImpl.java new file mode 100644 index 0000000000000000000000000000000000000000..70ece8d7350cd6baa982801e87aa21650655112d --- /dev/null +++ b/haas-spim-benchmark/src/main/java/cz/it4i/fiji/haas_spim_benchmark/commands/BenchmarkSPIMParametersImpl.java @@ -0,0 +1,41 @@ +package cz.it4i.fiji.haas_spim_benchmark.commands; + +import java.nio.file.Path; + +import cz.it4i.fiji.haas_java_client.Configuration; +import cz.it4i.fiji.haas_spim_benchmark.core.BenchmarkSPIMParameters; + +class BenchmarkSPIMParametersImpl extends Configuration implements BenchmarkSPIMParameters{ + + private Path workingDirectory; + + public BenchmarkSPIMParametersImpl(Path workingDirectory) { + super("configuration.properties"); + this.workingDirectory = workingDirectory; + } + + @Override + public Path workingDirectory() { + return workingDirectory; + } + + @Override + public String username() { + return getValue("USER_NAME"); + } + + @Override + public String password() { + return getValue("PASSWORD"); + } + + @Override + public String phone() { + return getValue("PHONE"); + } + + @Override + public String email() { + return getValue("EMAIL"); + } +} diff --git a/haas-spim-benchmark/src/main/java/cz/it4i/fiji/haas_spim_benchmark/commands/ManageSPIMBenchmark.java b/haas-spim-benchmark/src/main/java/cz/it4i/fiji/haas_spim_benchmark/commands/ManageSPIMBenchmark.java new file mode 100644 index 0000000000000000000000000000000000000000..75eab35b14172e2c2a52df7984e6dfa3c1c239bf --- /dev/null +++ b/haas-spim-benchmark/src/main/java/cz/it4i/fiji/haas_spim_benchmark/commands/ManageSPIMBenchmark.java @@ -0,0 +1,78 @@ +package cz.it4i.fiji.haas_spim_benchmark.commands; + +import java.awt.Frame; +import java.io.File; +import java.io.IOException; +import java.nio.file.Paths; + +import javax.swing.WindowConstants; + +import org.scijava.Context; +import org.scijava.command.Command; +import org.scijava.plugin.Parameter; +import org.scijava.plugin.Plugin; +import org.scijava.ui.ApplicationFrame; +import org.scijava.ui.UIService; +import org.scijava.widget.UIComponent; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import cz.it4i.fiji.haas.ui.ModalDialogs; +import cz.it4i.fiji.haas_spim_benchmark.ui.BenchmarkSPIMWindow; +import net.imagej.ImageJ; + +/** + * + * @author koz01 + * + */ +@Plugin(type = Command.class, headless = false, menuPath = "Plugins>SPIM benchmark") +public class ManageSPIMBenchmark implements Command { + + private static Logger log = LoggerFactory + .getLogger(cz.it4i.fiji.haas_spim_benchmark.commands.ManageSPIMBenchmark.class); + + @Parameter(label = "Work directory", persist = true, style = "directory") + private File workDirectory; + + @Parameter + private UIService uiService; + + @Parameter + private Context context; + + @Override + public void run() { + try { + ModalDialogs.doModal( + new BenchmarkSPIMWindow(getFrame(), new BenchmarkSPIMParametersImpl(Paths.get(workDirectory.getPath()))), + WindowConstants.DISPOSE_ON_CLOSE); + } catch (IOException e) { + // TODO Auto-generated catch block + log.error(e.getMessage(), e); + } + + } + + private Frame getFrame() { + ApplicationFrame af = uiService.getDefaultUI().getApplicationFrame(); + if (af instanceof Frame) { + return (Frame) af; + } else if (af instanceof UIComponent) { + Object component = ((UIComponent<?>) af).getComponent(); + if (component instanceof Frame) { + return (Frame) component; + } + } + return null; + } + + public static void main(final String... args) { + // Launch ImageJ as usual. + final ImageJ ij = new ImageJ(); + ij.launch(args); + + ij.command().run(ManageSPIMBenchmark.class, true); + } + +} diff --git a/haas-spim-benchmark/src/main/java/cz/it4i/fiji/haas_spim_benchmark/commands/package-info.java b/haas-spim-benchmark/src/main/java/cz/it4i/fiji/haas_spim_benchmark/commands/package-info.java new file mode 100644 index 0000000000000000000000000000000000000000..dcfbfc4ce8e10a519f9405f30cd0c0b801db3800 --- /dev/null +++ b/haas-spim-benchmark/src/main/java/cz/it4i/fiji/haas_spim_benchmark/commands/package-info.java @@ -0,0 +1,8 @@ +/** + * + */ +/** + * @author koz01 + * + */ +package cz.it4i.fiji.haas_spim_benchmark.commands; \ No newline at end of file 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 26e65fd2383d11ec62863db01cdf811cfed7e34d..375a00fbcb06bc230b287d3413ac4c9963665560 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 @@ -6,91 +6,167 @@ import java.nio.file.Path; import java.nio.file.Paths; import java.util.Arrays; import java.util.Collection; -import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.function.Predicate; import java.util.stream.Collectors; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.yaml.snakeyaml.Yaml; import cz.it4i.fiji.haas.JobManager; -import cz.it4i.fiji.haas.TestingConstants; -import cz.it4i.fiji.haas.UploadingFileFromResource; import cz.it4i.fiji.haas.JobManager.JobInfo; import cz.it4i.fiji.haas.JobManager.JobSynchronizableFile; +import cz.it4i.fiji.haas.UploadingFileFromResource; import cz.it4i.fiji.haas_java_client.HaaSClient; import cz.it4i.fiji.haas_java_client.JobState; +import cz.it4i.fiji.haas_java_client.Settings; +import javafx.beans.value.ObservableValueBase; import net.imagej.updater.util.Progress; public class BenchmarkJobManager { - private static final String SPIM_OUTPUT_FILENAME_PATTERN = "spim.outputFilenamePattern"; - private static final int HAAS_TEMPLATE_ID = 4; - private static final String CONFIG_YAML = "config.yaml"; - private JobManager jobManager; - private Progress progress; - private Map<Long, JobInfo> jobs = new HashMap<>(); + + @SuppressWarnings("unused") + private static Logger log = LoggerFactory + .getLogger(cz.it4i.fiji.haas_spim_benchmark.core.BenchmarkJobManager.class); + + public final class Job extends ObservableValueBase<Job> { + private JobInfo jobInfo; + + private JobState oldState; + public Job(JobInfo ji) { + super(); + this.jobInfo = ji; + } - public BenchmarkJobManager(Path workDirectory, Progress progress) throws IOException { - jobManager = new JobManager(workDirectory, TestingConstants.getSettings(HAAS_TEMPLATE_ID, 6)); - this.progress = progress; - } + public void startJob(Progress progress) throws IOException { + jobInfo.uploadFilesByName(Arrays.asList(CONFIG_YAML), progress); + String outputName = getOutputName(jobInfo.openLocalFile(CONFIG_YAML)); + jobInfo.submit(); + jobInfo.setProperty(SPIM_OUTPUT_FILENAME_PATTERN, outputName); + } - public long createJob() throws IOException { - JobInfo jobInfo = jobManager.createJob(progress); - jobInfo.storeDataInWorkdirectory(getUploadingFile()); - return indexJob(jobInfo); - } + public JobState getState() { + return oldState = jobInfo.getState(); + } - public void startJob(long jobId) throws IOException { - JobInfo jobInfo = jobs.get(jobId); - jobInfo.uploadFilesByName(Arrays.asList(CONFIG_YAML)); - String outputName = getOutputName(jobInfo.openLocalFile(CONFIG_YAML)); - jobInfo.submit(); - jobInfo.setProperty(SPIM_OUTPUT_FILENAME_PATTERN, outputName); - } + public void downloadData(Progress progress) throws IOException { + JobInfo ji = jobInfo; + if (ji.needsDownload()) { + if (ji.getState() == JobState.Finished) { + String filePattern = ji.getProperty(SPIM_OUTPUT_FILENAME_PATTERN); + ji.downloadData(downloadFinishedData(filePattern), progress); + } else if (ji.getState() == JobState.Failed) { + ji.downloadData(downloadFailedData(), progress); + } + } - public Collection<Long> getJobs() throws IOException { - return jobManager.getJobs(progress).stream().map(this::indexJob).collect(Collectors.toList()); - } + } - public JobState getState(long jobId) { - return jobs.get(jobId).getState(); - } + public List<String> getOutput(List<JobSynchronizableFile> files) { + return jobInfo.getOutput(files); + } + + public long getId() { + return jobInfo.getId(); + } + + public String getCreationTime() { + return jobInfo.getCreationTime(); + } + + public String getStartTime() { + return jobInfo.getStartTime(); + } + + public String getEndTime() { + return jobInfo.getEndTime(); + } + + @Override + public Job getValue() { + return this; + } + + @Override + public int hashCode() { + return jobInfo.getId().hashCode(); + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof Job) { + Job job = (Job) obj; + return job.getId() == getId(); - public void downloadData(long jobId) throws IOException { - JobInfo ji = jobs.get(jobId); - if (ji.needsDownload()) { - if (ji.getState() == JobState.Finished) { - String filePattern = ji.getProperty(SPIM_OUTPUT_FILENAME_PATTERN); - ji.downloadData(downloadFinishedData(filePattern), progress); - } else if (ji.getState() == JobState.Failed) { - ji.downloadData(downloadFailedData(), progress); } + return false; + } + + public void update(Job job) { + jobInfo = job.jobInfo; + if (jobInfo.getState() != oldState) { + fireValueChangedEvent(); + } + } + + + + public boolean downloaded() { + return !jobInfo.needsDownload(); + } + + public Job update() { + jobInfo.updateInfo(); + return this; + } + + public Path getDirectory() { + return jobInfo.getDirectory(); } + } + + private static final String HAAS_JOB_NAME = "HaaSSPIMBenchmark"; + private static final int HAAS_CLUSTER_NODE_TYPE = 6; + private static final int HAAS_TEMPLATE_ID = 4; + private static final String HAAS_PROJECT_ID = "DD-17-31"; + private static final int HAAS_TIMEOUT = 9600; + + private static final String SPIM_OUTPUT_FILENAME_PATTERN = "spim.outputFilenamePattern"; + private static final String CONFIG_YAML = "config.yaml"; + private JobManager jobManager; + + public BenchmarkJobManager(BenchmarkSPIMParameters params) throws IOException { + jobManager = new JobManager(params.workingDirectory(), constructSettingsFromParams(params)); } - public Iterable<String> getOutput(long jobId, List<JobSynchronizableFile> files) { - return jobs.get(jobId).getOutput(files); + public Job createJob() throws IOException { + JobInfo jobInfo = jobManager.createJob(); + jobInfo.storeDataInWorkdirectory(getUploadingFile()); + return convertJob(jobInfo); + } + + public Collection<Job> getJobs() throws IOException { + + return jobManager.getJobs().stream().map(this::convertJob).collect(Collectors.toList()); } private HaaSClient.UploadingFile getUploadingFile() { return new UploadingFileFromResource("", CONFIG_YAML); } - private long indexJob(JobInfo jobInfo) { - jobs.put(jobInfo.getId(), jobInfo); - return jobInfo.getId(); + private Job convertJob(JobInfo jobInfo) { + return new Job(jobInfo); } - @SuppressWarnings("rawtypes") private String getOutputName(InputStream openLocalFile) throws IOException { try (InputStream is = openLocalFile) { Yaml yaml = new Yaml(); - Map map = yaml.load(is); - String result = (String) ((Map) map.get("common")).get("hdf5_xml_filename"); + Map<String, Map<String, String>> map = yaml.load(is); + String result = map.get("common").get("hdf5_xml_filename"); if (result == null) { throw new IllegalArgumentException("hdf5_xml_filename not found"); } @@ -122,4 +198,55 @@ public class BenchmarkJobManager { || p.getParent().getFileName().toString().equals("logs"); }; } + + private static Settings constructSettingsFromParams(BenchmarkSPIMParameters params) { + // TODO Auto-generated method stub + return new Settings() { + + @Override + public String getUserName() { + return params.username(); + } + + @Override + public int getTimeout() { + return HAAS_TIMEOUT; + } + + @Override + public long getTemplateId() { + return HAAS_TEMPLATE_ID; + } + + @Override + public String getProjectId() { + return HAAS_PROJECT_ID; + } + + @Override + public String getPhone() { + return params.phone(); + } + + @Override + public String getPassword() { + return params.password(); + } + + @Override + public String getJobName() { + return HAAS_JOB_NAME; + } + + @Override + public String getEmail() { + return params.email(); + } + + @Override + public long getClusterNodeType() { + return HAAS_CLUSTER_NODE_TYPE; + } + }; + } } diff --git a/haas-spim-benchmark/src/main/java/cz/it4i/fiji/haas_spim_benchmark/core/BenchmarkSPIMParameters.java b/haas-spim-benchmark/src/main/java/cz/it4i/fiji/haas_spim_benchmark/core/BenchmarkSPIMParameters.java new file mode 100644 index 0000000000000000000000000000000000000000..abbafc2c0db434162b7166c36d457086e896512c --- /dev/null +++ b/haas-spim-benchmark/src/main/java/cz/it4i/fiji/haas_spim_benchmark/core/BenchmarkSPIMParameters.java @@ -0,0 +1,11 @@ +package cz.it4i.fiji.haas_spim_benchmark.core; + +import java.nio.file.Path; + +public interface BenchmarkSPIMParameters { + Path workingDirectory(); + String username(); + String password(); + String phone(); + String email(); +} diff --git a/haas-spim-benchmark/src/main/java/cz/it4i/fiji/haas_spim_benchmark/core/Constants.java b/haas-spim-benchmark/src/main/java/cz/it4i/fiji/haas_spim_benchmark/core/Constants.java new file mode 100644 index 0000000000000000000000000000000000000000..367ef54df3ca69b2dc82e879f4c0088737adf470 --- /dev/null +++ b/haas-spim-benchmark/src/main/java/cz/it4i/fiji/haas_spim_benchmark/core/Constants.java @@ -0,0 +1,5 @@ +package cz.it4i.fiji.haas_spim_benchmark.core; + +public interface Constants { + long HAAS_UPDATE_TIMEOUT = 1000; +} diff --git a/haas-spim-benchmark/src/main/java/cz/it4i/fiji/haas_spim_benchmark/ui/BenchmarkSPIM.fxml b/haas-spim-benchmark/src/main/java/cz/it4i/fiji/haas_spim_benchmark/ui/BenchmarkSPIM.fxml index 07201409776731fd9033a79207a24241f760665b..27eff777e379056574c46ec623441f321a668d56 100644 --- a/haas-spim-benchmark/src/main/java/cz/it4i/fiji/haas_spim_benchmark/ui/BenchmarkSPIM.fxml +++ b/haas-spim-benchmark/src/main/java/cz/it4i/fiji/haas_spim_benchmark/ui/BenchmarkSPIM.fxml @@ -4,7 +4,7 @@ <?import javafx.scene.control.TableView?> <?import javafx.scene.layout.BorderPane?> -<BorderPane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="400.0" prefWidth="912.0" xmlns="http://javafx.com/javafx/8.0.65" xmlns:fx="http://javafx.com/fxml/1" fx:controller="cz.it4i.fiji.haas_snakemake_spim.ui.CheckStatusOfHaaSController"> +<BorderPane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="400.0" prefWidth="912.0" xmlns="http://javafx.com/javafx/8.0.65" xmlns:fx="http://javafx.com/fxml/1" fx:controller="cz.it4i.fiji.haas_spim_benchmark.ui.BenchmarkSPIMController"> <center> <TableView fx:id="jobs" prefHeight="400.0" prefWidth="675.0" BorderPane.alignment="CENTER"> <columns> diff --git a/haas-spim-benchmark/src/main/java/cz/it4i/fiji/haas_spim_benchmark/ui/BenchmarkSPIMController.java b/haas-spim-benchmark/src/main/java/cz/it4i/fiji/haas_spim_benchmark/ui/BenchmarkSPIMController.java index 8e8feade02c1274450e3cb2ac47e5d06d852db25..9010a3b02a52cf5ba5c70e42bca2078ab235cfbd 100644 --- a/haas-spim-benchmark/src/main/java/cz/it4i/fiji/haas_spim_benchmark/ui/BenchmarkSPIMController.java +++ b/haas-spim-benchmark/src/main/java/cz/it4i/fiji/haas_spim_benchmark/ui/BenchmarkSPIMController.java @@ -1,15 +1,192 @@ package cz.it4i.fiji.haas_spim_benchmark.ui; +import java.awt.Desktop; import java.awt.Window; +import java.awt.event.WindowAdapter; +import java.awt.event.WindowEvent; +import java.io.IOException; +import java.util.EnumSet; +import java.util.HashSet; +import java.util.Map; +import java.util.Set; +import java.util.Timer; +import java.util.TimerTask; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.function.Function; +import java.util.function.Predicate; +import java.util.stream.Collectors; +import javax.swing.WindowConstants; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import cz.it4i.fiji.haas.ui.DummyProgress; import cz.it4i.fiji.haas.ui.FXFrame; +import cz.it4i.fiji.haas.ui.ModalDialogs; +import cz.it4i.fiji.haas.ui.ObservableValueAdapter; +import cz.it4i.fiji.haas.ui.ProgressDialog; +import cz.it4i.fiji.haas.ui.TableViewContextMenu; +import cz.it4i.fiji.haas_java_client.JobState; +import cz.it4i.fiji.haas_spim_benchmark.core.BenchmarkJobManager; +import cz.it4i.fiji.haas_spim_benchmark.core.BenchmarkJobManager.Job; +import cz.it4i.fiji.haas_spim_benchmark.core.Constants; +import javafx.fxml.FXML; +import javafx.scene.control.TableColumn; +import javafx.scene.control.TableView; +import net.imagej.updater.util.Progress; + +public class BenchmarkSPIMController implements FXFrame.Controller { + + private static boolean notNullValue(Job j, Predicate<Job> pred) { + if (j == null) { + return false; + } else { + return pred.test(j); + } + } + + @FXML + private TableView<Job> jobs; + + private BenchmarkJobManager manager; + + private Window root; + + private ExecutorService executorService; -public class BenchmarkSPIMController implements FXFrame.Controller{ + private Timer timer; + + private static Logger log = LoggerFactory + .getLogger(cz.it4i.fiji.haas_spim_benchmark.ui.BenchmarkSPIMController.class); @Override public void init(Window frame) { - // TODO Auto-generated method stub - + executorService = Executors.newSingleThreadExecutor(); + timer = new Timer(); + timer.scheduleAtFixedRate(new TimerTask() { + @Override + public void run() { + updateJobs(false); + } + }, Constants.HAAS_UPDATE_TIMEOUT, Constants.HAAS_UPDATE_TIMEOUT); + root = frame; + initTable(); + initMenu(); + updateJobs(); + root.addWindowListener(new WindowAdapter() { + @Override + public void windowClosed(WindowEvent e) { + super.windowClosed(e); + dispose(); + } + }); + } + + public void setManager(BenchmarkJobManager manager) { + this.manager = manager; + } + private void initMenu() { + TableViewContextMenu<Job> menu = new TableViewContextMenu<>(jobs); + menu.addItem("Create job", x -> executeJobActionAsync("Creating job", p -> manager.createJob()), j -> true); + menu.addItem("Start job", job -> executeJobActionAsync("Starting job", p -> job.startJob(p)), + job -> notNullValue(job, j -> j.getState() == JobState.Configuring)); + menu.addItem("Download", job -> executeJobActionAsync("Downloading data", p -> job.downloadData(p)), + job -> notNullValue(job, + j -> EnumSet.of(JobState.Failed, JobState.Finished).contains(j.getState()) && !j.downloaded())); + menu.addItem("Show output", j -> new JobOutputView(root, executorService, j, Constants.HAAS_UPDATE_TIMEOUT), + job -> notNullValue(job, + j -> EnumSet.of(JobState.Failed, JobState.Finished, JobState.Running).contains(j.getState()))); + menu.addItem("Open", j->open(j), x->true); + menu.addItem("Update table", job -> updateJobs(), j -> true); + + } + + private void open(Job j) { + executorService.execute(() -> { + Desktop desktop = Desktop.getDesktop(); + try { + desktop.open(j.getDirectory().toFile()); + } catch (IOException e) { + log.error(e.getMessage(), e); + }}); + } + + private void executeJobActionAsync(String title, P_JobAction action) { + executorService.execute(() -> { + try { + ProgressDialog dialog = ModalDialogs.doModal(new ProgressDialog(root, title), + WindowConstants.DO_NOTHING_ON_CLOSE); + action.doAction(dialog); + dialog.done(); + updateJobs(); + } catch (IOException e) { + log.error(e.getMessage(), e); + } + }); + } + + private void updateJobs() { + updateJobs(true); + } + + private void updateJobs(boolean showProgress) { + executorService.execute(() -> { + Progress progress = showProgress + ? ModalDialogs.doModal(new ProgressDialog(root, "Updating jobs"), + WindowConstants.DO_NOTHING_ON_CLOSE) + : new DummyProgress(); + + Set<Job> old = new HashSet<Job>(jobs.getItems()); + Map<Job, Job> actual; + try { + actual = manager.getJobs().stream().map(job -> job.update()) + .collect(Collectors.toMap(job -> job, job -> job)); + } catch (IOException e) { + throw new RuntimeException(e); + } + for (Job job : old) { + if (!actual.containsKey(job)) { + jobs.getItems().remove(job); + } else { + job.update(actual.get(job)); + } + } + progress.done(); + FXFrame.runOnFxThread(() -> { + for (Job job : actual.keySet()) { + if (!old.contains(job)) { + jobs.getItems().add(job); + } + } + }); + }); + } + + private void initTable() { + setCellValueFactory(0, j -> j.getId() + ""); + setCellValueFactory(1, j -> j.getState().toString()); + setCellValueFactory(2, j -> j.getCreationTime().toString()); + setCellValueFactory(3, j -> j.getStartTime().toString()); + setCellValueFactory(4, j -> j.getEndTime().toString()); + } + + @SuppressWarnings("unchecked") + private void setCellValueFactory(int index, Function<Job, String> mapper) { + ((TableColumn<Job, String>) jobs.getColumns().get(index)) + .setCellValueFactory(f -> new ObservableValueAdapter<Job, String>(f.getValue(), mapper)); + + } + + private interface P_JobAction { + public void doAction(Progress p) throws IOException; + } + + private void dispose() { + executorService.shutdown(); + timer.cancel(); + } } diff --git a/haas-spim-benchmark/src/main/java/cz/it4i/fiji/haas_spim_benchmark/ui/BenchmarkSPIMWindow.java b/haas-spim-benchmark/src/main/java/cz/it4i/fiji/haas_spim_benchmark/ui/BenchmarkSPIMWindow.java index 206e707499937f08a6cfba9bfa30f77c6657d0be..b15fadcdc0d6ec5ef6c79c59d235a534f0899b5d 100644 --- a/haas-spim-benchmark/src/main/java/cz/it4i/fiji/haas_spim_benchmark/ui/BenchmarkSPIMWindow.java +++ b/haas-spim-benchmark/src/main/java/cz/it4i/fiji/haas_spim_benchmark/ui/BenchmarkSPIMWindow.java @@ -1,16 +1,21 @@ package cz.it4i.fiji.haas_spim_benchmark.ui; import java.awt.Frame; +import java.io.IOException; import cz.it4i.fiji.haas.ui.FXFrame; +import cz.it4i.fiji.haas_spim_benchmark.core.BenchmarkJobManager; +import cz.it4i.fiji.haas_spim_benchmark.core.BenchmarkSPIMParameters; public class BenchmarkSPIMWindow extends FXFrame<BenchmarkSPIMController> { private static final long serialVersionUID = 1L; - public BenchmarkSPIMWindow(Frame applicationFrame) { + public BenchmarkSPIMWindow(Frame applicationFrame, BenchmarkSPIMParameters params) throws IOException { super(applicationFrame, "/cz/it4i/fiji/haas_spim_benchmark/ui/BenchmarkSPIM.fxml"); - init(x->{}); + BenchmarkJobManager manager = new BenchmarkJobManager(params); + init(controller->controller.setManager(manager)); } + } diff --git a/haas-spim-benchmark/src/main/java/cz/it4i/fiji/haas_spim_benchmark/ui/JobOutputView.java b/haas-spim-benchmark/src/main/java/cz/it4i/fiji/haas_spim_benchmark/ui/JobOutputView.java new file mode 100644 index 0000000000000000000000000000000000000000..3da6d260f6756ce10a0dfaf76611d2c21de87e1e --- /dev/null +++ b/haas-spim-benchmark/src/main/java/cz/it4i/fiji/haas_spim_benchmark/ui/JobOutputView.java @@ -0,0 +1,102 @@ +package cz.it4i.fiji.haas_spim_benchmark.ui; + +import java.awt.BorderLayout; +import java.awt.Dimension; +import java.awt.Window; +import java.awt.event.WindowAdapter; +import java.awt.event.WindowEvent; +import java.util.Arrays; +import java.util.Timer; +import java.util.TimerTask; +import java.util.concurrent.ExecutorService; + +import javax.swing.JDialog; +import javax.swing.JPanel; +import javax.swing.JScrollPane; +import javax.swing.JTextArea; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import cz.it4i.fiji.haas.JobManager.JobSynchronizableFile; +import cz.it4i.fiji.haas_java_client.SynchronizableFileType; +import cz.it4i.fiji.haas_spim_benchmark.core.BenchmarkJobManager.Job; + +public class JobOutputView { + @SuppressWarnings("unused") + private static Logger log = LoggerFactory.getLogger(cz.it4i.fiji.haas_spim_benchmark.ui.JobOutputView.class); + private Timer timer; + private JDialog theDialog; + private JTextArea theText; + private Job job; + private ExecutorService executor; + private long readedChars = 0; + + public JobOutputView(Window parent, ExecutorService executor, Job job, long refreshTimeout) { + this.job = job; + this.executor = executor; + constructFrame(parent); + parent.addWindowListener(new WindowAdapter() { + @Override + public void windowClosed(WindowEvent e) { + dispose(); + } + }); + timer = new Timer(); + timer.schedule(new TimerTask() { + @Override + public void run() { + updateView(); + } + }, refreshTimeout, refreshTimeout); + updateView(); + } + + private void dispose() { + timer.cancel(); + theDialog.dispose(); + } + + private void constructFrame(Window parent) { + theDialog = new JDialog(parent, "Output of job: " + (job!=null?job.getId():"N/A")); + theDialog.setPreferredSize(new Dimension(500, 500)); + theDialog.setLocation(550, 400); + JPanel jPanel = new JPanel(new BorderLayout()); + theDialog.setContentPane(jPanel); + //Create the text area used for output. Request + //enough space for 5 rows and 30 columns. + theText = new JTextArea(5, 30); + theText.setEditable(false); + JScrollPane scrollPane = new JScrollPane(theText); + + //Lay out the main panel. + jPanel.setPreferredSize(new Dimension(450, 130)); + jPanel.add(scrollPane, BorderLayout.CENTER); + + theDialog.pack(); + theDialog.addWindowListener(new WindowAdapter() { + @Override + public void windowClosing(WindowEvent e) { + super.windowClosing(e); + dispose(); + } + }); + theDialog.setVisible(true); + } + + private void updateView() { + executor.execute(() -> { + JobSynchronizableFile file = new JobSynchronizableFile(SynchronizableFileType.StandardErrorFile, + readedChars); + String output; + if (job != null) { + output = job.getOutput(Arrays.asList(file)).get(0); + } else { + output = "This is testing line\n"; + } + readedChars += output.length(); + theText.append(output); + theText.setCaretPosition(theText.getDocument().getLength()); + }); + } +} diff --git a/haas-spim-benchmark/src/main/resources/.gitignore b/haas-spim-benchmark/src/main/resources/.gitignore new file mode 100644 index 0000000000000000000000000000000000000000..b5285f5f9fb3ae9423696a524c0fcf6c5a8d5d0c --- /dev/null +++ b/haas-spim-benchmark/src/main/resources/.gitignore @@ -0,0 +1 @@ +/configuration.properties diff --git a/haas-spim-benchmark/src/main/resources/configuration.properties.template b/haas-spim-benchmark/src/main/resources/configuration.properties.template new file mode 100644 index 0000000000000000000000000000000000000000..892ed0d0a691608a7070d5beb4c3c8e539c074ef --- /dev/null +++ b/haas-spim-benchmark/src/main/resources/configuration.properties.template @@ -0,0 +1,4 @@ +USER_NAME= +PASSWORD= +EMAIL= +PHONE= \ No newline at end of file diff --git a/haas-spim-benchmark/src/test/java/cz/it4i/fiji/haas/.gitignore b/haas-spim-benchmark/src/test/java/cz/it4i/fiji/haas/.gitignore new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/haas-spim-benchmark/src/test/java/cz/it4i/fiji/haas/BenchmarkSPIMParametersImpl.java b/haas-spim-benchmark/src/test/java/cz/it4i/fiji/haas/BenchmarkSPIMParametersImpl.java new file mode 100644 index 0000000000000000000000000000000000000000..f9af043a0662da9ee9b5ada72d093ac70d35737d --- /dev/null +++ b/haas-spim-benchmark/src/test/java/cz/it4i/fiji/haas/BenchmarkSPIMParametersImpl.java @@ -0,0 +1,48 @@ +package cz.it4i.fiji.haas; + +import java.nio.file.Path; + +import cz.it4i.fiji.haas_java_client.Configuration; +import cz.it4i.fiji.haas_spim_benchmark.core.BenchmarkSPIMParameters; + +class BenchmarkSPIMParametersImpl extends Configuration implements BenchmarkSPIMParameters{ + + String USER_NAME = "testuser"; + String PASSWORD = "57f9caaf84"; + + String EMAIL = "aaa@vsb.cz"; + String PHONE = "123456789"; + + + private Path workingDirectory; + + public BenchmarkSPIMParametersImpl(Path workingDirectory) { + super("configuration.properties"); + this.workingDirectory = workingDirectory; + } + + @Override + public Path workingDirectory() { + return workingDirectory; + } + + @Override + public String username() { + return getValue("USER_NAME"); + } + + @Override + public String password() { + return getValue("PASSWORD"); + } + + @Override + public String phone() { + return getValue("PHONE"); + } + + @Override + public String email() { + return getValue("EMAIL"); + } +} diff --git a/haas-spim-benchmark/src/test/java/cz/it4i/fiji/haas/RunBenchmark.java b/haas-spim-benchmark/src/test/java/cz/it4i/fiji/haas/RunBenchmark.java index 3a36e0e82d5df1cbd9fd9d3624a35318068d76b4..15c76cad21e1c948a5024d2551232a2952b50ee3 100644 --- a/haas-spim-benchmark/src/test/java/cz/it4i/fiji/haas/RunBenchmark.java +++ b/haas-spim-benchmark/src/test/java/cz/it4i/fiji/haas/RunBenchmark.java @@ -9,73 +9,50 @@ import java.util.Arrays; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import cz.it4i.fiji.haas.JobManager.JobSynchronizableFile; +import cz.it4i.fiji.haas.ui.DummyProgress; import cz.it4i.fiji.haas_java_client.JobState; import cz.it4i.fiji.haas_java_client.SynchronizableFileType; import cz.it4i.fiji.haas_spim_benchmark.core.BenchmarkJobManager; -import net.imagej.updater.util.Progress; +import cz.it4i.fiji.haas_spim_benchmark.core.BenchmarkJobManager.Job; +import cz.it4i.fiji.haas_spim_benchmark.core.BenchmarkSPIMParameters; public class RunBenchmark { private static Logger log = LoggerFactory.getLogger(cz.it4i.fiji.haas.RunBenchmark.class); public static class CreateJob { public static void main(String[] args) throws IOException { - Path p = Paths.get("/tmp/benchmark"); - if (!Files.exists(p)) { - Files.createDirectory(p); - } - BenchmarkJobManager benchmarkJobManager = new BenchmarkJobManager(p, new P_Progress()); - long ji = benchmarkJobManager.createJob(); - log.info("job: " + ji + " created."); + BenchmarkJobManager benchmarkJobManager = new BenchmarkJobManager(getBenchmarkSPIMParameters()); + Job ji = benchmarkJobManager.createJob(); + log.info("job: " + ji.getId() + " created."); } } public static class ProcessJobs { public static void main(String[] args) throws IOException { - Path p = Paths.get("/tmp/benchmark"); - if (!Files.exists(p)) { - Files.createDirectory(p); - } - BenchmarkJobManager benchmarkJobManager = new BenchmarkJobManager(p, new P_Progress()); - for (long jobId : benchmarkJobManager.getJobs()) { + BenchmarkJobManager benchmarkJobManager = new BenchmarkJobManager(getBenchmarkSPIMParameters()); + for (Job job : benchmarkJobManager.getJobs()) { JobState state; - log.info("job: " + jobId + " hasStatus " + (state = benchmarkJobManager.getState(jobId))); + log.info("job: " + job.getId() + " hasStatus " + (state = job.getState())); if (state == JobState.Configuring) { - benchmarkJobManager.startJob(jobId); + job.startJob(new DummyProgress()); } else if (state != JobState.Running && state != JobState.Queued) { - benchmarkJobManager.downloadData(jobId); + job.downloadData(new DummyProgress()); } else if (state == JobState.Running) { - log.info(benchmarkJobManager.getOutput(jobId,Arrays.asList( - new JobManager.JobSynchronizableFile(SynchronizableFileType.StandardErrorFile, 0))).iterator().next()); - } + JobSynchronizableFile file = new JobSynchronizableFile(SynchronizableFileType.StandardErrorFile, 0); + log.info(job.getOutput(Arrays.asList(file)).iterator().next()); + } } } } - private static class P_Progress implements Progress { - - @Override - public void setTitle(String title) { - } + - @Override - public void setCount(int count, int total) { + private static BenchmarkSPIMParameters getBenchmarkSPIMParameters() throws IOException { + Path p = Paths.get("/tmp/benchmark"); + if (!Files.exists(p)) { + Files.createDirectory(p); } - - @Override - public void addItem(Object item) { - } - - @Override - public void setItemCount(int count, int total) { - } - - @Override - public void itemDone(Object item) { - } - - @Override - public void done() { - } - + return new BenchmarkSPIMParametersImpl(p); } } diff --git a/haas-spim-benchmark/src/test/java/cz/it4i/fiji/haas/RunView.java b/haas-spim-benchmark/src/test/java/cz/it4i/fiji/haas/RunView.java new file mode 100644 index 0000000000000000000000000000000000000000..0ffd4000e349a5801f5b58b9630e7e75be87cea1 --- /dev/null +++ b/haas-spim-benchmark/src/test/java/cz/it4i/fiji/haas/RunView.java @@ -0,0 +1,13 @@ +package cz.it4i.fiji.haas; + +import java.util.concurrent.Executors; + +import javax.swing.JFrame; + +import cz.it4i.fiji.haas_spim_benchmark.ui.JobOutputView; + +public class RunView { + public static void main(String[] args) { + new JobOutputView(new JFrame(), Executors.newSingleThreadExecutor(), null, 3000); + } +} diff --git a/java-scpclient/src/test/java/TestSCP.java b/java-scpclient/src/test/java/TestSCP.java index 5c20cd53e61f46a0e06f76b1ca474e52d7efc68e..6762e37bdb19ce65089570420175d5dc1355139d 100644 --- a/java-scpclient/src/test/java/TestSCP.java +++ b/java-scpclient/src/test/java/TestSCP.java @@ -1,5 +1,4 @@ import java.io.IOException; -import java.nio.file.Paths; import com.jcraft.jsch.JSchException; diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000000000000000000000000000000000000..04d107ebb35ec5f9c2122eb7050b5cebb8437d4e --- /dev/null +++ b/pom.xml @@ -0,0 +1,34 @@ +<project xmlns="http://maven.apache.org/POM/4.0.0" + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 + http://maven.apache.org/maven-v4_0_0.xsd"> + <modelVersion>4.0.0</modelVersion> + <groupId>cz.it4i.fiji</groupId> + <artifactId>haas-parent</artifactId> + <version>0.0.1-SNAPSHOT</version> + <name>Multi Chapter Simple Parent Project</name> + <packaging>pom</packaging> + <modules> + <module>java-scpclient</module> + <module>haas-java-client</module> + <module>haas-imagej-client</module> + <module>haas-spim-benchmark</module> + + </modules> + + <build> + <pluginManagement> + <plugins> + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-compiler-plugin</artifactId> + <configuration> + <source>1.5</source> + <target>1.5</target> + </configuration> + </plugin> + </plugins> + </pluginManagement> + </build> + +</project>