From c6bc586172f849ddaf3ea1a7a74bc4e3dfb71595 Mon Sep 17 00:00:00 2001
From: Jan Kozusznik <jan@kozusznik.cz>
Date: Mon, 15 Jan 2018 14:32:21 +0100
Subject: [PATCH] Refactoring for benchmark running

---
 .../it4i/fiji/haas/BenchmarkJobManager.java   | 28 ++++++++----------
 .../src/main/java/cz/it4i/fiji/haas/Job.java  | 29 +++++++++++++++----
 .../java/cz/it4i/fiji/haas/JobManager.java    | 29 +++++++++++++++++--
 3 files changed, 62 insertions(+), 24 deletions(-)

diff --git a/haas-imagej-client/src/main/java/cz/it4i/fiji/haas/BenchmarkJobManager.java b/haas-imagej-client/src/main/java/cz/it4i/fiji/haas/BenchmarkJobManager.java
index c255015e..69a3fd25 100644
--- a/haas-imagej-client/src/main/java/cz/it4i/fiji/haas/BenchmarkJobManager.java
+++ b/haas-imagej-client/src/main/java/cz/it4i/fiji/haas/BenchmarkJobManager.java
@@ -3,6 +3,8 @@ package cz.it4i.fiji.haas;
 import java.io.IOException;
 import java.nio.file.Path;
 import java.util.Arrays;
+import java.util.HashMap;
+import java.util.Map;
 
 import cz.it4i.fiji.haas.JobManager.JobInfo;
 import cz.it4i.fiji.haas_java_client.HaaSClient;
@@ -12,37 +14,31 @@ import net.imagej.updater.util.Progress;
 public class BenchmarkJobManager {
 	private JobManager jobManager;
 	private Progress progress;
-	private Path workDirectory;
+	private Map<JobInfo, Path> uploadedFiles = new HashMap<>();
 
-	
 	public BenchmarkJobManager(Path workDirectory, Progress progress) throws IOException {
-		this.workDirectory = workDirectory;
 		jobManager = new JobManager(workDirectory, TestingConstants.getSettings(3, 6));
 		this.progress = progress;
 	}
 
-	public JobInfo startJob() throws IOException {
-		
-		JobInfo jobInfo = jobManager.startJob(Arrays.asList(getUploadingFile()).stream(), progress);
-		jobInfo.waitForStart();
-		if (jobInfo.getState() != JobState.Running) {
-			throw new IllegalStateException("start of job: " + jobInfo + " failed");
-		}
+	public JobInfo createJob() throws IOException {
+		JobInfo jobInfo = jobManager.createJob(progress);
+		Path file = jobInfo.storeDataInWorkdirectory(getUploadingFile());
+		uploadedFiles.put(jobInfo, file);
 		return jobInfo;
 	}
 
-	private HaaSClient.UploadingFile getUploadingFile() {
-		return new UploadingFileFromResource("", "config.yaml");
+	public void startJob(JobInfo jobInfo) {
+		jobInfo.uploadFiles(Arrays.asList(HaaSClient.getUploadingFile(uploadedFiles.get(jobInfo))).stream());
+		jobInfo.submit();
 	}
 
 	public JobState getState(long jobId) {
 		return jobManager.getState(jobId);
 	}
-	
-
-	private byte[] updateConfigFile(byte[] data) throws IOException {
-		return data;
 
+	private HaaSClient.UploadingFile getUploadingFile() {
+		return new UploadingFileFromResource("", "config.yaml");
 	}
 
 }
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 31f71bc7..bdfb5698 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
@@ -44,6 +44,7 @@ public class Job {
 	private Boolean needsDownload;
 	private JobInfo jobInfo;
 	private Long jobId;
+	private ProgressNotifier notifier;
 
 	final private Progress dummy = new Progress() {
 
@@ -72,12 +73,11 @@ public class Job {
 		}
 	};
 
-	public Job(Path basePath, Stream<UploadingFile> files, Supplier<HaaSClient> haasClientSupplier, Progress progress)
-			throws IOException {
+	public Job(Path basePath, Supplier<HaaSClient> haasClientSupplier, Progress progress) throws IOException {
 		this(haasClientSupplier);
 		HaaSClient client = this.haasClientSupplier.get();
-		long id = client.start(files, "TestOutRedirect", Collections.emptyList(),
-				new P_ProgressNotifierAdapter(progress));
+		long id = client.createJob("TestOutRedirect", Collections.emptyList(),
+				notifier = new P_ProgressNotifierAdapter(progress));
 		jobDir = basePath.resolve("" + id);
 		Files.createDirectory(jobDir);
 		updateState();
@@ -89,6 +89,16 @@ public class Job {
 		loadJobInfo();
 	}
 
+	public void uploadFiles(Stream<UploadingFile> files) {
+		HaaSClient client = this.haasClientSupplier.get();
+		client.uploadFiles(jobId, files, notifier);
+	}
+
+	public void submit() {
+		HaaSClient client = this.haasClientSupplier.get();
+		client.submitJob(jobId, notifier);
+	}
+
 	private Job(Supplier<HaaSClient> haasClientSupplier) {
 		this.haasClientSupplier = haasClientSupplier;
 	}
@@ -116,6 +126,14 @@ public class Job {
 	public void download() {
 		download(dummy);
 	}
+	
+	public Path storeDataInWorkdirectory(UploadingFile uploadingFile) throws IOException {
+		Path result;
+		try(InputStream is = uploadingFile.getInputStream()) {
+			Files.copy(is, result = jobDir.resolve(uploadingFile.getName()));
+		}
+		return result;
+	}
 
 	synchronized public void download(Progress progress) {
 		if (!needsDownload()) {
@@ -129,7 +147,7 @@ public class Job {
 			log.error(e);
 		}
 	}
-	
+
 	public JobState getState() {
 		return state;
 	}
@@ -218,5 +236,4 @@ 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 27b3d8ca..1af11efc 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
@@ -45,9 +45,9 @@ public class JobManager {
 
 	}
 
-	public JobInfo startJob(Stream<UploadingFile> files, Progress progress) throws IOException {
+	public JobInfo createJob(Progress progress) throws IOException {
 		Job job;
-		jobs.add(job = new Job(workDirectory, files, this::getHaasClient, progress));
+		jobs.add(job = new Job(workDirectory, this::getHaasClient, progress));
 		return new JobInfo(job) {
 			@Override
 			public JobState getState() {
@@ -60,6 +60,14 @@ public class JobManager {
 			}
 		};
 	}
+	
+	public JobInfo startJob(Stream<UploadingFile> files, Progress progress) throws IOException {
+		JobInfo result = createJob(progress);
+		result.uploadFiles(files);
+		result.submit();
+		return result;
+	}
+	
 
 	public Iterable<JobInfo> getJobsNeedingDownload() {
 		return () -> jobs.stream().filter(j -> j.needsDownload()).map(j -> new JobInfo(j)).iterator();
@@ -95,6 +103,16 @@ public class JobManager {
 			this.job = job;
 		}
 
+		
+		public void uploadFiles(Stream<UploadingFile> files) {
+			job.uploadFiles(files);
+		}
+		
+		public void submit() {
+			job.submit();
+		}
+
+
 		public Long getId() {
 			return job.getJobId();
 		}
@@ -142,6 +160,13 @@ public class JobManager {
 			return time != null ? time.getTime().toString() : "N/A";
 		}
 
+
+		public Path storeDataInWorkdirectory(UploadingFile uploadingFile) throws IOException {
+			return job.storeDataInWorkdirectory(uploadingFile);
+		}
+
 	}
 
+	
+
 }
-- 
GitLab