package de.otto.edison.status.domain; import net.jcip.annotations.Immutable; import java.util.ArrayList; import java.util.List; import static java.util.Collections.emptyList; import static java.util.Collections.unmodifiableList; import static java.util.Comparator.comparing; import static java.util.stream.Collectors.toList; @Immutable public class ApplicationStatus { public final ApplicationInfo application; public final SystemInfo system; public final VersionInfo vcs; public final TeamInfo team; public final ClusterInfo cluster; public final Status status; public final List<StatusDetail> statusDetails; public final List<ServiceSpec> serviceSpecs; private ApplicationStatus(final ApplicationInfo application, final ClusterInfo cluster, final SystemInfo system, final VersionInfo vcs, final TeamInfo team, final List<StatusDetail> details, final List<ServiceSpec> serviceSpecs) { this.status = details.stream() .map(StatusDetail::getStatus) .reduce(Status.OK, Status::plus); this.statusDetails = unmodifiableList(new ArrayList<>(details)); this.application = application; this.cluster = cluster; this.system = system; this.vcs = vcs; this.team = team; this.serviceSpecs = serviceSpecs != null ? serviceSpecs.stream().sorted(comparing(spec->spec.name)).collect(toList()) : emptyList(); } public static ApplicationStatus applicationStatus(final ApplicationInfo applicationInfo, final ClusterInfo clusterInfo, final SystemInfo systemInfo, final VersionInfo versionInfo, final TeamInfo teamInfo, final List<StatusDetail> details, final List<ServiceSpec> serviceSpecs) { return new ApplicationStatus(applicationInfo, clusterInfo, systemInfo, versionInfo, teamInfo, details, serviceSpecs); } @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; ApplicationStatus that = (ApplicationStatus) o; if (application != null ? !application.equals(that.application) : that.application != null) return false; if (system != null ? !system.equals(that.system) : that.system != null) return false; if (vcs != null ? !vcs.equals(that.vcs) : that.vcs != null) return false; if (team != null ? !team.equals(that.team) : that.team != null) return false; if (cluster != null ? !cluster.equals(that.cluster) : that.cluster != null) return false; if (status != that.status) return false; if (statusDetails != null ? !statusDetails.equals(that.statusDetails) : that.statusDetails != null) return false; return serviceSpecs != null ? serviceSpecs.equals(that.serviceSpecs) : that.serviceSpecs == null; } @Override public int hashCode() { int result = application != null ? application.hashCode() : 0; result = 31 * result + (system != null ? system.hashCode() : 0); result = 31 * result + (vcs != null ? vcs.hashCode() : 0); result = 31 * result + (team != null ? team.hashCode() : 0); result = 31 * result + (cluster != null ? cluster.hashCode() : 0); result = 31 * result + (status != null ? status.hashCode() : 0); result = 31 * result + (statusDetails != null ? statusDetails.hashCode() : 0); result = 31 * result + (serviceSpecs != null ? serviceSpecs.hashCode() : 0); return result; } @Override public String toString() { return "ApplicationStatus{" + "application=" + application + ", system=" + system + ", vcs=" + vcs + ", team=" + team + ", cluster=" + cluster + ", status=" + status + ", statusDetails=" + statusDetails + ", serviceSpecs=" + serviceSpecs + '}'; } }