package io.teknek.intravert.daemon;
import io.teknek.intravert.service.DefaultIntravertService;
import io.teknek.intravert.service.IntravertService;
import java.io.IOException;
import java.util.concurrent.atomic.AtomicBoolean;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpServletRequest;
import org.apache.cassandra.service.CassandraDaemon.Server;
import org.codehaus.jackson.map.ObjectMapper;
import org.mortbay.jetty.Handler;
import org.mortbay.jetty.HttpConnection;
import org.mortbay.jetty.Request;
import org.mortbay.jetty.handler.AbstractHandler;
public class IntravertCassandraServer implements Server {
public static final int port = 7654;
private static final AtomicBoolean RUNNING = new AtomicBoolean(false);
private org.mortbay.jetty.Server server;
private IntravertService intraService;
private static ObjectMapper MAPPER = new ObjectMapper();
public IntravertService getService(){
return intraService;
}
@Override
public boolean isRunning() {
return RUNNING.get();
}
@Override
public void start() {
intraService = new DefaultIntravertService();
server = new org.mortbay.jetty.Server(port);
server.setHandler(getHandler());
try {
server.start();
RUNNING.set(true);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
@Override
public void stop() {
try {
server.stop();
RUNNING.set(false);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
private Handler getHandler(){
final IntravertService copy = this.intraService;
AbstractHandler handler = new AbstractHandler() {
public void handle(String target, HttpServletRequest request, HttpServletResponse response,
int dispatch) throws IOException, ServletException {
Request baseRequest = request instanceof Request ? (Request) request : HttpConnection
.getCurrentConnection().getRequest();
String url = baseRequest.getRequestURI();
io.teknek.intravert.model.Request requestFromBody = MAPPER.readValue(baseRequest.getInputStream(),
io.teknek.intravert.model.Request.class);
response.setStatus(HttpServletResponse.SC_OK);
response.setContentType("application/json;charset=utf-8");
MAPPER.writeValue(response.getOutputStream(), copy.doRequest(requestFromBody));
response.getOutputStream().close();
baseRequest.setHandled(true);
}
};
return handler;
}
}