/* * Copyright (c) MuleSoft, Inc. All rights reserved. http://www.mulesoft.com * The software in this package is published under the terms of the CPAL v1.0 * license, a copy of which has been included with this distribution in the * LICENSE.txt file. */ package org.mule.test.infrastructure.process; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.net.InetAddress; import java.net.ServerSocket; import java.net.Socket; import java.util.ArrayList; import java.util.List; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class CommandServer { public static final String MULE_CONTEXT_STARTED_COMMAND = "MuleContext:started"; private final Logger logger = LoggerFactory.getLogger(CommandServer.class); private final int serverPort; private ServerSocket commandSocket; private List<String> pendingCommands = new ArrayList<String>(); private CommandListener commandListener; private Thread commandServerThread; public CommandServer(int serverPort) { this.serverPort = serverPort; } public synchronized void setCommandListener(CommandListener commandListener) { this.commandListener = commandListener; for (String command : pendingCommands) { this.commandListener.commandReceived(command); } } public void start() throws IOException { logger.debug("Trying to create server socket for command service to port: " + serverPort); commandSocket = new ServerSocket(serverPort, 0, InetAddress.getByName("localhost")); commandServerThread = new Thread("Command-Server") { @Override public void run() { try { Socket processClientConnection = commandSocket.accept(); BufferedReader processClientLogEntriesInputStream = new BufferedReader(new InputStreamReader(processClientConnection.getInputStream())); while (!Thread.interrupted()) { String commandLine = processClientLogEntriesInputStream.readLine(); if (commandLine == null) { try { Thread.sleep(200); } catch (InterruptedException e) { return; } } else { logger.info("Command from external process received: " + commandLine); synchronized (this) { if (commandListener == null) { pendingCommands.add(commandLine); } else { commandListener.commandReceived(commandLine); } } } } } catch (IOException e) { throw new RuntimeException(e); } finally { closeQuietly(commandSocket); } } }; commandServerThread.setDaemon(true); commandServerThread.start(); } private void closeQuietly(ServerSocket loggerSocket) { try { if (loggerSocket != null) { loggerSocket.close(); } } catch (Exception e) { // Do nothing. } } public void stop() { closeQuietly(commandSocket); if (commandServerThread != null) { commandServerThread.interrupt(); } } public interface CommandListener { void commandReceived(String command); } }