package com.hubspot.blazar.base; import java.util.Objects; import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonProperty; import com.google.common.base.MoreObjects; import com.google.common.base.Optional; import com.hubspot.rosetta.annotations.StoredAsJson; public class RepositoryBuild { public enum State { QUEUED(false), LAUNCHING(false), IN_PROGRESS(false), SUCCEEDED(true), CANCELLED(true), FAILED(true), UNSTABLE(true); private final boolean completed; State(boolean completed) { this.completed = completed; } public boolean isComplete() { return completed; } public boolean isFailed() { return equals(CANCELLED) || equals(FAILED) || equals(UNSTABLE); } } private final Optional<Long> id; private final int branchId; private final int buildNumber; private final State state; @StoredAsJson private final BuildTrigger buildTrigger; private final Optional<Long> startTimestamp; private final Optional<Long> endTimestamp; private final Optional<String> sha; @StoredAsJson private final Optional<CommitInfo> commitInfo; @StoredAsJson private final Optional<DependencyGraph> dependencyGraph; @StoredAsJson private final BuildOptions buildOptions; @JsonCreator public RepositoryBuild(@JsonProperty("id") Optional<Long> id, @JsonProperty("branchId") int branchId, @JsonProperty("buildNumber") int buildNumber, @JsonProperty("state") State state, @JsonProperty("buildTrigger") BuildTrigger buildTrigger, @JsonProperty("startTimestamp") Optional<Long> startTimestamp, @JsonProperty("endTimestamp") Optional<Long> endTimestamp, @JsonProperty("sha") Optional<String> sha, @JsonProperty("commitInfo") Optional<CommitInfo> commitInfo, @JsonProperty("dependencyGraph") Optional<DependencyGraph> dependencyGraph, @JsonProperty("buildOptions") BuildOptions buildOptions) { this.id = id; this.branchId = branchId; this.buildNumber = buildNumber; this.state = state; this.buildTrigger = buildTrigger; this.startTimestamp = startTimestamp; this.endTimestamp = endTimestamp; this.sha = sha; this.commitInfo = commitInfo; this.dependencyGraph = dependencyGraph; this.buildOptions = MoreObjects.firstNonNull(buildOptions, BuildOptions.defaultOptions()); } public static RepositoryBuild queuedBuild(GitInfo gitInfo, BuildTrigger trigger, int buildNumber, BuildOptions buildOptions) { return newBuilder(gitInfo.getId().get(), buildNumber, State.QUEUED, trigger, buildOptions).build(); } public Optional<Long> getId() { return id; } public int getBranchId() { return branchId; } public int getBuildNumber() { return buildNumber; } public State getState() { return state; } public BuildTrigger getBuildTrigger() { return buildTrigger; } public Optional<Long> getStartTimestamp() { return startTimestamp; } public Optional<Long> getEndTimestamp() { return endTimestamp; } public Optional<String> getSha() { return sha; } public Optional<CommitInfo> getCommitInfo() { return commitInfo; } public Optional<DependencyGraph> getDependencyGraph() { return dependencyGraph; } public BuildOptions getBuildOptions() { return buildOptions; } @Override public boolean equals(Object o) { if (this == o) { return true; } if (o == null || getClass() != o.getClass()) { return false; } RepositoryBuild build = (RepositoryBuild) o; return Objects.equals(branchId, build.branchId) && Objects.equals(buildNumber, build.buildNumber); } @Override public String toString() { return com.google.common.base.Objects.toStringHelper(this) .add("id", id) .add("branchId", branchId) .add("buildNumber", buildNumber) .add("state", state).toString(); } @Override public int hashCode() { return Objects.hash(branchId, buildNumber); } public Builder toBuilder() { return new Builder(branchId, buildNumber, state, buildTrigger, buildOptions) .setId(id) .setStartTimestamp(startTimestamp) .setEndTimestamp(endTimestamp) .setSha(sha) .setCommitInfo(commitInfo) .setDependencyGraph(dependencyGraph); } public static Builder newBuilder(int branchId, int buildNumber, State state, BuildTrigger buildTrigger, BuildOptions buildOptions) { return new Builder(branchId, buildNumber, state, buildTrigger, buildOptions); } public static class Builder { private Optional<Long> id = Optional.absent(); private int branchId; private int buildNumber; private State state; private BuildTrigger buildTrigger; private Optional<Long> startTimestamp = Optional.absent(); private Optional<Long> endTimestamp = Optional.absent(); private Optional<String> sha = Optional.absent(); private Optional<CommitInfo> commitInfo = Optional.absent(); private Optional<DependencyGraph> dependencyGraph = Optional.absent(); private BuildOptions buildOptions; Builder(int branchId, int buildNumber, State state, BuildTrigger buildTrigger, BuildOptions buildOptions) { this.branchId = branchId; this.buildNumber = buildNumber; this.state = state; this.buildTrigger = buildTrigger; this.buildOptions = buildOptions; } public Builder setId(Optional<Long> id) { this.id = id; return this; } public Builder setBranchId(int branchId) { this.branchId = branchId; return this; } public Builder setBuildNumber(int buildNumber) { this.buildNumber = buildNumber; return this; } public Builder setState(State state) { this.state = state; return this; } public Builder setBuildTrigger(BuildTrigger buildTrigger) { this.buildTrigger = buildTrigger; return this; } public Builder setStartTimestamp(Optional<Long> startTimestamp) { this.startTimestamp = startTimestamp; return this; } public Builder setEndTimestamp(Optional<Long> endTimestamp) { this.endTimestamp = endTimestamp; return this; } public Builder setSha(Optional<String> sha) { this.sha = sha; return this; } public Builder setCommitInfo(Optional<CommitInfo> commitInfo) { this.commitInfo = commitInfo; return this; } public Builder setDependencyGraph(Optional<DependencyGraph> dependencyGraph) { this.dependencyGraph = dependencyGraph; return this; } public Builder setBuildOptions(BuildOptions buildOptions) { this.buildOptions = buildOptions; return this; } public RepositoryBuild build() { return new RepositoryBuild(id, branchId, buildNumber, state, buildTrigger, startTimestamp, endTimestamp, sha, commitInfo, dependencyGraph, buildOptions); } } }