aboutsummaryrefslogtreecommitdiffstats
path: root/subprojects/language-web/src/main/java
diff options
context:
space:
mode:
authorLibravatar Kristóf Marussy <marussy@mit.bme.hu>2023-06-18 18:04:43 +0200
committerLibravatar GitHub <noreply@github.com>2023-06-18 18:04:43 +0200
commita0619c0fbf1fab2304ca683343803d1f37c2ef7c (patch)
tree6d6e342b019a1f3ad0baae710cf520a5dffe4b9e /subprojects/language-web/src/main/java
parentMerge pull request #24 from kris7t/partial-interpretation (diff)
parentchore(deps): bump dependencies (diff)
downloadrefinery-a0619c0fbf1fab2304ca683343803d1f37c2ef7c.tar.gz
refinery-a0619c0fbf1fab2304ca683343803d1f37c2ef7c.tar.zst
refinery-a0619c0fbf1fab2304ca683343803d1f37c2ef7c.zip
Merge pull request #26 from kris7t/query-refactor
Query refactor
Diffstat (limited to 'subprojects/language-web/src/main/java')
-rw-r--r--subprojects/language-web/src/main/java/tools/refinery/language/web/CacheControlFilter.java5
-rw-r--r--subprojects/language-web/src/main/java/tools/refinery/language/web/ProblemWebModule.java12
-rw-r--r--subprojects/language-web/src/main/java/tools/refinery/language/web/ProblemWebSetup.java6
-rw-r--r--subprojects/language-web/src/main/java/tools/refinery/language/web/ProblemWebSocketServlet.java5
-rw-r--r--subprojects/language-web/src/main/java/tools/refinery/language/web/SecurityHeadersFilter.java5
-rw-r--r--subprojects/language-web/src/main/java/tools/refinery/language/web/ServerLauncher.java12
-rw-r--r--subprojects/language-web/src/main/java/tools/refinery/language/web/VirtualThreadUtils.java52
-rw-r--r--subprojects/language-web/src/main/java/tools/refinery/language/web/config/BackendConfig.java5
-rw-r--r--subprojects/language-web/src/main/java/tools/refinery/language/web/config/BackendConfigServlet.java7
-rw-r--r--subprojects/language-web/src/main/java/tools/refinery/language/web/occurrences/ProblemOccurrencesService.java5
-rw-r--r--subprojects/language-web/src/main/java/tools/refinery/language/web/xtext/VirtualThreadExecutorServiceProvider.java16
-rw-r--r--subprojects/language-web/src/main/java/tools/refinery/language/web/xtext/server/PongResult.java5
-rw-r--r--subprojects/language-web/src/main/java/tools/refinery/language/web/xtext/server/ResponseHandler.java5
-rw-r--r--subprojects/language-web/src/main/java/tools/refinery/language/web/xtext/server/ResponseHandlerException.java5
-rw-r--r--subprojects/language-web/src/main/java/tools/refinery/language/web/xtext/server/SubscribingServiceContext.java5
-rw-r--r--subprojects/language-web/src/main/java/tools/refinery/language/web/xtext/server/TransactionExecutor.java5
-rw-r--r--subprojects/language-web/src/main/java/tools/refinery/language/web/xtext/server/message/XtextWebErrorKind.java5
-rw-r--r--subprojects/language-web/src/main/java/tools/refinery/language/web/xtext/server/message/XtextWebErrorResponse.java5
-rw-r--r--subprojects/language-web/src/main/java/tools/refinery/language/web/xtext/server/message/XtextWebOkResponse.java5
-rw-r--r--subprojects/language-web/src/main/java/tools/refinery/language/web/xtext/server/message/XtextWebPushMessage.java5
-rw-r--r--subprojects/language-web/src/main/java/tools/refinery/language/web/xtext/server/message/XtextWebRequest.java5
-rw-r--r--subprojects/language-web/src/main/java/tools/refinery/language/web/xtext/server/message/XtextWebResponse.java5
-rw-r--r--subprojects/language-web/src/main/java/tools/refinery/language/web/xtext/server/push/PrecomputationListener.java5
-rw-r--r--subprojects/language-web/src/main/java/tools/refinery/language/web/xtext/server/push/PushServiceDispatcher.java5
-rw-r--r--subprojects/language-web/src/main/java/tools/refinery/language/web/xtext/server/push/PushWebDocument.java5
-rw-r--r--subprojects/language-web/src/main/java/tools/refinery/language/web/xtext/server/push/PushWebDocumentAccess.java5
-rw-r--r--subprojects/language-web/src/main/java/tools/refinery/language/web/xtext/server/push/PushWebDocumentProvider.java5
-rw-r--r--subprojects/language-web/src/main/java/tools/refinery/language/web/xtext/servlet/SimpleServiceContext.java5
-rw-r--r--subprojects/language-web/src/main/java/tools/refinery/language/web/xtext/servlet/SimpleSession.java5
-rw-r--r--subprojects/language-web/src/main/java/tools/refinery/language/web/xtext/servlet/XtextStatusCode.java5
-rw-r--r--subprojects/language-web/src/main/java/tools/refinery/language/web/xtext/servlet/XtextWebSocket.java44
-rw-r--r--subprojects/language-web/src/main/java/tools/refinery/language/web/xtext/servlet/XtextWebSocketServlet.java5
32 files changed, 177 insertions, 97 deletions
diff --git a/subprojects/language-web/src/main/java/tools/refinery/language/web/CacheControlFilter.java b/subprojects/language-web/src/main/java/tools/refinery/language/web/CacheControlFilter.java
index fd2af1b2..53f78c3c 100644
--- a/subprojects/language-web/src/main/java/tools/refinery/language/web/CacheControlFilter.java
+++ b/subprojects/language-web/src/main/java/tools/refinery/language/web/CacheControlFilter.java
@@ -1,3 +1,8 @@
1/*
2 * SPDX-FileCopyrightText: 2021-2023 The Refinery Authors <https://refinery.tools/>
3 *
4 * SPDX-License-Identifier: EPL-2.0
5 */
1package tools.refinery.language.web; 6package tools.refinery.language.web;
2 7
3import jakarta.servlet.*; 8import jakarta.servlet.*;
diff --git a/subprojects/language-web/src/main/java/tools/refinery/language/web/ProblemWebModule.java b/subprojects/language-web/src/main/java/tools/refinery/language/web/ProblemWebModule.java
index 706413a9..b0197c01 100644
--- a/subprojects/language-web/src/main/java/tools/refinery/language/web/ProblemWebModule.java
+++ b/subprojects/language-web/src/main/java/tools/refinery/language/web/ProblemWebModule.java
@@ -1,15 +1,19 @@
1/* 1/*
2 * SPDX-FileCopyrightText: 2021-2023 The Refinery Authors <https://refinery.tools/>
3 *
4 * SPDX-License-Identifier: EPL-2.0
5 */
6
7/*
2 * generated by Xtext 2.25.0 8 * generated by Xtext 2.25.0
3 */ 9 */
4package tools.refinery.language.web; 10package tools.refinery.language.web;
5 11
6import org.eclipse.xtext.ide.ExecutorServiceProvider;
7import org.eclipse.xtext.web.server.XtextServiceDispatcher; 12import org.eclipse.xtext.web.server.XtextServiceDispatcher;
8import org.eclipse.xtext.web.server.model.IWebDocumentProvider; 13import org.eclipse.xtext.web.server.model.IWebDocumentProvider;
9import org.eclipse.xtext.web.server.model.XtextWebDocumentAccess; 14import org.eclipse.xtext.web.server.model.XtextWebDocumentAccess;
10import org.eclipse.xtext.web.server.occurrences.OccurrencesService; 15import org.eclipse.xtext.web.server.occurrences.OccurrencesService;
11import tools.refinery.language.web.occurrences.ProblemOccurrencesService; 16import tools.refinery.language.web.occurrences.ProblemOccurrencesService;
12import tools.refinery.language.web.xtext.VirtualThreadExecutorServiceProvider;
13import tools.refinery.language.web.xtext.server.push.PushServiceDispatcher; 17import tools.refinery.language.web.xtext.server.push.PushServiceDispatcher;
14import tools.refinery.language.web.xtext.server.push.PushWebDocumentAccess; 18import tools.refinery.language.web.xtext.server.push.PushWebDocumentAccess;
15import tools.refinery.language.web.xtext.server.push.PushWebDocumentProvider; 19import tools.refinery.language.web.xtext.server.push.PushWebDocumentProvider;
@@ -33,8 +37,4 @@ public class ProblemWebModule extends AbstractProblemWebModule {
33 public Class<? extends OccurrencesService> bindOccurrencesService() { 37 public Class<? extends OccurrencesService> bindOccurrencesService() {
34 return ProblemOccurrencesService.class; 38 return ProblemOccurrencesService.class;
35 } 39 }
36
37 public Class<? extends ExecutorServiceProvider> bindExecutorServiceProvider() {
38 return VirtualThreadExecutorServiceProvider.class;
39 }
40} 40}
diff --git a/subprojects/language-web/src/main/java/tools/refinery/language/web/ProblemWebSetup.java b/subprojects/language-web/src/main/java/tools/refinery/language/web/ProblemWebSetup.java
index 4738bc80..53a394d8 100644
--- a/subprojects/language-web/src/main/java/tools/refinery/language/web/ProblemWebSetup.java
+++ b/subprojects/language-web/src/main/java/tools/refinery/language/web/ProblemWebSetup.java
@@ -1,4 +1,10 @@
1/* 1/*
2 * SPDX-FileCopyrightText: 2021-2023 The Refinery Authors <https://refinery.tools/>
3 *
4 * SPDX-License-Identifier: EPL-2.0
5 */
6
7/*
2 * generated by Xtext 2.25.0 8 * generated by Xtext 2.25.0
3 */ 9 */
4package tools.refinery.language.web; 10package tools.refinery.language.web;
diff --git a/subprojects/language-web/src/main/java/tools/refinery/language/web/ProblemWebSocketServlet.java b/subprojects/language-web/src/main/java/tools/refinery/language/web/ProblemWebSocketServlet.java
index df67b521..7b48cde8 100644
--- a/subprojects/language-web/src/main/java/tools/refinery/language/web/ProblemWebSocketServlet.java
+++ b/subprojects/language-web/src/main/java/tools/refinery/language/web/ProblemWebSocketServlet.java
@@ -1,3 +1,8 @@
1/*
2 * SPDX-FileCopyrightText: 2021-2023 The Refinery Authors <https://refinery.tools/>
3 *
4 * SPDX-License-Identifier: EPL-2.0
5 */
1package tools.refinery.language.web; 6package tools.refinery.language.web;
2 7
3import org.eclipse.xtext.util.DisposableRegistry; 8import org.eclipse.xtext.util.DisposableRegistry;
diff --git a/subprojects/language-web/src/main/java/tools/refinery/language/web/SecurityHeadersFilter.java b/subprojects/language-web/src/main/java/tools/refinery/language/web/SecurityHeadersFilter.java
index c41db799..7b094fde 100644
--- a/subprojects/language-web/src/main/java/tools/refinery/language/web/SecurityHeadersFilter.java
+++ b/subprojects/language-web/src/main/java/tools/refinery/language/web/SecurityHeadersFilter.java
@@ -1,3 +1,8 @@
1/*
2 * SPDX-FileCopyrightText: 2021-2023 The Refinery Authors <https://refinery.tools/>
3 *
4 * SPDX-License-Identifier: EPL-2.0
5 */
1package tools.refinery.language.web; 6package tools.refinery.language.web;
2 7
3import jakarta.servlet.*; 8import jakarta.servlet.*;
diff --git a/subprojects/language-web/src/main/java/tools/refinery/language/web/ServerLauncher.java b/subprojects/language-web/src/main/java/tools/refinery/language/web/ServerLauncher.java
index f49f46ee..ad19e77d 100644
--- a/subprojects/language-web/src/main/java/tools/refinery/language/web/ServerLauncher.java
+++ b/subprojects/language-web/src/main/java/tools/refinery/language/web/ServerLauncher.java
@@ -1,4 +1,10 @@
1/* 1/*
2 * SPDX-FileCopyrightText: 2021-2023 The Refinery Authors <https://refinery.tools/>
3 *
4 * SPDX-License-Identifier: EPL-2.0
5 */
6
7/*
2 * generated by Xtext 2.25.0 8 * generated by Xtext 2.25.0
3 */ 9 */
4package tools.refinery.language.web; 10package tools.refinery.language.web;
@@ -13,6 +19,7 @@ import org.eclipse.jetty.ee10.websocket.server.config.JettyWebSocketServletConta
13import org.eclipse.jetty.server.Server; 19import org.eclipse.jetty.server.Server;
14import org.eclipse.jetty.util.resource.Resource; 20import org.eclipse.jetty.util.resource.Resource;
15import org.eclipse.jetty.util.resource.ResourceFactory; 21import org.eclipse.jetty.util.resource.ResourceFactory;
22import org.eclipse.jetty.util.thread.QueuedThreadPool;
16import org.slf4j.Logger; 23import org.slf4j.Logger;
17import org.slf4j.LoggerFactory; 24import org.slf4j.LoggerFactory;
18import tools.refinery.language.web.config.BackendConfigServlet; 25import tools.refinery.language.web.config.BackendConfigServlet;
@@ -43,7 +50,8 @@ public class ServerLauncher {
43 private final Server server; 50 private final Server server;
44 51
45 public ServerLauncher(InetSocketAddress bindAddress, String[] allowedOrigins, String webSocketUrl) { 52 public ServerLauncher(InetSocketAddress bindAddress, String[] allowedOrigins, String webSocketUrl) {
46 server = VirtualThreadUtils.newServerWithVirtualThreadsThreadPool("jetty", bindAddress); 53 server = new Server(bindAddress);
54 ((QueuedThreadPool) server.getThreadPool()).setName("jetty");
47 var handler = new ServletContextHandler(); 55 var handler = new ServletContextHandler();
48 addSessionHandler(handler); 56 addSessionHandler(handler);
49 addProblemServlet(handler, allowedOrigins); 57 addProblemServlet(handler, allowedOrigins);
@@ -105,7 +113,7 @@ public class ServerLauncher {
105 var indexUrlInJar = ServerLauncher.class.getResource("/webapp/index.html"); 113 var indexUrlInJar = ServerLauncher.class.getResource("/webapp/index.html");
106 if (indexUrlInJar != null) { 114 if (indexUrlInJar != null) {
107 // If the app is packaged in the jar, serve it. 115 // If the app is packaged in the jar, serve it.
108 URI webRootUri = null; 116 URI webRootUri;
109 try { 117 try {
110 webRootUri = URI.create(indexUrlInJar.toURI().toASCIIString().replaceFirst("/index.html$", "/")); 118 webRootUri = URI.create(indexUrlInJar.toURI().toASCIIString().replaceFirst("/index.html$", "/"));
111 } catch (URISyntaxException e) { 119 } catch (URISyntaxException e) {
diff --git a/subprojects/language-web/src/main/java/tools/refinery/language/web/VirtualThreadUtils.java b/subprojects/language-web/src/main/java/tools/refinery/language/web/VirtualThreadUtils.java
deleted file mode 100644
index a055e755..00000000
--- a/subprojects/language-web/src/main/java/tools/refinery/language/web/VirtualThreadUtils.java
+++ /dev/null
@@ -1,52 +0,0 @@
1package tools.refinery.language.web;
2
3import org.eclipse.jetty.server.Server;
4import org.eclipse.jetty.server.ServerConnector;
5import org.eclipse.jetty.util.thread.QueuedThreadPool;
6import org.eclipse.jetty.util.thread.ThreadPool;
7
8import java.net.InetSocketAddress;
9import java.time.Duration;
10import java.util.concurrent.ExecutorService;
11import java.util.concurrent.Executors;
12
13public final class VirtualThreadUtils {
14 private VirtualThreadUtils() {
15 throw new IllegalStateException("This is a static utility class and should not be instantiated directly");
16 }
17
18 public static ExecutorService newNamedVirtualThreadsExecutor(String name) {
19 // Based on
20 // https://github.com/eclipse/jetty.project/blob/83154b4ffe4767ef44981598d6c26e6a5d32e57c/jetty-server/src/main/config/etc/jetty-threadpool-virtual-preview.xml
21 return Executors.newThreadPerTaskExecutor(Thread.ofVirtual()
22 .allowSetThreadLocals(true)
23 .inheritInheritableThreadLocals(false)
24 .name(name + "-virtual-", 0)
25 .factory());
26 }
27
28 public static ThreadPool newThreadPoolWithVirtualThreadsExecutor(String name) {
29 // Based on
30 // https://github.com/eclipse/jetty.project/blob/83154b4ffe4767ef44981598d6c26e6a5d32e57c/jetty-server/src/main/config/etc/jetty-threadpool-virtual-preview.xml
31 int timeout = (int) Duration.ofMinutes(1).toMillis();
32 var threadPool = new QueuedThreadPool(200, 10, timeout, -1, null, null);
33 threadPool.setName(name);
34 threadPool.setDetailedDump(false);
35 threadPool.setVirtualThreadsExecutor(newNamedVirtualThreadsExecutor(name));
36 return threadPool;
37 }
38
39 public static Server newServerWithVirtualThreadsThreadPool(String name, InetSocketAddress listenAddress) {
40 var server = new Server(newThreadPoolWithVirtualThreadsExecutor(name));
41 var connector = new ServerConnector(server);
42 try {
43 connector.setHost(listenAddress.getHostName());
44 connector.setPort(listenAddress.getPort());
45 server.addConnector(connector);
46 } catch (Exception e) {
47 connector.close();
48 throw e;
49 }
50 return server;
51 }
52}
diff --git a/subprojects/language-web/src/main/java/tools/refinery/language/web/config/BackendConfig.java b/subprojects/language-web/src/main/java/tools/refinery/language/web/config/BackendConfig.java
index 2e864998..807b789c 100644
--- a/subprojects/language-web/src/main/java/tools/refinery/language/web/config/BackendConfig.java
+++ b/subprojects/language-web/src/main/java/tools/refinery/language/web/config/BackendConfig.java
@@ -1,3 +1,8 @@
1/*
2 * SPDX-FileCopyrightText: 2021-2023 The Refinery Authors <https://refinery.tools/>
3 *
4 * SPDX-License-Identifier: EPL-2.0
5 */
1package tools.refinery.language.web.config; 6package tools.refinery.language.web.config;
2 7
3import com.google.gson.annotations.SerializedName; 8import com.google.gson.annotations.SerializedName;
diff --git a/subprojects/language-web/src/main/java/tools/refinery/language/web/config/BackendConfigServlet.java b/subprojects/language-web/src/main/java/tools/refinery/language/web/config/BackendConfigServlet.java
index f314a9fa..a2f04e34 100644
--- a/subprojects/language-web/src/main/java/tools/refinery/language/web/config/BackendConfigServlet.java
+++ b/subprojects/language-web/src/main/java/tools/refinery/language/web/config/BackendConfigServlet.java
@@ -1,3 +1,8 @@
1/*
2 * SPDX-FileCopyrightText: 2021-2023 The Refinery Authors <https://refinery.tools/>
3 *
4 * SPDX-License-Identifier: EPL-2.0
5 */
1package tools.refinery.language.web.config; 6package tools.refinery.language.web.config;
2 7
3import com.google.gson.Gson; 8import com.google.gson.Gson;
@@ -29,7 +34,7 @@ public class BackendConfigServlet extends HttpServlet {
29 } 34 }
30 35
31 @Override 36 @Override
32 protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { 37 protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException {
33 resp.setStatus(HttpStatus.OK_200); 38 resp.setStatus(HttpStatus.OK_200);
34 resp.setContentType("application/json"); 39 resp.setContentType("application/json");
35 var writer = resp.getWriter(); 40 var writer = resp.getWriter();
diff --git a/subprojects/language-web/src/main/java/tools/refinery/language/web/occurrences/ProblemOccurrencesService.java b/subprojects/language-web/src/main/java/tools/refinery/language/web/occurrences/ProblemOccurrencesService.java
index d32bbb54..34117384 100644
--- a/subprojects/language-web/src/main/java/tools/refinery/language/web/occurrences/ProblemOccurrencesService.java
+++ b/subprojects/language-web/src/main/java/tools/refinery/language/web/occurrences/ProblemOccurrencesService.java
@@ -1,3 +1,8 @@
1/*
2 * SPDX-FileCopyrightText: 2021-2023 The Refinery Authors <https://refinery.tools/>
3 *
4 * SPDX-License-Identifier: EPL-2.0
5 */
1package tools.refinery.language.web.occurrences; 6package tools.refinery.language.web.occurrences;
2 7
3import org.eclipse.emf.ecore.EObject; 8import org.eclipse.emf.ecore.EObject;
diff --git a/subprojects/language-web/src/main/java/tools/refinery/language/web/xtext/VirtualThreadExecutorServiceProvider.java b/subprojects/language-web/src/main/java/tools/refinery/language/web/xtext/VirtualThreadExecutorServiceProvider.java
deleted file mode 100644
index abbcbd53..00000000
--- a/subprojects/language-web/src/main/java/tools/refinery/language/web/xtext/VirtualThreadExecutorServiceProvider.java
+++ /dev/null
@@ -1,16 +0,0 @@
1package tools.refinery.language.web.xtext;
2
3import org.eclipse.xtext.ide.ExecutorServiceProvider;
4import tools.refinery.language.web.VirtualThreadUtils;
5
6import java.util.concurrent.ExecutorService;
7
8public class VirtualThreadExecutorServiceProvider extends ExecutorServiceProvider {
9 private static final String THREAD_POOL_NAME = "xtextWeb";
10
11 @Override
12 protected ExecutorService createInstance(String key) {
13 var name = key == null ? THREAD_POOL_NAME : THREAD_POOL_NAME + "-" + key;
14 return VirtualThreadUtils.newNamedVirtualThreadsExecutor(name);
15 }
16}
diff --git a/subprojects/language-web/src/main/java/tools/refinery/language/web/xtext/server/PongResult.java b/subprojects/language-web/src/main/java/tools/refinery/language/web/xtext/server/PongResult.java
index fe510f51..27b2e04e 100644
--- a/subprojects/language-web/src/main/java/tools/refinery/language/web/xtext/server/PongResult.java
+++ b/subprojects/language-web/src/main/java/tools/refinery/language/web/xtext/server/PongResult.java
@@ -1,3 +1,8 @@
1/*
2 * SPDX-FileCopyrightText: 2021-2023 The Refinery Authors <https://refinery.tools/>
3 *
4 * SPDX-License-Identifier: EPL-2.0
5 */
1package tools.refinery.language.web.xtext.server; 6package tools.refinery.language.web.xtext.server;
2 7
3import java.util.Objects; 8import java.util.Objects;
diff --git a/subprojects/language-web/src/main/java/tools/refinery/language/web/xtext/server/ResponseHandler.java b/subprojects/language-web/src/main/java/tools/refinery/language/web/xtext/server/ResponseHandler.java
index 2a85afe3..3069c2dd 100644
--- a/subprojects/language-web/src/main/java/tools/refinery/language/web/xtext/server/ResponseHandler.java
+++ b/subprojects/language-web/src/main/java/tools/refinery/language/web/xtext/server/ResponseHandler.java
@@ -1,3 +1,8 @@
1/*
2 * SPDX-FileCopyrightText: 2021-2023 The Refinery Authors <https://refinery.tools/>
3 *
4 * SPDX-License-Identifier: EPL-2.0
5 */
1package tools.refinery.language.web.xtext.server; 6package tools.refinery.language.web.xtext.server;
2 7
3import tools.refinery.language.web.xtext.server.message.XtextWebResponse; 8import tools.refinery.language.web.xtext.server.message.XtextWebResponse;
diff --git a/subprojects/language-web/src/main/java/tools/refinery/language/web/xtext/server/ResponseHandlerException.java b/subprojects/language-web/src/main/java/tools/refinery/language/web/xtext/server/ResponseHandlerException.java
index b686d33a..366ef0a7 100644
--- a/subprojects/language-web/src/main/java/tools/refinery/language/web/xtext/server/ResponseHandlerException.java
+++ b/subprojects/language-web/src/main/java/tools/refinery/language/web/xtext/server/ResponseHandlerException.java
@@ -1,3 +1,8 @@
1/*
2 * SPDX-FileCopyrightText: 2021-2023 The Refinery Authors <https://refinery.tools/>
3 *
4 * SPDX-License-Identifier: EPL-2.0
5 */
1package tools.refinery.language.web.xtext.server; 6package tools.refinery.language.web.xtext.server;
2 7
3import java.io.Serial; 8import java.io.Serial;
diff --git a/subprojects/language-web/src/main/java/tools/refinery/language/web/xtext/server/SubscribingServiceContext.java b/subprojects/language-web/src/main/java/tools/refinery/language/web/xtext/server/SubscribingServiceContext.java
index 78e00a9e..04212b84 100644
--- a/subprojects/language-web/src/main/java/tools/refinery/language/web/xtext/server/SubscribingServiceContext.java
+++ b/subprojects/language-web/src/main/java/tools/refinery/language/web/xtext/server/SubscribingServiceContext.java
@@ -1,3 +1,8 @@
1/*
2 * SPDX-FileCopyrightText: 2021-2023 The Refinery Authors <https://refinery.tools/>
3 *
4 * SPDX-License-Identifier: EPL-2.0
5 */
1package tools.refinery.language.web.xtext.server; 6package tools.refinery.language.web.xtext.server;
2 7
3import java.util.Set; 8import java.util.Set;
diff --git a/subprojects/language-web/src/main/java/tools/refinery/language/web/xtext/server/TransactionExecutor.java b/subprojects/language-web/src/main/java/tools/refinery/language/web/xtext/server/TransactionExecutor.java
index 7bb11d2e..0135d8f5 100644
--- a/subprojects/language-web/src/main/java/tools/refinery/language/web/xtext/server/TransactionExecutor.java
+++ b/subprojects/language-web/src/main/java/tools/refinery/language/web/xtext/server/TransactionExecutor.java
@@ -1,3 +1,8 @@
1/*
2 * SPDX-FileCopyrightText: 2021-2023 The Refinery Authors <https://refinery.tools/>
3 *
4 * SPDX-License-Identifier: EPL-2.0
5 */
1package tools.refinery.language.web.xtext.server; 6package tools.refinery.language.web.xtext.server;
2 7
3import com.google.common.base.Strings; 8import com.google.common.base.Strings;
diff --git a/subprojects/language-web/src/main/java/tools/refinery/language/web/xtext/server/message/XtextWebErrorKind.java b/subprojects/language-web/src/main/java/tools/refinery/language/web/xtext/server/message/XtextWebErrorKind.java
index f74bae74..6f4f265c 100644
--- a/subprojects/language-web/src/main/java/tools/refinery/language/web/xtext/server/message/XtextWebErrorKind.java
+++ b/subprojects/language-web/src/main/java/tools/refinery/language/web/xtext/server/message/XtextWebErrorKind.java
@@ -1,3 +1,8 @@
1/*
2 * SPDX-FileCopyrightText: 2021-2023 The Refinery Authors <https://refinery.tools/>
3 *
4 * SPDX-License-Identifier: EPL-2.0
5 */
1package tools.refinery.language.web.xtext.server.message; 6package tools.refinery.language.web.xtext.server.message;
2 7
3import com.google.gson.annotations.SerializedName; 8import com.google.gson.annotations.SerializedName;
diff --git a/subprojects/language-web/src/main/java/tools/refinery/language/web/xtext/server/message/XtextWebErrorResponse.java b/subprojects/language-web/src/main/java/tools/refinery/language/web/xtext/server/message/XtextWebErrorResponse.java
index 01d78c31..af38ad70 100644
--- a/subprojects/language-web/src/main/java/tools/refinery/language/web/xtext/server/message/XtextWebErrorResponse.java
+++ b/subprojects/language-web/src/main/java/tools/refinery/language/web/xtext/server/message/XtextWebErrorResponse.java
@@ -1,3 +1,8 @@
1/*
2 * SPDX-FileCopyrightText: 2021-2023 The Refinery Authors <https://refinery.tools/>
3 *
4 * SPDX-License-Identifier: EPL-2.0
5 */
1package tools.refinery.language.web.xtext.server.message; 6package tools.refinery.language.web.xtext.server.message;
2 7
3import java.util.Objects; 8import java.util.Objects;
diff --git a/subprojects/language-web/src/main/java/tools/refinery/language/web/xtext/server/message/XtextWebOkResponse.java b/subprojects/language-web/src/main/java/tools/refinery/language/web/xtext/server/message/XtextWebOkResponse.java
index 8af27247..73527ee5 100644
--- a/subprojects/language-web/src/main/java/tools/refinery/language/web/xtext/server/message/XtextWebOkResponse.java
+++ b/subprojects/language-web/src/main/java/tools/refinery/language/web/xtext/server/message/XtextWebOkResponse.java
@@ -1,3 +1,8 @@
1/*
2 * SPDX-FileCopyrightText: 2021-2023 The Refinery Authors <https://refinery.tools/>
3 *
4 * SPDX-License-Identifier: EPL-2.0
5 */
1package tools.refinery.language.web.xtext.server.message; 6package tools.refinery.language.web.xtext.server.message;
2 7
3import java.util.Objects; 8import java.util.Objects;
diff --git a/subprojects/language-web/src/main/java/tools/refinery/language/web/xtext/server/message/XtextWebPushMessage.java b/subprojects/language-web/src/main/java/tools/refinery/language/web/xtext/server/message/XtextWebPushMessage.java
index c9432e1c..e9ff87c4 100644
--- a/subprojects/language-web/src/main/java/tools/refinery/language/web/xtext/server/message/XtextWebPushMessage.java
+++ b/subprojects/language-web/src/main/java/tools/refinery/language/web/xtext/server/message/XtextWebPushMessage.java
@@ -1,3 +1,8 @@
1/*
2 * SPDX-FileCopyrightText: 2021-2023 The Refinery Authors <https://refinery.tools/>
3 *
4 * SPDX-License-Identifier: EPL-2.0
5 */
1package tools.refinery.language.web.xtext.server.message; 6package tools.refinery.language.web.xtext.server.message;
2 7
3import java.util.Objects; 8import java.util.Objects;
diff --git a/subprojects/language-web/src/main/java/tools/refinery/language/web/xtext/server/message/XtextWebRequest.java b/subprojects/language-web/src/main/java/tools/refinery/language/web/xtext/server/message/XtextWebRequest.java
index 959749f8..ff788e94 100644
--- a/subprojects/language-web/src/main/java/tools/refinery/language/web/xtext/server/message/XtextWebRequest.java
+++ b/subprojects/language-web/src/main/java/tools/refinery/language/web/xtext/server/message/XtextWebRequest.java
@@ -1,3 +1,8 @@
1/*
2 * SPDX-FileCopyrightText: 2021-2023 The Refinery Authors <https://refinery.tools/>
3 *
4 * SPDX-License-Identifier: EPL-2.0
5 */
1package tools.refinery.language.web.xtext.server.message; 6package tools.refinery.language.web.xtext.server.message;
2 7
3import java.util.Map; 8import java.util.Map;
diff --git a/subprojects/language-web/src/main/java/tools/refinery/language/web/xtext/server/message/XtextWebResponse.java b/subprojects/language-web/src/main/java/tools/refinery/language/web/xtext/server/message/XtextWebResponse.java
index 3bd13047..61444c99 100644
--- a/subprojects/language-web/src/main/java/tools/refinery/language/web/xtext/server/message/XtextWebResponse.java
+++ b/subprojects/language-web/src/main/java/tools/refinery/language/web/xtext/server/message/XtextWebResponse.java
@@ -1,3 +1,8 @@
1/*
2 * SPDX-FileCopyrightText: 2021-2023 The Refinery Authors <https://refinery.tools/>
3 *
4 * SPDX-License-Identifier: EPL-2.0
5 */
1package tools.refinery.language.web.xtext.server.message; 6package tools.refinery.language.web.xtext.server.message;
2 7
3public sealed interface XtextWebResponse permits XtextWebOkResponse,XtextWebErrorResponse,XtextWebPushMessage { 8public sealed interface XtextWebResponse permits XtextWebOkResponse,XtextWebErrorResponse,XtextWebPushMessage {
diff --git a/subprojects/language-web/src/main/java/tools/refinery/language/web/xtext/server/push/PrecomputationListener.java b/subprojects/language-web/src/main/java/tools/refinery/language/web/xtext/server/push/PrecomputationListener.java
index 79a284db..110c8f52 100644
--- a/subprojects/language-web/src/main/java/tools/refinery/language/web/xtext/server/push/PrecomputationListener.java
+++ b/subprojects/language-web/src/main/java/tools/refinery/language/web/xtext/server/push/PrecomputationListener.java
@@ -1,3 +1,8 @@
1/*
2 * SPDX-FileCopyrightText: 2021-2023 The Refinery Authors <https://refinery.tools/>
3 *
4 * SPDX-License-Identifier: EPL-2.0
5 */
1package tools.refinery.language.web.xtext.server.push; 6package tools.refinery.language.web.xtext.server.push;
2 7
3import org.eclipse.xtext.web.server.IServiceResult; 8import org.eclipse.xtext.web.server.IServiceResult;
diff --git a/subprojects/language-web/src/main/java/tools/refinery/language/web/xtext/server/push/PushServiceDispatcher.java b/subprojects/language-web/src/main/java/tools/refinery/language/web/xtext/server/push/PushServiceDispatcher.java
index c7b8108d..4c9135c8 100644
--- a/subprojects/language-web/src/main/java/tools/refinery/language/web/xtext/server/push/PushServiceDispatcher.java
+++ b/subprojects/language-web/src/main/java/tools/refinery/language/web/xtext/server/push/PushServiceDispatcher.java
@@ -1,3 +1,8 @@
1/*
2 * SPDX-FileCopyrightText: 2021-2023 The Refinery Authors <https://refinery.tools/>
3 *
4 * SPDX-License-Identifier: EPL-2.0
5 */
1package tools.refinery.language.web.xtext.server.push; 6package tools.refinery.language.web.xtext.server.push;
2 7
3import org.eclipse.xtext.web.server.IServiceContext; 8import org.eclipse.xtext.web.server.IServiceContext;
diff --git a/subprojects/language-web/src/main/java/tools/refinery/language/web/xtext/server/push/PushWebDocument.java b/subprojects/language-web/src/main/java/tools/refinery/language/web/xtext/server/push/PushWebDocument.java
index 906b9e30..56fd12c9 100644
--- a/subprojects/language-web/src/main/java/tools/refinery/language/web/xtext/server/push/PushWebDocument.java
+++ b/subprojects/language-web/src/main/java/tools/refinery/language/web/xtext/server/push/PushWebDocument.java
@@ -1,3 +1,8 @@
1/*
2 * SPDX-FileCopyrightText: 2021-2023 The Refinery Authors <https://refinery.tools/>
3 *
4 * SPDX-License-Identifier: EPL-2.0
5 */
1package tools.refinery.language.web.xtext.server.push; 6package tools.refinery.language.web.xtext.server.push;
2 7
3import java.util.ArrayList; 8import java.util.ArrayList;
diff --git a/subprojects/language-web/src/main/java/tools/refinery/language/web/xtext/server/push/PushWebDocumentAccess.java b/subprojects/language-web/src/main/java/tools/refinery/language/web/xtext/server/push/PushWebDocumentAccess.java
index b3666a86..d9e548cd 100644
--- a/subprojects/language-web/src/main/java/tools/refinery/language/web/xtext/server/push/PushWebDocumentAccess.java
+++ b/subprojects/language-web/src/main/java/tools/refinery/language/web/xtext/server/push/PushWebDocumentAccess.java
@@ -1,3 +1,8 @@
1/*
2 * SPDX-FileCopyrightText: 2021-2023 The Refinery Authors <https://refinery.tools/>
3 *
4 * SPDX-License-Identifier: EPL-2.0
5 */
1package tools.refinery.language.web.xtext.server.push; 6package tools.refinery.language.web.xtext.server.push;
2 7
3import org.eclipse.xtext.service.OperationCanceledManager; 8import org.eclipse.xtext.service.OperationCanceledManager;
diff --git a/subprojects/language-web/src/main/java/tools/refinery/language/web/xtext/server/push/PushWebDocumentProvider.java b/subprojects/language-web/src/main/java/tools/refinery/language/web/xtext/server/push/PushWebDocumentProvider.java
index b6f04748..b6f4fb43 100644
--- a/subprojects/language-web/src/main/java/tools/refinery/language/web/xtext/server/push/PushWebDocumentProvider.java
+++ b/subprojects/language-web/src/main/java/tools/refinery/language/web/xtext/server/push/PushWebDocumentProvider.java
@@ -1,3 +1,8 @@
1/*
2 * SPDX-FileCopyrightText: 2021-2023 The Refinery Authors <https://refinery.tools/>
3 *
4 * SPDX-License-Identifier: EPL-2.0
5 */
1package tools.refinery.language.web.xtext.server.push; 6package tools.refinery.language.web.xtext.server.push;
2 7
3import org.eclipse.xtext.web.server.IServiceContext; 8import org.eclipse.xtext.web.server.IServiceContext;
diff --git a/subprojects/language-web/src/main/java/tools/refinery/language/web/xtext/servlet/SimpleServiceContext.java b/subprojects/language-web/src/main/java/tools/refinery/language/web/xtext/servlet/SimpleServiceContext.java
index 43e37160..fee1141d 100644
--- a/subprojects/language-web/src/main/java/tools/refinery/language/web/xtext/servlet/SimpleServiceContext.java
+++ b/subprojects/language-web/src/main/java/tools/refinery/language/web/xtext/servlet/SimpleServiceContext.java
@@ -1,3 +1,8 @@
1/*
2 * SPDX-FileCopyrightText: 2021-2023 The Refinery Authors <https://refinery.tools/>
3 *
4 * SPDX-License-Identifier: EPL-2.0
5 */
1package tools.refinery.language.web.xtext.servlet; 6package tools.refinery.language.web.xtext.servlet;
2 7
3import java.util.Map; 8import java.util.Map;
diff --git a/subprojects/language-web/src/main/java/tools/refinery/language/web/xtext/servlet/SimpleSession.java b/subprojects/language-web/src/main/java/tools/refinery/language/web/xtext/servlet/SimpleSession.java
index 09c055a2..bc60c282 100644
--- a/subprojects/language-web/src/main/java/tools/refinery/language/web/xtext/servlet/SimpleSession.java
+++ b/subprojects/language-web/src/main/java/tools/refinery/language/web/xtext/servlet/SimpleSession.java
@@ -1,3 +1,8 @@
1/*
2 * SPDX-FileCopyrightText: 2021-2023 The Refinery Authors <https://refinery.tools/>
3 *
4 * SPDX-License-Identifier: EPL-2.0
5 */
1package tools.refinery.language.web.xtext.servlet; 6package tools.refinery.language.web.xtext.servlet;
2 7
3import java.util.HashMap; 8import java.util.HashMap;
diff --git a/subprojects/language-web/src/main/java/tools/refinery/language/web/xtext/servlet/XtextStatusCode.java b/subprojects/language-web/src/main/java/tools/refinery/language/web/xtext/servlet/XtextStatusCode.java
index 0cd229e8..caa98e84 100644
--- a/subprojects/language-web/src/main/java/tools/refinery/language/web/xtext/servlet/XtextStatusCode.java
+++ b/subprojects/language-web/src/main/java/tools/refinery/language/web/xtext/servlet/XtextStatusCode.java
@@ -1,3 +1,8 @@
1/*
2 * SPDX-FileCopyrightText: 2021-2023 The Refinery Authors <https://refinery.tools/>
3 *
4 * SPDX-License-Identifier: EPL-2.0
5 */
1package tools.refinery.language.web.xtext.servlet; 6package tools.refinery.language.web.xtext.servlet;
2 7
3public final class XtextStatusCode { 8public final class XtextStatusCode {
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 1d9e0463..043d318c 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
@@ -1,12 +1,17 @@
1/*
2 * SPDX-FileCopyrightText: 2021-2023 The Refinery Authors <https://refinery.tools/>
3 *
4 * SPDX-License-Identifier: EPL-2.0
5 */
1package tools.refinery.language.web.xtext.servlet; 6package tools.refinery.language.web.xtext.servlet;
2 7
3import com.google.gson.Gson; 8import com.google.gson.Gson;
4import com.google.gson.JsonIOException; 9import com.google.gson.JsonIOException;
5import com.google.gson.JsonParseException; 10import com.google.gson.JsonParseException;
6import org.eclipse.jetty.ee10.websocket.api.Session; 11import org.eclipse.jetty.websocket.api.Callback;
7import org.eclipse.jetty.ee10.websocket.api.StatusCode; 12import org.eclipse.jetty.websocket.api.Session;
8import org.eclipse.jetty.ee10.websocket.api.WriteCallback; 13import org.eclipse.jetty.websocket.api.StatusCode;
9import org.eclipse.jetty.ee10.websocket.api.annotations.*; 14import org.eclipse.jetty.websocket.api.annotations.*;
10import org.eclipse.xtext.resource.IResourceServiceProvider; 15import org.eclipse.xtext.resource.IResourceServiceProvider;
11import org.eclipse.xtext.web.server.ISession; 16import org.eclipse.xtext.web.server.ISession;
12import org.slf4j.Logger; 17import org.slf4j.Logger;
@@ -20,7 +25,7 @@ import tools.refinery.language.web.xtext.server.message.XtextWebResponse;
20import java.io.Reader; 25import java.io.Reader;
21 26
22@WebSocket 27@WebSocket
23public class XtextWebSocket implements WriteCallback, ResponseHandler { 28public class XtextWebSocket implements ResponseHandler {
24 private static final Logger LOG = LoggerFactory.getLogger(XtextWebSocket.class); 29 private static final Logger LOG = LoggerFactory.getLogger(XtextWebSocket.class);
25 30
26 private final Gson gson = new Gson(); 31 private final Gson gson = new Gson();
@@ -38,13 +43,13 @@ public class XtextWebSocket implements WriteCallback, ResponseHandler {
38 this(new TransactionExecutor(session, resourceServiceProviderRegistry)); 43 this(new TransactionExecutor(session, resourceServiceProviderRegistry));
39 } 44 }
40 45
41 @OnWebSocketConnect 46 @OnWebSocketOpen
42 public void onConnect(Session webSocketSession) { 47 public void onOpen(Session webSocketSession) {
43 if (this.webSocketSession != null) { 48 if (this.webSocketSession != null) {
44 LOG.error("Websocket session onConnect when already connected"); 49 LOG.error("Websocket session onConnect when already connected");
45 return; 50 return;
46 } 51 }
47 LOG.debug("New websocket connection from {}", webSocketSession.getRemoteAddress()); 52 LOG.debug("New websocket connection from {}", webSocketSession.getRemoteSocketAddress());
48 this.webSocketSession = webSocketSession; 53 this.webSocketSession = webSocketSession;
49 } 54 }
50 55
@@ -55,10 +60,10 @@ public class XtextWebSocket implements WriteCallback, ResponseHandler {
55 return; 60 return;
56 } 61 }
57 if (statusCode == StatusCode.NORMAL || statusCode == StatusCode.SHUTDOWN) { 62 if (statusCode == StatusCode.NORMAL || statusCode == StatusCode.SHUTDOWN) {
58 LOG.debug("{} closed connection normally: {}", webSocketSession.getRemoteAddress(), reason); 63 LOG.debug("{} closed connection normally: {}", webSocketSession.getRemoteSocketAddress(), reason);
59 } else { 64 } else {
60 LOG.warn("{} closed connection with status code {}: {}", webSocketSession.getRemoteAddress(), statusCode, 65 LOG.warn("{} closed connection with status code {}: {}", webSocketSession.getRemoteSocketAddress(),
61 reason); 66 statusCode, reason);
62 } 67 }
63 webSocketSession = null; 68 webSocketSession = null;
64 } 69 }
@@ -68,7 +73,7 @@ public class XtextWebSocket implements WriteCallback, ResponseHandler {
68 if (webSocketSession == null) { 73 if (webSocketSession == null) {
69 return; 74 return;
70 } 75 }
71 LOG.error("Internal websocket error in connection from" + webSocketSession.getRemoteAddress(), error); 76 LOG.error("Internal websocket error in connection from" + webSocketSession.getRemoteSocketAddress(), error);
72 } 77 }
73 78
74 @OnWebSocketMessage 79 @OnWebSocketMessage
@@ -81,14 +86,14 @@ public class XtextWebSocket implements WriteCallback, ResponseHandler {
81 try { 86 try {
82 request = gson.fromJson(reader, XtextWebRequest.class); 87 request = gson.fromJson(reader, XtextWebRequest.class);
83 } catch (JsonIOException e) { 88 } catch (JsonIOException e) {
84 LOG.error("Cannot read from websocket from" + webSocketSession.getRemoteAddress(), e); 89 LOG.error("Cannot read from websocket from" + webSocketSession.getRemoteSocketAddress(), e);
85 if (webSocketSession.isOpen()) { 90 if (webSocketSession.isOpen()) {
86 webSocketSession.close(StatusCode.SERVER_ERROR, "Cannot read payload"); 91 webSocketSession.close(StatusCode.SERVER_ERROR, "Cannot read payload", Callback.NOOP);
87 } 92 }
88 return; 93 return;
89 } catch (JsonParseException e) { 94 } catch (JsonParseException e) {
90 LOG.warn("Malformed websocket request from" + webSocketSession.getRemoteAddress(), e); 95 LOG.warn("Malformed websocket request from" + webSocketSession.getRemoteSocketAddress(), e);
91 webSocketSession.close(XtextStatusCode.INVALID_JSON, "Invalid JSON payload"); 96 webSocketSession.close(XtextStatusCode.INVALID_JSON, "Invalid JSON payload", Callback.NOOP);
92 return; 97 return;
93 } 98 }
94 try { 99 try {
@@ -96,7 +101,7 @@ public class XtextWebSocket implements WriteCallback, ResponseHandler {
96 } catch (ResponseHandlerException e) { 101 } catch (ResponseHandlerException e) {
97 LOG.warn("Cannot write websocket response", e); 102 LOG.warn("Cannot write websocket response", e);
98 if (webSocketSession.isOpen()) { 103 if (webSocketSession.isOpen()) {
99 webSocketSession.close(StatusCode.SERVER_ERROR, "Cannot write response"); 104 webSocketSession.close(StatusCode.SERVER_ERROR, "Cannot write response", Callback.NOOP);
100 } 105 }
101 } 106 }
102 } 107 }
@@ -107,15 +112,14 @@ public class XtextWebSocket implements WriteCallback, ResponseHandler {
107 throw new ResponseHandlerException("Trying to send message when websocket is disconnected"); 112 throw new ResponseHandlerException("Trying to send message when websocket is disconnected");
108 } 113 }
109 var responseString = gson.toJson(response); 114 var responseString = gson.toJson(response);
110 webSocketSession.getRemote().sendPartialString(responseString, true, this); 115 webSocketSession.sendText(responseString, Callback.from(() -> {}, this::writeFailed));
111 } 116 }
112 117
113 @Override
114 public void writeFailed(Throwable x) { 118 public void writeFailed(Throwable x) {
115 if (webSocketSession == null) { 119 if (webSocketSession == null) {
116 LOG.error("Cannot complete async write to disconnected websocket", x); 120 LOG.error("Cannot complete async write to disconnected websocket", x);
117 return; 121 return;
118 } 122 }
119 LOG.warn("Cannot complete async write to websocket " + webSocketSession.getRemoteAddress(), x); 123 LOG.warn("Cannot complete async write to websocket " + webSocketSession.getRemoteSocketAddress(), x);
120 } 124 }
121} 125}
diff --git a/subprojects/language-web/src/main/java/tools/refinery/language/web/xtext/servlet/XtextWebSocketServlet.java b/subprojects/language-web/src/main/java/tools/refinery/language/web/xtext/servlet/XtextWebSocketServlet.java
index 9a32b937..5e4fb0ce 100644
--- a/subprojects/language-web/src/main/java/tools/refinery/language/web/xtext/servlet/XtextWebSocketServlet.java
+++ b/subprojects/language-web/src/main/java/tools/refinery/language/web/xtext/servlet/XtextWebSocketServlet.java
@@ -1,3 +1,8 @@
1/*
2 * SPDX-FileCopyrightText: 2021-2023 The Refinery Authors <https://refinery.tools/>
3 *
4 * SPDX-License-Identifier: EPL-2.0
5 */
1package tools.refinery.language.web.xtext.servlet; 6package tools.refinery.language.web.xtext.servlet;
2 7
3import jakarta.servlet.ServletConfig; 8import jakarta.servlet.ServletConfig;