aboutsummaryrefslogtreecommitdiffstats
path: root/subprojects/language-web/src/main/java/tools/refinery/language/web/semantics/SemanticsWorker.java
diff options
context:
space:
mode:
Diffstat (limited to 'subprojects/language-web/src/main/java/tools/refinery/language/web/semantics/SemanticsWorker.java')
-rw-r--r--subprojects/language-web/src/main/java/tools/refinery/language/web/semantics/SemanticsWorker.java113
1 files changed, 113 insertions, 0 deletions
diff --git a/subprojects/language-web/src/main/java/tools/refinery/language/web/semantics/SemanticsWorker.java b/subprojects/language-web/src/main/java/tools/refinery/language/web/semantics/SemanticsWorker.java
new file mode 100644
index 00000000..512c2778
--- /dev/null
+++ b/subprojects/language-web/src/main/java/tools/refinery/language/web/semantics/SemanticsWorker.java
@@ -0,0 +1,113 @@
1/*
2 * SPDX-FileCopyrightText: 2023 The Refinery Authors <https://refinery.tools/>
3 *
4 * SPDX-License-Identifier: EPL-2.0
5 */
6package tools.refinery.language.web.semantics;
7
8import com.google.inject.Inject;
9import org.eclipse.emf.common.util.Diagnostic;
10import org.eclipse.emf.ecore.EObject;
11import org.eclipse.xtext.service.OperationCanceledManager;
12import org.eclipse.xtext.util.CancelIndicator;
13import org.eclipse.xtext.validation.CheckType;
14import org.eclipse.xtext.validation.FeatureBasedDiagnostic;
15import org.eclipse.xtext.validation.IDiagnosticConverter;
16import org.eclipse.xtext.validation.Issue;
17import org.eclipse.xtext.web.server.validation.ValidationResult;
18import tools.refinery.language.model.problem.Problem;
19import tools.refinery.language.semantics.metadata.MetadataCreator;
20import tools.refinery.language.semantics.model.ModelInitializer;
21import tools.refinery.language.semantics.model.TracedException;
22import tools.refinery.store.dse.propagation.PropagationAdapter;
23import tools.refinery.store.model.ModelStore;
24import tools.refinery.store.query.viatra.ViatraModelQueryAdapter;
25import tools.refinery.store.reasoning.ReasoningAdapter;
26import tools.refinery.store.reasoning.ReasoningStoreAdapter;
27import tools.refinery.store.reasoning.literal.Concreteness;
28import tools.refinery.store.reasoning.translator.TranslationException;
29import tools.refinery.store.util.CancellationToken;
30
31import java.util.ArrayList;
32import java.util.concurrent.Callable;
33
34class SemanticsWorker implements Callable<SemanticsResult> {
35 private static final String DIAGNOSTIC_ID = "tools.refinery.language.semantics.SemanticError";
36
37 @Inject
38 private PartialInterpretation2Json partialInterpretation2Json;
39
40 @Inject
41 private OperationCanceledManager operationCanceledManager;
42
43 @Inject
44 private IDiagnosticConverter diagnosticConverter;
45
46 @Inject
47 private ModelInitializer initializer;
48
49 @Inject
50 private MetadataCreator metadataCreator;
51
52 private Problem problem;
53
54 private CancellationToken cancellationToken;
55
56 public void setProblem(Problem problem, CancelIndicator parentIndicator) {
57 this.problem = problem;
58 cancellationToken = () -> {
59 if (Thread.interrupted() || parentIndicator.isCanceled()) {
60 operationCanceledManager.throwOperationCanceledException();
61 }
62 };
63 }
64
65 @Override
66 public SemanticsResult call() {
67 var builder = ModelStore.builder()
68 .cancellationToken(cancellationToken)
69 .with(ViatraModelQueryAdapter.builder())
70 .with(PropagationAdapter.builder())
71 .with(ReasoningAdapter.builder()
72 .requiredInterpretations(Concreteness.PARTIAL));
73 cancellationToken.checkCancelled();
74 try {
75 var modelSeed = initializer.createModel(problem, builder);
76 cancellationToken.checkCancelled();
77 metadataCreator.setInitializer(initializer);
78 cancellationToken.checkCancelled();
79 var nodesMetadata = metadataCreator.getNodesMetadata();
80 cancellationToken.checkCancelled();
81 var relationsMetadata = metadataCreator.getRelationsMetadata();
82 cancellationToken.checkCancelled();
83 var store = builder.build();
84 cancellationToken.checkCancelled();
85 var model = store.getAdapter(ReasoningStoreAdapter.class).createInitialModel(modelSeed);
86 cancellationToken.checkCancelled();
87 var partialInterpretation = partialInterpretation2Json.getPartialInterpretation(initializer, model,
88 Concreteness.PARTIAL, cancellationToken);
89
90 return new SemanticsSuccessResult(nodesMetadata, relationsMetadata, partialInterpretation);
91 } catch (TracedException e) {
92 return getTracedErrorResult(e.getSourceElement(), e.getMessage());
93 } catch (TranslationException e) {
94 var sourceElement = initializer.getInverseTrace(e.getPartialSymbol());
95 return getTracedErrorResult(sourceElement, e.getMessage());
96 }
97 }
98
99 private SemanticsResult getTracedErrorResult(EObject sourceElement, String message) {
100 if (sourceElement == null || !problem.eResource().equals(sourceElement.eResource())) {
101 return new SemanticsInternalErrorResult(message);
102 }
103 var diagnostic = new FeatureBasedDiagnostic(Diagnostic.ERROR, message, sourceElement, null, 0,
104 CheckType.EXPENSIVE, DIAGNOSTIC_ID);
105 var xtextIssues = new ArrayList<Issue>();
106 diagnosticConverter.convertValidatorDiagnostic(diagnostic, xtextIssues::add);
107 var issues = xtextIssues.stream()
108 .map(issue -> new ValidationResult.Issue(issue.getMessage(), "error", issue.getLineNumber(),
109 issue.getColumn(), issue.getOffset(), issue.getLength()))
110 .toList();
111 return new SemanticsIssuesResult(issues);
112 }
113}