branch: elpa/geiser-kawa
commit fabe3316193d2f65202a1924730b50ad30df0399
Author: spellcard199 <spellcard...@protonmail.com>
Commit: spellcard199 <spellcard...@protonmail.com>

    Use kawa-devutil's Kawa server wrapper instead of own solution
---
 pom.xml                                            |  2 +-
 .../kawageiser/StartKawaWithGeiserSupport.java     | 90 +++++-----------------
 2 files changed, 20 insertions(+), 72 deletions(-)

diff --git a/pom.xml b/pom.xml
index 25fd77b..73b867e 100644
--- a/pom.xml
+++ b/pom.xml
@@ -63,7 +63,7 @@
         <dependency>
             <groupId>com.gitlab.spellcard199</groupId>
             <artifactId>kawa-devutil</artifactId>
-            <version>c960cbe13fc3459f5575ae049f6175f7c5b7699c</version>
+            <version>20fc0da50d6059584615bd226d9abb699edb7274</version>
         </dependency>
 
         <!-- https://mvnrepository.com/artifact/org.testng/testng -->
diff --git a/src/main/java/kawageiser/StartKawaWithGeiserSupport.java 
b/src/main/java/kawageiser/StartKawaWithGeiserSupport.java
index 433b0b1..9eae4f8 100644
--- a/src/main/java/kawageiser/StartKawaWithGeiserSupport.java
+++ b/src/main/java/kawageiser/StartKawaWithGeiserSupport.java
@@ -5,40 +5,22 @@
 
 package kawageiser;
 
-import gnu.expr.Language;
-import kawa.TelnetRepl;
 import kawa.standard.Scheme;
-
-import java.io.IOException;
-import java.net.InetSocketAddress;
-import java.net.ServerSocket;
+import kawadevutil.kawa.KawaTelnetServerTrackingClients;
 
 public class StartKawaWithGeiserSupport {
 
-    public static void main(String[] args) throws IOException {
-        Scheme scheme = new Scheme();
+    public static void main(String[] args) throws Throwable {
         if (args.length == 0) {
             int defaultPort = 37146;
-            System.out.println(
-                    String.format(
-                            "No port specified. Starting kawa server on 
default port (%d)...",
-                            defaultPort));
-            // NOTE: You can use ssocket.close() to forcefully free port:
-            //       that's why we are passing around a ServerSocket instead 
of an int port
-            // NOTE:
-            // 1. You can't reuse address if you use the constructor new 
ServerSocket(int port);
-            // 2. That's why we used the following 3 lines here
-            ServerSocket ssocket = 
makeServerSocketWithReusableAddress(defaultPort);
-            Thread kawaServerThread = 
makeThreadForKawaServerWithGeiserSupport(ssocket, scheme);
-            kawaServerThread.start();
+            System.out.println(String.format(
+                    "No port specified. Starting kawa server on default port 
(%d)...",
+                    defaultPort));
+            startKawaServerWithGeiserSupport(defaultPort);
 
         } else if (args.length == 1 && args[0].matches("[0-9]+")) {
-            // NOTE: You can use ssocket.close() to forcefully free port:
-            //       that's why we are passing around a ServerSocket instead 
of an int port
             int port = Integer.parseInt(args[0]);
-            ServerSocket ssocket = makeServerSocketWithReusableAddress(port);
-            Thread kawaServerThread = 
makeThreadForKawaServerWithGeiserSupport(ssocket, scheme);
-            kawaServerThread.start();
+            startKawaServerWithGeiserSupport(port);
 
         } else if (args.length == 1 && args[0].equals("--no-server")) {
             System.out.println("Starting kawa repl in current terminal...");
@@ -52,7 +34,8 @@ public class StartKawaWithGeiserSupport {
         }
     }
 
-    public static Scheme startKawaReplWithGeiserSupport() {
+    public static Scheme
+    startKawaReplWithGeiserSupport() {
         String[] interpArgs = new String[]{
                 "-e", "(require <kawageiser.Geiser>)",
                 "--",
@@ -60,58 +43,23 @@ public class StartKawaWithGeiserSupport {
         return runSchemeAsApplication(interpArgs);
     }
 
-    public static Scheme runSchemeAsApplication(String[] args) {
+    public static Scheme
+    runSchemeAsApplication(String[] args) {
         kawa.standard.Scheme scheme = kawa.standard.Scheme.getInstance();
         scheme.runAsApplication(args);
         return scheme;
 
     }
 
-    public static Thread
-    makeThreadForKawaServerWithGeiserSupport(ServerSocket ssocket, Scheme 
scheme) {
-        return new Thread(() -> {
-            try {
-                startKawaServerWithGeiserSupport(ssocket, scheme);
-            } catch (Throwable throwable) {
-                throwable.printStackTrace();
-            }
-        });
-    }
-
-    public static ServerSocket
-    makeServerSocketWithReusableAddress(int port) throws IOException {
-        ServerSocket ssocket = new ServerSocket();
-        ssocket.setReuseAddress(true);
-        ssocket.bind(new InetSocketAddress(port));
-        return ssocket;
-    }
-
-    private static void
-    startKawaServerWithGeiserSupport(ServerSocket ssocket,
-                                     Scheme scheme) throws Throwable {
+    public static KawaTelnetServerTrackingClients
+    startKawaServerWithGeiserSupport(int port) throws Throwable {
+        Scheme scheme = new Scheme();
         scheme.eval("(require <kawageiser.Geiser>)");
-        startKawaServer(ssocket, scheme);
-    }
-
-    private static void
-    startKawaServer(ServerSocket ssocket, Scheme scheme) throws IOException {
-        // Adapted from Kawa's code in kawa/repl.java
-        System.err.println("Listening on port " + ssocket.getLocalPort());
-        for (; ; ) {
-            System.err.print("waiting ... ");
-            System.err.flush();
-            java.net.Socket client = ssocket.accept();
-            System.err.println("got connection from "
-                    + client.getInetAddress()
-                    + " port:" + client.getPort());
-            Language saveLang = Language.getDefaultLanguage();
-            try {
-                Language.setCurrentLanguage(scheme);
-                TelnetRepl.serve(scheme, client);
-            } finally {
-                Language.setCurrentLanguage(saveLang);
-            }
-        }
+        KawaTelnetServerTrackingClients ktstc =
+                new KawaTelnetServerTrackingClients(
+                        port, scheme, true);
+        ktstc.startServer();
+        return ktstc;
     }
 
 }

Reply via email to