package io.monokkel.mockserver;
import org.simpleframework.http.Query;
import org.simpleframework.http.Request;
import org.simpleframework.http.Response;
import org.simpleframework.http.core.Container;
import org.simpleframework.http.core.ContainerServer;
import org.simpleframework.transport.Server;
import org.simpleframework.transport.connect.Connection;
import org.simpleframework.transport.connect.SocketConnection;
import org.slf4j.LoggerFactory;
import java.io.IOException;
import java.io.PrintStream;
import java.net.InetSocketAddress;
import java.net.SocketAddress;
import java.util.Map;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
/**
* Created by tarjei on 13/06/14.
*/
public class WebServer implements Container, Runnable {
private org.slf4j.Logger log = LoggerFactory.getLogger(WebServer.class);
private final Integer port;
private final Map<String, String> requestAndResponse;
public WebServer(Integer port,Map<String,String> requestAndResponse) {
this.port = port;
this.requestAndResponse = requestAndResponse;
}
public void handle(Request request, Response response) {
try {
log.info("Request received {}",request);
PrintStream body = response.getPrintStream();
long time = System.currentTimeMillis();
response.setValue("Content-Type", "text/plain");
response.setValue("Server", "AkkaCrawler Server 1.0");
response.setDate("Date", time);
response.setDate("Last-Modified", time);
final Query query = request.getQuery();
final String responseAttribute = (String) query.get("request");
if(responseAttribute != null){
final String writeBackResponseBody = requestAndResponse.get(responseAttribute);
body.print(writeBackResponseBody);
log.info("Response sent back {} ",writeBackResponseBody);
}
body.close();
} catch (Exception e) {
e.printStackTrace();
}
}
public static void serveHtml(final Integer port,final Map<String, String> requestAndResponse) {
final ExecutorService executorService = Executors.newCachedThreadPool();
executorService.execute(new WebServer(port,requestAndResponse));
}
@Override
public void run() {
try {
Server server = new ContainerServer(this);
Connection connection = new SocketConnection(server);
SocketAddress address = new InetSocketAddress(port);
connection.connect(address);
} catch (IOException e) {
e.printStackTrace();
}
}
}