view src/nabble/utils/Jetty.java @ 0:7ecd1a4ef557

add content
author Franklin Schmidt <fschmidt@gmail.com>
date Thu, 21 Mar 2019 19:15:52 -0600
parents
children
line wrap: on
line source

package nabble.utils;

import cachingfilter.CachingFilter;
import fschmidt.util.executor.JettyThreadPool;
import fschmidt.util.java.IoUtils;
import fschmidt.util.servlet.AuthenticatingFilter;
import fschmidt.util.servlet.BadBotFilter;
import fschmidt.util.servlet.JarDefaultServlet;
import fschmidt.util.servlet.JtpContext;
import nabble.view.lib.JtpContextServlet;
import fschmidt.util.servlet.NoCacheDefaultServlet;
import fschmidt.util.servlet.RedirectFilter;
import nabble.model.Init;
import nabble.view.lib.MyJtpServlet;
import nabble.view.lib.NabbleConnectionLimitFilter;
import nabble.view.lib.NabbleErrorFilter;
import nabble.view.lib.NabbleErrorHandler;
import org.eclipse.jetty.http.MimeTypes;
import org.eclipse.jetty.server.Connector;
import org.eclipse.jetty.server.Handler;
import org.eclipse.jetty.server.NCSARequestLog;
import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.server.handler.ContextHandlerCollection;
import org.eclipse.jetty.server.handler.HandlerCollection;
import org.eclipse.jetty.server.handler.RequestLogHandler;
import org.eclipse.jetty.server.nio.SelectChannelConnector;
import org.eclipse.jetty.servlet.FilterHolder;
import org.eclipse.jetty.servlet.Holder;
import org.eclipse.jetty.servlet.ServletContextHandler;
import org.eclipse.jetty.servlet.ServletHolder;
import org.eclipse.jetty.servlets.GzipFilter;
import org.eclipse.jetty.servlets.WelcomeFilter;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import javax.servlet.http.HttpServlet;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.Map;


public class Jetty {

	private static final Logger logger = LoggerFactory.getLogger(Jetty.class);

	private ContextHandlerCollection contexts = new ContextHandlerCollection();
	public static volatile boolean isJetty = false;

	public Jetty() {
		isJetty = true;
	}

	public ServletContextHandler newContext(String path) throws MalformedURLException {
		return new ServletContextHandler(contexts, path, ServletContextHandler.SESSIONS);
	}

	public ServletContextHandler newContext(String path, String resourceBase) throws MalformedURLException {
		ServletContextHandler context = new ServletContextHandler(contexts, path, ServletContextHandler.SESSIONS);
		setResourceBase(context, resourceBase);
		return context;
	}

	public ServletHolder newServletHolder(HttpServlet servlet, ServletContextHandler context, String[] paths) {
		ServletHolder sh = new ServletHolder(servlet);
		for (String path : paths) {
			context.addServlet(sh, path);
		}
		return sh;
	}

	public ServletContextHandler newFolderContext(String path, String folderPath, String[] paths, boolean dirAllowed) throws MalformedURLException {
		ServletContextHandler context = new ServletContextHandler(contexts, path, ServletContextHandler.SESSIONS);
		context.setResourceBase(folderPath);
		ServletHolder sh = new ServletHolder(new NoCacheDefaultServlet());
		sh.setInitParameter("maxCacheSize", "0");
		sh.setInitParameter("dirAllowed", String.valueOf(dirAllowed));
		for (String p : paths) {
			context.addServlet(sh, p);
		}
		return context;
	}

	public ServletContextHandler newTools2Context() throws MalformedURLException {
		ServletContextHandler context = newContext("/tools2", "fschmidt/tools/web/Index.class");
		// context.setMaxFormContentSize(0);  ???
		context.addFilter(WelcomeFilter.class,"/*",0).setInitParameter("welcome","Index.jtp");
		ServletHolder sh = newServletHolder(new JtpContextServlet(), context, new String[] { "/", "*.jtp", "*.class", "*.txt" });
		sh.setInitParameter("base", "fschmidt.tools.web");
		addDefaultServlet(context, new String[]{"*.html"} );
		return context;
	}

