All Downloads are FREE. Search and download functionalities are using the official Maven repository.

net.ozwolf.mongo.migrations.internal.domain.Migration Maven / Gradle / Ivy

package net.ozwolf.mongo.migrations.internal.domain;

import org.apache.commons.lang3.StringUtils;
import org.bson.Document;
import org.semver4j.Semver;

import java.time.Duration;
import java.time.Instant;
import java.time.ZoneOffset;
import java.time.format.DateTimeFormatter;
import java.util.*;

public class Migration {
    private final String version;
    private final String description;
    private final String author;
    private Instant started;
    private Instant finished;
    private MigrationStatus status;
    private String failureMessage;
    private Map result;

    private MigrationCommand command;

    public final static String DEFAULT_AUTHOR = "trekBot";

    public Migration(String version,
                     String description,
                     String author,
                     Instant started,
                     Instant finished,
                     MigrationStatus status,
                     String failureMessage,
                     Map result) {
        this.version = version;
        this.description = description;
        this.author = Optional.ofNullable(author).orElse(DEFAULT_AUTHOR);
        this.started = started;
        this.finished = finished;
        this.status = status;
        this.failureMessage = failureMessage;
        this.result = result;
    }

    public Migration(MigrationCommand command) {
        this(command.getVersion(), command.getDescription(), command.getAuthor(), null, null, MigrationStatus.Pending, null, null);
        this.command = command;
    }

    public String getVersion() {
        return version;
    }

    public Semver getSemanticVersion() {
        return Semver.parse(version);
    }

    public String getDescription() {
        return description;
    }

    public String getAuthor() {
        return author;
    }

    public Instant getStarted() {
        return started;
    }

    public Instant getFinished() {
        return finished;
    }

    public String getFailureMessage() {
        return failureMessage;
    }

    public String getDuration() {
        if (status != MigrationStatus.Successful) return "";
        return String.format("%d seconds", Duration.between(this.started, this.finished).getSeconds());
    }

    public MigrationStatus getStatus() {
        return status;
    }

    public Map getResult() {
        if (status != MigrationStatus.Successful) return null;

        return Optional.ofNullable(result).orElseGet(HashMap::new);
    }

    public boolean isSuccessful() {
        return status == MigrationStatus.Successful;
    }

    public boolean isFailed() {
        return status == MigrationStatus.Failed;
    }

    public boolean isPending() {
        return status == MigrationStatus.Pending;
    }

    public boolean isRunning() {
        return status == MigrationStatus.Running;
    }

    public MigrationCommand getCommand() {
        return Optional.ofNullable(command).orElseThrow(() -> new IllegalStateException(String.format("No command attached to migration [ %s ]", version)));
    }

    public Migration assign(MigrationCommand command) {
        this.command = command;
        return this;
    }

    public Migration running() {
        this.started = Instant.now();
        this.finished = null;
        this.failureMessage = null;
        this.status = MigrationStatus.Running;
        return this;
    }

    public Migration successful(Document result) {
        this.finished = Instant.now();
        this.status = MigrationStatus.Successful;
        this.result = result;
        return this;
    }

    public Migration failed(Exception e) {
        this.finished = null;
        this.status = MigrationStatus.Failed;
        this.failureMessage = e.getMessage();
        return this;
    }

    public String getTags() {
        List tags = new ArrayList<>();
        tags.add(String.format("[ %s ]", status.name()));
        if (this.status == MigrationStatus.Successful || this.status == MigrationStatus.Failed)
            tags.add(String.format("[ %s ]", started.atZone(ZoneOffset.systemDefault()).format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"))));

        if (this.status == MigrationStatus.Successful)
            tags.add(String.format("[ %s ]", getDuration()));

        if (this.status == MigrationStatus.Failed)
            tags.add(String.format("[ ERROR: %s ]", failureMessage));
        return StringUtils.join(tags, " ");
    }

    @Override
    public String toString() {
        return String.format("version = <%s>, description = <%s>, author = <%s>, status = <%s>", version, description, author, status);
    }

    public static Comparator sortByVersionAscending() {
        return Comparator.comparing(Migration::getSemanticVersion);
    }

    public static Comparator sortByVersionDescending() {
        return (m1, m2) -> m2.getSemanticVersion().compareTo(m1.getSemanticVersion());
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy