summaryrefslogtreecommitdiff
path: root/same/src/main/java/com/orbekk/same/http/ServerBuilder.java
blob: 543366e0a39f0146d3329ed1204f42131a807724 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
package com.orbekk.same.http;

import javax.servlet.http.HttpServlet;

import org.eclipse.jetty.servlet.ServletContextHandler;
import org.eclipse.jetty.servlet.ServletHolder;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.googlecode.jsonrpc4j.JsonRpcServer;

public class ServerBuilder {
    Logger logger = LoggerFactory.getLogger(getClass());
    int port;
    ServletContextHandler context = null;    

    public ServerBuilder(int port) {
        this.port = port;
    }

    public ServerBuilder withServlet(HttpServlet servlet, String pathSpec) {
        logger.info("Servlet binding: {} → {}", pathSpec, servlet);
        getServletContextHandler().addServlet(new ServletHolder(servlet),
                pathSpec);
        return this;
    }

    public <T> ServerBuilder withService(T service, Class<T> clazz) {
        JsonRpcServer server = new JsonRpcServer(service, clazz);
        String pathSpec = "/" + clazz.getSimpleName() + ".json";
        return withServlet(new RpcServlet(server), pathSpec);
    }

    public ServerContainer build() {
        ServerContainer server = ServerContainer.create(port); 
        server.setReuseAddress(true);
        server.setContext(getServletContextHandler());
        return server;
    }

    private ServletContextHandler getServletContextHandler() {
        if (context == null) {
            context = new ServletContextHandler();
            context.setContextPath("/");
        }
        return context;
    }
}