diff options
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.java | 49 |
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 | ||
23 | import java.util.*; | 23 | import java.util.*; |
24 | import java.util.function.Function; | 24 | import java.util.function.Function; |
25 | import java.util.function.UnaryOperator; | ||
25 | 26 | ||
26 | @Singleton | 27 | @Singleton |
27 | public class ProblemDerivedStateComputer implements IDerivedStateComputer { | 28 | public 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 |