Skip to content
Snippets Groups Projects
Commit 6ba47ee7 authored by Jan Kožusznik's avatar Jan Kožusznik
Browse files

refactoring

parent 1aa5ced8
No related branches found
No related tags found
No related merge requests found
...@@ -6,37 +6,44 @@ import java.util.Map; ...@@ -6,37 +6,44 @@ import java.util.Map;
import java.util.function.Consumer; import java.util.function.Consumer;
import java.util.function.Function; import java.util.function.Function;
import cz.it4i.fiji.haas.ui.UpdatableObservableValue.UpdateStatus;
import javafx.beans.value.ObservableValue; import javafx.beans.value.ObservableValue;
public class ObservableValueRegistry<T> { public class ObservableValueRegistry<T> {
private Function<T, Boolean> updateFunction; private Function<T,UpdateStatus> updateFunction;
private Function<T, Boolean> validateFunction;
private Consumer<T> removeConsumer; private Consumer<T> removeConsumer;
public ObservableValueRegistry(Function<T, Boolean> validateFunction, Function<T, Boolean> updateFunction, public ObservableValueRegistry(Function<T, UpdateStatus> updateFunction,
Consumer<T> removeConsumer) { Consumer<T> removeConsumer) {
super(); super();
this.validateFunction = validateFunction;
this.updateFunction = updateFunction; this.updateFunction = updateFunction;
this.removeConsumer = removeConsumer; this.removeConsumer = t-> {
removeConsumer.accept(t);
remove(t);
};
} }
private Map<T,UpdatableObservableValue<T>> map = new HashMap<>(); private Map<T,UpdatableObservableValue<T>> map = new HashMap<>();
public ObservableValue<T> addIfAbsent(T value) { public ObservableValue<T> addIfAbsent(T value) {
UpdatableObservableValue<T> uov = map.computeIfAbsent(value, v-> new UpdatableObservableValue<T>(v, updateFunction, validateFunction)); UpdatableObservableValue<T> uov = map.computeIfAbsent(value, v-> new UpdatableObservableValue<T>(v, updateFunction));
return uov; return uov;
} }
public ObservableValue<T> remove(T value) { public ObservableValue<T> get(T value) {
return map.get(value);
}
private ObservableValue<T> remove(T value) {
return map.get(value); return map.get(value);
} }
public void update() { public void update() {
for (UpdatableObservableValue<T> value : new LinkedList<>(map.values())) { for (UpdatableObservableValue<T> value : new LinkedList<>(map.values())) {
if(!value.update()) { if(value.update() == UpdateStatus.Deleted) {
removeConsumer.accept(value.getValue()); removeConsumer.accept(value.getValue());
} }
} }
......
...@@ -6,16 +6,21 @@ import javafx.beans.value.ObservableValueBase; ...@@ -6,16 +6,21 @@ 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
}
private T wrapped; private T wrapped;
private Function<T,Boolean> updateFunction; private Function<T,UpdateStatus> updateFunction;
private Function<T,Boolean> validateFunction;
public UpdatableObservableValue(T wrapped, Function<T, Boolean> updateFunction, Function<T, Boolean> validateFunction) { public UpdatableObservableValue(T wrapped, Function<T, UpdateStatus> updateFunction) {
super(); super();
this.wrapped = wrapped; this.wrapped = wrapped;
this.updateFunction = updateFunction; this.updateFunction = updateFunction;
this.validateFunction = validateFunction;
} }
@Override @Override
...@@ -24,14 +29,38 @@ public class UpdatableObservableValue<T> extends ObservableValueBase<T>{ ...@@ -24,14 +29,38 @@ public class UpdatableObservableValue<T> extends ObservableValueBase<T>{
return wrapped; return wrapped;
} }
public boolean update() { public UpdateStatus update() {
if(!validateFunction.apply(wrapped)) { UpdateStatus status = updateFunction.apply(wrapped);
return false; switch (status) {
} case Updated:
if(updateFunction.apply(wrapped)) {
fireValueChangedEvent(); fireValueChangedEvent();
default:
return status;
} }
}
@Override
public int hashCode() {
return wrapped.hashCode();
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
@SuppressWarnings("unchecked")
UpdatableObservableValue<T> other = (UpdatableObservableValue<T>) obj;
if (wrapped == null) {
if (other.wrapped != null)
return false;
} else if (!wrapped.equals(other.wrapped))
return false;
return true; return true;
} }
} }
...@@ -33,7 +33,6 @@ import cz.it4i.fiji.haas_java_client.HaaSClient; ...@@ -33,7 +33,6 @@ import cz.it4i.fiji.haas_java_client.HaaSClient;
import cz.it4i.fiji.haas_java_client.JobState; import cz.it4i.fiji.haas_java_client.JobState;
import cz.it4i.fiji.haas_java_client.Settings; import cz.it4i.fiji.haas_java_client.Settings;
import cz.it4i.fiji.haas_java_client.SynchronizableFileType; import cz.it4i.fiji.haas_java_client.SynchronizableFileType;
import javafx.beans.value.ObservableValueBase;
import net.imagej.updater.util.Progress; import net.imagej.updater.util.Progress;
public class BenchmarkJobManager { public class BenchmarkJobManager {
...@@ -46,10 +45,9 @@ public class BenchmarkJobManager { ...@@ -46,10 +45,9 @@ public class BenchmarkJobManager {
private JobManager jobManager; private JobManager jobManager;
public final class BenchmarkJob extends ObservableValueBase<BenchmarkJob> implements HaaSOutputSource { public final class BenchmarkJob implements HaaSOutputSource {
private Job job; private Job job;
private JobState oldState;
private HaaSOutputHolder outputOfSnakemake; private HaaSOutputHolder outputOfSnakemake;
...@@ -67,11 +65,12 @@ public class BenchmarkJobManager { ...@@ -67,11 +65,12 @@ public class BenchmarkJobManager {
return false; return false;
} }
}; };
public BenchmarkJob(Job job) { public BenchmarkJob(Job job) {
super(); super();
this.job = job; this.job = job;
outputOfSnakemake = new HaaSOutputHolderImpl(getValue(), SynchronizableFileType.StandardErrorFile); outputOfSnakemake = new HaaSOutputHolderImpl(this, SynchronizableFileType.StandardErrorFile);
} }
public void startJob(Progress progress) throws IOException { public void startJob(Progress progress) throws IOException {
...@@ -79,12 +78,11 @@ public class BenchmarkJobManager { ...@@ -79,12 +78,11 @@ public class BenchmarkJobManager {
String outputName = getOutputName(job.openLocalFile(Constants.CONFIG_YAML)); String outputName = getOutputName(job.openLocalFile(Constants.CONFIG_YAML));
job.submit(); job.submit();
job.setProperty(Constants.SPIM_OUTPUT_FILENAME_PATTERN, outputName); job.setProperty(Constants.SPIM_OUTPUT_FILENAME_PATTERN, outputName);
fireValueChangedEvent();
setDownloaded(false); setDownloaded(false);
} }
public JobState getState() { public JobState getState() {
return oldState = job.getState(); return job.getState();
} }
public void downloadData(Progress progress) throws IOException { public void downloadData(Progress progress) throws IOException {
...@@ -94,13 +92,12 @@ public class BenchmarkJobManager { ...@@ -94,13 +92,12 @@ public class BenchmarkJobManager {
} else if (job.getState() == JobState.Failed) { } else if (job.getState() == JobState.Failed) {
job.download(downloadFailedData(), progress); job.download(downloadFailedData(), progress);
} }
fireValueChangedEvent();
setDownloaded(true); setDownloaded(true);
} }
public void downloadStatistics(Progress progress) throws IOException { public void downloadStatistics(Progress progress) throws IOException {
job.download(BenchmarkJobManager.downloadStatistics(), progress); job.download(BenchmarkJobManager.downloadStatistics(), progress);
fireValueChangedEvent();
Path resultFile = job.getDirectory().resolve(Constants.BENCHMARK_RESULT_FILE); Path resultFile = job.getDirectory().resolve(Constants.BENCHMARK_RESULT_FILE);
if (resultFile != null) if (resultFile != null)
BenchmarkJobManager.formatResultFile(resultFile); BenchmarkJobManager.formatResultFile(resultFile);
...@@ -130,11 +127,6 @@ public class BenchmarkJobManager { ...@@ -130,11 +127,6 @@ public class BenchmarkJobManager {
return time != null ? time.getTime().toString() : "N/A"; return time != null ? time.getTime().toString() : "N/A";
} }
@Override
public BenchmarkJob getValue() {
return this;
}
@Override @Override
public int hashCode() { public int hashCode() {
return Long.hashCode(job.getId()); return Long.hashCode(job.getId());
...@@ -149,11 +141,6 @@ public class BenchmarkJobManager { ...@@ -149,11 +141,6 @@ public class BenchmarkJobManager {
return false; return false;
} }
public void update(BenchmarkJob benchmarkJob) {
job = benchmarkJob.job;
if (benchmarkJob.job.getState() != oldState)
fireValueChangedEvent();
}
public boolean downloaded() { public boolean downloaded() {
return getDownloaded(); return getDownloaded();
...@@ -161,11 +148,9 @@ public class BenchmarkJobManager { ...@@ -161,11 +148,9 @@ public class BenchmarkJobManager {
public BenchmarkJob update() { public BenchmarkJob update() {
job.updateInfo(); job.updateInfo();
if (!job.getState().equals(oldState))
fireValueChangedEvent();
return this; return this;
} }
public Path getDirectory() { public Path getDirectory() {
return job.getDirectory(); return job.getDirectory();
} }
......
...@@ -5,9 +5,9 @@ import java.awt.Window; ...@@ -5,9 +5,9 @@ import java.awt.Window;
import java.awt.event.WindowAdapter; import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent; import java.awt.event.WindowEvent;
import java.io.IOException; import java.io.IOException;
import java.util.Collection;
import java.util.EnumSet; import java.util.EnumSet;
import java.util.HashSet; import java.util.HashSet;
import java.util.Map;
import java.util.Set; import java.util.Set;
import java.util.Timer; import java.util.Timer;
import java.util.TimerTask; import java.util.TimerTask;
...@@ -17,7 +17,6 @@ import java.util.concurrent.ExecutorService; ...@@ -17,7 +17,6 @@ import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors; import java.util.concurrent.Executors;
import java.util.function.Function; import java.util.function.Function;
import java.util.function.Predicate; import java.util.function.Predicate;
import java.util.stream.Collectors;
import javax.swing.WindowConstants; import javax.swing.WindowConstants;
...@@ -34,22 +33,23 @@ import cz.it4i.fiji.haas_spim_benchmark.core.BenchmarkJobManager; ...@@ -34,22 +33,23 @@ import cz.it4i.fiji.haas_spim_benchmark.core.BenchmarkJobManager;
import cz.it4i.fiji.haas_spim_benchmark.core.BenchmarkJobManager.BenchmarkJob; import cz.it4i.fiji.haas_spim_benchmark.core.BenchmarkJobManager.BenchmarkJob;
import cz.it4i.fiji.haas_spim_benchmark.core.Constants; import cz.it4i.fiji.haas_spim_benchmark.core.Constants;
import cz.it4i.fiji.haas_spim_benchmark.core.FXFrameExecutorService; import cz.it4i.fiji.haas_spim_benchmark.core.FXFrameExecutorService;
import javafx.beans.value.ObservableValue;
import javafx.fxml.FXML; import javafx.fxml.FXML;
import javafx.scene.control.TableView; import javafx.scene.control.TableView;
import net.imagej.updater.util.Progress; import net.imagej.updater.util.Progress;
public class BenchmarkSPIMController implements FXFrame.Controller { public class BenchmarkSPIMController implements FXFrame.Controller {
private static boolean notNullValue(BenchmarkJob j, Predicate<BenchmarkJob> pred) { private static boolean notNullValue(ObservableValue<BenchmarkJob> j, Predicate<BenchmarkJob> pred) {
if (j == null) { if (j == null || j.getValue() == null) {
return false; return false;
} else { } else {
return pred.test(j); return pred.test(j.getValue());
} }
} }
@FXML @FXML
private TableView<BenchmarkJob> jobs; private TableView<ObservableValue<BenchmarkJob>> jobs;
private BenchmarkJobManager manager; private BenchmarkJobManager manager;
...@@ -60,6 +60,7 @@ public class BenchmarkSPIMController implements FXFrame.Controller { ...@@ -60,6 +60,7 @@ public class BenchmarkSPIMController implements FXFrame.Controller {
private Executor executorServiceFX = new FXFrameExecutorService(); private Executor executorServiceFX = new FXFrameExecutorService();
private Timer timer; private Timer timer;
private ObservableBenchmarkJobRegistry registry;
private static Logger log = LoggerFactory private static Logger log = LoggerFactory
.getLogger(cz.it4i.fiji.haas_spim_benchmark.ui.BenchmarkSPIMController.class); .getLogger(cz.it4i.fiji.haas_spim_benchmark.ui.BenchmarkSPIMController.class);
...@@ -94,15 +95,15 @@ public class BenchmarkSPIMController implements FXFrame.Controller { ...@@ -94,15 +95,15 @@ public class BenchmarkSPIMController implements FXFrame.Controller {
} }
private void initMenu() { private void initMenu() {
TableViewContextMenu<BenchmarkJob> menu = new TableViewContextMenu<>(jobs); TableViewContextMenu<ObservableValue<BenchmarkJob>> menu = new TableViewContextMenu<>(jobs);
menu.addItem("Create job", x -> executeWSCallAsync("Creating job", p -> manager.createJob()), j -> true); menu.addItem("Create job", x -> executeWSCallAsync("Creating job", p -> manager.createJob()), j -> true);
menu.addItem("Start job", job -> executeWSCallAsync("Starting job", p -> job.startJob(p)), menu.addItem("Start job", job -> executeWSCallAsync("Starting job", p -> job.getValue().startJob(p)),
job -> notNullValue(job, job -> notNullValue(job,
j -> j.getState() == JobState.Configuring || j.getState() == JobState.Finished)); j -> j.getState() == JobState.Configuring || j.getState() == JobState.Finished));
menu.addItem("Show progress", job -> { menu.addItem("Show progress", job -> {
try { try {
new SPIMPipelineProgressViewWindow(root, job).setVisible(true); new SPIMPipelineProgressViewWindow(root, job.getValue()).setVisible(true);
} catch (IOException e) { } catch (IOException e) {
// TODO Auto-generated catch block // TODO Auto-generated catch block
log.error(e.getMessage(), e); log.error(e.getMessage(), e);
...@@ -110,17 +111,19 @@ public class BenchmarkSPIMController implements FXFrame.Controller { ...@@ -110,17 +111,19 @@ public class BenchmarkSPIMController implements FXFrame.Controller {
}, job -> notNullValue(job, j -> j.getState() == JobState.Running || j.getState() == JobState.Finished }, job -> notNullValue(job, j -> j.getState() == JobState.Running || j.getState() == JobState.Finished
|| j.getState() == JobState.Failed)); || j.getState() == JobState.Failed));
menu.addItem("Download result", job -> executeWSCallAsync("Downloading data", p -> job.downloadData(p)), menu.addItem("Download result",
job -> executeWSCallAsync("Downloading data", p -> job.getValue().downloadData(p)),
job -> notNullValue(job, job -> notNullValue(job,
j -> EnumSet.of(JobState.Failed, JobState.Finished).contains(j.getState()) && !j.downloaded())); j -> EnumSet.of(JobState.Failed, JobState.Finished).contains(j.getState()) && !j.downloaded()));
menu.addItem("Download statistics", menu.addItem("Download statistics",
job -> executeWSCallAsync("Downloading data", p -> job.downloadStatistics(p)), job -> executeWSCallAsync("Downloading data", p -> job.getValue().downloadStatistics(p)),
job -> notNullValue(job, j -> j.getState() == JobState.Finished)); job -> notNullValue(job, j -> j.getState() == JobState.Finished));
menu.addItem("Show output", j -> new JobOutputView(root, executorServiceUI, j, Constants.HAAS_UPDATE_TIMEOUT), menu.addItem("Show output",
j -> new JobOutputView(root, executorServiceUI, j.getValue(), Constants.HAAS_UPDATE_TIMEOUT),
job -> notNullValue(job, job -> notNullValue(job,
j -> EnumSet.of(JobState.Failed, JobState.Finished, JobState.Running).contains(j.getState()))); j -> EnumSet.of(JobState.Failed, JobState.Finished, JobState.Running).contains(j.getState())));
menu.addItem("Open", j -> open(j), x -> true); menu.addItem("Open", j -> open(j.getValue()), x -> true);
menu.addItem("Update table", job -> updateJobs(), j -> true); menu.addItem("Update table", job -> updateJobs(), j -> true);
} }
...@@ -158,46 +161,36 @@ public class BenchmarkSPIMController implements FXFrame.Controller { ...@@ -158,46 +161,36 @@ public class BenchmarkSPIMController implements FXFrame.Controller {
} }
private void updateJobs(boolean showProgress) { private void updateJobs(boolean showProgress) {
executorServiceUI.execute(() -> { executorServiceWS.execute(() -> {
Progress progress = showProgress
? ModalDialogs.doModal(new ProgressDialog(root, "Updating jobs"), registry.update();
WindowConstants.DO_NOTHING_ON_CLOSE)
: new DummyProgress();
try {
manager.getJobs().forEach(job -> job.update());
} catch (IOException e1) {
throw new RuntimeException(e1);
}
executorServiceUI.execute(() -> { executorServiceUI.execute(() -> {
Progress progress = showProgress
? ModalDialogs.doModal(new ProgressDialog(root, "Updating jobs"),
WindowConstants.DO_NOTHING_ON_CLOSE)
: new DummyProgress();
Set<BenchmarkJob> old = new HashSet<BenchmarkJob>(jobs.getItems());
Map<BenchmarkJob, BenchmarkJob> actual;
try { try {
actual = manager.getJobs().stream().collect(Collectors.toMap(job -> job, job -> job)); Collection<BenchmarkJob> jobs = manager.getJobs();
} catch (IOException e) { Set<ObservableValue<BenchmarkJob>> actual = new HashSet<>(this.jobs.getItems());
throw new RuntimeException(e); for (BenchmarkJob bj : jobs) {
} ObservableValue<BenchmarkJob> value = registry.addIfAbsent(bj);
for (BenchmarkJob job : old) { if (!actual.contains(value)) {
if (!actual.containsKey(job)) { this.jobs.getItems().add(value);
jobs.getItems().remove(job); }
} else {
job.update(actual.get(job));
} }
} catch (IOException e) {
log.error(e.getMessage(), e);
} }
progress.done(); progress.done();
executorServiceFX.execute(() -> {
for (BenchmarkJob job : actual.keySet()) {
if (!old.contains(job)) {
jobs.getItems().add(job);
}
}
});
}); });
}); });
} }
private void initTable() { private void initTable() {
registry = new ObservableBenchmarkJobRegistry(bj -> jobs.getItems().remove(registry.get(bj)));
setCellValueFactory(0, j -> j.getId() + ""); setCellValueFactory(0, j -> j.getId() + "");
setCellValueFactory(1, j -> j.getState().toString()); setCellValueFactory(1, j -> j.getState().toString());
setCellValueFactory(2, j -> j.getCreationTime().toString()); setCellValueFactory(2, j -> j.getCreationTime().toString());
......
package cz.it4i.fiji.haas_spim_benchmark.ui;
import java.nio.file.Files;
import java.util.function.Consumer;
import cz.it4i.fiji.haas.ui.ObservableValueRegistry;
import cz.it4i.fiji.haas.ui.UpdatableObservableValue.UpdateStatus;
import cz.it4i.fiji.haas_java_client.JobState;
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);
}
private static UpdateStatus update(BenchmarkJob t) {
JobState oldState = t.getState();
t.update();
if (!Files.isDirectory(t.getDirectory())) {
return UpdateStatus.Deleted;
}
return oldState != t.getState() ? UpdateStatus.Updated : UpdateStatus.NotUpdated;
}
}
...@@ -3,26 +3,26 @@ package cz.it4i.fiji.haas_spim_benchmark.ui; ...@@ -3,26 +3,26 @@ package cz.it4i.fiji.haas_spim_benchmark.ui;
import java.util.function.Consumer; import java.util.function.Consumer;
import cz.it4i.fiji.haas.ui.ObservableValueRegistry; import cz.it4i.fiji.haas.ui.ObservableValueRegistry;
import cz.it4i.fiji.haas.ui.UpdatableObservableValue.UpdateStatus;
import cz.it4i.fiji.haas_java_client.JobState; import cz.it4i.fiji.haas_java_client.JobState;
import cz.it4i.fiji.haas_spim_benchmark.core.Task; import cz.it4i.fiji.haas_spim_benchmark.core.Task;
import cz.it4i.fiji.haas_spim_benchmark.core.TaskComputation; import cz.it4i.fiji.haas_spim_benchmark.core.TaskComputation;
public class ObservableTaskRegistry extends ObservableValueRegistry<Task>{ public class ObservableTaskRegistry extends ObservableValueRegistry<Task> {
public ObservableTaskRegistry( public ObservableTaskRegistry(Consumer<Task> removeConsumer) {
Consumer<Task> removeConsumer) { super(t -> update(t), removeConsumer);
super(x->true, t->update(t), removeConsumer);
} }
private static boolean update(Task t) { private static UpdateStatus update(Task t) {
boolean result = true; boolean updated = false;
t.update(); t.update();
for(TaskComputation tc: t.getComputations()) { for (TaskComputation tc : t.getComputations()) {
JobState oldState = tc.getState(); JobState oldState = tc.getState();
tc.update(); tc.update();
result &= oldState == tc.getState(); updated |= oldState != tc.getState();
} }
return result; return updated ? UpdateStatus.Updated : UpdateStatus.NotUpdated;
} }
......
...@@ -43,7 +43,7 @@ public class SPIMPipelineProgressViewController implements FXFrame.Controller { ...@@ -43,7 +43,7 @@ public class SPIMPipelineProgressViewController implements FXFrame.Controller {
public void setBenchmarkJob(BenchmarkJob job) { public void setBenchmarkJob(BenchmarkJob job) {
this.job = job; this.job = job;
registry = new ObservableTaskRegistry(task -> tasks.getItems().remove(registry.remove(task))); registry = new ObservableTaskRegistry(task -> tasks.getItems().remove(registry.get(task)));
fillTable(); fillTable();
} }
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment