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;
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 {
}
}
......@@ -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) {
......
......@@ -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;
}
}
......@@ -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);
}
......
......@@ -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;
}
}
......@@ -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 {
......
......@@ -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);
}
......
......@@ -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;
}
}
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) {
......
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