/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
*
*
* University Of Edinburgh (EDINA)
* Scotland
*
*
* File Name : JettyStopListener.java
* Author : gwaller
* Approver : Gareth Waller
*
* Notes :
*
*
*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
*
*/
package uk.ac.jorum;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.LineNumberReader;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.UnknownHostException;
import org.mortbay.jetty.Server;
/**
* @author gwaller
*
*/
public class JettyStopListener extends Thread{
private String _key;
private Server _server;
ServerSocket _serverSocket;
boolean _kill;
public JettyStopListener(int port, String key, Server server, boolean kill) throws UnknownHostException, IOException {
if (port <= 0)
throw new IllegalStateException("Bad stop port");
if (key == null)
throw new IllegalStateException("Bad stop key");
_key = key;
_server = server;
_kill = kill;
_serverSocket = new ServerSocket(port, 1, InetAddress.getByName("127.0.0.1"));
_serverSocket.setReuseAddress(true);
}
public void run() {
while (_serverSocket != null) {
Socket socket = null;
try {
socket = _serverSocket.accept();
socket.setSoLinger(false, 0);
LineNumberReader lin = new LineNumberReader(new InputStreamReader(socket.getInputStream()));
String key = lin.readLine();
if (!_key.equals(key))
continue;
String cmd = lin.readLine();
if ("stop".equals(cmd)) {
try {
socket.close();
} catch (Exception e) {
e.printStackTrace();
}
try {
socket.close();
} catch (Exception e) {
e.printStackTrace();
}
try {
_serverSocket.close();
} catch (Exception e) {
e.printStackTrace();
}
_serverSocket = null;
if (_kill) {
System.exit(0);
} else {
try {
_server.stop();
} catch (Exception e) {
e.printStackTrace();
}
}
}
} catch (Exception e) {
e.printStackTrace();
} finally {
if (socket != null) {
try {
socket.close();
} catch (Exception e) {
e.printStackTrace();
}
}
socket = null;
}
}
}
}