package com.hubspot.singularity; import java.util.Objects; import com.fasterxml.jackson.annotation.JsonIgnore; import com.google.common.base.Optional; public abstract class SingularityMachineAbstraction<T extends SingularityMachineAbstraction<T>> { private final String id; private final long firstSeenAt; private final SingularityMachineStateHistoryUpdate currentState; public SingularityMachineAbstraction(String id) { this(id, System.currentTimeMillis(), new SingularityMachineStateHistoryUpdate(id, MachineState.ACTIVE, System.currentTimeMillis(), Optional.<String> absent(), Optional.<String> absent())); } public SingularityMachineAbstraction(String id, long firstSeenAt, SingularityMachineStateHistoryUpdate currentState) { this.id = id; this.currentState = currentState; this.firstSeenAt = firstSeenAt; } public String getId() { return id; } @JsonIgnore public abstract String getName(); @JsonIgnore public abstract String getTypeName(); @Override public int hashCode() { return Objects.hashCode(id); } @Override public boolean equals(Object obj) { if (this == obj) { return true; } if (obj == null) { return false; } if (getClass() != obj.getClass()) { return false; } @SuppressWarnings("unchecked") SingularityMachineAbstraction<T> other = (SingularityMachineAbstraction<T>) obj; if (id == null) { if (other.id != null) { return false; } } else if (!id.equals(other.id)) { return false; } return true; } public long getFirstSeenAt() { return firstSeenAt; } public SingularityMachineStateHistoryUpdate getCurrentState() { return currentState; } public abstract T changeState(SingularityMachineStateHistoryUpdate newState); }