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; } }