aboutsummaryrefslogtreecommitdiffstats
path: root/subprojects/language/src/main/java/tools/refinery/language/resource/state/ProblemDerivedStateComputer.java
diff options
context:
space:
mode:
Diffstat (limited to 'subprojects/language/src/main/java/tools/refinery/language/resource/state/ProblemDerivedStateComputer.java')
-rw-r--r--subprojects/language/src/main/java/tools/refinery/language/resource/state/ProblemDerivedStateComputer.java49
1 files changed, 45 insertions, 4 deletions
diff --git a/subprojects/language/src/main/java/tools/refinery/language/resource/state/ProblemDerivedStateComputer.java b/subprojects/language/src/main/java/tools/refinery/language/resource/state/ProblemDerivedStateComputer.java
index efa77c50..44f55563 100644
--- a/subprojects/language/src/main/java/tools/refinery/language/resource/state/ProblemDerivedStateComputer.java
+++ b/subprojects/language/src/main/java/tools/refinery/language/resource/state/ProblemDerivedStateComputer.java
@@ -22,6 +22,7 @@ import tools.refinery.language.utils.ProblemUtil;
22 22
23import java.util.*; 23import java.util.*;
24import java.util.function.Function; 24import java.util.function.Function;
25import java.util.function.UnaryOperator;
25 26
26@Singleton 27@Singleton
27public class ProblemDerivedStateComputer implements IDerivedStateComputer { 28public class ProblemDerivedStateComputer implements IDerivedStateComputer {
@@ -59,7 +60,7 @@ public class ProblemDerivedStateComputer implements IDerivedStateComputer {
59 } 60 }
60 61
61 protected void installDerivedProblemState(Problem problem, Adapter adapter, boolean preLinkingPhase) { 62 protected void installDerivedProblemState(Problem problem, Adapter adapter, boolean preLinkingPhase) {
62 installDerivedClassDeclarationState(problem, adapter); 63 installDerivedDeclarationState(problem, adapter);
63 if (preLinkingPhase) { 64 if (preLinkingPhase) {
64 return; 65 return;
65 } 66 }
@@ -67,13 +68,15 @@ public class ProblemDerivedStateComputer implements IDerivedStateComputer {
67 derivedVariableComputer.installDerivedVariables(problem, nodeNames); 68 derivedVariableComputer.installDerivedVariables(problem, nodeNames);
68 } 69 }
69 70
70 protected void installDerivedClassDeclarationState(Problem problem, Adapter adapter) { 71 protected void installDerivedDeclarationState(Problem problem, Adapter adapter) {
71 for (var statement : problem.getStatements()) { 72 for (var statement : problem.getStatements()) {
72 if (statement instanceof ClassDeclaration classDeclaration) { 73 if (statement instanceof ClassDeclaration classDeclaration) {
73 installOrRemoveNewNode(adapter, classDeclaration); 74 installOrRemoveNewNode(adapter, classDeclaration);
74 for (var referenceDeclaration : classDeclaration.getFeatureDeclarations()) { 75 for (var referenceDeclaration : classDeclaration.getFeatureDeclarations()) {
75 installOrRemoveInvalidMultiplicityPredicate(adapter, classDeclaration, referenceDeclaration); 76 installOrRemoveInvalidMultiplicityPredicate(adapter, classDeclaration, referenceDeclaration);
76 } 77 }
78 } else if (statement instanceof PredicateDefinition predicateDefinition) {
79 installOrRemoveComputedValuePredicate(adapter, predicateDefinition);
77 } 80 }
78 } 81 }
79 } 82 }
@@ -118,6 +121,27 @@ public class ProblemDerivedStateComputer implements IDerivedStateComputer {
118 } 121 }
119 } 122 }
120 123
124 protected void installOrRemoveComputedValuePredicate(Adapter adapter, PredicateDefinition predicateDefinition) {
125 if (ProblemUtil.hasComputedValue(predicateDefinition)) {
126 var computedValue = adapter.createComputedValuePredicateIfAbsent(predicateDefinition, key -> {
127 var predicate = ProblemFactory.eINSTANCE.createPredicateDefinition();
128 predicate.setShadow(true);
129 predicate.setName("computed");
130 return predicate;
131 });
132 var parameters = computedValue.getParameters();
133 parameters.clear();
134 parameters.addAll(EcoreUtil.copyAll(predicateDefinition.getParameters()));
135 predicateDefinition.setComputedValue(computedValue);
136 } else {
137 var computedValue = predicateDefinition.getComputedValue();
138 if (computedValue != null) {
139 predicateDefinition.setComputedValue(null);
140 adapter.removeComputedValuePredicate(computedValue);
141 }
142 }
143 }
144
121 protected Set<String> installDerivedNodes(Problem problem) { 145 protected Set<String> installDerivedNodes(Problem problem) {
122 var collector = nodeNameCollectorProvider.get(); 146 var collector = nodeNameCollectorProvider.get();
123 collector.collectNodeNames(problem); 147 collector.collectNodeNames(problem);
@@ -148,6 +172,7 @@ public class ProblemDerivedStateComputer implements IDerivedStateComputer {
148 protected void discardDerivedProblemState(Problem problem, Adapter adapter) { 172 protected void discardDerivedProblemState(Problem problem, Adapter adapter) {
149 var abstractClassDeclarations = new HashSet<ClassDeclaration>(); 173 var abstractClassDeclarations = new HashSet<ClassDeclaration>();
150 var referenceDeclarationsWithMultiplicity = new HashSet<ReferenceDeclaration>(); 174 var referenceDeclarationsWithMultiplicity = new HashSet<ReferenceDeclaration>();
175 var predicateDefinitionsWithComputedValue = new HashSet<PredicateDefinition>();
151 problem.getNodes().clear(); 176 problem.getNodes().clear();
152 for (var statement : problem.getStatements()) { 177 for (var statement : problem.getStatements()) {
153 if (statement instanceof ClassDeclaration classDeclaration) { 178 if (statement instanceof ClassDeclaration classDeclaration) {
@@ -160,9 +185,13 @@ public class ProblemDerivedStateComputer implements IDerivedStateComputer {
160 referenceDeclarationsWithMultiplicity.add(referenceDeclaration); 185 referenceDeclarationsWithMultiplicity.add(referenceDeclaration);
161 } 186 }
162 } 187 }
188 } else if (statement instanceof PredicateDefinition predicateDefinition &&
189 ProblemUtil.hasComputedValue(predicateDefinition)) {
190 predicateDefinitionsWithComputedValue.add(predicateDefinition);
163 } 191 }
164 } 192 }
165 adapter.retainAll(abstractClassDeclarations, referenceDeclarationsWithMultiplicity); 193 adapter.retainAll(abstractClassDeclarations, referenceDeclarationsWithMultiplicity,
194 predicateDefinitionsWithComputedValue);
166 derivedVariableComputer.discardDerivedVariables(problem); 195 derivedVariableComputer.discardDerivedVariables(problem);
167 } 196 }
168 197
@@ -185,6 +214,7 @@ public class ProblemDerivedStateComputer implements IDerivedStateComputer {
185 protected static class Adapter extends AdapterImpl { 214 protected static class Adapter extends AdapterImpl {
186 private final Map<ClassDeclaration, Node> newNodes = new HashMap<>(); 215 private final Map<ClassDeclaration, Node> newNodes = new HashMap<>();
187 private final Map<ReferenceDeclaration, PredicateDefinition> invalidMultiplicityPredicates = new HashMap<>(); 216 private final Map<ReferenceDeclaration, PredicateDefinition> invalidMultiplicityPredicates = new HashMap<>();
217 private final Map<PredicateDefinition, PredicateDefinition> computedValuePredicates = new HashMap<>();
188 218
189 public Node createNewNodeIfAbsent(ClassDeclaration classDeclaration, 219 public Node createNewNodeIfAbsent(ClassDeclaration classDeclaration,
190 Function<ClassDeclaration, Node> createNode) { 220 Function<ClassDeclaration, Node> createNode) {
@@ -205,10 +235,21 @@ public class ProblemDerivedStateComputer implements IDerivedStateComputer {
205 invalidMultiplicityPredicates.remove(referenceDeclaration); 235 invalidMultiplicityPredicates.remove(referenceDeclaration);
206 } 236 }
207 237
238 public PredicateDefinition createComputedValuePredicateIfAbsent(
239 PredicateDefinition predicateDefinition, UnaryOperator<PredicateDefinition> createPredicate) {
240 return computedValuePredicates.computeIfAbsent(predicateDefinition, createPredicate);
241 }
242
243 public void removeComputedValuePredicate(PredicateDefinition predicateDefinition) {
244 computedValuePredicates.remove(predicateDefinition);
245 }
246
208 public void retainAll(Collection<ClassDeclaration> abstractClassDeclarations, 247 public void retainAll(Collection<ClassDeclaration> abstractClassDeclarations,
209 Collection<ReferenceDeclaration> referenceDeclarationsWithMultiplicity) { 248 Collection<ReferenceDeclaration> referenceDeclarationsWithMultiplicity,
249 Collection<PredicateDefinition> predicateDefinitionsWithComputedValue) {
210 newNodes.keySet().retainAll(abstractClassDeclarations); 250 newNodes.keySet().retainAll(abstractClassDeclarations);
211 invalidMultiplicityPredicates.keySet().retainAll(referenceDeclarationsWithMultiplicity); 251 invalidMultiplicityPredicates.keySet().retainAll(referenceDeclarationsWithMultiplicity);
252 computedValuePredicates.keySet().retainAll(predicateDefinitionsWithComputedValue);
212 } 253 }
213 254
214 @Override 255 @Override