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.Optional;
import com.google.common.base.Predicate;
public class ModuleState {
private final Module module;
private final Optional<ModuleBuild> lastSuccessfulModuleBuild;
private final Optional<RepositoryBuild> lastSuccessfulBranchBuild;
private final Optional<ModuleBuild> lastNonSkippedModuleBuild;
private final Optional<RepositoryBuild> lastNonSkippedBranchBuild;
private final Optional<ModuleBuild> lastModuleBuild;
private final Optional<RepositoryBuild> lastBranchBuild;
private final Optional<ModuleBuild> inProgressModuleBuild;
private final Optional<RepositoryBuild> inProgressBranchBuild;
private final Optional<ModuleBuild> pendingModuleBuild;
private final Optional<RepositoryBuild> pendingBranchBuild;
@JsonCreator
public ModuleState(@JsonProperty("module") Module module,
@JsonProperty("lastSuccessfulModuleBuild") Optional<ModuleBuild> lastSuccessfulModuleBuild,
@JsonProperty("lastSuccessfulBranchBuild") Optional<RepositoryBuild> lastSuccessfulBranchBuild,
@JsonProperty("lastNonSkippedModuleBuild") Optional<ModuleBuild> lastNonSkippedModuleBuild,
@JsonProperty("lastNonSkippedBranchBuild") Optional<RepositoryBuild> lastNonSkippedBranchBuild,
@JsonProperty("lastModuleBuild") Optional<ModuleBuild> lastModuleBuild,
@JsonProperty("lastBranchBuild") Optional<RepositoryBuild> lastBranchBuild,
@JsonProperty("inProgressModuleBuild") Optional<ModuleBuild> inProgressModuleBuild,
@JsonProperty("inProgressBranchBuild") Optional<RepositoryBuild> inProgressBranchBuild,
@JsonProperty("pendingModuleBuild") Optional<ModuleBuild> pendingModuleBuild,
@JsonProperty("pendingBranchBuild") Optional<RepositoryBuild> pendingBranchBuild) {
if (module == null) {
throw new IllegalArgumentException("Cannot construct module state with null module");
}
this.module = module;
this.lastSuccessfulModuleBuild = filterModuleBuild(lastSuccessfulModuleBuild);
this.lastSuccessfulBranchBuild = filterBranchBuild(lastSuccessfulBranchBuild);
this.lastNonSkippedModuleBuild = filterModuleBuild(lastNonSkippedModuleBuild);
this.lastNonSkippedBranchBuild = filterBranchBuild(lastNonSkippedBranchBuild);
this.lastModuleBuild = filterModuleBuild(lastModuleBuild);
this.lastBranchBuild = filterBranchBuild(lastBranchBuild);
this.inProgressModuleBuild = filterModuleBuild(inProgressModuleBuild);
this.inProgressBranchBuild = filterBranchBuild(inProgressBranchBuild);
this.pendingModuleBuild = filterModuleBuild(pendingModuleBuild);
this.pendingBranchBuild = filterBranchBuild(pendingBranchBuild);
}
/* When this object is built by rosetta the missing build rows are filled with nulls,
* which results in objects like this being passed to ModuleState's constructor:
*
* ModuleBuild(Optional.absent(), 0, 0, 0, null, Optional.absent()...)
*
* This results in a "present" ModuleBuild, but it has no actual values, the filters here
* find such elements and replace them with just Optional.absent()
*/
private static Optional<ModuleBuild> filterModuleBuild(Optional<ModuleBuild> moduleBuildOptional) {
return filter(moduleBuildOptional, moduleBuild -> moduleBuild.getId().isPresent());
}
private static Optional<RepositoryBuild> filterBranchBuild(Optional<RepositoryBuild> repositoryBuildOptional) {
return filter(repositoryBuildOptional, repositoryBuild -> repositoryBuild.getId().isPresent());
}
private static <T> Optional<T> filter(Optional<T> optional, Predicate<T> predicate) {
return optional.isPresent() && predicate.apply(optional.get()) ? optional : Optional.absent();
}
public Module getModule() {
return module;
}
public Optional<ModuleBuild> getLastSuccessfulModuleBuild() {
return lastSuccessfulModuleBuild;
}
public Optional<RepositoryBuild> getLastSuccessfulBranchBuild() {
return lastSuccessfulBranchBuild;
}
public Optional<ModuleBuild> getLastNonSkippedModuleBuild() {
return lastNonSkippedModuleBuild;
}
public Optional<RepositoryBuild> getLastNonSkippedBranchBuild() {
return lastNonSkippedBranchBuild;
}
public Optional<ModuleBuild> getLastModuleBuild() {
return lastModuleBuild;
}
public Optional<RepositoryBuild> getLastBranchBuild() {
return lastBranchBuild;
}
public Optional<ModuleBuild> getInProgressModuleBuild() {
return inProgressModuleBuild;
}
public Optional<RepositoryBuild> getInProgressBranchBuild() {
return inProgressBranchBuild;
}
public Optional<ModuleBuild> getPendingModuleBuild() {
return pendingModuleBuild;
}
public Optional<RepositoryBuild> getPendingBranchBuild() {
return pendingBranchBuild;
}
@Override
public boolean equals(Object o) {
if (this == o) {
return true;
}
if (o == null || getClass() != o.getClass()) {
return false;
}
ModuleState that = (ModuleState) o;
return Objects.equals(this.lastSuccessfulModuleBuild, that.lastSuccessfulModuleBuild) &&
Objects.equals(this.lastSuccessfulBranchBuild, that.lastSuccessfulBranchBuild) &&
Objects.equals(this.lastNonSkippedModuleBuild, that.lastNonSkippedModuleBuild) &&
Objects.equals(this.lastNonSkippedBranchBuild, that.lastNonSkippedBranchBuild) &&
Objects.equals(this.lastModuleBuild, that.lastModuleBuild) &&
Objects.equals(this.lastBranchBuild, that.lastBranchBuild) &&
Objects.equals(this.inProgressModuleBuild, that.inProgressModuleBuild) &&
Objects.equals(this.inProgressBranchBuild, that.inProgressBranchBuild) &&
Objects.equals(this.pendingModuleBuild, that.pendingModuleBuild) &&
Objects.equals(this.pendingBranchBuild, that.pendingBranchBuild);
}
@Override
public int hashCode() {
return Objects.hash(module, lastSuccessfulModuleBuild , lastSuccessfulBranchBuild , lastNonSkippedModuleBuild , lastNonSkippedBranchBuild , lastModuleBuild , lastBranchBuild , inProgressModuleBuild , inProgressBranchBuild , pendingModuleBuild , pendingBranchBuild);
}
public Builder toBuilder () {
return new Builder(module)
.setLastSuccessfulBranchBuild(lastSuccessfulBranchBuild)
.setLastSuccessfulModuleBuild(lastSuccessfulModuleBuild)
.setLastNonSkippedBranchBuild(lastNonSkippedBranchBuild)
.setLastNonSkippedModuleBuild(lastNonSkippedModuleBuild)
.setLastBranchBuild(lastBranchBuild)
.setLastModuleBuild(lastModuleBuild)
.setInProgressBranchBuild(inProgressBranchBuild)
.setInProgressModuleBuild(inProgressModuleBuild)
.setPendingBranchBuild(pendingBranchBuild)
.setPendingModuleBuild(pendingModuleBuild);
}
public static Builder newBuilder(Module module) {
return new Builder(module);
}
public static class Builder {
private Module module;
private Optional<ModuleBuild> lastSuccessfulModuleBuild = Optional.absent();
private Optional<RepositoryBuild> lastSuccessfulBranchBuild = Optional.absent();
private Optional<ModuleBuild> lastNonSkippedModuleBuild = Optional.absent();
private Optional<RepositoryBuild> lastNonSkippedBranchBuild = Optional.absent();
private Optional<ModuleBuild> lastModuleBuild = Optional.absent();
private Optional<RepositoryBuild> lastBranchBuild = Optional.absent();
private Optional<ModuleBuild> inProgressModuleBuild = Optional.absent();
private Optional<RepositoryBuild> inProgressBranchBuild = Optional.absent();
private Optional<ModuleBuild> pendingModuleBuild = Optional.absent();
private Optional<RepositoryBuild> pendingBranchBuild = Optional.absent();
public Builder(Module module) {
this.module = module;
}
public void setModule(Module module) {
this.module = module;
}
public Builder setLastSuccessfulModuleBuild(Optional<ModuleBuild> lastSuccessfulModuleBuild) {
this.lastSuccessfulModuleBuild = lastSuccessfulModuleBuild;
return this;
}
public Builder setLastSuccessfulBranchBuild(Optional<RepositoryBuild> lastSuccessfulBranchBuild) {
this.lastSuccessfulBranchBuild = lastSuccessfulBranchBuild;
return this;
}
public Builder setLastNonSkippedModuleBuild(Optional<ModuleBuild> lastNonSkippedModuleBuild) {
this.lastNonSkippedModuleBuild = lastNonSkippedModuleBuild;
return this;
}
public Builder setLastNonSkippedBranchBuild(Optional<RepositoryBuild> lastNonSkippedBranchBuild) {
this.lastNonSkippedBranchBuild = lastNonSkippedBranchBuild;
return this;
}
public Builder setLastModuleBuild(Optional<ModuleBuild> lastModuleBuild) {
this.lastModuleBuild = lastModuleBuild;
return this;
}
public Builder setLastBranchBuild(Optional<RepositoryBuild> lastBranchBuild) {
this.lastBranchBuild = lastBranchBuild;
return this;
}
public Builder setInProgressModuleBuild(Optional<ModuleBuild> inProgressModuleBuild) {
this.inProgressModuleBuild = inProgressModuleBuild;
return this;
}
public Builder setInProgressBranchBuild(Optional<RepositoryBuild> inProgressBranchBuild) {
this.inProgressBranchBuild = inProgressBranchBuild;
return this;
}
public Builder setPendingModuleBuild(Optional<ModuleBuild> pendingModuleBuild) {
this.pendingModuleBuild = pendingModuleBuild;
return this;
}
public Builder setPendingBranchBuild(Optional<RepositoryBuild> pendingBranchBuild) {
this.pendingBranchBuild = pendingBranchBuild;
return this;
}
public ModuleState build() {
return new ModuleState(module, lastSuccessfulModuleBuild, lastSuccessfulBranchBuild, lastNonSkippedModuleBuild, lastNonSkippedBranchBuild, lastModuleBuild, lastBranchBuild,
inProgressModuleBuild, inProgressBranchBuild, pendingModuleBuild,pendingBranchBuild);
}
}
}