From af22c94b833643bc8545cfcc82b25b8f515ae513 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kjetil=20=C3=98rbekk?= Date: Fri, 3 Feb 2012 16:07:57 +0100 Subject: Move Handler code around. --- .../java/com/orbekk/same/http/HandlerFactory.java | 50 ++++++++++++++++ .../main/java/com/orbekk/same/http/RpcHandler.java | 69 ++++++++++++++++++++++ 2 files changed, 119 insertions(+) create mode 100644 same/src/main/java/com/orbekk/same/http/HandlerFactory.java create mode 100644 same/src/main/java/com/orbekk/same/http/RpcHandler.java (limited to 'same/src/main/java/com/orbekk/same/http') diff --git a/same/src/main/java/com/orbekk/same/http/HandlerFactory.java b/same/src/main/java/com/orbekk/same/http/HandlerFactory.java new file mode 100644 index 0000000..5d5d34c --- /dev/null +++ b/same/src/main/java/com/orbekk/same/http/HandlerFactory.java @@ -0,0 +1,50 @@ +package com.orbekk.same.http; + +import org.eclipse.jetty.server.Handler; +import org.eclipse.jetty.server.handler.ContextHandler.Context; +import org.eclipse.jetty.server.handler.HandlerList; +import org.eclipse.jetty.servlet.ServletContextHandler; +import org.eclipse.jetty.servlet.ServletHandler; +import org.eclipse.jetty.servlet.ServletHolder; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.googlecode.jsonrpc4j.JsonRpcServer; +import com.orbekk.paxos.PaxosService; +import com.orbekk.same.ClientService; +import com.orbekk.same.MasterService; + +public class HandlerFactory { + Logger logger = LoggerFactory.getLogger(getClass()); + + public Handler createServletHandler() { + logger.info("Creating servlet handler."); + ServletContextHandler context = new ServletContextHandler( + ServletContextHandler.SESSIONS); + context.setContextPath("/*"); + context.addServlet(new ServletHolder(new StateServlet()), "/*"); + return context; + } + + public RpcHandler createRpcHandler(MasterService master, + ClientService client, PaxosService paxos) { + RpcHandler rpcHandler = new RpcHandler(null); + rpcHandler.addRpcServer("/MasterService.json", + new JsonRpcServer(master, MasterService.class)); + rpcHandler.addRpcServer("/ClientService.json", + new JsonRpcServer(client, ClientService.class)); + rpcHandler.addRpcServer("/PaxosService.json", + new JsonRpcServer(paxos, PaxosService.class)); + return rpcHandler; + } + + public Handler createMainHandler(RpcHandler rpcHandler, + Handler servletHandler) { + HandlerList handler = new HandlerList(); + handler.addHandler(rpcHandler); + handler.addHandler(servletHandler); + + return handler; + } + +} diff --git a/same/src/main/java/com/orbekk/same/http/RpcHandler.java b/same/src/main/java/com/orbekk/same/http/RpcHandler.java new file mode 100644 index 0000000..56970d1 --- /dev/null +++ b/same/src/main/java/com/orbekk/same/http/RpcHandler.java @@ -0,0 +1,69 @@ +package com.orbekk.same.http; + +import com.googlecode.jsonrpc4j.JsonRpcServer; +import com.orbekk.net.HttpUtil; +import com.orbekk.same.UrlReceiver; + +import java.io.IOException; +import java.util.HashMap; +import java.util.Map; +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import org.eclipse.jetty.server.Request; +import org.eclipse.jetty.server.handler.AbstractHandler; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class RpcHandler extends AbstractHandler { + private Logger logger = LoggerFactory.getLogger(getClass()); + private UrlReceiver urlReceiver; + private Map rpcServers = + new HashMap(); + + public RpcHandler(UrlReceiver urlReceiver) { + this.urlReceiver = urlReceiver; + } + + /** + * Add an RpcServer to this Handler. + * + * @param url the base url of the service, e.g. + * /MyService.json + */ + public void addRpcServer(String url, JsonRpcServer rpcServer) { + rpcServers.put(url, rpcServer); + } + + @Override + public synchronized void handle(String target, Request baseRequest, + HttpServletRequest request, HttpServletResponse response) + throws IOException, ServletException { + logger.info("Handling request to target: " + target); + + if (urlReceiver != null) { + String sameServiceUrl = "http://" + request.getLocalAddr() + + ":" + request.getLocalPort() + "/"; + urlReceiver.setUrl(sameServiceUrl); + urlReceiver = null; + } + + if (target.equals("/ping")) { + int remotePort = Integer.parseInt(request.getParameter("port")); + String pongUrl = "http://" + request.getRemoteAddr() + ":" + + remotePort + "/pong"; + logger.info("Got ping. Sending pong to {}", pongUrl); + HttpUtil.sendHttpRequest(pongUrl); + baseRequest.setHandled(true); + } else if (target.equals("/pong")) { + logger.info("Received pong from {}", request.getRemoteAddr()); + baseRequest.setHandled(true); + } else { + JsonRpcServer server = rpcServers.get(target); + if (server != null) { + server.handle(request, response); + baseRequest.setHandled(true); + } + } + } +} -- cgit v1.2.3