-
Notifications
You must be signed in to change notification settings - Fork 11
/
JerseyServer.java
109 lines (92 loc) · 4.51 KB
/
JerseyServer.java
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
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
package io.logz.guice.jersey;
import com.google.inject.Injector;
import com.google.inject.servlet.GuiceFilter;
import com.google.inject.servlet.GuiceServletContextListener;
import io.logz.guice.jersey.configuration.JerseyConfiguration;
import io.logz.guice.jersey.configuration.JerseyWebApplicationConfigurator;
import io.logz.guice.jersey.configuration.ServerConnectorConfiguration;
import org.eclipse.jetty.server.Handler;
import org.eclipse.jetty.server.HttpConnectionFactory;
import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.server.ServerConnector;
import org.eclipse.jetty.server.handler.HandlerCollection;
import org.eclipse.jetty.server.handler.HandlerList;
import org.eclipse.jetty.server.handler.HandlerWrapper;
import org.eclipse.jetty.servlet.ServletHolder;
import org.eclipse.jetty.webapp.WebAppContext;
import org.glassfish.jersey.servlet.ServletContainer;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.servlet.DispatcherType;
import java.util.Collections;
import java.util.EnumSet;
import java.util.List;
import java.util.function.Supplier;
public class JerseyServer {
private static final Logger LOGGER = LoggerFactory.getLogger(JerseyServer.class);
private final JerseyConfiguration jerseyConfiguration;
private final JerseyWebApplicationConfigurator jerseyWebApplicationConfigurator;
private final Supplier<Injector> injectorSupplier;
private final Server server;
JerseyServer(JerseyConfiguration jerseyConfiguration,
Supplier<Injector> injectorSupplier,
JettyServerCreator jettyServerCreator,
JerseyWebApplicationConfigurator jerseyWebApplicationConfigurator) {
this.jerseyConfiguration = jerseyConfiguration;
this.injectorSupplier = injectorSupplier;
this.server = jettyServerCreator.create();
this.jerseyWebApplicationConfigurator = jerseyWebApplicationConfigurator;
configureServer();
}
public void start() throws Exception {
LOGGER.info("Starting embedded jetty server");
server.start();
}
public void stop() throws Exception {
server.stop();
LOGGER.info("Embedded jetty server stopped");
}
private void configureServer() {
List<ServerConnectorConfiguration> serverConnectorConfigurations = jerseyConfiguration.getServerConnectors();
serverConnectorConfigurations.forEach(configuration -> {
ServerConnector connector = new ServerConnector(server);
connector.setName(configuration.getName());
connector.setHost(configuration.getHost());
connector.setPort(configuration.getPort());
connector.setConnectionFactories(Collections.singleton(new HttpConnectionFactory(configuration.getHttpConfiguration())));
server.addConnector(connector);
});
WebAppContext webAppContext = new WebAppContext();
if (jerseyWebApplicationConfigurator != null)
jerseyWebApplicationConfigurator.configure(webAppContext);
webAppContext.setServer(server);
webAppContext.addFilter(GuiceFilter.class, "/*", EnumSet.allOf(DispatcherType.class));
ServletHolder holder = new ServletHolder(ServletContainer.class);
holder.setInitParameter("javax.ws.rs.Application", GuiceJerseyResourceConfig.class.getName());
webAppContext.addServlet(holder, "/*");
webAppContext.setResourceBase("/");
webAppContext.setContextPath(jerseyConfiguration.getContextPath());
webAppContext.addEventListener(new GuiceServletContextListener() {
@Override
protected Injector getInjector() {
return injectorSupplier.get();
}
});
setHandler(server, webAppContext);
}
private static void setHandler(HandlerWrapper handlerWrapper, Handler handlerToAdd) {
Handler currentInnerHandler = handlerWrapper.getHandler();
if (currentInnerHandler == null) {
handlerWrapper.setHandler(handlerToAdd);
} else if (currentInnerHandler instanceof HandlerCollection) {
((HandlerCollection) currentInnerHandler).addHandler(handlerToAdd);
} else if (currentInnerHandler instanceof HandlerWrapper) {
setHandler((HandlerWrapper) currentInnerHandler, handlerToAdd);
} else {
HandlerList handlerList = new HandlerList();
handlerList.addHandler(currentInnerHandler);
handlerList.addHandler(handlerToAdd);
handlerWrapper.setHandler(handlerWrapper);
}
}
}