package com.googlecode.jsonrpc4j.util;
import com.googlecode.jsonrpc4j.AnnotationsErrorResolver;
import com.googlecode.jsonrpc4j.JsonRpcServer;
import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.servlet.ServletContextHandler;
import org.eclipse.jetty.servlet.ServletHolder;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.util.Random;
import static com.googlecode.jsonrpc4j.util.Util.DEFAULT_LOCAL_HOSTNAME;
@SuppressWarnings("WeakerAccess")
public class JettyServer implements AutoCloseable {
public static final String SERVLET = "someSunnyServlet";
private static final String PROTOCOL = "http";
private final Class<?> service;
private Server jetty;
private int port;
JettyServer(Class<?> service) {
this.service = service;
}
public String getCustomServerUrlString(final String servletName) {
return PROTOCOL + "://" + DEFAULT_LOCAL_HOSTNAME + ":" + port + "/" + servletName;
}
public void startup() throws Exception {
port = 10000 + new Random().nextInt(30000);
jetty = new Server(port);
ServletContextHandler context = new ServletContextHandler(ServletContextHandler.NO_SESSIONS);
context.setContextPath("/");
jetty.setHandler(context);
ServletHolder servlet = context.addServlet(JsonRpcTestServlet.class, "/" + SERVLET);
servlet.setInitParameter("class", service.getCanonicalName());
jetty.start();
}
@Override
public void close() throws Exception {
this.stop();
}
public void stop() throws Exception {
jetty.stop();
}
public static class JsonRpcTestServlet extends HttpServlet {
static final long serialVersionUID = 1L;
private transient JsonRpcServer jsonRpcServer;
@Override
public void init() {
try {
final Class<?> aClass = Class.forName(getInitParameter("class"));
final Object instance = aClass.getConstructor().newInstance();
jsonRpcServer = new JsonRpcServer(instance);
jsonRpcServer.setErrorResolver(AnnotationsErrorResolver.INSTANCE);
} catch (ClassNotFoundException | NoSuchMethodException | InstantiationException | InvocationTargetException | IllegalAccessException e) {
e.printStackTrace();
}
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
jsonRpcServer.handle(request, response);
}
}
}