package org.objectstyle.wolips.womodeler.server;
import java.io.IOException;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
public class Webserver implements Runnable {
private static final String DEFAULT_REQUEST_HANDLER = "___DEFAULT___";
private boolean _running;
private ServerSocket _serverSocket;
private int _port;
private Map<String, IRequestHandler> _pathToRequestHandler;
public Webserver(int port) {
_port = port;
_pathToRequestHandler = new HashMap<String, IRequestHandler>();
}
public void addRequestHandler(String path, IRequestHandler requestHandler) {
_pathToRequestHandler.put(path, requestHandler);
}
public void removeRequestHandler(String path) {
_pathToRequestHandler.remove(path);
}
public InetAddress getHostAddress() throws IOException {
return InetAddress.getLocalHost();
}
public int getPort() {
return _port;
}
public synchronized void start(boolean daemon) {
if (!_running) {
_running = true;
Thread serverThread = new Thread(this, "TBLips Server");
serverThread.setDaemon(daemon);
serverThread.start();
}
}
public synchronized void stop() {
try {
if (_serverSocket != null) {
_serverSocket.close();
}
_running = false;
}
catch (Throwable t) {
t.printStackTrace();
}
}
public void run() {
try {
Iterator<IRequestHandler> requestHandlers = _pathToRequestHandler.values().iterator();
while (requestHandlers.hasNext()) {
IRequestHandler requestHandler = requestHandlers.next();
requestHandler.init(this);
}
_serverSocket = new ServerSocket(_port);
while (_running) {
try {
Socket requestSock = _serverSocket.accept();
Request req = new Request(this, requestSock);
// req.run();
Thread requestThread = new Thread(req, "TBLips Server Request");
requestThread.start();
}
catch (Throwable t) {
t.printStackTrace();
}
}
}
catch (Throwable t) {
t.printStackTrace();
}
}
public IRequestHandler getHandler(Request request) {
String path = request.getPath();
IRequestHandler requestHandler = _pathToRequestHandler.get(path);
if (requestHandler == null) {
requestHandler = _pathToRequestHandler.get(Webserver.DEFAULT_REQUEST_HANDLER);
}
return requestHandler;
}
}