1 package org
.argeo
.cms
.jetty
;
3 import java
.util
.AbstractMap
;
4 import java
.util
.ArrayList
;
5 import java
.util
.Enumeration
;
6 import java
.util
.HashSet
;
9 import java
.util
.Objects
;
12 import javax
.servlet
.ServletContext
;
13 import javax
.websocket
.DeploymentException
;
14 import javax
.websocket
.server
.ServerContainer
;
16 import org
.argeo
.cms
.servlet
.httpserver
.HttpContextServlet
;
17 import org
.argeo
.cms
.websocket
.server
.WebsocketEndpoints
;
18 import org
.eclipse
.jetty
.server
.session
.SessionHandler
;
19 import org
.eclipse
.jetty
.servlet
.ServletContextHandler
;
20 import org
.eclipse
.jetty
.servlet
.ServletHolder
;
21 import org
.eclipse
.jetty
.websocket
.javax
.server
.config
.JavaxWebSocketServletContainerInitializer
;
22 import org
.eclipse
.jetty
.websocket
.javax
.server
.config
.JavaxWebSocketServletContainerInitializer
.Configurator
;
24 import com
.sun
.net
.httpserver
.Authenticator
;
25 import com
.sun
.net
.httpserver
.Filter
;
26 import com
.sun
.net
.httpserver
.HttpContext
;
27 import com
.sun
.net
.httpserver
.HttpHandler
;
28 import com
.sun
.net
.httpserver
.HttpServer
;
30 /** Trivial implementation of @{HttpContext}. */
31 class JettyHttpContext
extends HttpContext
{
32 private final JettyHttpServer httpServer
;
33 private final String path
;
34 private final ServletContextHandler contextHandler
;
35 private final ContextAttributes attributes
;
36 private final List
<Filter
> filters
= new ArrayList
<>();
38 private HttpHandler handler
;
39 private Authenticator authenticator
;
41 public JettyHttpContext(JettyHttpServer httpServer
, String path
) {
42 this.httpServer
= httpServer
;
45 // Jetty context handler
46 ServletContextHandler servletContextHandler
= new ServletContextHandler();
47 servletContextHandler
.setContextPath(path
);
48 HttpContextServlet servlet
= new HttpContextServlet(this);
49 servletContextHandler
.addServlet(new ServletHolder(servlet
), "/*");
50 SessionHandler sessionHandler
= new SessionHandler();
51 // FIXME find a better default
52 sessionHandler
.setMaxInactiveInterval(-1);
53 servletContextHandler
.setSessionHandler(sessionHandler
);
54 contextHandler
= servletContextHandler
;
56 attributes
= new ContextAttributes();
60 public HttpHandler
getHandler() {
65 public void setHandler(HttpHandler handler
) {
66 if (this.handler
!= null)
67 throw new IllegalArgumentException("Handler is already set");
68 Objects
.requireNonNull(handler
);
69 this.handler
= handler
;
72 if (handler
instanceof WebsocketEndpoints
) {
73 JavaxWebSocketServletContainerInitializer
.configure(contextHandler
, new Configurator() {
76 public void accept(ServletContext servletContext
, ServerContainer serverContainer
)
77 throws DeploymentException
{
78 // CmsWebSocketConfigurator wsEndpointConfigurator = new CmsWebSocketConfigurator();
80 for (Class
<?
> clss
: ((WebsocketEndpoints
) handler
).getEndPoints()) {
81 // Class<?> clss = websocketEndpoints.get(path);
82 // ServerEndpointConfig config = ServerEndpointConfig.Builder.create(clss, path)
83 // .configurator(wsEndpointConfigurator).build();
84 serverContainer
.addEndpoint(clss
);
90 if (httpServer
.isStarted())
92 contextHandler
.start();
93 } catch (Exception e
) {
94 throw new IllegalStateException("Cannot start context handler", e
);
99 public String
getPath() {
104 public HttpServer
getServer() {
109 public Map
<String
, Object
> getAttributes() {
114 public List
<Filter
> getFilters() {
119 public Authenticator
setAuthenticator(Authenticator auth
) {
120 Authenticator previousAuthenticator
= authenticator
;
121 this.authenticator
= auth
;
122 return previousAuthenticator
;
126 public Authenticator
getAuthenticator() {
127 return authenticator
;
130 ServletContextHandler
getContextHandler() {
131 return contextHandler
;
134 private class ContextAttributes
extends AbstractMap
<String
, Object
> {
136 public Set
<Entry
<String
, Object
>> entrySet() {
137 Set
<Entry
<String
, Object
>> entries
= new HashSet
<>();
138 for (Enumeration
<String
> keys
= contextHandler
.getAttributeNames(); keys
.hasMoreElements();) {
139 entries
.add(new ContextAttributeEntry(keys
.nextElement()));
145 public Object
put(String key
, Object value
) {
146 Object previousValue
= get(key
);
147 contextHandler
.setAttribute(key
, value
);
148 return previousValue
;
151 private class ContextAttributeEntry
implements Map
.Entry
<String
, Object
> {
152 private final String key
;
154 public ContextAttributeEntry(String key
) {
159 public String
getKey() {
164 public Object
getValue() {
165 return contextHandler
.getAttribute(key
);
169 public Object
setValue(Object value
) {
170 Object previousValue
= getValue();
171 contextHandler
.setAttribute(key
, value
);
172 return previousValue
;