aboutsummaryrefslogtreecommitdiffstats
path: root/subprojects/language-web
diff options
context:
space:
mode:
Diffstat (limited to 'subprojects/language-web')
-rw-r--r--subprojects/language-web/build.gradle.kts18
-rw-r--r--subprojects/language-web/src/main/java/tools/refinery/language/web/generator/ModelGenerationWorker.java7
-rw-r--r--subprojects/language-web/src/main/java/tools/refinery/language/web/semantics/SemanticsWorker.java5
-rw-r--r--subprojects/language-web/src/main/java/tools/refinery/language/web/semantics/metadata/BasePredicateDetail.java10
-rw-r--r--subprojects/language-web/src/main/java/tools/refinery/language/web/semantics/metadata/MetadataCreator.java5
-rw-r--r--subprojects/language-web/src/main/java/tools/refinery/language/web/semantics/metadata/RelationDetail.java2
-rw-r--r--subprojects/language-web/src/main/java/tools/refinery/language/web/xtext/servlet/XtextWebSocket.java3
-rw-r--r--subprojects/language-web/src/test/java/tools/refinery/language/web/tests/AwaitTerminationExecutorServiceProvider.java9
-rw-r--r--subprojects/language-web/src/test/java/tools/refinery/language/web/tests/RestartableCachedThreadPool.java60
-rw-r--r--subprojects/language-web/src/test/java/tools/refinery/language/web/tests/WebSocketIntegrationTestClient.java2
10 files changed, 66 insertions, 55 deletions
diff --git a/subprojects/language-web/build.gradle.kts b/subprojects/language-web/build.gradle.kts
index 73e80b1d..bcc10030 100644
--- a/subprojects/language-web/build.gradle.kts
+++ b/subprojects/language-web/build.gradle.kts
@@ -9,10 +9,6 @@ plugins {
9 id("tools.refinery.gradle.xtext-generated") 9 id("tools.refinery.gradle.xtext-generated")
10} 10}
11 11
12mavenArtifact {
13 description = "Cloud-based partial modeling environment"
14}
15
16val webapp: Configuration by configurations.creating { 12val webapp: Configuration by configurations.creating {
17 isCanBeConsumed = false 13 isCanBeConsumed = false
18 isCanBeResolved = true 14 isCanBeResolved = true
@@ -28,7 +24,7 @@ dependencies {
28 implementation(libs.jetty.servlet) 24 implementation(libs.jetty.servlet)
29 implementation(libs.jetty.websocket.api) 25 implementation(libs.jetty.websocket.api)
30 implementation(libs.jetty.websocket.server) 26 implementation(libs.jetty.websocket.server)
31 implementation(libs.slf4j.api) 27 implementation(libs.slf4j)
32 implementation(libs.xtext.web) 28 implementation(libs.xtext.web)
33 xtextGenerated(project(":refinery-language", "generatedWebSources")) 29 xtextGenerated(project(":refinery-language", "generatedWebSources"))
34 webapp(project(":refinery-frontend", "productionAssets")) 30 webapp(project(":refinery-frontend", "productionAssets"))
@@ -48,18 +44,6 @@ tasks {
48 } 44 }
49 } 45 }
50 46
51 shadowJar {
52 dependsOn(webapp)
53 from(project.sourceSets.main.map { it.output })
54 exclude("META-INF/INDEX.LIST", "META-INF/*.SF", "META-INF/*.DSA", "META-INF/*.RSA", "schema/*",
55 ".options", ".api_description", "*.profile", "about.*", "about_*.html", "about_files/*",
56 "plugin.xml", "systembundle.properties", "profile.list", "META-INF/resources/xtext/**")
57 append("plugin.properties")
58 from(webapp) {
59 into("webapp")
60 }
61 }
62
63 register<JavaExec>("serve") { 47 register<JavaExec>("serve") {
64 dependsOn(webapp) 48 dependsOn(webapp)
65 val mainRuntimeClasspath = sourceSets.main.map { it.runtimeClasspath } 49 val mainRuntimeClasspath = sourceSets.main.map { it.runtimeClasspath }
diff --git a/subprojects/language-web/src/main/java/tools/refinery/language/web/generator/ModelGenerationWorker.java b/subprojects/language-web/src/main/java/tools/refinery/language/web/generator/ModelGenerationWorker.java
index 7febce7d..e7facbf7 100644
--- a/subprojects/language-web/src/main/java/tools/refinery/language/web/generator/ModelGenerationWorker.java
+++ b/subprojects/language-web/src/main/java/tools/refinery/language/web/generator/ModelGenerationWorker.java
@@ -9,11 +9,8 @@ import com.google.inject.Inject;
9import org.eclipse.xtext.service.OperationCanceledManager; 9import org.eclipse.xtext.service.OperationCanceledManager;
10import org.slf4j.Logger; 10import org.slf4j.Logger;
11import org.slf4j.LoggerFactory; 11import org.slf4j.LoggerFactory;
12import tools.refinery.generator.ModelGenerator; 12import tools.refinery.generator.*;
13import tools.refinery.generator.ModelGeneratorFactory;
14import tools.refinery.language.web.semantics.metadata.MetadataCreator; 13import tools.refinery.language.web.semantics.metadata.MetadataCreator;
15import tools.refinery.generator.ProblemLoader;
16import tools.refinery.generator.ValidationErrorsException;
17import tools.refinery.language.web.semantics.PartialInterpretation2Json; 14import tools.refinery.language.web.semantics.PartialInterpretation2Json;
18import tools.refinery.language.web.xtext.server.ThreadPoolExecutorServiceProvider; 15import tools.refinery.language.web.xtext.server.ThreadPoolExecutorServiceProvider;
19import tools.refinery.language.web.xtext.server.push.PushWebDocument; 16import tools.refinery.language.web.xtext.server.push.PushWebDocument;
@@ -149,7 +146,7 @@ public class ModelGenerationWorker implements Runnable {
149 } 146 }
150 notifyResult(new ModelGenerationStatusResult(uuid, "Generating model")); 147 notifyResult(new ModelGenerationStatusResult(uuid, "Generating model"));
151 generator.setRandomSeed(randomSeed); 148 generator.setRandomSeed(randomSeed);
152 if (!generator.tryGenerate()) { 149 if (generator.tryGenerate() != GeneratorResult.SUCCESS) {
153 return new ModelGenerationErrorResult(uuid, "Problem is unsatisfiable"); 150 return new ModelGenerationErrorResult(uuid, "Problem is unsatisfiable");
154 } 151 }
155 notifyResult(new ModelGenerationStatusResult(uuid, "Saving generated model")); 152 notifyResult(new ModelGenerationStatusResult(uuid, "Saving generated model"));
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
index a96b68f9..508e716e 100644
--- 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
@@ -72,7 +72,10 @@ class SemanticsWorker implements Callable<SemanticsResult> {
72 cancellationToken.checkCancelled(); 72 cancellationToken.checkCancelled();
73 ModelSemantics semantics; 73 ModelSemantics semantics;
74 try { 74 try {
75 semantics = semanticsFactory.cancellationToken(cancellationToken).tryCreateSemantics(problem); 75 semantics = semanticsFactory
76 .cancellationToken(cancellationToken)
77 .keepNonExistingObjects(true)
78 .tryCreateSemantics(problem);
76 } catch (TranslationException e) { 79 } catch (TranslationException e) {
77 return new SemanticsResult(e.getMessage()); 80 return new SemanticsResult(e.getMessage());
78 } catch (TracedException e) { 81 } catch (TracedException e) {
diff --git a/subprojects/language-web/src/main/java/tools/refinery/language/web/semantics/metadata/BasePredicateDetail.java b/subprojects/language-web/src/main/java/tools/refinery/language/web/semantics/metadata/BasePredicateDetail.java
new file mode 100644
index 00000000..6ffaf267
--- /dev/null
+++ b/subprojects/language-web/src/main/java/tools/refinery/language/web/semantics/metadata/BasePredicateDetail.java
@@ -0,0 +1,10 @@
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.metadata;
7
8public record BasePredicateDetail() implements RelationDetail {
9 public static final BasePredicateDetail INSTANCE = new BasePredicateDetail();
10}
diff --git a/subprojects/language-web/src/main/java/tools/refinery/language/web/semantics/metadata/MetadataCreator.java b/subprojects/language-web/src/main/java/tools/refinery/language/web/semantics/metadata/MetadataCreator.java
index 29f8ab8b..11f0a228 100644
--- a/subprojects/language-web/src/main/java/tools/refinery/language/web/semantics/metadata/MetadataCreator.java
+++ b/subprojects/language-web/src/main/java/tools/refinery/language/web/semantics/metadata/MetadataCreator.java
@@ -156,7 +156,10 @@ public class MetadataCreator {
156 } 156 }
157 157
158 private RelationDetail getPredicateDetail(PredicateDefinition predicate) { 158 private RelationDetail getPredicateDetail(PredicateDefinition predicate) {
159 return PredicateDetail.ofError(predicate.isError()); 159 if (ProblemUtil.isBasePredicate(predicate)) {
160 return BasePredicateDetail.INSTANCE;
161 }
162 return PredicateDetail.ofError(predicate.getKind() == PredicateKind.ERROR);
160 } 163 }
161 164
162 private QualifiedName getQualifiedName(EObject eObject) { 165 private QualifiedName getQualifiedName(EObject eObject) {
diff --git a/subprojects/language-web/src/main/java/tools/refinery/language/web/semantics/metadata/RelationDetail.java b/subprojects/language-web/src/main/java/tools/refinery/language/web/semantics/metadata/RelationDetail.java
index bbe563cd..00177858 100644
--- a/subprojects/language-web/src/main/java/tools/refinery/language/web/semantics/metadata/RelationDetail.java
+++ b/subprojects/language-web/src/main/java/tools/refinery/language/web/semantics/metadata/RelationDetail.java
@@ -6,5 +6,5 @@
6package tools.refinery.language.web.semantics.metadata; 6package tools.refinery.language.web.semantics.metadata;
7 7
8public sealed interface RelationDetail permits ClassDetail, ReferenceDetail, PredicateDetail, OppositeReferenceDetail, 8public sealed interface RelationDetail permits ClassDetail, ReferenceDetail, PredicateDetail, OppositeReferenceDetail,
9 BuiltInDetail { 9 BuiltInDetail, BasePredicateDetail {
10} 10}
diff --git a/subprojects/language-web/src/main/java/tools/refinery/language/web/xtext/servlet/XtextWebSocket.java b/subprojects/language-web/src/main/java/tools/refinery/language/web/xtext/servlet/XtextWebSocket.java
index 818bd80e..13ae1221 100644
--- a/subprojects/language-web/src/main/java/tools/refinery/language/web/xtext/servlet/XtextWebSocket.java
+++ b/subprojects/language-web/src/main/java/tools/refinery/language/web/xtext/servlet/XtextWebSocket.java
@@ -37,7 +37,8 @@ public class XtextWebSocket implements ResponseHandler {
37 .registerSubtype(ReferenceDetail.class, "reference") 37 .registerSubtype(ReferenceDetail.class, "reference")
38 .registerSubtype(OppositeReferenceDetail.class, "opposite") 38 .registerSubtype(OppositeReferenceDetail.class, "opposite")
39 .registerSubtype(PredicateDetail.class, "predicate") 39 .registerSubtype(PredicateDetail.class, "predicate")
40 .registerSubtype(BuiltInDetail.class, "builtin")) 40 .registerSubtype(BuiltInDetail.class, "builtin")
41 .registerSubtype(BasePredicateDetail.class, "base"))
41 .create(); 42 .create();
42 43
43 private final TransactionExecutor executor; 44 private final TransactionExecutor executor;
diff --git a/subprojects/language-web/src/test/java/tools/refinery/language/web/tests/AwaitTerminationExecutorServiceProvider.java b/subprojects/language-web/src/test/java/tools/refinery/language/web/tests/AwaitTerminationExecutorServiceProvider.java
index 52acee6d..fe4952a9 100644
--- a/subprojects/language-web/src/test/java/tools/refinery/language/web/tests/AwaitTerminationExecutorServiceProvider.java
+++ b/subprojects/language-web/src/test/java/tools/refinery/language/web/tests/AwaitTerminationExecutorServiceProvider.java
@@ -17,6 +17,13 @@ public class AwaitTerminationExecutorServiceProvider extends ExecutorServiceProv
17 private final List<RestartableCachedThreadPool> servicesToShutDown = new ArrayList<>(); 17 private final List<RestartableCachedThreadPool> servicesToShutDown = new ArrayList<>();
18 18
19 @Override 19 @Override
20 public ExecutorService get(String key) {
21 synchronized (servicesToShutDown) {
22 return super.get(key);
23 }
24 }
25
26 @Override
20 protected ExecutorService createInstance(String key) { 27 protected ExecutorService createInstance(String key) {
21 var instance = new RestartableCachedThreadPool(() -> super.createInstance(key)); 28 var instance = new RestartableCachedThreadPool(() -> super.createInstance(key));
22 synchronized (servicesToShutDown) { 29 synchronized (servicesToShutDown) {
@@ -35,8 +42,8 @@ public class AwaitTerminationExecutorServiceProvider extends ExecutorServiceProv
35 42
36 @Override 43 @Override
37 public void dispose() { 44 public void dispose() {
38 super.dispose();
39 synchronized (servicesToShutDown) { 45 synchronized (servicesToShutDown) {
46 super.dispose();
40 for (var executorService : servicesToShutDown) { 47 for (var executorService : servicesToShutDown) {
41 executorService.waitForTermination(); 48 executorService.waitForTermination();
42 } 49 }
diff --git a/subprojects/language-web/src/test/java/tools/refinery/language/web/tests/RestartableCachedThreadPool.java b/subprojects/language-web/src/test/java/tools/refinery/language/web/tests/RestartableCachedThreadPool.java
index 991ff114..4d55e548 100644
--- a/subprojects/language-web/src/test/java/tools/refinery/language/web/tests/RestartableCachedThreadPool.java
+++ b/subprojects/language-web/src/test/java/tools/refinery/language/web/tests/RestartableCachedThreadPool.java
@@ -13,29 +13,34 @@ import org.slf4j.LoggerFactory;
13import java.util.Collection; 13import java.util.Collection;
14import java.util.List; 14import java.util.List;
15import java.util.concurrent.*; 15import java.util.concurrent.*;
16import java.util.concurrent.atomic.AtomicReference;
16 17
17public class RestartableCachedThreadPool implements ExecutorService { 18public class RestartableCachedThreadPool implements ExecutorService {
18 private static final Logger LOG = LoggerFactory.getLogger(RestartableCachedThreadPool.class); 19 private static final Logger LOG = LoggerFactory.getLogger(RestartableCachedThreadPool.class);
19 20
20 private ExecutorService delegate; 21 private final AtomicReference<ExecutorService> delegate = new AtomicReference<>();
21 22
22 private final Provider<ExecutorService> executorServiceProvider; 23 private final Provider<ExecutorService> executorServiceProvider;
23 24
24 public RestartableCachedThreadPool(Provider<ExecutorService> executorServiceProvider) { 25 public RestartableCachedThreadPool(Provider<ExecutorService> executorServiceProvider) {
25 this.executorServiceProvider = executorServiceProvider; 26 this.executorServiceProvider = executorServiceProvider;
26 delegate = executorServiceProvider.get(); 27 delegate.set(executorServiceProvider.get());
27 } 28 }
28 29
29 public void waitForAllTasksToFinish() { 30 public void waitForAllTasksToFinish() {
30 delegate.shutdown(); 31 var oldDelegate = delegate.getAndSet(executorServiceProvider.get());
31 waitForTermination(); 32 oldDelegate.shutdown();
32 delegate = executorServiceProvider.get(); 33 waitForTermination(oldDelegate);
33 } 34 }
34 35
35 public void waitForTermination() { 36 public void waitForTermination() {
37 waitForTermination(delegate.get());
38 }
39
40 private static void waitForTermination(ExecutorService executorService) {
36 boolean result = false; 41 boolean result = false;
37 try { 42 try {
38 result = delegate.awaitTermination(10, TimeUnit.SECONDS); 43 result = executorService.awaitTermination(10, TimeUnit.SECONDS);
39 } catch (InterruptedException e) { 44 } catch (InterruptedException e) {
40 LOG.warn("Interrupted while waiting for delegate executor to stop", e); 45 LOG.warn("Interrupted while waiting for delegate executor to stop", e);
41 } 46 }
@@ -46,70 +51,71 @@ public class RestartableCachedThreadPool implements ExecutorService {
46 51
47 @Override 52 @Override
48 public boolean awaitTermination(long arg0, @NotNull TimeUnit arg1) throws InterruptedException { 53 public boolean awaitTermination(long arg0, @NotNull TimeUnit arg1) throws InterruptedException {
49 return delegate.awaitTermination(arg0, arg1); 54 return delegate.get().awaitTermination(arg0, arg1);
50 } 55 }
51 56
52 @Override 57 @Override
53 public void execute(@NotNull Runnable arg0) { 58 public void execute(@NotNull Runnable arg0) {
54 delegate.execute(arg0); 59 delegate.get().execute(arg0);
55 } 60 }
56 61
57 @Override 62 @Override
58 public <T> List<Future<T>> invokeAll(@NotNull Collection<? extends Callable<T>> arg0, long arg1, 63 public <T> @NotNull List<Future<T>> invokeAll(@NotNull Collection<? extends Callable<T>> arg0, long arg1,
59 @NotNull TimeUnit arg2) 64 @NotNull TimeUnit arg2)
60 throws InterruptedException { 65 throws InterruptedException {
61 return delegate.invokeAll(arg0, arg1, arg2); 66 return delegate.get().invokeAll(arg0, arg1, arg2);
62 } 67 }
63 68
64 @Override 69 @Override
65 public <T> List<Future<T>> invokeAll(@NotNull Collection<? extends Callable<T>> arg0) throws InterruptedException { 70 public <T> @NotNull List<Future<T>> invokeAll(@NotNull Collection<? extends Callable<T>> arg0)
66 return delegate.invokeAll(arg0); 71 throws InterruptedException {
72 return delegate.get().invokeAll(arg0);
67 } 73 }
68 74
69 @Override 75 @Override
70 public <T> T invokeAny(@NotNull Collection<? extends Callable<T>> arg0, long arg1, @NotNull TimeUnit arg2) 76 public <T> T invokeAny(@NotNull Collection<? extends Callable<T>> arg0, long arg1, @NotNull TimeUnit arg2)
71 throws InterruptedException, ExecutionException, TimeoutException { 77 throws InterruptedException, ExecutionException, TimeoutException {
72 return delegate.invokeAny(arg0, arg1, arg2); 78 return delegate.get().invokeAny(arg0, arg1, arg2);
73 } 79 }
74 80
75 @Override 81 @Override
76 public <T> T invokeAny(@NotNull Collection<? extends Callable<T>> arg0) throws InterruptedException, 82 public <T> @NotNull T invokeAny(@NotNull Collection<? extends Callable<T>> arg0) throws InterruptedException,
77 ExecutionException { 83 ExecutionException {
78 return delegate.invokeAny(arg0); 84 return delegate.get().invokeAny(arg0);
79 } 85 }
80 86
81 @Override 87 @Override
82 public boolean isShutdown() { 88 public boolean isShutdown() {
83 return delegate.isShutdown(); 89 return delegate.get().isShutdown();
84 } 90 }
85 91
86 @Override 92 @Override
87 public boolean isTerminated() { 93 public boolean isTerminated() {
88 return delegate.isTerminated(); 94 return delegate.get().isTerminated();
89 } 95 }
90 96
91 @Override 97 @Override
92 public void shutdown() { 98 public void shutdown() {
93 delegate.shutdown(); 99 delegate.get().shutdown();
94 } 100 }
95 101
96 @Override 102 @Override
97 public List<Runnable> shutdownNow() { 103 public @NotNull List<Runnable> shutdownNow() {
98 return delegate.shutdownNow(); 104 return delegate.get().shutdownNow();
99 } 105 }
100 106
101 @Override 107 @Override
102 public <T> Future<T> submit(@NotNull Callable<T> arg0) { 108 public <T> @NotNull Future<T> submit(@NotNull Callable<T> arg0) {
103 return delegate.submit(arg0); 109 return delegate.get().submit(arg0);
104 } 110 }
105 111
106 @Override 112 @Override
107 public <T> Future<T> submit(@NotNull Runnable arg0, T arg1) { 113 public <T> @NotNull Future<T> submit(@NotNull Runnable arg0, T arg1) {
108 return delegate.submit(arg0, arg1); 114 return delegate.get().submit(arg0, arg1);
109 } 115 }
110 116
111 @Override 117 @Override
112 public Future<?> submit(@NotNull Runnable arg0) { 118 public @NotNull Future<?> submit(@NotNull Runnable arg0) {
113 return delegate.submit(arg0); 119 return delegate.get().submit(arg0);
114 } 120 }
115} 121}
diff --git a/subprojects/language-web/src/test/java/tools/refinery/language/web/tests/WebSocketIntegrationTestClient.java b/subprojects/language-web/src/test/java/tools/refinery/language/web/tests/WebSocketIntegrationTestClient.java
index d45a9d6b..6ccf1760 100644
--- a/subprojects/language-web/src/test/java/tools/refinery/language/web/tests/WebSocketIntegrationTestClient.java
+++ b/subprojects/language-web/src/test/java/tools/refinery/language/web/tests/WebSocketIntegrationTestClient.java
@@ -18,7 +18,7 @@ import java.util.List;
18import static org.junit.jupiter.api.Assertions.fail; 18import static org.junit.jupiter.api.Assertions.fail;
19 19
20public abstract class WebSocketIntegrationTestClient { 20public abstract class WebSocketIntegrationTestClient {
21 private static final long TIMEOUT_MILLIS = Duration.ofSeconds(30).toMillis(); 21 private static final long TIMEOUT_MILLIS = Duration.ofSeconds(10).toMillis();
22 22
23 private boolean finished = false; 23 private boolean finished = false;
24 24