From 6095f6eca9ae96f94d1afdcba9971ac2ec4d8c5b Mon Sep 17 00:00:00 2001 From: Kristóf Marussy Date: Fri, 28 Jun 2024 19:43:52 +0200 Subject: refactor: improve propagation traceability --- .../dse/propagation/PropagationRejectedResult.java | 32 ++++++++++++++++++++ .../store/dse/propagation/PropagationResult.java | 25 +++++----------- .../dse/propagation/PropagationSuccessResult.java | 34 ++++++++++++++++++++++ .../impl/rule/BoundPropagationRule.java | 3 +- 4 files changed, 76 insertions(+), 18 deletions(-) create mode 100644 subprojects/store-dse/src/main/java/tools/refinery/store/dse/propagation/PropagationRejectedResult.java create mode 100644 subprojects/store-dse/src/main/java/tools/refinery/store/dse/propagation/PropagationSuccessResult.java (limited to 'subprojects/store-dse') diff --git a/subprojects/store-dse/src/main/java/tools/refinery/store/dse/propagation/PropagationRejectedResult.java b/subprojects/store-dse/src/main/java/tools/refinery/store/dse/propagation/PropagationRejectedResult.java new file mode 100644 index 00000000..6d696de7 --- /dev/null +++ b/subprojects/store-dse/src/main/java/tools/refinery/store/dse/propagation/PropagationRejectedResult.java @@ -0,0 +1,32 @@ +/* + * SPDX-FileCopyrightText: 2024 The Refinery Authors + * + * SPDX-License-Identifier: EPL-2.0 + */ +package tools.refinery.store.dse.propagation; + +public record PropagationRejectedResult(Object reason, String message) implements PropagationResult { + @Override + public PropagationResult andThen(PropagationResult next) { + return this; + } + + @Override + public boolean isRejected() { + return true; + } + + @Override + public void throwIfRejected() { + throw new IllegalArgumentException(formatMessage()); + } + + public String formatMessage() { + return "Propagation failed: %s".formatted(message); + } + + @Override + public boolean isChanged() { + return false; + } +} diff --git a/subprojects/store-dse/src/main/java/tools/refinery/store/dse/propagation/PropagationResult.java b/subprojects/store-dse/src/main/java/tools/refinery/store/dse/propagation/PropagationResult.java index ea56653a..e07e443b 100644 --- a/subprojects/store-dse/src/main/java/tools/refinery/store/dse/propagation/PropagationResult.java +++ b/subprojects/store-dse/src/main/java/tools/refinery/store/dse/propagation/PropagationResult.java @@ -5,24 +5,15 @@ */ package tools.refinery.store.dse.propagation; -public enum PropagationResult { - UNCHANGED, - PROPAGATED, - REJECTED; +public sealed interface PropagationResult permits PropagationSuccessResult, PropagationRejectedResult { + PropagationResult UNCHANGED = PropagationSuccessResult.UNCHANGED; + PropagationResult PROPAGATED = PropagationSuccessResult.PROPAGATED; - public PropagationResult andThen(PropagationResult next) { - return switch (this) { - case UNCHANGED -> next; - case PROPAGATED -> next == REJECTED ? REJECTED : PROPAGATED; - case REJECTED -> REJECTED; - }; - } + PropagationResult andThen(PropagationResult next); - public boolean isRejected() { - return this == REJECTED; - } + boolean isRejected(); - public boolean isChanged() { - return this == PROPAGATED; - } + void throwIfRejected(); + + boolean isChanged(); } diff --git a/subprojects/store-dse/src/main/java/tools/refinery/store/dse/propagation/PropagationSuccessResult.java b/subprojects/store-dse/src/main/java/tools/refinery/store/dse/propagation/PropagationSuccessResult.java new file mode 100644 index 00000000..22117772 --- /dev/null +++ b/subprojects/store-dse/src/main/java/tools/refinery/store/dse/propagation/PropagationSuccessResult.java @@ -0,0 +1,34 @@ +/* + * SPDX-FileCopyrightText: 2024 The Refinery Authors + * + * SPDX-License-Identifier: EPL-2.0 + */ +package tools.refinery.store.dse.propagation; + +public enum PropagationSuccessResult implements PropagationResult { + UNCHANGED, + PROPAGATED; + + @Override + public PropagationResult andThen(PropagationResult next) { + return switch (this) { + case UNCHANGED -> next; + case PROPAGATED -> next instanceof PropagationRejectedResult ? next : PROPAGATED; + }; + } + + @Override + public boolean isRejected() { + return false; + } + + @Override + public void throwIfRejected() { + // Nothing to throw. + } + + @Override + public boolean isChanged() { + return this == PROPAGATED; + } +} diff --git a/subprojects/store-dse/src/main/java/tools/refinery/store/dse/propagation/impl/rule/BoundPropagationRule.java b/subprojects/store-dse/src/main/java/tools/refinery/store/dse/propagation/impl/rule/BoundPropagationRule.java index 5f69b7a2..f91882be 100644 --- a/subprojects/store-dse/src/main/java/tools/refinery/store/dse/propagation/impl/rule/BoundPropagationRule.java +++ b/subprojects/store-dse/src/main/java/tools/refinery/store/dse/propagation/impl/rule/BoundPropagationRule.java @@ -5,6 +5,7 @@ */ package tools.refinery.store.dse.propagation.impl.rule; +import tools.refinery.store.dse.propagation.PropagationRejectedResult; import tools.refinery.store.dse.propagation.PropagationResult; import tools.refinery.store.dse.transition.Rule; import tools.refinery.store.dse.transition.actions.BoundAction; @@ -54,7 +55,7 @@ class BoundPropagationRule { var tuple = cursor.getKey(); var result = action.fire(tuple); if (!result) { - return PropagationResult.REJECTED; + return new PropagationRejectedResult(rule, "Propagation rule '%s' failed.".formatted(rule.getName())); } firedActivations.add(tuple); } -- cgit v1.2.3-54-g00ecf