	public void setResourceBase(ServletContextHandler context,String name) throws MalformedURLException {
		URL url = IoUtils.getUrlFromResource(name);
		url = new URL(url,".");
		context.setResourceBase(url.toString());
	}

	public ServletContextHandler newWebContext(Map<String, String> initParams) throws MalformedURLException {
		ServletContextHandler context = newContext("/", "nabble/view/web/Index.class");

		newServletHolder( new LuanServlet("classpath:nabble/view/web"), context, new String[]{"*.luan"} );

		JtpContext mainServlet = MyJtpServlet.getJtpContext();
		String[] paths = new String[] { "/", "*.jtp", "*.class", "*.html", "*.xml", "*.xml.gz", "*.txt", "/file/*", "/attachment/*" };
		ServletHolder sh = newServletHolder((HttpServlet) mainServlet, context, paths);
		sh.setInitParameter("urlMapping", "true");
		sh.setInitParameter("characterEncoding", "utf-8");
		setInitParameters(sh, initParams);
		context.setErrorHandler(new NabbleErrorHandler());
		addDefaultServlet(context);
		return context;
	}

	public ServletHolder addDefaultServlet(ServletContextHandler context) {
		return addDefaultServlet(context, new String[0]);
	}

	public NCSARequestLog newNCSARequestLog() {
		return newNCSARequestLog(null);
	}

	public NCSARequestLog newNCSARequestLog(String filename) {
		NCSARequestLog log = filename == null? new NCSARequestLog() : new NCSARequestLog(filename);
		log.setPreferProxiedForAddress(true);
		log.setExtended(false);
		return log;
	}

	public Server newServer(int port, NCSARequestLog log) {
		Server server = new Server(port);
		RequestLogHandler rlh = new RequestLogHandler();
		rlh.setRequestLog(log);
		HandlerCollection handlers = new HandlerCollection();
		handlers.setHandlers(new Handler[] {contexts, rlh});
		server.setHandler(handlers);
		return server;
	}

	public Server newServer(int port, String host, NCSARequestLog log) {
		Server server = new Server();
		SelectChannelConnector con = new SelectChannelConnector();
		con.setPort(port);
		con.setHost(host);
		server.setConnectors( new Connector[] {con});

		RequestLogHandler rlh = new RequestLogHandler();
		rlh.setRequestLog(log);
		HandlerCollection handlers = new HandlerCollection();
		handlers.setHandlers(new Handler[] {contexts, rlh});
		server.setHandler(handlers);
		return server;
	}

	public void setThreadPool(Server server) {
		server.setThreadPool(new JettyThreadPool(nabble.model.Executors.foregroundExecutor));
	}

	public ServletHolder addDefaultServlet(ServletContextHandler context, String[] paths) {
		ServletHolder sh = new ServletHolder(new JarDefaultServlet());
		context.addServlet(sh, "*.gif");
		context.addServlet(sh, "*.js");
		context.addServlet(sh, "*.css");
		context.addServlet(sh, "*.xls");
		context.addServlet(sh, "*.ico");
		context.addServlet(sh, "*.png");
		context.addServlet(sh, "*.htm");
		context.addServlet(sh, "*.woff");
		context.addServlet(sh, "*.woff2");
		context.addServlet(sh, "*.svg");
		for (String path : paths) {
			context.addServlet(sh, path);
		}
		sh.setInitParameter("dirAllowed","false");
		sh.setInitParameter("gzip","false");
		sh.setInitParameter("maxCacheSize","0");
		return sh;
	}

