in accord-core/src/main/java/accord/local/Commands.java [1138:1196]
private static boolean validate(Status status, CommonAttributes attrs, Ranges existingRanges, Ranges additionalRanges, ProgressShard shard,
Route<?> route, EnsureAction ensureRoute,
@Nullable PartialTxn partialTxn, EnsureAction ensurePartialTxn,
@Nullable PartialDeps partialDeps, EnsureAction ensurePartialDeps)
{
if (shard == Unsure)
return false;
// first validate route
if (shard.isHome())
{
switch (ensureRoute)
{
default: throw new AssertionError();
case Check:
if (!isFullRoute(attrs.route()) && !isFullRoute(route))
return false;
case Ignore:
break;
case Add:
case Set:
if (!isFullRoute(route))
throw new IllegalArgumentException("Incomplete route (" + route + ") sent to home shard");
break;
case TrySet:
if (!isFullRoute(route))
return false;
}
}
else
{
// failing any of these tests is always an illegal state
if (!route.covers(existingRanges))
return false;
if (existingRanges != additionalRanges && !route.covers(additionalRanges))
throw new IllegalArgumentException("Incomplete route (" + route + ") provided; does not cover " + additionalRanges);
}
// invalid to Add deps to Accepted or AcceptedInvalidate statuses, as Committed deps are not equivalent
// and we may erroneously believe we have covered a wider range than we have infact covered
if (ensurePartialDeps == Add)
Invariants.checkState(status != Accepted && status != AcceptedInvalidate);
// validate new partial txn
if (!validate(ensurePartialTxn, existingRanges, additionalRanges, covers(attrs.partialTxn()), covers(partialTxn), "txn", partialTxn))
return false;
if (partialTxn != null && attrs.txnId().rw() != null && !attrs.txnId().rw().equals(partialTxn.kind()))
throw new IllegalArgumentException("Transaction has different kind to its TxnId");
if (shard.isHome() && ensurePartialTxn != Ignore)
{
if (!hasQuery(attrs.partialTxn()) && !hasQuery(partialTxn))
throw new IllegalStateException();
}
return validate(ensurePartialDeps, existingRanges, additionalRanges, covers(attrs.partialDeps()), covers(partialDeps), "deps", partialDeps);
}