diff options
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.java | 113 |
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 | */ | ||
6 | package tools.refinery.language.web.semantics; | ||
7 | |||
8 | import com.google.inject.Inject; | ||
9 | import org.eclipse.emf.common.util.Diagnostic; | ||
10 | import org.eclipse.emf.ecore.EObject; | ||
11 | import org.eclipse.xtext.service.OperationCanceledManager; | ||
12 | import org.eclipse.xtext.util.CancelIndicator; | ||
13 | import org.eclipse.xtext.validation.CheckType; | ||
14 | import org.eclipse.xtext.validation.FeatureBasedDiagnostic; | ||
15 | import org.eclipse.xtext.validation.IDiagnosticConverter; | ||
16 | import org.eclipse.xtext.validation.Issue; | ||
17 | import org.eclipse.xtext.web.server.validation.ValidationResult; | ||
18 | import tools.refinery.language.model.problem.Problem; | ||
19 | import tools.refinery.language.semantics.metadata.MetadataCreator; | ||
20 | import tools.refinery.language.semantics.model.ModelInitializer; | ||
21 | import tools.refinery.language.semantics.model.TracedException; | ||
22 | import tools.refinery.store.dse.propagation.PropagationAdapter; | ||
23 | import tools.refinery.store.model.ModelStore; | ||
24 | import tools.refinery.store.query.viatra.ViatraModelQueryAdapter; | ||
25 | import tools.refinery.store.reasoning.ReasoningAdapter; | ||
26 | import tools.refinery.store.reasoning.ReasoningStoreAdapter; | ||
27 | import tools.refinery.store.reasoning.literal.Concreteness; | ||
28 | import tools.refinery.store.reasoning.translator.TranslationException; | ||
29 | import tools.refinery.store.util.CancellationToken; | ||
30 | |||
31 | import java.util.ArrayList; | ||
32 | import java.util.concurrent.Callable; | ||
33 | |||
34 | class 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 | } | ||