package org.easyb.plugin.remoting; import java.io.IOException; import java.io.ObjectInputStream; import java.net.ServerSocket; import java.net.Socket; import org.easyb.listener.ExecutionListener; import static org.easyb.plugin.remoting.RemoteUtils.safeClose; /** * Listens for remote events to sent over a socket and forwards then to an execution listener */ public class RemoteExecutionListener implements Runnable { private ExecutionListener receiver; private ServerSocket serverSocket; public void start() { new Thread(this).start(); verifyListenerThreadStarted(); } public void run() { Socket socket = null; try { serverSocket = new ServerSocket(0); socket = serverSocket.accept(); Event event; ObjectInputStream inputStream = new ObjectInputStream(socket.getInputStream()); do { event = (Event) inputStream.readObject(); if (receiver != null) { event.fire(receiver); } } while (event.getType() != EventType.COMPLETE_TESTING); inputStream.close(); } catch (IOException e) { throw new RuntimeException(e); } catch (ClassNotFoundException e) { throw new RuntimeException(e); } finally { safeClose(socket); } } private void verifyListenerThreadStarted() { for (int i = 0; i < 10; i++) { try { Thread.sleep(100); } catch (InterruptedException e) { throw new RuntimeException(e); } if (serverSocket != null) { return; } } throw new RuntimeException("Unable to verify that listener thread started"); } public void setReceiver(ExecutionListener receiver) { this.receiver = receiver; } public void stop() { safeClose(serverSocket); } public int getPort() { return serverSocket.getLocalPort(); } }