From ad830bdc587797026b59f3a47ed1ca099631e1f4 Mon Sep 17 00:00:00 2001 From: Valentin Heiserer Date: Sun, 12 Nov 2023 14:29:10 +0100 Subject: [PATCH] Initial commit --- .gitignore | 38 ++++++ .idea/.gitignore | 8 ++ .idea/encodings.xml | 7 + .idea/misc.xml | 13 ++ .idea/uiDesigner.xml | 124 ++++++++++++++++++ pom.xml | 54 ++++++++ src/main/java/org/example/EventClient.java | 56 ++++++++ src/main/java/org/example/EventEndpoint.java | 92 +++++++++++++ .../org/example/EventEndpointCreator.java | 13 ++ src/main/java/org/example/EventServer.java | 77 +++++++++++ src/main/java/org/example/Karte.java | 12 ++ src/main/java/org/example/Schafkopf.java | 17 +++ 12 files changed, 511 insertions(+) create mode 100644 .gitignore create mode 100644 .idea/.gitignore create mode 100644 .idea/encodings.xml create mode 100644 .idea/misc.xml create mode 100644 .idea/uiDesigner.xml create mode 100644 pom.xml create mode 100644 src/main/java/org/example/EventClient.java create mode 100644 src/main/java/org/example/EventEndpoint.java create mode 100644 src/main/java/org/example/EventEndpointCreator.java create mode 100644 src/main/java/org/example/EventServer.java create mode 100644 src/main/java/org/example/Karte.java create mode 100644 src/main/java/org/example/Schafkopf.java diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..5ff6309 --- /dev/null +++ b/.gitignore @@ -0,0 +1,38 @@ +target/ +!.mvn/wrapper/maven-wrapper.jar +!**/src/main/**/target/ +!**/src/test/**/target/ + +### IntelliJ IDEA ### +.idea/modules.xml +.idea/jarRepositories.xml +.idea/compiler.xml +.idea/libraries/ +*.iws +*.iml +*.ipr + +### Eclipse ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ +build/ +!**/src/main/**/build/ +!**/src/test/**/build/ + +### VS Code ### +.vscode/ + +### Mac OS ### +.DS_Store \ No newline at end of file diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..13566b8 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,8 @@ +# Default ignored files +/shelf/ +/workspace.xml +# Editor-based HTTP Client requests +/httpRequests/ +# Datasource local storage ignored files +/dataSources/ +/dataSources.local.xml diff --git a/.idea/encodings.xml b/.idea/encodings.xml new file mode 100644 index 0000000..aa00ffa --- /dev/null +++ b/.idea/encodings.xml @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..17e9c2e --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,13 @@ + + + + + + + + + \ No newline at end of file diff --git a/.idea/uiDesigner.xml b/.idea/uiDesigner.xml new file mode 100644 index 0000000..2b63946 --- /dev/null +++ b/.idea/uiDesigner.xml @@ -0,0 +1,124 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..2df51ac --- /dev/null +++ b/pom.xml @@ -0,0 +1,54 @@ + + + 4.0.0 + + org.example + schafkopf-backend-java + 1.0-SNAPSHOT + + + 21 + 21 + UTF-8 + + + + + org.eclipse.jetty.websocket + websocket-jetty-api + 11.0.15 + + + + org.eclipse.jetty.websocket + websocket-jetty-server + 11.0.15 + + + + org.eclipse.jetty.websocket + websocket-jetty-client + 11.0.15 + + + + org.eclipse.jetty + jetty-slf4j-impl + 11.0.15 + + + + org.junit.jupiter + junit-jupiter + 5.10.1 + test + + + com.google.code.gson + gson + 2.10.1 + + + \ No newline at end of file diff --git a/src/main/java/org/example/EventClient.java b/src/main/java/org/example/EventClient.java new file mode 100644 index 0000000..ae9a99c --- /dev/null +++ b/src/main/java/org/example/EventClient.java @@ -0,0 +1,56 @@ +package org.example; + +import java.net.URI; +import java.util.concurrent.Future; + +import org.eclipse.jetty.websocket.api.Session; +import org.eclipse.jetty.websocket.client.WebSocketClient; + +public class EventClient +{ + public static void main(String[] args) + { + EventClient client = new EventClient(); + URI uri = URI.create("ws://localhost:8080/events/"); + try + { + client.run(uri); + } + catch (Throwable t) + { + t.printStackTrace(System.err); + } + } + + public void run(URI uri) throws Exception + { + WebSocketClient client = new WebSocketClient(); + + try + { + client.start(); + // The socket that receives events + EventEndpoint socket = new EventEndpoint(); + // Attempt Connect + Future fut = client.connect(socket, uri); + // Wait for Connect + Session session = fut.get(); + + // Send a message + session.getRemote().sendString("Hello"); + + // Send another message + session.getRemote().sendString("Goodbye"); + + // Wait for other side to close + socket.awaitClosure(); + + // Close session + session.close(); + } + finally + { + client.stop(); + } + } +} \ No newline at end of file diff --git a/src/main/java/org/example/EventEndpoint.java b/src/main/java/org/example/EventEndpoint.java new file mode 100644 index 0000000..f92c338 --- /dev/null +++ b/src/main/java/org/example/EventEndpoint.java @@ -0,0 +1,92 @@ +package org.example; + +import java.io.IOException; +import java.util.Locale; +import java.util.concurrent.CountDownLatch; + +import com.google.gson.Gson; +import org.eclipse.jetty.websocket.api.Session; +import org.eclipse.jetty.websocket.api.StatusCode; +import org.eclipse.jetty.websocket.api.WebSocketAdapter; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class EventEndpoint extends WebSocketAdapter +{ + private static final Logger LOG = LoggerFactory.getLogger(EventEndpoint.class); + private final CountDownLatch closureLatch = new CountDownLatch(1); + + private Schafkopf schafkopf; + @Override + public void onWebSocketConnect(Session sess) + { + super.onWebSocketConnect(sess); + LOG.debug("Endpoint connected: {}", sess); + System.out.println("Endpoint connected:" + sess); + + schafkopf = new Schafkopf(getSession()); + try { + schafkopf.initializeCardDeck(); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + @Override + public void onWebSocketText(String message) + { + super.onWebSocketText(message); + LOG.debug("Received TEXT message: {}", message); + System.out.println("Received TEXT message:" + message); + + if (message.toLowerCase(Locale.US).contains("bye")) + { + getSession().close(StatusCode.NORMAL, "Thanks"); + } + + if (message.toLowerCase(Locale.US).contains("startsimulation")) + { + try { + Gson gson = new Gson(); + String jsonData = gson.toJson("Start"); + getRemote().sendString(jsonData); + + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + if (message.toLowerCase(Locale.US).contains("stopsimulation")) + { + try { + Gson gson = new Gson(); + String jsonData = gson.toJson("Stop"); + getRemote().sendString(jsonData); + + } catch (IOException e) { + throw new RuntimeException(e); + } + } + } + + @Override + public void onWebSocketClose(int statusCode, String reason) + { + super.onWebSocketClose(statusCode, reason); + LOG.debug("Socket Closed: [{}] {}", statusCode, reason); + closureLatch.countDown(); + } + + @Override + public void onWebSocketError(Throwable cause) + { + super.onWebSocketError(cause); + cause.printStackTrace(System.err); + } + + public void awaitClosure() throws InterruptedException + { + LOG.debug("Awaiting closure from remote"); + closureLatch.await(); + } +} \ No newline at end of file diff --git a/src/main/java/org/example/EventEndpointCreator.java b/src/main/java/org/example/EventEndpointCreator.java new file mode 100644 index 0000000..2c74250 --- /dev/null +++ b/src/main/java/org/example/EventEndpointCreator.java @@ -0,0 +1,13 @@ +package org.example; +import org.eclipse.jetty.websocket.server.JettyServerUpgradeRequest; +import org.eclipse.jetty.websocket.server.JettyServerUpgradeResponse; +import org.eclipse.jetty.websocket.server.JettyWebSocketCreator; + +public class EventEndpointCreator implements JettyWebSocketCreator +{ + @Override + public Object createWebSocket(JettyServerUpgradeRequest jettyServerUpgradeRequest, JettyServerUpgradeResponse jettyServerUpgradeResponse) + { + return new EventEndpoint(); + } +} \ No newline at end of file diff --git a/src/main/java/org/example/EventServer.java b/src/main/java/org/example/EventServer.java new file mode 100644 index 0000000..ccd9d50 --- /dev/null +++ b/src/main/java/org/example/EventServer.java @@ -0,0 +1,77 @@ +package org.example; + +import java.net.URI; +import java.time.Duration; + +import org.eclipse.jetty.server.Server; +import org.eclipse.jetty.server.ServerConnector; +import org.eclipse.jetty.servlet.ServletContextHandler; +import org.eclipse.jetty.websocket.server.config.JettyWebSocketServletContainerInitializer; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class EventServer +{ + private static final Logger LOG = LoggerFactory.getLogger(EventServer.class); + + public static void main(String[] args) throws Exception + { + EventServer server = new EventServer(); + server.setPort(8080); + server.start(); + server.join(); + } + + private final Server server; + private final ServerConnector connector; + + public EventServer() + { + server = new Server(); + connector = new ServerConnector(server); + server.addConnector(connector); + + // Setup the basic application "context" for this application at "/" + // This is also known as the handler tree (in jetty speak) + ServletContextHandler context = new ServletContextHandler(ServletContextHandler.SESSIONS); + context.setContextPath("/"); + server.setHandler(context); + + + // Configure specific websocket behavior + JettyWebSocketServletContainerInitializer.configure(context, (servletContext, wsContainer) -> + { + // Configure default max size + wsContainer.setMaxTextMessageSize(65535); + wsContainer.setIdleTimeout(Duration.ofDays(300000)); + // Add websockets + wsContainer.addMapping("/events/*", new EventEndpointCreator()); + }); + } + + public void setPort(int port) + { + connector.setPort(port); + } + + public void start() throws Exception + { + server.start(); + } + + public URI getURI() + { + return server.getURI(); + } + + public void stop() throws Exception + { + server.stop(); + } + + public void join() throws InterruptedException + { + LOG.info("Use Ctrl+C to stop server"); + server.join(); + } +} \ No newline at end of file diff --git a/src/main/java/org/example/Karte.java b/src/main/java/org/example/Karte.java new file mode 100644 index 0000000..0855706 --- /dev/null +++ b/src/main/java/org/example/Karte.java @@ -0,0 +1,12 @@ +package org.example; + +public class Karte { + private int id; + Karte(int id){ + this.id = id; + } + + public int getId(){ + return this.id; + } +} diff --git a/src/main/java/org/example/Schafkopf.java b/src/main/java/org/example/Schafkopf.java new file mode 100644 index 0000000..f720ef7 --- /dev/null +++ b/src/main/java/org/example/Schafkopf.java @@ -0,0 +1,17 @@ +package org.example; +import org.eclipse.jetty.websocket.api.Session; +import com.google.gson.Gson; +import java.io.IOException; + +public class Schafkopf { + private Karte[] deck; + private Session session; + Schafkopf(Session session){ + this.session = session; + } + public void initializeCardDeck() throws IOException { + Gson gson = new Gson(); + String jsonData = gson.toJson("Initialisiere Kartendeck"); + session.getRemote().sendString(jsonData); + } +}