/*
* $Id$
*
* Copyright (c) 2008-2009 by Joel Uckelman
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
* License (LGPL) as published by the Free Software Foundation.
*
* This library 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
* Library General Public License for more details.
*
* You should have received a copy of the GNU Library General Public
* License along with this library; if not, copies are available
* at http://www.opensource.org.
*/
package VASSAL.launch;
import java.io.EOFException;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.SocketException;
import VASSAL.tools.ErrorDialog;
import VASSAL.tools.ThrowableUtils;
import VASSAL.tools.io.IOUtils;
/**
* The base class for socket servers for communication between the
* {@link ModuleManager} and its children {@link Player} and {@link Editor}
* processes. Concrete extensions will implement {@link #execute(Object)} to
* process incoming requests.
*
* @see CommandClient
* @author Joel Uckelman
* @since 3.1.0
* @deprecated Use {@link SignalDispatcher} instead.
*/
@Deprecated
public class CommandServer implements Runnable {
private final ServerSocket serverSocket;
public CommandServer(ServerSocket serverSocket) {
this.serverSocket = serverSocket;
}
/**
* Initialize the {@link Command}. Subclasses handling commands
* which need access to some local state will override this method.
*/
public void init(Command command) {}
public void run() {
Socket clientSocket = null;
ObjectOutputStream out = null;
ObjectInputStream in = null;
try {
clientSocket = serverSocket.accept();
out = new ObjectOutputStream(clientSocket.getOutputStream());
in = new ObjectInputStream(clientSocket.getInputStream());
Object obj;
Object result;
try {
while ((obj = in.readObject()) != null) {
// Execute commands as they come and send back the reply
if (obj instanceof Command) {
final Command command = (Command) obj;
init(command);
result = command.execute();
}
else {
result = "UNRECOGNIZED_COMMAND";
}
out.writeObject(result);
}
}
catch (EOFException e) {
// Normal. This happens when the socket is closed from the other end.
}
catch (SocketException e) {
// Normal. This happens when the socket is closed from the other end.
}
clientSocket.close();
serverSocket.close();
}
catch (ClassNotFoundException e) {
ErrorDialog.bug(e);
}
catch (IOException e) {
ErrorDialog.showDetails(
e,
ThrowableUtils.getStackTrace(e),
"Error.socket_error"
);
}
finally {
IOUtils.closeQuietly(clientSocket);
IOUtils.closeQuietly(serverSocket);
}
}
}