diff options
author | 2024-06-28 21:21:53 +0200 | |
---|---|---|
committer | 2024-06-28 21:44:58 +0200 | |
commit | b52a4b0b330c4f4903fb4aa41a63980774b43c85 (patch) | |
tree | e0a0f90580d6b571572d4aab173b09e66c96ef94 /subprojects/store-dse | |
parent | refactor: improve propagation traceability (diff) | |
download | refinery-main.tar.gz refinery-main.tar.zst refinery-main.zip |
Diffstat (limited to 'subprojects/store-dse')
6 files changed, 33 insertions, 9 deletions
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 { | |||
27 | 27 | ||
28 | PropagationBuilder propagator(Propagator propagator); | 28 | PropagationBuilder propagator(Propagator propagator); |
29 | 29 | ||
30 | PropagationBuilder throwOnFatalRejection(boolean throwOnFatalRejection); | ||
31 | |||
30 | @Override | 32 | @Override |
31 | PropagationStoreAdapter build(ModelStore store); | 33 | PropagationStoreAdapter build(ModelStore store); |
32 | } | 34 | } |
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 @@ | |||
5 | */ | 5 | */ |
6 | package tools.refinery.store.dse.propagation; | 6 | package tools.refinery.store.dse.propagation; |
7 | 7 | ||
8 | public record PropagationRejectedResult(Object reason, String message) implements PropagationResult { | 8 | public record PropagationRejectedResult(Object reason, String message, boolean fatal) implements PropagationResult { |
9 | public PropagationRejectedResult(Object reason, String message) { | ||
10 | this(reason, message, false); | ||
11 | } | ||
12 | |||
9 | @Override | 13 | @Override |
10 | public PropagationResult andThen(PropagationResult next) { | 14 | public PropagationResult andThen(PropagationResult next) { |
11 | return this; | 15 | return this; |
@@ -18,7 +22,7 @@ public record PropagationRejectedResult(Object reason, String message) implement | |||
18 | 22 | ||
19 | @Override | 23 | @Override |
20 | public void throwIfRejected() { | 24 | public void throwIfRejected() { |
21 | throw new IllegalArgumentException(formatMessage()); | 25 | throw new IllegalStateException(formatMessage()); |
22 | } | 26 | } |
23 | 27 | ||
24 | public String formatMessage() { | 28 | 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 @@ | |||
5 | */ | 5 | */ |
6 | package tools.refinery.store.dse.propagation.impl; | 6 | package tools.refinery.store.dse.propagation.impl; |
7 | 7 | ||
8 | import tools.refinery.store.dse.propagation.BoundPropagator; | 8 | import tools.refinery.store.dse.propagation.*; |
9 | import tools.refinery.store.dse.propagation.PropagationAdapter; | ||
10 | import tools.refinery.store.dse.propagation.PropagationResult; | ||
11 | import tools.refinery.store.dse.propagation.PropagationStoreAdapter; | ||
12 | import tools.refinery.store.model.Model; | 9 | import tools.refinery.store.model.Model; |
13 | 10 | ||
14 | class PropagationAdapterImpl implements PropagationAdapter { | 11 | class PropagationAdapterImpl implements PropagationAdapter { |
@@ -35,6 +32,11 @@ class PropagationAdapterImpl implements PropagationAdapter { | |||
35 | lastResult = propagateOne(); | 32 | lastResult = propagateOne(); |
36 | result = result.andThen(lastResult); | 33 | result = result.andThen(lastResult); |
37 | } while (lastResult.isChanged()); | 34 | } while (lastResult.isChanged()); |
35 | if (lastResult instanceof PropagationRejectedResult rejectedResult && | ||
36 | rejectedResult.fatal() && | ||
37 | storeAdapter.isThrowOnFatalRejection()) { | ||
38 | rejectedResult.throwIfRejected(); | ||
39 | } | ||
38 | return result; | 40 | return result; |
39 | } | 41 | } |
40 | 42 | ||
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<Propagat | |||
20 | implements PropagationBuilder { | 20 | implements PropagationBuilder { |
21 | private final Set<Rule> propagationRules = new LinkedHashSet<>(); | 21 | private final Set<Rule> propagationRules = new LinkedHashSet<>(); |
22 | private final Deque<Propagator> propagators = new ArrayDeque<>(); | 22 | private final Deque<Propagator> propagators = new ArrayDeque<>(); |
23 | private boolean throwOnFatalRejection = true; | ||
23 | 24 | ||
24 | @Override | 25 | @Override |
25 | public PropagationBuilder rule(Rule propagationRule) { | 26 | public PropagationBuilder rule(Rule propagationRule) { |
@@ -36,6 +37,12 @@ public class PropagationBuilderImpl extends AbstractModelAdapterBuilder<Propagat | |||
36 | } | 37 | } |
37 | 38 | ||
38 | @Override | 39 | @Override |
40 | public PropagationBuilder throwOnFatalRejection(boolean throwOnFatalRejection) { | ||
41 | this.throwOnFatalRejection = throwOnFatalRejection; | ||
42 | return this; | ||
43 | } | ||
44 | |||
45 | @Override | ||
39 | protected void doConfigure(ModelStoreBuilder storeBuilder) { | 46 | protected void doConfigure(ModelStoreBuilder storeBuilder) { |
40 | super.doConfigure(storeBuilder); | 47 | super.doConfigure(storeBuilder); |
41 | if (!propagationRules.isEmpty()) { | 48 | if (!propagationRules.isEmpty()) { |
@@ -48,6 +55,6 @@ public class PropagationBuilderImpl extends AbstractModelAdapterBuilder<Propagat | |||
48 | 55 | ||
49 | @Override | 56 | @Override |
50 | protected PropagationStoreAdapter doBuild(ModelStore store) { | 57 | protected PropagationStoreAdapter doBuild(ModelStore store) { |
51 | return new PropagationStoreAdapterImpl(store, List.copyOf(propagators)); | 58 | return new PropagationStoreAdapterImpl(store, List.copyOf(propagators), throwOnFatalRejection); |
52 | } | 59 | } |
53 | } | 60 | } |
diff --git a/subprojects/store-dse/src/main/java/tools/refinery/store/dse/propagation/impl/PropagationStoreAdapterImpl.java b/subprojects/store-dse/src/main/java/tools/refinery/store/dse/propagation/impl/PropagationStoreAdapterImpl.java index a223caed..4f7b8622 100644 --- a/subprojects/store-dse/src/main/java/tools/refinery/store/dse/propagation/impl/PropagationStoreAdapterImpl.java +++ b/subprojects/store-dse/src/main/java/tools/refinery/store/dse/propagation/impl/PropagationStoreAdapterImpl.java | |||
@@ -13,13 +13,17 @@ import tools.refinery.store.model.ModelStore; | |||
13 | 13 | ||
14 | import java.util.List; | 14 | import java.util.List; |
15 | 15 | ||
16 | // This should not be a record, because we don't want auto-generated {@code equals} and {@code hashCode} methods. | ||
17 | @SuppressWarnings("ClassCanBeRecord") | ||
16 | class PropagationStoreAdapterImpl implements PropagationStoreAdapter { | 18 | class PropagationStoreAdapterImpl implements PropagationStoreAdapter { |
17 | private final ModelStore store; | 19 | private final ModelStore store; |
18 | private final List<Propagator> propagators; | 20 | private final List<Propagator> propagators; |
21 | private final boolean throwOnFatalRejection; | ||
19 | 22 | ||
20 | PropagationStoreAdapterImpl(ModelStore store, List<Propagator> propagators) { | 23 | PropagationStoreAdapterImpl(ModelStore store, List<Propagator> propagators, boolean throwOnFatalRejection) { |
21 | this.store = store; | 24 | this.store = store; |
22 | this.propagators = propagators; | 25 | this.propagators = propagators; |
26 | this.throwOnFatalRejection = throwOnFatalRejection; | ||
23 | } | 27 | } |
24 | 28 | ||
25 | @Override | 29 | @Override |
@@ -35,4 +39,8 @@ class PropagationStoreAdapterImpl implements PropagationStoreAdapter { | |||
35 | List<Propagator> getPropagators() { | 39 | List<Propagator> getPropagators() { |
36 | return propagators; | 40 | return propagators; |
37 | } | 41 | } |
42 | |||
43 | boolean isThrowOnFatalRejection() { | ||
44 | return throwOnFatalRejection; | ||
45 | } | ||
38 | } | 46 | } |
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 { | |||
44 | 44 | ||
45 | public PropagationResult fireAll() { | 45 | public PropagationResult fireAll() { |
46 | if (!firedActivations.isEmpty()) { | 46 | if (!firedActivations.isEmpty()) { |
47 | throw new IllegalStateException("Stuck propagation rule '%s'.".formatted(rule.getName())); | 47 | return new PropagationRejectedResult(rule, "Propagation rule '%s' got stuck.".formatted(rule.getName()), |
48 | true); | ||
48 | } | 49 | } |
49 | if (resultSet.size() == 0) { | 50 | if (resultSet.size() == 0) { |
50 | return PropagationResult.UNCHANGED; | 51 | return PropagationResult.UNCHANGED; |