From b52a4b0b330c4f4903fb4aa41a63980774b43c85 Mon Sep 17 00:00:00 2001 From: Kristóf Marussy Date: Fri, 28 Jun 2024 21:21:53 +0200 Subject: refactor: improve propagation rule diagnostics --- .../refinery/store/dse/propagation/PropagationBuilder.java | 2 ++ .../store/dse/propagation/PropagationRejectedResult.java | 8 ++++++-- .../store/dse/propagation/impl/PropagationAdapterImpl.java | 10 ++++++---- .../store/dse/propagation/impl/PropagationBuilderImpl.java | 9 ++++++++- .../dse/propagation/impl/PropagationStoreAdapterImpl.java | 10 +++++++++- .../store/dse/propagation/impl/rule/BoundPropagationRule.java | 3 ++- 6 files changed, 33 insertions(+), 9 deletions(-) (limited to 'subprojects/store-dse') diff --git a/subprojects/store-dse/src/main/java/tools/refinery/store/dse/propagation/PropagationBuilder.java b/subprojects/store-dse/src/main/java/tools/refinery/store/dse/propagation/PropagationBuilder.java index f8a89b30..2a22f00d 100644 --- a/subprojects/store-dse/src/main/java/tools/refinery/store/dse/propagation/PropagationBuilder.java +++ b/subprojects/store-dse/src/main/java/tools/refinery/store/dse/propagation/PropagationBuilder.java @@ -27,6 +27,8 @@ public interface PropagationBuilder extends ModelAdapterBuilder { PropagationBuilder propagator(Propagator propagator); + PropagationBuilder throwOnFatalRejection(boolean throwOnFatalRejection); + @Override PropagationStoreAdapter build(ModelStore store); } 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 index 6d696de7..0ef1dc38 100644 --- 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 @@ -5,7 +5,11 @@ */ package tools.refinery.store.dse.propagation; -public record PropagationRejectedResult(Object reason, String message) implements PropagationResult { +public record PropagationRejectedResult(Object reason, String message, boolean fatal) implements PropagationResult { + public PropagationRejectedResult(Object reason, String message) { + this(reason, message, false); + } + @Override public PropagationResult andThen(PropagationResult next) { return this; @@ -18,7 +22,7 @@ public record PropagationRejectedResult(Object reason, String message) implement @Override public void throwIfRejected() { - throw new IllegalArgumentException(formatMessage()); + throw new IllegalStateException(formatMessage()); } public String formatMessage() { diff --git a/subprojects/store-dse/src/main/java/tools/refinery/store/dse/propagation/impl/PropagationAdapterImpl.java b/subprojects/store-dse/src/main/java/tools/refinery/store/dse/propagation/impl/PropagationAdapterImpl.java index fdd19217..7158a7ab 100644 --- a/subprojects/store-dse/src/main/java/tools/refinery/store/dse/propagation/impl/PropagationAdapterImpl.java +++ b/subprojects/store-dse/src/main/java/tools/refinery/store/dse/propagation/impl/PropagationAdapterImpl.java @@ -5,10 +5,7 @@ */ package tools.refinery.store.dse.propagation.impl; -import tools.refinery.store.dse.propagation.BoundPropagator; -import tools.refinery.store.dse.propagation.PropagationAdapter; -import tools.refinery.store.dse.propagation.PropagationResult; -import tools.refinery.store.dse.propagation.PropagationStoreAdapter; +import tools.refinery.store.dse.propagation.*; import tools.refinery.store.model.Model; class PropagationAdapterImpl implements PropagationAdapter { @@ -35,6 +32,11 @@ class PropagationAdapterImpl implements PropagationAdapter { lastResult = propagateOne(); result = result.andThen(lastResult); } while (lastResult.isChanged()); + if (lastResult instanceof PropagationRejectedResult rejectedResult && + rejectedResult.fatal() && + storeAdapter.isThrowOnFatalRejection()) { + rejectedResult.throwIfRejected(); + } return result; } diff --git a/subprojects/store-dse/src/main/java/tools/refinery/store/dse/propagation/impl/PropagationBuilderImpl.java b/subprojects/store-dse/src/main/java/tools/refinery/store/dse/propagation/impl/PropagationBuilderImpl.java index c844a89f..da32fe44 100644 --- a/subprojects/store-dse/src/main/java/tools/refinery/store/dse/propagation/impl/PropagationBuilderImpl.java +++ b/subprojects/store-dse/src/main/java/tools/refinery/store/dse/propagation/impl/PropagationBuilderImpl.java @@ -20,6 +20,7 @@ public class PropagationBuilderImpl extends AbstractModelAdapterBuilder propagationRules = new LinkedHashSet<>(); private final Deque propagators = new ArrayDeque<>(); + private boolean throwOnFatalRejection = true; @Override public PropagationBuilder rule(Rule propagationRule) { @@ -35,6 +36,12 @@ public class PropagationBuilderImpl extends AbstractModelAdapterBuilder propagators; + private final boolean throwOnFatalRejection; - PropagationStoreAdapterImpl(ModelStore store, List propagators) { + PropagationStoreAdapterImpl(ModelStore store, List propagators, boolean throwOnFatalRejection) { this.store = store; this.propagators = propagators; + this.throwOnFatalRejection = throwOnFatalRejection; } @Override @@ -35,4 +39,8 @@ class PropagationStoreAdapterImpl implements PropagationStoreAdapter { List getPropagators() { return propagators; } + + boolean isThrowOnFatalRejection() { + return throwOnFatalRejection; + } } 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 f91882be..cc1e0486 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 @@ -44,7 +44,8 @@ class BoundPropagationRule { public PropagationResult fireAll() { if (!firedActivations.isEmpty()) { - throw new IllegalStateException("Stuck propagation rule '%s'.".formatted(rule.getName())); + return new PropagationRejectedResult(rule, "Propagation rule '%s' got stuck.".formatted(rule.getName()), + true); } if (resultSet.size() == 0) { return PropagationResult.UNCHANGED; -- cgit v1.2.3-54-g00ecf