[LIB-9] Replace engine sending commands via transmitter
[chesshog.git] / src / main / java / org / hedgecode / chess / uci / ExternalEngineRunner.java
index fd81352..cb84f03 100644 (file)
 
 package org.hedgecode.chess.uci;
 
-import java.io.BufferedReader;
-import java.io.BufferedWriter;
 import java.io.IOException;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.io.OutputStream;
-import java.io.OutputStreamWriter;
 import java.util.List;
-import java.util.Scanner;
 
 import org.hedgecode.chess.uci.annotation.CommandDirection;
 import org.hedgecode.chess.uci.command.CommandParams;
@@ -39,8 +32,7 @@ public final class ExternalEngineRunner implements EngineRunner {
     private Process process;
     private ProcessBuilder processBuilder;
 
-    private BufferedReader reader;
-    private BufferedWriter writer;
+    private ExternalEngine engine;
 
     private boolean isInit = false;
 
@@ -62,21 +54,14 @@ public final class ExternalEngineRunner implements EngineRunner {
         } catch (IOException e) {
             throw new EngineException("uci.engine.external.start", e.getLocalizedMessage());
         }
-        reader = new BufferedReader(
-                new InputStreamReader(
-                        process.getInputStream()
-                )
-        );
-        writer = new BufferedWriter(
-                new OutputStreamWriter(
-                        process.getOutputStream()
-                )
+
+        engine = new ExternalEngine(
+                process.getInputStream(),
+                process.getOutputStream()
         );
         isInit = true;
 
-        return new ExternalEngine(
-                writer
-        );
+        return engine;
     }
 
     @Override
@@ -87,10 +72,10 @@ public final class ExternalEngineRunner implements EngineRunner {
         Thread engineThread = new Thread(
                 new Runnable() {
                     public void run() {
+                        Transmitter<String> engineTransmitter = engine.transmitter();
                         try {
-                            Scanner scanner = new Scanner(reader);
-                            while (scanner.hasNextLine()) {
-                                String command = scanner.nextLine();
+                            while (engineTransmitter.hasCommand()) {
+                                String command = engineTransmitter.transmitCommand();
                                 if (command.isEmpty()) continue;
                                 CommandParams commandParams = new CommandParams(command);
                                 commandExecutor.exec(
@@ -100,16 +85,15 @@ public final class ExternalEngineRunner implements EngineRunner {
                                 );
                             }
                         } finally {
-                            try {
-                                writer.close();
-                                reader.close();
-                            } catch (IOException ignored) {
-                            }
                             commandExecutor.exec(
                                     UCIConstants.TERMINATE,
                                     CommandDirection.FROM_ENGINE,
                                     null
                             );
+                            engineTransmitter.stop();
+                            engineTransmitter.close();
+                            if (process.isAlive()) process.destroy();
+                            isInit = false;
                         }
                     }
                 }
@@ -117,58 +101,4 @@ public final class ExternalEngineRunner implements EngineRunner {
         engineThread.start();
     }
 
-    public void run() throws IOException, InterruptedException {
-        //Map<String, String> environment = processBuilder.environment();
-        Process process = processBuilder.start();
-        InputStream is = process.getInputStream();
-        BufferedReader br = new BufferedReader(new InputStreamReader(is));
-        OutputStream os = process.getOutputStream();
-        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(os));
-
-        Thread engineThread = new Thread(
-                new Runnable() {
-                    public void run() {
-                        Scanner scanner = new Scanner(br); //
-                        while (scanner.hasNextLine()) {
-                            System.out.println(scanner.nextLine());
-                        }
-/*
-                        String line;
-                        try {
-                            while ((line = br.readLine()) != null) {
-                                System.out.println(line);
-                                bw.write("isready");
-                            }
-                        } catch (IOException e) {
-                            e.printStackTrace();
-                        }
-*/
-                        System.out.println("Engine terminated.");
-                    }
-                }
-        );
-        engineThread.start();
-
-        bw.write("uci\n");
-        bw.flush();
-        bw.write("isready\n");
-        bw.flush();
-        bw.write("quit\n");
-        bw.flush();
-
-        //process.waitFor();
-
-    }
-
-
-    public static void main(String... args) throws Exception {
-/*
-        String[] strings = " uci     test one more test".trim().split("\\s+", 2);
-        for (String string : strings)
-            System.out.println(string);
-*/
-
-        new ExternalEngineRunner("stockfish.exe").run();
-    }
-
 }