From 9fe1f07a4c609def29f1fb8f690f9d788b678adc Mon Sep 17 00:00:00 2001 From: Jan Kozusznik <jan@kozusznik.cz> Date: Tue, 30 Jan 2018 18:06:30 +0100 Subject: [PATCH] solve updates --- .../src/main/java/cz/it4i/fiji/haas/Job.java | 35 +++++++++++++--- .../java/cz/it4i/fiji/haas/JobManager.java | 21 ++++++++-- .../fiji/haas/ui/ObservableValueRegistry.java | 16 +++++--- .../fiji/haas/ui/TableViewContextMenu.java | 6 +++ .../haas/ui/UpdatableObservableValue.java | 41 ++++++++++++------- .../core/BenchmarkJobManager.java | 4 ++ .../ui/BenchmarkSPIMController.java | 29 +++++++------ .../ui/ObservableBenchmarkJobRegistry.java | 6 ++- .../ui/ObservableTaskRegistry.java | 3 +- 9 files changed, 116 insertions(+), 45 deletions(-) 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 fc57f3e1..7a04defd 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 @@ -6,6 +6,7 @@ import java.nio.file.Files; import java.nio.file.Path; import java.util.Calendar; import java.util.Collections; +import java.util.Comparator; import java.util.List; import java.util.function.Predicate; import java.util.function.Supplier; @@ -15,6 +16,7 @@ import java.util.stream.StreamSupport; import org.scijava.log.LogService; import org.scijava.plugin.Parameter; +import cz.it4i.fiji.haas.JobManager.JobManager4Job; import cz.it4i.fiji.haas.JobManager.JobSynchronizableFile; import cz.it4i.fiji.haas_java_client.HaaSClient; import cz.it4i.fiji.haas_java_client.HaaSClient.UploadingFile; @@ -48,8 +50,10 @@ public class Job { private PropertyHolder propertyHolder; - public Job(String name, Path basePath, Supplier<HaaSClient> haasClientSupplier) throws IOException { - this(haasClientSupplier); + private JobManager4Job jobManager; + + public Job(JobManager4Job jobManager, String name, Path basePath, Supplier<HaaSClient> haasClientSupplier) throws IOException { + this(jobManager,haasClientSupplier); HaaSClient client = this.haasClientSupplier.get(); long id = client.createJob(name, Collections.emptyList()); jobDir = basePath.resolve("" + id); @@ -63,8 +67,8 @@ public class Job { setProperty(JOB_NAME, name); } - public Job(Path p, Supplier<HaaSClient> haasClientSupplier) { - this(haasClientSupplier); + public Job(JobManager4Job jobManager,Path p, Supplier<HaaSClient> haasClientSupplier) { + this(jobManager, haasClientSupplier); jobDir = p; propertyHolder = new PropertyHolder(jobDir.resolve(JOB_INFO_FILE)); } @@ -86,8 +90,9 @@ public class Job { client.submitJob(jobId); } - private Job(Supplier<HaaSClient> haasClientSupplier) { + private Job(JobManager4Job jobManager, Supplier<HaaSClient> haasClientSupplier) { this.haasClientSupplier = haasClientSupplier; + this.jobManager = jobManager; } @@ -116,7 +121,6 @@ public class Job { } public JobState getState() { - updateJobInfo(); return getJobInfo().getState(); } @@ -160,6 +164,23 @@ public class Job { return jobDir; } + public boolean remove() { + boolean result; + if((result = jobManager.remove(this)) && Files.isDirectory(jobDir) ) { + List<Path> pathsToDelete; + try { + pathsToDelete = Files.walk(jobDir).sorted(Comparator.reverseOrder()).collect(Collectors.toList()); + for(Path path : pathsToDelete) { + Files.deleteIfExists(path); + } + } catch (IOException e) { + log.error(e.getMessage(), e); + } + + } + return result; + } + private JobInfo getJobInfo() { if (jobInfo == null) { updateJobInfo(); @@ -219,4 +240,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 dfcf3549..0319efc9 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 @@ -4,6 +4,7 @@ import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; import java.util.Collection; +import java.util.Collections; import java.util.Iterator; import java.util.LinkedList; import java.util.stream.Collectors; @@ -20,6 +21,10 @@ import net.imagej.updater.util.Progress; public class JobManager { + interface JobManager4Job { + boolean remove(Job job); + } + @SuppressWarnings("unused") private static Logger log = LoggerFactory.getLogger(cz.it4i.fiji.haas.JobManager.class); @@ -31,6 +36,14 @@ public class JobManager { private Settings settings; + private JobManager4Job remover = new JobManager4Job() { + + @Override + public boolean remove(Job job) { + return jobs.remove(job); + } + }; + public JobManager(Path workDirectory, Settings settings) { this.workDirectory = workDirectory; this.settings = settings; @@ -41,7 +54,7 @@ public class JobManager { if (jobs == null) { jobs = new LinkedList<>(); } - jobs.add(job = new Job(settings.getJobName(), workDirectory, this::getHaasClient)); + jobs.add(job = new Job(remover, settings.getJobName(), workDirectory, this::getHaasClient)); return job; } @@ -57,14 +70,14 @@ public class JobManager { jobs = new LinkedList<>(); try { Files.list(this.workDirectory).filter(p -> Files.isDirectory(p) && Job.isJobPath(p)).forEach(p -> { - jobs.add(new Job(p, this::getHaasClient)); + jobs.add(new Job(remover, p, this::getHaasClient)); }); } catch (IOException e) { - throw new RuntimeException(e); + log.error(e.getMessage(),e); } } - return jobs.stream().collect(Collectors.toList()); + return Collections.unmodifiableCollection(jobs); } public void downloadJob(Long id, Progress notifier) { diff --git a/haas-imagej-client/src/main/java/cz/it4i/fiji/haas/ui/ObservableValueRegistry.java b/haas-imagej-client/src/main/java/cz/it4i/fiji/haas/ui/ObservableValueRegistry.java index ada57f4d..abd2d4ec 100644 --- a/haas-imagej-client/src/main/java/cz/it4i/fiji/haas/ui/ObservableValueRegistry.java +++ b/haas-imagej-client/src/main/java/cz/it4i/fiji/haas/ui/ObservableValueRegistry.java @@ -13,12 +13,14 @@ public class ObservableValueRegistry<T> { private Function<T,UpdateStatus> updateFunction; private Consumer<T> removeConsumer; + private Function<T, Object> stateProvider; - public ObservableValueRegistry(Function<T, UpdateStatus> updateFunction, + public ObservableValueRegistry(Function<T, UpdateStatus> updateFunction,Function<T,Object> stateProvider, Consumer<T> removeConsumer) { super(); this.updateFunction = updateFunction; + this.stateProvider = stateProvider; this.removeConsumer = t-> { removeConsumer.accept(t); remove(t); @@ -29,16 +31,16 @@ public class ObservableValueRegistry<T> { private Map<T,UpdatableObservableValue<T>> map = new HashMap<>(); public ObservableValue<T> addIfAbsent(T value) { - UpdatableObservableValue<T> uov = map.computeIfAbsent(value, v-> new UpdatableObservableValue<T>(v, updateFunction)); + UpdatableObservableValue<T> uov = map.computeIfAbsent(value, v-> new UpdatableObservableValue<T>(v, updateFunction, stateProvider)); return uov; } - public ObservableValue<T> get(T value) { + public UpdatableObservableValue<T> get(T value) { return map.get(value); } - private ObservableValue<T> remove(T value) { - return map.get(value); + protected ObservableValue<T> remove(T value) { + return map.remove(value); } public void update() { @@ -48,4 +50,8 @@ public class ObservableValueRegistry<T> { } } } + + protected void setUpdateFunction(Function<T, UpdateStatus> updateFunction) { + this.updateFunction = updateFunction; + } } 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 index 78acda8a..1fbcf4ee 100644 --- 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 @@ -5,6 +5,9 @@ import java.util.LinkedList; import java.util.function.Consumer; import java.util.function.Predicate; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + import javafx.event.EventHandler; import javafx.scene.control.ContextMenu; import javafx.scene.control.MenuItem; @@ -12,6 +15,8 @@ import javafx.scene.control.TableView; import javafx.scene.input.ContextMenuEvent; public class TableViewContextMenu<T> { + @SuppressWarnings("unused") + private static Logger log = LoggerFactory.getLogger(cz.it4i.fiji.haas.ui.TableViewContextMenu.class); private Collection<P_MenuItem> items = new LinkedList<TableViewContextMenu<T>.P_MenuItem>(); private ContextMenu cm; private TableView<T> tableView; @@ -24,6 +29,7 @@ public class TableViewContextMenu<T> { @Override public void handle(ContextMenuEvent event) { T selected = getSelectedItem(); + for (P_MenuItem item : items) { item.updateEnable(selected); } diff --git a/haas-imagej-client/src/main/java/cz/it4i/fiji/haas/ui/UpdatableObservableValue.java b/haas-imagej-client/src/main/java/cz/it4i/fiji/haas/ui/UpdatableObservableValue.java index 41c9deda..c1cb5c22 100644 --- a/haas-imagej-client/src/main/java/cz/it4i/fiji/haas/ui/UpdatableObservableValue.java +++ b/haas-imagej-client/src/main/java/cz/it4i/fiji/haas/ui/UpdatableObservableValue.java @@ -4,46 +4,58 @@ import java.util.function.Function; import javafx.beans.value.ObservableValueBase; -public class UpdatableObservableValue<T> extends ObservableValueBase<T>{ +public class UpdatableObservableValue<T> extends ObservableValueBase<T> { public enum UpdateStatus { - Deleted, - Updated, - NotUpdated + Deleted, Updated, NotUpdated } - + private T wrapped; - private Function<T,UpdateStatus> updateFunction; - - - public UpdatableObservableValue(T wrapped, Function<T, UpdateStatus> updateFunction) { + private Function<T, UpdateStatus> updateFunction; + private Object oldState; + private Function<T, Object> stateProvider; + + public UpdatableObservableValue(T wrapped, Function<T, UpdateStatus> updateFunction, + Function<T, Object> stateProvider) { super(); this.wrapped = wrapped; this.updateFunction = updateFunction; - + this.stateProvider = stateProvider; + oldState = stateProvider.apply(wrapped); } @Override public T getValue() { - + return wrapped; } public UpdateStatus update() { UpdateStatus status = updateFunction.apply(wrapped); + Object state = stateProvider.apply(wrapped); + boolean fire = true; switch (status) { + case NotUpdated: + fire = false; + if (oldState == null && state != null || oldState != null && (state == null || !oldState.equals(state))) { + fire = true; + } case Updated: - fireValueChangedEvent(); + oldState = state; + if (fire) { + fireValueChangedEvent(); + } default: return status; } } + @Override public int hashCode() { return wrapped.hashCode(); } - + @Override public boolean equals(Object obj) { if (this == obj) @@ -61,6 +73,5 @@ public class UpdatableObservableValue<T> extends ObservableValueBase<T>{ return false; return true; } - - + } 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 473f2551..c029a6e5 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 @@ -199,6 +199,10 @@ public class BenchmarkJobManager { String downloadedStr = job.getProperty(JOB_HAS_DATA_TO_DOWNLOAD_PROPERTY); return downloadedStr != null && Boolean.parseBoolean(downloadedStr); } + + public boolean remove() { + return job.remove(); + } } public BenchmarkJobManager(BenchmarkSPIMParameters params) throws IOException { 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 7606d57c..71dda4ad 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 @@ -97,9 +97,10 @@ public class BenchmarkSPIMController implements FXFrame.Controller { private void initMenu() { TableViewContextMenu<ObservableValue<BenchmarkJob>> menu = new TableViewContextMenu<>(jobs); menu.addItem("Create job", x -> executeWSCallAsync("Creating job", p -> manager.createJob()), j -> true); - menu.addItem("Start job", job -> executeWSCallAsync("Starting job", p -> job.getValue().startJob(p)), - job -> notNullValue(job, - j -> j.getState() == JobState.Configuring || j.getState() == JobState.Finished)); + menu.addItem("Start job", job -> executeWSCallAsync("Starting job", p -> { + job.getValue().startJob(p); + registry.get(job.getValue()).update(); + }), job -> notNullValue(job, j -> j.getState() == JobState.Configuring || j.getState() == JobState.Finished)); menu.addItem("Show progress", job -> { try { @@ -123,7 +124,7 @@ public class BenchmarkSPIMController implements FXFrame.Controller { j -> new JobOutputView(root, executorServiceUI, j.getValue(), 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.getValue()), x -> true); + menu.addItem("Open", j -> open(j.getValue()), x -> notNullValue(x, j -> true)); menu.addItem("Update table", job -> updateJobs(), j -> true); } @@ -162,14 +163,13 @@ public class BenchmarkSPIMController implements FXFrame.Controller { private void updateJobs(boolean showProgress) { executorServiceWS.execute(() -> { + Progress progress = showProgress + ? ModalDialogs.doModal(new ProgressDialog(root, "Updating jobs"), + WindowConstants.DO_NOTHING_ON_CLOSE) + : new DummyProgress(); registry.update(); - executorServiceUI.execute(() -> { - Progress progress = showProgress - ? ModalDialogs.doModal(new ProgressDialog(root, "Updating jobs"), - WindowConstants.DO_NOTHING_ON_CLOSE) - : new DummyProgress(); - + executorServiceFX.execute(() -> { try { Collection<BenchmarkJob> jobs = manager.getJobs(); Set<ObservableValue<BenchmarkJob>> actual = new HashSet<>(this.jobs.getItems()); @@ -184,13 +184,12 @@ public class BenchmarkSPIMController implements FXFrame.Controller { } progress.done(); - }); }); } private void initTable() { - registry = new ObservableBenchmarkJobRegistry(bj -> jobs.getItems().remove(registry.get(bj))); + registry = new ObservableBenchmarkJobRegistry(bj -> remove(bj)); setCellValueFactory(0, j -> j.getId() + ""); setCellValueFactory(1, j -> j.getState().toString()); setCellValueFactory(2, j -> j.getCreationTime().toString()); @@ -198,6 +197,12 @@ public class BenchmarkSPIMController implements FXFrame.Controller { setCellValueFactory(4, j -> j.getEndTime().toString()); } + private void remove(BenchmarkJob bj) { + + jobs.getItems().remove(registry.get(bj)); + bj.remove(); + } + private void setCellValueFactory(int index, Function<BenchmarkJob, String> mapper) { FXFrame.Controller.setCellValueFactory(jobs, index, mapper); } diff --git a/haas-spim-benchmark/src/main/java/cz/it4i/fiji/haas_spim_benchmark/ui/ObservableBenchmarkJobRegistry.java b/haas-spim-benchmark/src/main/java/cz/it4i/fiji/haas_spim_benchmark/ui/ObservableBenchmarkJobRegistry.java index 93a06645..4c4b8631 100644 --- a/haas-spim-benchmark/src/main/java/cz/it4i/fiji/haas_spim_benchmark/ui/ObservableBenchmarkJobRegistry.java +++ b/haas-spim-benchmark/src/main/java/cz/it4i/fiji/haas_spim_benchmark/ui/ObservableBenchmarkJobRegistry.java @@ -11,7 +11,7 @@ import cz.it4i.fiji.haas_spim_benchmark.core.BenchmarkJobManager.BenchmarkJob; public class ObservableBenchmarkJobRegistry extends ObservableValueRegistry<BenchmarkJob> { public ObservableBenchmarkJobRegistry(Consumer<BenchmarkJob> removeConsumer) { - super(t -> update(t), removeConsumer); + super(t -> update(t), t -> t.getState(), removeConsumer); } private static UpdateStatus update(BenchmarkJob t) { @@ -20,7 +20,9 @@ public class ObservableBenchmarkJobRegistry extends ObservableValueRegistry<Benc if (!Files.isDirectory(t.getDirectory())) { return UpdateStatus.Deleted; } - return oldState != t.getState() ? UpdateStatus.Updated : UpdateStatus.NotUpdated; + UpdateStatus result = oldState != t.getState() ? UpdateStatus.Updated : UpdateStatus.NotUpdated; + + return result; } } diff --git a/haas-spim-benchmark/src/main/java/cz/it4i/fiji/haas_spim_benchmark/ui/ObservableTaskRegistry.java b/haas-spim-benchmark/src/main/java/cz/it4i/fiji/haas_spim_benchmark/ui/ObservableTaskRegistry.java index 595a057f..2ff86a61 100644 --- a/haas-spim-benchmark/src/main/java/cz/it4i/fiji/haas_spim_benchmark/ui/ObservableTaskRegistry.java +++ b/haas-spim-benchmark/src/main/java/cz/it4i/fiji/haas_spim_benchmark/ui/ObservableTaskRegistry.java @@ -1,6 +1,7 @@ package cz.it4i.fiji.haas_spim_benchmark.ui; import java.util.function.Consumer; +import java.util.stream.Collectors; import cz.it4i.fiji.haas.ui.ObservableValueRegistry; import cz.it4i.fiji.haas.ui.UpdatableObservableValue.UpdateStatus; @@ -11,7 +12,7 @@ import cz.it4i.fiji.haas_spim_benchmark.core.TaskComputation; public class ObservableTaskRegistry extends ObservableValueRegistry<Task> { public ObservableTaskRegistry(Consumer<Task> removeConsumer) { - super(t -> update(t), removeConsumer); + super(t -> update(t),t->t.getComputations().stream().map(tc->tc.getState()).collect(Collectors.toList()), removeConsumer); } private static UpdateStatus update(Task t) { -- GitLab