0
|
1 package nabble.utils;
|
|
2
|
|
3 import cachingfilter.CachingFilter;
|
|
4 import fschmidt.util.executor.JettyThreadPool;
|
|
5 import fschmidt.util.java.IoUtils;
|
|
6 import fschmidt.util.servlet.AuthenticatingFilter;
|
|
7 import fschmidt.util.servlet.BadBotFilter;
|
|
8 import fschmidt.util.servlet.JarDefaultServlet;
|
|
9 import fschmidt.util.servlet.JtpContext;
|
|
10 import nabble.view.lib.JtpContextServlet;
|
|
11 import fschmidt.util.servlet.NoCacheDefaultServlet;
|
|
12 import fschmidt.util.servlet.RedirectFilter;
|
|
13 import nabble.model.Init;
|
|
14 import nabble.view.lib.MyJtpServlet;
|
|
15 import nabble.view.lib.NabbleConnectionLimitFilter;
|
|
16 import nabble.view.lib.NabbleErrorFilter;
|
|
17 import nabble.view.lib.NabbleErrorHandler;
|
|
18 import org.eclipse.jetty.http.MimeTypes;
|
|
19 import org.eclipse.jetty.server.Connector;
|
|
20 import org.eclipse.jetty.server.Handler;
|
|
21 import org.eclipse.jetty.server.NCSARequestLog;
|
|
22 import org.eclipse.jetty.server.Server;
|
|
23 import org.eclipse.jetty.server.handler.ContextHandlerCollection;
|
|
24 import org.eclipse.jetty.server.handler.HandlerCollection;
|
|
25 import org.eclipse.jetty.server.handler.RequestLogHandler;
|
|
26 import org.eclipse.jetty.server.nio.SelectChannelConnector;
|
|
27 import org.eclipse.jetty.servlet.FilterHolder;
|
|
28 import org.eclipse.jetty.servlet.Holder;
|
|
29 import org.eclipse.jetty.servlet.ServletContextHandler;
|
|
30 import org.eclipse.jetty.servlet.ServletHolder;
|
|
31 import org.eclipse.jetty.servlets.GzipFilter;
|
|
32 import org.eclipse.jetty.servlets.WelcomeFilter;
|
|
33 import org.slf4j.Logger;
|
|
34 import org.slf4j.LoggerFactory;
|
|
35
|
|
36 import javax.servlet.http.HttpServlet;
|
|
37 import java.net.MalformedURLException;
|
|
38 import java.net.URL;
|
|
39 import java.util.Map;
|
|
40
|
|
41
|
|
42 public class Jetty {
|
|
43
|
|
44 private static final Logger logger = LoggerFactory.getLogger(Jetty.class);
|
|
45
|
|
46 private ContextHandlerCollection contexts = new ContextHandlerCollection();
|
|
47 public static volatile boolean isJetty = false;
|
|
48
|
|
49 public Jetty() {
|
|
50 isJetty = true;
|
|
51 }
|
|
52
|
|
53 public ServletContextHandler newContext(String path) throws MalformedURLException {
|
|
54 return new ServletContextHandler(contexts, path, ServletContextHandler.SESSIONS);
|
|
55 }
|
|
56
|
|
57 public ServletContextHandler newContext(String path, String resourceBase) throws MalformedURLException {
|
|
58 ServletContextHandler context = new ServletContextHandler(contexts, path, ServletContextHandler.SESSIONS);
|
|
59 setResourceBase(context, resourceBase);
|
|
60 return context;
|
|
61 }
|
|
62
|
|
63 public ServletHolder newServletHolder(HttpServlet servlet, ServletContextHandler context, String[] paths) {
|
|
64 ServletHolder sh = new ServletHolder(servlet);
|
|
65 for (String path : paths) {
|
|
66 context.addServlet(sh, path);
|
|
67 }
|
|
68 return sh;
|
|
69 }
|
|
70
|
|
71 public ServletContextHandler newFolderContext(String path, String folderPath, String[] paths, boolean dirAllowed) throws MalformedURLException {
|
|
72 ServletContextHandler context = new ServletContextHandler(contexts, path, ServletContextHandler.SESSIONS);
|
|
73 context.setResourceBase(folderPath);
|
|
74 ServletHolder sh = new ServletHolder(new NoCacheDefaultServlet());
|
|
75 sh.setInitParameter("maxCacheSize", "0");
|
|
76 sh.setInitParameter("dirAllowed", String.valueOf(dirAllowed));
|
|
77 for (String p : paths) {
|
|
78 context.addServlet(sh, p);
|
|
79 }
|
|
80 return context;
|
|
81 }
|
|
82
|
|
83 public ServletContextHandler newTools2Context() throws MalformedURLException {
|
|
84 ServletContextHandler context = newContext("/tools2", "fschmidt/tools/web/Index.class");
|
|
85 // context.setMaxFormContentSize(0); ???
|
|
86 context.addFilter(WelcomeFilter.class,"/*",0).setInitParameter("welcome","Index.jtp");
|
|
87 ServletHolder sh = newServletHolder(new JtpContextServlet(), context, new String[] { "/", "*.jtp", "*.class", "*.txt" });
|
|
88 sh.setInitParameter("base", "fschmidt.tools.web");
|
|
89 addDefaultServlet(context, new String[]{"*.html"} );
|
|
90 return context;
|
|
91 }
|
|
92
|
|
93 public void setResourceBase(ServletContextHandler context,String name) throws MalformedURLException {
|
|
94 URL url = IoUtils.getUrlFromResource(name);
|
|
95 url = new URL(url,".");
|
|
96 context.setResourceBase(url.toString());
|
|
97 }
|
|
98
|
|
99 public ServletContextHandler newWebContext(Map<String, String> initParams) throws MalformedURLException {
|
|
100 ServletContextHandler context = newContext("/", "nabble/view/web/Index.class");
|
|
101
|
|
102 newServletHolder( new LuanServlet("classpath:nabble/view/web"), context, new String[]{"*.luan"} );
|
|
103
|
|
104 JtpContext mainServlet = MyJtpServlet.getJtpContext();
|
|
105 String[] paths = new String[] { "/", "*.jtp", "*.class", "*.html", "*.xml", "*.xml.gz", "*.txt", "/file/*", "/attachment/*" };
|
|
106 ServletHolder sh = newServletHolder((HttpServlet) mainServlet, context, paths);
|
|
107 sh.setInitParameter("urlMapping", "true");
|
|
108 sh.setInitParameter("characterEncoding", "utf-8");
|
|
109 setInitParameters(sh, initParams);
|
|
110 context.setErrorHandler(new NabbleErrorHandler());
|
|
111 addDefaultServlet(context);
|
|
112 return context;
|
|
113 }
|
|
114
|
|
115 public ServletHolder addDefaultServlet(ServletContextHandler context) {
|
|
116 return addDefaultServlet(context, new String[0]);
|
|
117 }
|
|
118
|
|
119 public NCSARequestLog newNCSARequestLog() {
|
|
120 return newNCSARequestLog(null);
|
|
121 }
|
|
122
|
|
123 public NCSARequestLog newNCSARequestLog(String filename) {
|
|
124 NCSARequestLog log = filename == null? new NCSARequestLog() : new NCSARequestLog(filename);
|
|
125 log.setPreferProxiedForAddress(true);
|
|
126 log.setExtended(false);
|
|
127 return log;
|
|
128 }
|
|
129
|
|
130 public Server newServer(int port, NCSARequestLog log) {
|
|
131 Server server = new Server(port);
|
|
132 RequestLogHandler rlh = new RequestLogHandler();
|
|
133 rlh.setRequestLog(log);
|
|
134 HandlerCollection handlers = new HandlerCollection();
|
|
135 handlers.setHandlers(new Handler[] {contexts, rlh});
|
|
136 server.setHandler(handlers);
|
|
137 return server;
|
|
138 }
|
|
139
|
|
140 public Server newServer(int port, String host, NCSARequestLog log) {
|
|
141 Server server = new Server();
|
|
142 SelectChannelConnector con = new SelectChannelConnector();
|
|
143 con.setPort(port);
|
|
144 con.setHost(host);
|
|
145 server.setConnectors( new Connector[] {con});
|
|
146
|
|
147 RequestLogHandler rlh = new RequestLogHandler();
|
|
148 rlh.setRequestLog(log);
|
|
149 HandlerCollection handlers = new HandlerCollection();
|
|
150 handlers.setHandlers(new Handler[] {contexts, rlh});
|
|
151 server.setHandler(handlers);
|
|
152 return server;
|
|
153 }
|
|
154
|
|
155 public void setThreadPool(Server server) {
|
|
156 server.setThreadPool(new JettyThreadPool(nabble.model.Executors.foregroundExecutor));
|
|
157 }
|
|
158
|
|
159 public ServletHolder addDefaultServlet(ServletContextHandler context, String[] paths) {
|
|
160 ServletHolder sh = new ServletHolder(new JarDefaultServlet());
|
|
161 context.addServlet(sh, "*.gif");
|
|
162 context.addServlet(sh, "*.js");
|
|
163 context.addServlet(sh, "*.css");
|
|
164 context.addServlet(sh, "*.xls");
|
|
165 context.addServlet(sh, "*.ico");
|
|
166 context.addServlet(sh, "*.png");
|
|
167 context.addServlet(sh, "*.htm");
|
|
168 context.addServlet(sh, "*.woff");
|
|
169 context.addServlet(sh, "*.woff2");
|
|
170 context.addServlet(sh, "*.svg");
|
|
171 for (String path : paths) {
|
|
172 context.addServlet(sh, path);
|
|
173 }
|
|
174 sh.setInitParameter("dirAllowed","false");
|
|
175 sh.setInitParameter("gzip","false");
|
|
176 sh.setInitParameter("maxCacheSize","0");
|
|
177 return sh;
|
|
178 }
|
|
179
|
|
180 public void authenticate(ServletContextHandler context, String path, String username, String password) {
|
|
181 FilterHolder fh = context.addFilter(AuthenticatingFilter.class, path, 0);
|
|
182 fh.setInitParameter("realm", "Nabble");
|
|
183 fh.setInitParameter("username", username);
|
|
184 fh.setInitParameter("password", password);
|
|
185 }
|
|
186
|
|
187 public void addShutdownHook(final Server server) {
|
|
188 Runnable runnable = new Runnable() {
|
|
189 public void run() {
|
|
190 try {
|
|
191 server.stop();
|
|
192 logger.info("Jetty shutdown done");
|
|
193 } catch (Exception e) {
|
|
194 logger.error("jetty shutdown failed", e);
|
|
195 }
|
|
196 }
|
|
197 };
|
|
198 Init.addShutdownHook(runnable);
|
|
199 }
|
|
200
|
|
201 public void addNabbleErrorFilter(ServletContextHandler context) {
|
|
202 context.addFilter(NabbleErrorFilter.class, "/*", 0);
|
|
203 }
|
|
204
|
|
205 public void addGzipFilter(ServletContextHandler context) {
|
|
206 context.addFilter(GzipFilter.class, "/*", 0);
|
|
207 }
|
|
208
|
|
209 public void addNabbleConnectionLimitFilter(ServletContextHandler context, Map<String, String> initParams) {
|
|
210 FilterHolder fh = context.addFilter(NabbleConnectionLimitFilter.class,"/*",0);
|
|
211 setInitParameters(fh, initParams);
|
|
212 }
|
|
213
|
|
214 public void addBadBotFilter(ServletContextHandler context, Map<String, String> initParams) {
|
|
215 FilterHolder fh = context.addFilter(BadBotFilter.class,"/*",0);
|
|
216 setInitParameters(fh, initParams);
|
|
217 }
|
|
218
|
|
219 public void addCachingFilter(ServletContextHandler context, Map<String, String> initParams) {
|
|
220 FilterHolder fh = context.addFilter(CachingFilter.class,"/*",0);
|
|
221 setInitParameters(fh, initParams);
|
|
222 }
|
|
223
|
|
224 public void addRedirectFilter(ServletContextHandler context, String domain) {
|
|
225 FilterHolder fh = context.addFilter(RedirectFilter.class, "/*", 0);
|
|
226 fh.setInitParameter("host", domain);
|
|
227 }
|
|
228
|
|
229 private void setInitParameters(Holder fh, Map<String, String> initParams) {
|
|
230 for (Map.Entry<String, String> entry : initParams.entrySet())
|
|
231 fh.setInitParameter(entry.getKey(), entry.getValue());
|
|
232 }
|
|
233
|
|
234 public void addCustomMimeTypes(MimeTypes mimeTypes) {
|
|
235 mimeTypes.addMimeMapping("docm", "application/vnd.ms-word.document.macroEnabled.12");
|
|
236 mimeTypes.addMimeMapping("docx", "application/vnd.openxmlformats-officedocument.wordprocessingml.document");
|
|
237 mimeTypes.addMimeMapping("dotx", "application/vnd.openxmlformats-officedocument.wordprocessingml.template");
|
|
238 mimeTypes.addMimeMapping("potm", "application/vnd.ms-powerpoint.template.macroEnabled.12");
|
|
239 mimeTypes.addMimeMapping("potx", "application/vnd.openxmlformats-officedocument.presentationml.template");
|
|
240 mimeTypes.addMimeMapping("ppam", "application/vnd.ms-powerpoint.addin.macroEnabled.12");
|
|
241 mimeTypes.addMimeMapping("ppsm", "application/vnd.ms-powerpoint.slideshow.macroEnabled.12");
|
|
242 mimeTypes.addMimeMapping("ppsx", "application/vnd.openxmlformats-officedocument.presentationml.slideshow");
|
|
243 mimeTypes.addMimeMapping("pptm", "application/vnd.ms-powerpoint.presentation.macroEnabled.12");
|
|
244 mimeTypes.addMimeMapping("pptx", "application/vnd.openxmlformats-officedocument.presentationml.presentation");
|
|
245 mimeTypes.addMimeMapping("xlam", "application/vnd.ms-excel.addin.macroEnabled.12");
|
|
246 mimeTypes.addMimeMapping("xlsb", "application/vnd.ms-excel.sheet.binary.macroEnabled.12");
|
|
247 mimeTypes.addMimeMapping("xlsm", "application/vnd.ms-excel.sheet.macroEnabled.12");
|
|
248 mimeTypes.addMimeMapping("xlsx", "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
|
|
249 mimeTypes.addMimeMapping("xltm", "application/vnd.ms-excel.template.macroEnabled.12");
|
|
250 mimeTypes.addMimeMapping("xltx", "application/vnd.openxmlformats-officedocument.spreadsheetml.template");
|
|
251 }
|
|
252 }
|