aboutsummaryrefslogtreecommitdiffstats
path: root/subprojects/language-web/src/main/java/tools/refinery/language/web/generator/ModelGenerationService.java
diff options
context:
space:
mode:
Diffstat (limited to 'subprojects/language-web/src/main/java/tools/refinery/language/web/generator/ModelGenerationService.java')
-rw-r--r--subprojects/language-web/src/main/java/tools/refinery/language/web/generator/ModelGenerationService.java60
1 files changed, 60 insertions, 0 deletions
diff --git a/subprojects/language-web/src/main/java/tools/refinery/language/web/generator/ModelGenerationService.java b/subprojects/language-web/src/main/java/tools/refinery/language/web/generator/ModelGenerationService.java
new file mode 100644
index 00000000..9f72e462
--- /dev/null
+++ b/subprojects/language-web/src/main/java/tools/refinery/language/web/generator/ModelGenerationService.java
@@ -0,0 +1,60 @@
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.generator;
7
8import com.google.inject.Inject;
9import com.google.inject.Provider;
10import com.google.inject.Singleton;
11import org.eclipse.xtext.service.OperationCanceledManager;
12import org.eclipse.xtext.util.CancelIndicator;
13import org.eclipse.xtext.util.concurrent.CancelableUnitOfWork;
14import org.eclipse.xtext.web.server.model.IXtextWebDocument;
15import tools.refinery.language.web.semantics.SemanticsService;
16import tools.refinery.language.web.xtext.server.push.PushWebDocument;
17import tools.refinery.language.web.xtext.server.push.PushWebDocumentAccess;
18
19@Singleton
20public class ModelGenerationService {
21 public static final String SERVICE_NAME = "modelGeneration";
22 public static final String MODEL_GENERATION_EXECUTOR = "modelGeneration";
23 public static final String MODEL_GENERATION_TIMEOUT_EXECUTOR = "modelGenerationTimeout";
24
25 @Inject
26 private OperationCanceledManager operationCanceledManager;
27
28 @Inject
29 private Provider<ModelGenerationWorker> workerProvider;
30
31 private final long timeoutSec;
32
33 public ModelGenerationService() {
34 timeoutSec = SemanticsService.getTimeout("REFINERY_MODEL_GENERATION_TIMEOUT_SEC").orElse(600L);
35 }
36
37 public ModelGenerationStartedResult generateModel(PushWebDocumentAccess document, int randomSeed) {
38 return document.modify(new CancelableUnitOfWork<>() {
39 @Override
40 public ModelGenerationStartedResult exec(IXtextWebDocument state, CancelIndicator cancelIndicator) {
41 var pushState = (PushWebDocument) state;
42 var worker = workerProvider.get();
43 worker.setState(pushState, randomSeed, timeoutSec);
44 var manager = pushState.getModelGenerationManager();
45 worker.start();
46 boolean canceled = manager.setActiveModelGenerationWorker(worker, cancelIndicator);
47 if (canceled) {
48 worker.cancel();
49 operationCanceledManager.throwOperationCanceledException();
50 }
51 return new ModelGenerationStartedResult(worker.getUuid());
52 }
53 });
54 }
55
56 public ModelGenerationCancelledResult cancelModelGeneration(PushWebDocumentAccess document) {
57 document.cancelModelGeneration();
58 return new ModelGenerationCancelledResult();
59 }
60}