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

solve updates

parent fd002dc1
No related branches found
No related tags found
No related merge requests found
Showing
with 116 additions and 45 deletions
...@@ -6,6 +6,7 @@ import java.nio.file.Files; ...@@ -6,6 +6,7 @@ import java.nio.file.Files;
import java.nio.file.Path; import java.nio.file.Path;
import java.util.Calendar; import java.util.Calendar;
import java.util.Collections; import java.util.Collections;
import java.util.Comparator;
import java.util.List; import java.util.List;
import java.util.function.Predicate; import java.util.function.Predicate;
import java.util.function.Supplier; import java.util.function.Supplier;
...@@ -15,6 +16,7 @@ import java.util.stream.StreamSupport; ...@@ -15,6 +16,7 @@ import java.util.stream.StreamSupport;
import org.scijava.log.LogService; import org.scijava.log.LogService;
import org.scijava.plugin.Parameter; import org.scijava.plugin.Parameter;
import cz.it4i.fiji.haas.JobManager.JobManager4Job;
import cz.it4i.fiji.haas.JobManager.JobSynchronizableFile; import cz.it4i.fiji.haas.JobManager.JobSynchronizableFile;
import cz.it4i.fiji.haas_java_client.HaaSClient; import cz.it4i.fiji.haas_java_client.HaaSClient;
import cz.it4i.fiji.haas_java_client.HaaSClient.UploadingFile; import cz.it4i.fiji.haas_java_client.HaaSClient.UploadingFile;
...@@ -48,8 +50,10 @@ public class Job { ...@@ -48,8 +50,10 @@ public class Job {
private PropertyHolder propertyHolder; private PropertyHolder propertyHolder;
public Job(String name, Path basePath, Supplier<HaaSClient> haasClientSupplier) throws IOException { private JobManager4Job jobManager;
this(haasClientSupplier);
public Job(JobManager4Job jobManager, String name, Path basePath, Supplier<HaaSClient> haasClientSupplier) throws IOException {
this(jobManager,haasClientSupplier);
HaaSClient client = this.haasClientSupplier.get(); HaaSClient client = this.haasClientSupplier.get();
long id = client.createJob(name, Collections.emptyList()); long id = client.createJob(name, Collections.emptyList());
jobDir = basePath.resolve("" + id); jobDir = basePath.resolve("" + id);
...@@ -63,8 +67,8 @@ public class Job { ...@@ -63,8 +67,8 @@ public class Job {
setProperty(JOB_NAME, name); setProperty(JOB_NAME, name);
} }
public Job(Path p, Supplier<HaaSClient> haasClientSupplier) { public Job(JobManager4Job jobManager,Path p, Supplier<HaaSClient> haasClientSupplier) {
this(haasClientSupplier); this(jobManager, haasClientSupplier);
jobDir = p; jobDir = p;
propertyHolder = new PropertyHolder(jobDir.resolve(JOB_INFO_FILE)); propertyHolder = new PropertyHolder(jobDir.resolve(JOB_INFO_FILE));
} }
...@@ -86,8 +90,9 @@ public class Job { ...@@ -86,8 +90,9 @@ public class Job {
client.submitJob(jobId); client.submitJob(jobId);
} }
private Job(Supplier<HaaSClient> haasClientSupplier) { private Job(JobManager4Job jobManager, Supplier<HaaSClient> haasClientSupplier) {
this.haasClientSupplier = haasClientSupplier; this.haasClientSupplier = haasClientSupplier;
this.jobManager = jobManager;
} }
...@@ -116,7 +121,6 @@ public class Job { ...@@ -116,7 +121,6 @@ public class Job {
} }
public JobState getState() { public JobState getState() {
updateJobInfo();
return getJobInfo().getState(); return getJobInfo().getState();
} }
...@@ -160,6 +164,23 @@ public class Job { ...@@ -160,6 +164,23 @@ public class Job {
return jobDir; 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() { private JobInfo getJobInfo() {
if (jobInfo == null) { if (jobInfo == null) {
updateJobInfo(); updateJobInfo();
...@@ -219,4 +240,6 @@ public class Job { ...@@ -219,4 +240,6 @@ public class Job {
} }
} }
...@@ -4,6 +4,7 @@ import java.io.IOException; ...@@ -4,6 +4,7 @@ import java.io.IOException;
import java.nio.file.Files; import java.nio.file.Files;
import java.nio.file.Path; import java.nio.file.Path;
import java.util.Collection; import java.util.Collection;
import java.util.Collections;
import java.util.Iterator; import java.util.Iterator;
import java.util.LinkedList; import java.util.LinkedList;
import java.util.stream.Collectors; import java.util.stream.Collectors;
...@@ -20,6 +21,10 @@ import net.imagej.updater.util.Progress; ...@@ -20,6 +21,10 @@ import net.imagej.updater.util.Progress;
public class JobManager { public class JobManager {
interface JobManager4Job {
boolean remove(Job job);
}
@SuppressWarnings("unused") @SuppressWarnings("unused")
private static Logger log = LoggerFactory.getLogger(cz.it4i.fiji.haas.JobManager.class); private static Logger log = LoggerFactory.getLogger(cz.it4i.fiji.haas.JobManager.class);
...@@ -31,6 +36,14 @@ public class JobManager { ...@@ -31,6 +36,14 @@ public class JobManager {
private Settings settings; private Settings settings;
private JobManager4Job remover = new JobManager4Job() {
@Override
public boolean remove(Job job) {
return jobs.remove(job);
}
};
public JobManager(Path workDirectory, Settings settings) { public JobManager(Path workDirectory, Settings settings) {
this.workDirectory = workDirectory; this.workDirectory = workDirectory;
this.settings = settings; this.settings = settings;
...@@ -41,7 +54,7 @@ public class JobManager { ...@@ -41,7 +54,7 @@ public class JobManager {
if (jobs == null) { if (jobs == null) {
jobs = new LinkedList<>(); 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; return job;
} }
...@@ -57,14 +70,14 @@ public class JobManager { ...@@ -57,14 +70,14 @@ public class JobManager {
jobs = new LinkedList<>(); jobs = new LinkedList<>();
try { try {
Files.list(this.workDirectory).filter(p -> Files.isDirectory(p) && Job.isJobPath(p)).forEach(p -> { 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) { } 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) { public void downloadJob(Long id, Progress notifier) {
......
...@@ -13,12 +13,14 @@ public class ObservableValueRegistry<T> { ...@@ -13,12 +13,14 @@ public class ObservableValueRegistry<T> {
private Function<T,UpdateStatus> updateFunction; private Function<T,UpdateStatus> updateFunction;
private Consumer<T> removeConsumer; 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) { Consumer<T> removeConsumer) {
super(); super();
this.updateFunction = updateFunction; this.updateFunction = updateFunction;
this.stateProvider = stateProvider;
this.removeConsumer = t-> { this.removeConsumer = t-> {
removeConsumer.accept(t); removeConsumer.accept(t);
remove(t); remove(t);
...@@ -29,16 +31,16 @@ public class ObservableValueRegistry<T> { ...@@ -29,16 +31,16 @@ public class ObservableValueRegistry<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)); UpdatableObservableValue<T> uov = map.computeIfAbsent(value, v-> new UpdatableObservableValue<T>(v, updateFunction, stateProvider));
return uov; return uov;
} }
public ObservableValue<T> get(T value) { public UpdatableObservableValue<T> get(T value) {
return map.get(value); return map.get(value);
} }
private ObservableValue<T> remove(T value) { protected ObservableValue<T> remove(T value) {
return map.get(value); return map.remove(value);
} }
public void update() { public void update() {
...@@ -48,4 +50,8 @@ public class ObservableValueRegistry<T> { ...@@ -48,4 +50,8 @@ public class ObservableValueRegistry<T> {
} }
} }
} }
protected void setUpdateFunction(Function<T, UpdateStatus> updateFunction) {
this.updateFunction = updateFunction;
}
} }
...@@ -5,6 +5,9 @@ import java.util.LinkedList; ...@@ -5,6 +5,9 @@ import java.util.LinkedList;
import java.util.function.Consumer; import java.util.function.Consumer;
import java.util.function.Predicate; import java.util.function.Predicate;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javafx.event.EventHandler; import javafx.event.EventHandler;
import javafx.scene.control.ContextMenu; import javafx.scene.control.ContextMenu;
import javafx.scene.control.MenuItem; import javafx.scene.control.MenuItem;
...@@ -12,6 +15,8 @@ import javafx.scene.control.TableView; ...@@ -12,6 +15,8 @@ import javafx.scene.control.TableView;
import javafx.scene.input.ContextMenuEvent; import javafx.scene.input.ContextMenuEvent;
public class TableViewContextMenu<T> { 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 Collection<P_MenuItem> items = new LinkedList<TableViewContextMenu<T>.P_MenuItem>();
private ContextMenu cm; private ContextMenu cm;
private TableView<T> tableView; private TableView<T> tableView;
...@@ -24,6 +29,7 @@ public class TableViewContextMenu<T> { ...@@ -24,6 +29,7 @@ public class TableViewContextMenu<T> {
@Override @Override
public void handle(ContextMenuEvent event) { public void handle(ContextMenuEvent event) {
T selected = getSelectedItem(); T selected = getSelectedItem();
for (P_MenuItem item : items) { for (P_MenuItem item : items) {
item.updateEnable(selected); item.updateEnable(selected);
} }
......
...@@ -4,46 +4,58 @@ import java.util.function.Function; ...@@ -4,46 +4,58 @@ import java.util.function.Function;
import javafx.beans.value.ObservableValueBase; import javafx.beans.value.ObservableValueBase;
public class UpdatableObservableValue<T> extends ObservableValueBase<T>{ public class UpdatableObservableValue<T> extends ObservableValueBase<T> {
public enum UpdateStatus { public enum UpdateStatus {
Deleted, Deleted, Updated, NotUpdated
Updated,
NotUpdated
} }
private T wrapped; private T wrapped;
private 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) {
public UpdatableObservableValue(T wrapped, Function<T, UpdateStatus> updateFunction,
Function<T, Object> stateProvider) {
super(); super();
this.wrapped = wrapped; this.wrapped = wrapped;
this.updateFunction = updateFunction; this.updateFunction = updateFunction;
this.stateProvider = stateProvider;
oldState = stateProvider.apply(wrapped);
} }
@Override @Override
public T getValue() { public T getValue() {
return wrapped; return wrapped;
} }
public UpdateStatus update() { public UpdateStatus update() {
UpdateStatus status = updateFunction.apply(wrapped); UpdateStatus status = updateFunction.apply(wrapped);
Object state = stateProvider.apply(wrapped);
boolean fire = true;
switch (status) { switch (status) {
case NotUpdated:
fire = false;
if (oldState == null && state != null || oldState != null && (state == null || !oldState.equals(state))) {
fire = true;
}
case Updated: case Updated:
fireValueChangedEvent(); oldState = state;
if (fire) {
fireValueChangedEvent();
}
default: default:
return status; return status;
} }
} }
@Override @Override
public int hashCode() { public int hashCode() {
return wrapped.hashCode(); return wrapped.hashCode();
} }
@Override @Override
public boolean equals(Object obj) { public boolean equals(Object obj) {
if (this == obj) if (this == obj)
...@@ -61,6 +73,5 @@ public class UpdatableObservableValue<T> extends ObservableValueBase<T>{ ...@@ -61,6 +73,5 @@ public class UpdatableObservableValue<T> extends ObservableValueBase<T>{
return false; return false;
return true; return true;
} }
} }
...@@ -199,6 +199,10 @@ public class BenchmarkJobManager { ...@@ -199,6 +199,10 @@ public class BenchmarkJobManager {
String downloadedStr = job.getProperty(JOB_HAS_DATA_TO_DOWNLOAD_PROPERTY); String downloadedStr = job.getProperty(JOB_HAS_DATA_TO_DOWNLOAD_PROPERTY);
return downloadedStr != null && Boolean.parseBoolean(downloadedStr); return downloadedStr != null && Boolean.parseBoolean(downloadedStr);
} }
public boolean remove() {
return job.remove();
}
} }
public BenchmarkJobManager(BenchmarkSPIMParameters params) throws IOException { public BenchmarkJobManager(BenchmarkSPIMParameters params) throws IOException {
......
...@@ -97,9 +97,10 @@ public class BenchmarkSPIMController implements FXFrame.Controller { ...@@ -97,9 +97,10 @@ public class BenchmarkSPIMController implements FXFrame.Controller {
private void initMenu() { private void initMenu() {
TableViewContextMenu<ObservableValue<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.getValue().startJob(p)), menu.addItem("Start job", job -> executeWSCallAsync("Starting job", p -> {
job -> notNullValue(job, job.getValue().startJob(p);
j -> j.getState() == JobState.Configuring || j.getState() == JobState.Finished)); registry.get(job.getValue()).update();
}), job -> notNullValue(job, j -> j.getState() == JobState.Configuring || j.getState() == JobState.Finished));
menu.addItem("Show progress", job -> { menu.addItem("Show progress", job -> {
try { try {
...@@ -123,7 +124,7 @@ public class BenchmarkSPIMController implements FXFrame.Controller { ...@@ -123,7 +124,7 @@ public class BenchmarkSPIMController implements FXFrame.Controller {
j -> new JobOutputView(root, executorServiceUI, j.getValue(), Constants.HAAS_UPDATE_TIMEOUT), 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.getValue()), x -> true); menu.addItem("Open", j -> open(j.getValue()), x -> notNullValue(x, j -> true));
menu.addItem("Update table", job -> updateJobs(), j -> true); menu.addItem("Update table", job -> updateJobs(), j -> true);
} }
...@@ -162,14 +163,13 @@ public class BenchmarkSPIMController implements FXFrame.Controller { ...@@ -162,14 +163,13 @@ public class BenchmarkSPIMController implements FXFrame.Controller {
private void updateJobs(boolean showProgress) { private void updateJobs(boolean showProgress) {
executorServiceWS.execute(() -> { executorServiceWS.execute(() -> {
Progress progress = showProgress
? ModalDialogs.doModal(new ProgressDialog(root, "Updating jobs"),
WindowConstants.DO_NOTHING_ON_CLOSE)
: new DummyProgress();
registry.update(); registry.update();
executorServiceUI.execute(() -> { executorServiceFX.execute(() -> {
Progress progress = showProgress
? ModalDialogs.doModal(new ProgressDialog(root, "Updating jobs"),
WindowConstants.DO_NOTHING_ON_CLOSE)
: new DummyProgress();
try { try {
Collection<BenchmarkJob> jobs = manager.getJobs(); Collection<BenchmarkJob> jobs = manager.getJobs();
Set<ObservableValue<BenchmarkJob>> actual = new HashSet<>(this.jobs.getItems()); Set<ObservableValue<BenchmarkJob>> actual = new HashSet<>(this.jobs.getItems());
...@@ -184,13 +184,12 @@ public class BenchmarkSPIMController implements FXFrame.Controller { ...@@ -184,13 +184,12 @@ public class BenchmarkSPIMController implements FXFrame.Controller {
} }
progress.done(); progress.done();
}); });
}); });
} }
private void initTable() { 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(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());
...@@ -198,6 +197,12 @@ public class BenchmarkSPIMController implements FXFrame.Controller { ...@@ -198,6 +197,12 @@ public class BenchmarkSPIMController implements FXFrame.Controller {
setCellValueFactory(4, j -> j.getEndTime().toString()); 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) { private void setCellValueFactory(int index, Function<BenchmarkJob, String> mapper) {
FXFrame.Controller.setCellValueFactory(jobs, index, mapper); FXFrame.Controller.setCellValueFactory(jobs, index, mapper);
} }
......
...@@ -11,7 +11,7 @@ import cz.it4i.fiji.haas_spim_benchmark.core.BenchmarkJobManager.BenchmarkJob; ...@@ -11,7 +11,7 @@ import cz.it4i.fiji.haas_spim_benchmark.core.BenchmarkJobManager.BenchmarkJob;
public class ObservableBenchmarkJobRegistry extends ObservableValueRegistry<BenchmarkJob> { public class ObservableBenchmarkJobRegistry extends ObservableValueRegistry<BenchmarkJob> {
public ObservableBenchmarkJobRegistry(Consumer<BenchmarkJob> removeConsumer) { public ObservableBenchmarkJobRegistry(Consumer<BenchmarkJob> removeConsumer) {
super(t -> update(t), removeConsumer); super(t -> update(t), t -> t.getState(), removeConsumer);
} }
private static UpdateStatus update(BenchmarkJob t) { private static UpdateStatus update(BenchmarkJob t) {
...@@ -20,7 +20,9 @@ public class ObservableBenchmarkJobRegistry extends ObservableValueRegistry<Benc ...@@ -20,7 +20,9 @@ public class ObservableBenchmarkJobRegistry extends ObservableValueRegistry<Benc
if (!Files.isDirectory(t.getDirectory())) { if (!Files.isDirectory(t.getDirectory())) {
return UpdateStatus.Deleted; return UpdateStatus.Deleted;
} }
return oldState != t.getState() ? UpdateStatus.Updated : UpdateStatus.NotUpdated; UpdateStatus result = oldState != t.getState() ? UpdateStatus.Updated : UpdateStatus.NotUpdated;
return result;
} }
} }
package cz.it4i.fiji.haas_spim_benchmark.ui; package cz.it4i.fiji.haas_spim_benchmark.ui;
import java.util.function.Consumer; import java.util.function.Consumer;
import java.util.stream.Collectors;
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.ui.UpdatableObservableValue.UpdateStatus;
...@@ -11,7 +12,7 @@ import cz.it4i.fiji.haas_spim_benchmark.core.TaskComputation; ...@@ -11,7 +12,7 @@ import cz.it4i.fiji.haas_spim_benchmark.core.TaskComputation;
public class ObservableTaskRegistry extends ObservableValueRegistry<Task> { public class ObservableTaskRegistry extends ObservableValueRegistry<Task> {
public ObservableTaskRegistry(Consumer<Task> removeConsumer) { 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) { private static UpdateStatus update(Task t) {
......
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