JobTracker.java

package org.entando.kubernetes.model.job;

import java.time.LocalDateTime;
import java.util.UUID;
import org.springframework.data.jpa.repository.JpaRepository;


public class JobTracker<T extends TrackableJob> {

    T job;
    JpaRepository<T, UUID> repo;

    public JobTracker(T job, JpaRepository<T, UUID> repo) {
        this.job = job;
        this.repo = repo;
    }

    public void startTracking(JobStatus js) {
        this.job.setStatus(js);
        this.updateJobProgress(0.0);
        this.job.setStartedAt(LocalDateTime.now());
        this.job = updateJob(this.job);
    }

    public void setProgress(double progress) {
        this.updateJobProgress(progress);
        this.job = updateJob(this.job);
    }

    public void finishTracking(JobResult result) {
        this.job.setStatus(result.getStatus());
        this.job.setFinishedAt(LocalDateTime.now());
        if (result.hasException()) {
            this.job.setInstallErrorCode(result.getInstallErrorCode());
            this.job.setInstallErrorMessage(result.getInstallErrorMessage());
            this.job.setRollbackErrorCode(result.getRollbackErrorCode());
            this.job.setRollbackErrorMessage(result.getRollbackErrorMessage());
        }
        if (result.getProgress() != null) {
            this.setProgress(result.getProgress());
        }
        this.job = updateJob(this.job);
    }

    public T getJob() {
        return this.job;
    }

    private void updateJobProgress(double progress) {
        if (this.job instanceof HasProgress) {
            ((HasProgress) this.job).setProgress(roundProgress(progress));
        }
    }

    private T updateJob(T job) {
        T updatedJob = repo.save(job);
        if (job instanceof HasInstallable) {
            ((HasInstallable) updatedJob).setInstallable(((HasInstallable) job).getInstallable());
        }
        return updatedJob;
    }

    private double roundProgress(double progress) {
        return Math.max(0.0, Math.min(1.0, Math.floor(progress * 100) / 100));
    }

}