	public void authenticate(ServletContextHandler context, String path, String username, String password) {
		FilterHolder fh = context.addFilter(AuthenticatingFilter.class, path, 0);
		fh.setInitParameter("realm", "Nabble");
		fh.setInitParameter("username", username);
		fh.setInitParameter("password", password);
	}

	public void addShutdownHook(final Server server) {
		Runnable runnable = new Runnable() {
			public void run() {
				try {
					server.stop();
					logger.info("Jetty shutdown done");
				} catch (Exception e) {
					logger.error("jetty shutdown failed", e);
				}
			}
		};
		Init.addShutdownHook(runnable);
	}

	public void addNabbleErrorFilter(ServletContextHandler context) {
		context.addFilter(NabbleErrorFilter.class, "/*", 0);
	}

	public void addGzipFilter(ServletContextHandler context) {
		context.addFilter(GzipFilter.class, "/*", 0);
	}

	public void addNabbleConnectionLimitFilter(ServletContextHandler context, Map<String, String> initParams) {
		FilterHolder fh = context.addFilter(NabbleConnectionLimitFilter.class,"/*",0);
		setInitParameters(fh, initParams);
	}

	public void addBadBotFilter(ServletContextHandler context, Map<String, String> initParams) {
		FilterHolder fh = context.addFilter(BadBotFilter.class,"/*",0);
		setInitParameters(fh, initParams);
	}

	public void addCachingFilter(ServletContextHandler context, Map<String, String> initParams) {
		FilterHolder fh = context.addFilter(CachingFilter.class,"/*",0);
		setInitParameters(fh, initParams);
	}

	public void addRedirectFilter(ServletContextHandler context, String domain) {
		FilterHolder fh = context.addFilter(RedirectFilter.class, "/*", 0);
		fh.setInitParameter("host", domain);
	}

	private void setInitParameters(Holder fh, Map<String, String> initParams) {
		for (Map.Entry<String, String> entry : initParams.entrySet())
			fh.setInitParameter(entry.getKey(), entry.getValue());
	}

	public void addCustomMimeTypes(MimeTypes mimeTypes) {
		mimeTypes.addMimeMapping("docm", "application/vnd.ms-word.document.macroEnabled.12");
		mimeTypes.addMimeMapping("docx", "application/vnd.openxmlformats-officedocument.wordprocessingml.document");
		mimeTypes.addMimeMapping("dotx", "application/vnd.openxmlformats-officedocument.wordprocessingml.template");
		mimeTypes.addMimeMapping("potm", "application/vnd.ms-powerpoint.template.macroEnabled.12");
		mimeTypes.addMimeMapping("potx", "application/vnd.openxmlformats-officedocument.presentationml.template");
		mimeTypes.addMimeMapping("ppam", "application/vnd.ms-powerpoint.addin.macroEnabled.12");
		mimeTypes.addMimeMapping("ppsm", "application/vnd.ms-powerpoint.slideshow.macroEnabled.12");
		mimeTypes.addMimeMapping("ppsx", "application/vnd.openxmlformats-officedocument.presentationml.slideshow");
		mimeTypes.addMimeMapping("pptm", "application/vnd.ms-powerpoint.presentation.macroEnabled.12");
		mimeTypes.addMimeMapping("pptx", "application/vnd.openxmlformats-officedocument.presentationml.presentation");
		mimeTypes.addMimeMapping("xlam", "application/vnd.ms-excel.addin.macroEnabled.12");
		mimeTypes.addMimeMapping("xlsb", "application/vnd.ms-excel.sheet.binary.macroEnabled.12");
		mimeTypes.addMimeMapping("xlsm", "application/vnd.ms-excel.sheet.macroEnabled.12");
		mimeTypes.addMimeMapping("xlsx", "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
		mimeTypes.addMimeMapping("xltm", "application/vnd.ms-excel.template.macroEnabled.12");
		mimeTypes.addMimeMapping("xltx", "application/vnd.openxmlformats-officedocument.spreadsheetml.template");
	}
}