in accord-core/src/main/java/accord/local/Command.java [1582:1689]
public static <T extends Command> T validate(T validate)
{
Invariants.require(validate.txnId().hasOnlyIdentityFlags());
Invariants.require(!validate.participants().hasTouched().isEmpty() || validate.saveStatus() == Uninitialised);
Known known = validate.known();
switch (known.route())
{
default: throw new UnhandledEnum(known.route());
case MaybeRoute: break;
case FullRoute: Invariants.require(Route.isFullRoute(validate.route())); break;
case CoveringRoute: Invariants.require(Route.isRoute(validate.route())); break;
}
{
PartialTxn partialTxn = validate.partialTxn();
switch (known.definition())
{
default: throw new UnhandledEnum(known.definition());
case DefinitionErased:
case DefinitionUnknown:
case NoOp:
Invariants.require(partialTxn == null, "partialTxn is defined %s", validate);
break;
case DefinitionKnown:
Invariants.require(partialTxn != null || validate.participants().stillOwns().isEmpty(), "partialTxn is null");
break;
}
}
{
Timestamp executeAt = validate.executeAt();
switch (known.executeAt())
{
default: throw new UnhandledEnum(known.executeAt());
case ExecuteAtErased:
case ExecuteAtUnknown:
Invariants.require(executeAt == null || executeAt.compareTo(validate.txnId()) >= 0);
break;
case ExecuteAtKnown:
case ApplyAtKnown:
case ExecuteAtProposed:
Invariants.require(executeAt != null);
int c = executeAt.compareTo(validate.txnId());
Invariants.require(c > 0 || (c == 0 && executeAt.getClass() != Timestamp.class));
break;
case NoExecuteAt:
Invariants.require(executeAt.equals(Timestamp.NONE));
break;
}
}
{
PartialDeps deps = validate.partialDeps();
switch (known.deps())
{
default: throw new UnhandledEnum(known.deps());
case DepsUnknown:
case DepsErased:
case NoDeps:
Invariants.require(deps == null);
break;
case DepsFromCoordinator:
case DepsProposedFixed:
case DepsProposed:
case DepsCommitted:
case DepsKnown:
Invariants.require(deps != null);
break;
}
}
{
Writes writes = validate.writes();
Result result = validate.result();
switch (known.outcome())
{
default: throw new UnhandledEnum(known.outcome());
case Apply:
if (validate.txnId().is(Write)) Invariants.require(writes != null, "Writes is null %s", validate);
else Invariants.require(writes == null, "Writes is not-null %s", validate);
Invariants.require(result != null, "Result is null %s", validate);
break;
case Abort:
Invariants.require(validate.durability().isMaybeInvalidated(), "%s is not invalidated", validate.durability());
case Unknown:
Invariants.require(validate.durability() != Local);
case Erased:
case WasApply:
Invariants.require(writes == null, "Writes exist for %s", validate);
Invariants.require(result == null, "Results exist %s %s", validate, result);
break;
}
}
switch (validate.saveStatus().execution)
{
case NotReady:
case CleaningUp:
break;
case ReadyToExclude:
Invariants.require(validate.saveStatus() != SaveStatus.Committed || validate.asCommitted().waitingOn == null);
break;
case WaitingToExecute:
case ReadyToExecute:
case Applied:
case Applying:
case WaitingToApply:
Invariants.require(validate.participants().executes() != null);
Invariants.require(validate.asCommitted().waitingOn != null);
break;
}
return validate;
}