/***************************************************************************
* Copyright 2006-2016 by Christian Ihle *
* contact@kouchat.net *
* *
* This file is part of KouChat. *
* *
* KouChat is free software; you can redistribute it and/or modify *
* it under the terms of the GNU Lesser General Public License as *
* published by the Free Software Foundation, either version 3 of *
* the License, or (at your option) any later version. *
* *
* KouChat is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU *
* Lesser General Public License for more details. *
* *
* You should have received a copy of the GNU Lesser General Public *
* License along with KouChat. *
* If not, see <http://www.gnu.org/licenses/>. *
***************************************************************************/
package net.usikkert.kouchat.testclient;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.ServerSocket;
import java.net.Socket;
import net.usikkert.kouchat.misc.CommandException;
import net.usikkert.kouchat.misc.CommandParser;
import net.usikkert.kouchat.misc.Controller;
import net.usikkert.kouchat.misc.MessageController;
import org.apache.commons.io.IOUtils;
/**
* Starts a telnet server at port 20000 for remote control of a test client using the console interface.
*
* @author Christian Ihle
*/
public class TestClientTelnetServer {
private final TestClientUserInterface ui;
private final Controller controller;
private final CommandParser commandParser;
private final MessageController messageController;
private Socket socket;
private BufferedWriter writer;
private BufferedReader reader;
private boolean processMessages;
public TestClientTelnetServer(final TestClientUserInterface ui, final Controller controller, final CommandParser commandParser) {
this.ui = ui;
this.controller = controller;
this.commandParser = commandParser;
this.messageController = ui.getMessageController();
startServer(); // This will block until the server is stopped
}
private void startServer() {
processMessages = true;
try {
final ServerSocket serverSocket = new ServerSocket(20000);
socket = serverSocket.accept();
IOUtils.closeQuietly(serverSocket);
writer = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
ui.setWriter(writer);
processMessages();
}
catch (final IOException e) {
throw new RuntimeException(e);
}
}
private void stopServer() {
processMessages = false;
IOUtils.closeQuietly(reader);
IOUtils.closeQuietly(writer);
IOUtils.closeQuietly(socket);
}
private void processMessages() {
try {
while (processMessages) {
final String line = reader.readLine().trim();
if (line.length() == 0) {
continue;
}
else if (line.startsWith("/quit")) {
stopServer();
}
else if (line.startsWith("/")) {
commandParser.parse(line);
}
else {
sendChatMessage(line);
}
}
}
catch (final IOException e) {
throw new RuntimeException(e);
}
}
private void sendChatMessage(final String message) {
try {
controller.sendChatMessage(message);
messageController.showOwnMessage(message);
}
catch (final CommandException e) {
throw new RuntimeException(e);
}
}
}