package com.hubspot.singularity; import javax.annotation.Nonnull; import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonProperty; import com.google.common.base.Predicate; import com.google.common.collect.ComparisonChain; import com.hubspot.mesos.JavaUtils; import com.hubspot.singularity.SingularityPendingRequest.PendingType; public class SingularityPendingTaskId extends SingularityId implements Comparable<SingularityPendingTaskId> { private final String requestId; private final String deployId; private final long nextRunAt; private final long createdAt; private final int instanceNo; private final PendingType pendingType; public static Predicate<SingularityPendingTaskId> matchingRequestId(final String requestId) { return new Predicate<SingularityPendingTaskId>() { @Override public boolean apply(@Nonnull SingularityPendingTaskId input) { return input.getRequestId().equals(requestId); } }; } public static Predicate<SingularityPendingTaskId> matchingDeployId(final String deployId) { return new Predicate<SingularityPendingTaskId>() { @Override public boolean apply(@Nonnull SingularityPendingTaskId input) { return input.getDeployId().equals(deployId); } }; } @JsonCreator public SingularityPendingTaskId(@JsonProperty("requestId") String requestId, @JsonProperty("deployId") String deployId, @JsonProperty("nextRunAt") long nextRunAt, @JsonProperty("instanceNo") int instanceNo, @JsonProperty("pendingType") PendingType pendingType, @JsonProperty("createdAt") long createdAt) { super(String.format("%s-%s-%s-%s-%s-%s", requestId, deployId, nextRunAt, instanceNo, pendingType, createdAt)); this.requestId = requestId; this.deployId = deployId; this.nextRunAt = nextRunAt; this.createdAt = createdAt; this.instanceNo = instanceNo; this.pendingType = pendingType; } public String getDeployId() { return deployId; } public String getRequestId() { return requestId; } public long getNextRunAt() { return nextRunAt; } public int getInstanceNo() { return instanceNo; } public long getCreatedAt() { return createdAt; } public PendingType getPendingType() { return pendingType; } public static SingularityPendingTaskId valueOf(String string) { String[] splits = null; try { splits = JavaUtils.reverseSplit(string, 6, "-"); } catch (IllegalStateException ise) { throw new InvalidSingularityTaskIdException(String.format("PendingTaskId %s was invalid (%s)", string, ise.getMessage())); } try { final String requestId = splits[0]; final String deployId = splits[1]; final long nextRunAt = Long.parseLong(splits[2]); final int instanceNo = Integer.parseInt(splits[3]); final PendingType pendingType = PendingType.valueOf(splits[4]); final long createdAt = Long.parseLong(splits[5]); return new SingularityPendingTaskId(requestId, deployId, nextRunAt, instanceNo, pendingType, createdAt); } catch (IllegalArgumentException e) { throw new InvalidSingularityTaskIdException(String.format("PendingTaskId %s had an invalid parameter (%s)", string, e.getMessage())); } } @Override public String toString() { return getId(); } @Override public int compareTo(SingularityPendingTaskId o) { return ComparisonChain.start() .compare(this.getNextRunAt(), o.getNextRunAt()) .compare(this.getRequestId(), o.getRequestId()) .compare(this.getDeployId(), o.getDeployId()) .compare(this.getInstanceNo(), o.getInstanceNo()) .compare(this.getCreatedAt(), o.getCreatedAt()) .compare(this.getPendingType(), o.getPendingType()) .result(); } }