]> git.argeo.org Git - lgpl/argeo-commons.git/blob - org.argeo.cms.lib.jetty/src/org/argeo/cms/jetty/JettyHttpContext.java
2aa4abc43a3662e5325f6e9fec9112ff159ec637
[lgpl/argeo-commons.git] / org.argeo.cms.lib.jetty / src / org / argeo / cms / jetty / JettyHttpContext.java
1 package org.argeo.cms.jetty;
2
3 import java.util.AbstractMap;
4 import java.util.ArrayList;
5 import java.util.Enumeration;
6 import java.util.HashSet;
7 import java.util.List;
8 import java.util.Map;
9 import java.util.Objects;
10 import java.util.Set;
11
12 import org.argeo.cms.servlet.httpserver.HttpContextServlet;
13 import org.eclipse.jetty.server.Handler;
14 import org.eclipse.jetty.server.handler.ContextHandler;
15 import org.eclipse.jetty.servlet.ServletContextHandler;
16 import org.eclipse.jetty.servlet.ServletHolder;
17
18 import com.sun.net.httpserver.Authenticator;
19 import com.sun.net.httpserver.Filter;
20 import com.sun.net.httpserver.HttpContext;
21 import com.sun.net.httpserver.HttpHandler;
22 import com.sun.net.httpserver.HttpServer;
23
24 /** Trivial implementation of @{HttpContext}. */
25 class JettyHttpContext extends HttpContext {
26 private final JettyHttpServer httpServer;
27 private final String path;
28 private final ContextHandler contextHandler;
29 private final ContextAttributes attributes;
30 private final List<Filter> filters = new ArrayList<>();
31
32 private HttpHandler handler;
33 private Authenticator authenticator;
34
35 public JettyHttpContext(JettyHttpServer httpServer, String path) {
36 this.httpServer = httpServer;
37 this.path = path;
38
39 ServletContextHandler servletContextHandler = new ServletContextHandler();
40 servletContextHandler.setContextPath(path);
41 HttpContextServlet servlet = new HttpContextServlet(this);
42 servletContextHandler.addServlet(new ServletHolder(servlet), "/*");
43 contextHandler = servletContextHandler;
44
45 attributes = new ContextAttributes();
46 }
47
48 @Override
49 public HttpHandler getHandler() {
50 return handler;
51 }
52
53 @Override
54 public void setHandler(HttpHandler handler) {
55 if (this.handler != null)
56 throw new IllegalArgumentException("Handler is already set");
57 Objects.requireNonNull(handler);
58 this.handler = handler;
59
60 if (httpServer.isStarted())
61 try {
62 contextHandler.start();
63 } catch (Exception e) {
64 throw new IllegalStateException("Cannot start context handler", e);
65 }
66 }
67
68 @Override
69 public String getPath() {
70 return path;
71 }
72
73 @Override
74 public HttpServer getServer() {
75 return httpServer;
76 }
77
78 @Override
79 public Map<String, Object> getAttributes() {
80 return attributes;
81 }
82
83 @Override
84 public List<Filter> getFilters() {
85 return filters;
86 }
87
88 @Override
89 public Authenticator setAuthenticator(Authenticator auth) {
90 Authenticator previousAuthenticator = authenticator;
91 this.authenticator = auth;
92 return previousAuthenticator;
93 }
94
95 @Override
96 public Authenticator getAuthenticator() {
97 return authenticator;
98 }
99
100 public Handler getContextHandler() {
101 return contextHandler;
102 }
103
104 private class ContextAttributes extends AbstractMap<String, Object> {
105 @Override
106 public Set<Entry<String, Object>> entrySet() {
107 Set<Entry<String, Object>> entries = new HashSet<>();
108 for (Enumeration<String> keys = contextHandler.getAttributeNames(); keys.hasMoreElements();) {
109 entries.add(new ContextAttributeEntry(keys.nextElement()));
110 }
111 return entries;
112 }
113
114 @Override
115 public Object put(String key, Object value) {
116 Object previousValue = get(key);
117 contextHandler.setAttribute(key, value);
118 return previousValue;
119 }
120
121 private class ContextAttributeEntry implements Map.Entry<String, Object> {
122 private final String key;
123
124 public ContextAttributeEntry(String key) {
125 this.key = key;
126 }
127
128 @Override
129 public String getKey() {
130 return key;
131 }
132
133 @Override
134 public Object getValue() {
135 return contextHandler.getAttribute(key);
136 }
137
138 @Override
139 public Object setValue(Object value) {
140 Object previousValue = getValue();
141 contextHandler.setAttribute(key, value);
142 return previousValue;
143 }
144
145 }
146 }
147 }