WorkflowSessionRevisionConflictException.java

package org.hammer.audio.workflow.collaboration.store;

import java.util.Objects;

/** Typed durable-session failure raised when an append targets a stale semantic revision. */
public final class WorkflowSessionRevisionConflictException extends RuntimeException {

  private final String conflictingSessionId;
  private final long requiredRevision;
  private final long observedRevision;

  /** Creates a revision conflict with stable machine-readable values. */
  public WorkflowSessionRevisionConflictException(
      String sessionId, long expectedRevision, long actualRevision) {
    this(sessionId, expectedRevision, actualRevision, null);
  }

  /** Creates a revision conflict while preserving the triggering persistence failure. */
  public WorkflowSessionRevisionConflictException(
      String sessionId, long expectedRevision, long actualRevision, Throwable cause) {
    super(message(sessionId, expectedRevision, actualRevision), cause);
    this.conflictingSessionId = Objects.requireNonNull(sessionId, "sessionId");
    this.requiredRevision = expectedRevision;
    this.observedRevision = actualRevision;
  }

  public String sessionId() {
    return conflictingSessionId;
  }

  public long expectedRevision() {
    return requiredRevision;
  }

  public long actualRevision() {
    return observedRevision;
  }

  private static String message(String sessionId, long expectedRevision, long actualRevision) {
    return "Expected workflow session revision "
        + expectedRevision
        + " but found "
        + actualRevision
        + " for session "
        + sessionId;
  }
}