JobScheduler.java
package org.entando.kubernetes.model.job;
import java.util.ArrayDeque;
import java.util.Collection;
import java.util.Deque;
import java.util.Iterator;
import java.util.Optional;
public class JobScheduler {
Deque<EntandoBundleComponentJobEntity> jobQueue;
Deque<EntandoBundleComponentJobEntity> processedJobStack;
public JobScheduler() {
this.jobQueue = new ArrayDeque<>();
this.processedJobStack = new ArrayDeque<>();
}
public void clearJobQueue() {
this.jobQueue.clear();
}
public void clearProcessedStack() {
this.processedJobStack.clear();
}
public void addToQueue(EntandoBundleComponentJobEntity job) {
jobQueue.addLast(job);
}
public void queueAll(Collection<EntandoBundleComponentJobEntity> jobs) {
for (EntandoBundleComponentJobEntity job : jobs) {
this.addToQueue(job);
}
}
public Optional<EntandoBundleComponentJobEntity> extractFromQueue() {
EntandoBundleComponentJobEntity nextComponentJob = null;
if (!jobQueue.isEmpty()) {
nextComponentJob = jobQueue.removeFirst();
}
return Optional.ofNullable(nextComponentJob);
}
public void recordProcessedComponentJob(EntandoBundleComponentJobEntity componentJob) {
processedJobStack.addLast(componentJob);
}
public void activateRollbackMode() {
Deque<EntandoBundleComponentJobEntity> rollbackQueue = new ArrayDeque<>();
Iterator<EntandoBundleComponentJobEntity> jobIterator = this.processedJobStack
.descendingIterator();
while (jobIterator.hasNext()) {
EntandoBundleComponentJobEntity duplicateJob = EntandoBundleComponentJobEntity
.getNewCopy(jobIterator.next());
duplicateJob.setStartedAt(null);
duplicateJob.setFinishedAt(null);
rollbackQueue.addLast(duplicateJob);
}
this.jobQueue = rollbackQueue;
this.clearProcessedStack();
}
public JobScheduler createRollbackScheduler() {
JobScheduler rbScheduler = new JobScheduler();
Iterator<EntandoBundleComponentJobEntity> jobIterator = this.processedJobStack
.descendingIterator();
while (jobIterator.hasNext()) {
EntandoBundleComponentJobEntity je = jobIterator.next();
EntandoBundleComponentJobEntity duplicateJob = EntandoBundleComponentJobEntity.getNewCopy(je);
duplicateJob.setStartedAt(null);
duplicateJob.setFinishedAt(null);
rbScheduler.addToQueue(duplicateJob);
}
return rbScheduler;
}
public Optional<EntandoBundleComponentJobEntity> componentJobWithError() {
return this.processedJobStack.stream()
.filter(trJob -> trJob.getStatus().isOfType(JobType.ERROR))
.findFirst();
}
}