All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.agapsys.sevlet.container.ServletContainerBuilder Maven / Gradle / Ivy

/*
 * Copyright 2015 Agapsys Tecnologia Ltda-ME.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package com.agapsys.sevlet.container;

import java.util.EventListener;
import java.util.LinkedHashMap;
import java.util.Map;
import javax.servlet.Filter;
import javax.servlet.http.HttpServlet;
import org.eclipse.jetty.server.Handler;
import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.server.handler.ContextHandlerCollection;
import org.eclipse.jetty.server.handler.ErrorHandler;
import org.eclipse.jetty.servlet.ServletContextHandler;
import org.eclipse.jetty.util.log.Logger;
import org.eclipse.jetty.util.log.StdErrLog;

/**
 *
 * @author leandro-agapsys
 */
public class ServletContainerBuilder {

	// CLASS SCOPE =============================================================
	public static final String ROOT_PATH = "/";
	
	private static class NoLogger implements Logger {
		// CLASS SCOPE =========================================================
		private static NoLogger singletonInstance = null;
		
		public static NoLogger getSingletonInstance() {
			if (singletonInstance == null)
				singletonInstance = new NoLogger();
			
			return singletonInstance;
		}
		// =====================================================================
		
		// INSTANCE SCOPE ======================================================
		private NoLogger() {}
		
		@Override public String getName() { return ""; }
		@Override public void warn(String msg, Object... args) { }
		@Override public void warn(Throwable thrown) { }
		@Override public void warn(String msg, Throwable thrown) { }
		@Override public void info(String msg, Object... args) { }
		@Override public void info(Throwable thrown) { }
		@Override public void info(String msg, Throwable thrown) { }
		@Override public boolean isDebugEnabled() { return false; }
		@Override public void setDebugEnabled(boolean enabled) { }
		@Override public void debug(String msg, Object... args) { }
		@Override public void debug(Throwable thrown) { }
		@Override public void debug(String msg, Throwable thrown) { }
		@Override public Logger getLogger(String name) { return this; }
		@Override public void ignore(Throwable ignored) { }
		@Override public void debug(String arg0, long arg1) { }
		// =====================================================================
	}
	
	public static ServletContainer getServletContainer(Class...servletClasses) {
		ServletContainerBuilder containerBuilder = new ServletContainerBuilder();
		for (Class servletClass : servletClasses) {
			containerBuilder.registerServlet(servletClass);
		}
		return containerBuilder.build();
	}
	
	static {
		Map loggers = org.eclipse.jetty.util.log.Log.getLoggers();
		for (Map.Entry entry : loggers.entrySet()) {
			Logger logger = entry.getValue();
			
			((StdErrLog)logger).setLevel(StdErrLog.LEVEL_OFF);
		}
		
		org.eclipse.jetty.util.log.Log.setLog(NoLogger.getSingletonInstance());
	}
	// =========================================================================

	// INSTANCE SCOPE ==========================================================
	private final ServletContextHandlerBuilder contextHandlerBuilder;
	final Map contextBuilders = new LinkedHashMap<>();

	private Integer localPort = null;
	
	public ServletContainerBuilder() {
		contextHandlerBuilder = addRootContext();
	}
	
	private ServletContextHandlerBuilder addRootContext() {
		return addContext(ROOT_PATH);
	}

	private ServletContextHandlerBuilder addContext(String contextPath) {
		if (contextPath == null)
			throw new IllegalArgumentException("Null context path");

		contextPath = contextPath.trim();

		if (!contextPath.startsWith("/")) {
			contextPath = "/" + contextPath;
		}

		if (contextBuilders.containsKey(contextPath)) {
			throw new IllegalStateException("Context already defined: " + contextPath);
		}

		contextBuilders.put(contextPath, null);
		return new ServletContextHandlerBuilder(this, contextPath);
	}

	/**
	 * Registers an event listener with this context handler builder
	 * @param eventListener event listener to be registered
	 * @param append boolean indicating if given listener shall be appended. If false, given listener will be prepended.
	 * @return this
	 */
	public ServletContainerBuilder registerEventListener(Class eventListener, boolean append) {
		contextHandlerBuilder.registerEventListener(eventListener, append);
		return this;
	}
	
	/**
	 * Convenience method for registerEventListener(eventListener, true).
	 * @param eventListener event listener to be registered
	 * @return this
	 */
	public final ServletContainerBuilder registerEventListener(Class eventListener) {
		return registerEventListener(eventListener, true);
	}
	
	
	/**
	 * Registers a filter with this context handler builder
	 * @param filterClass filter class to be registered.
	 * @param urlPattern URL pattern associated with given filter
	 * @param append boolean indicating if given filter shall be appended. If false, given filter will be prepended.
	 * @return this
	 */
	public ServletContainerBuilder registerFilter(Class filterClass, String urlPattern, boolean append) {
		contextHandlerBuilder.registerFilter(filterClass, urlPattern, append);
		return this;
	}
	
	/**
	 * Convenience method for registerFilter(filterClass, urlPattern, true)
	 * @param filterClass filter class to be registered
	 * @param urlPattern URL pattern associated with given filter
	 * @return this
	 */
	public final ServletContainerBuilder registerFilter(Class filterClass, String urlPattern) {
		return registerFilter(filterClass, urlPattern, true);
	}
	
	/**
	 * Convenience method for registerFilter(filterClass).
	 * @param filterClass filter class to be registered. Informed class must be annotated with {@linkplain javax.servlet.annotation.WebFilter}.
	 * @return this
	 */
	public final ServletContainerBuilder registerFilter(Class filterClass) {
		contextHandlerBuilder.registerFilter(filterClass);
		return this;
	}
	
	
	/**
	 * Registers a servlet with this context handler builder.
	 * @param servletClass servlet class to be registered.
	 * @param urlPattern URL pattern associated with given servlet
	 * @return this
	 */
	public ServletContainerBuilder registerServlet(Class servletClass, String urlPattern) {
		contextHandlerBuilder.registerServlet(servletClass, urlPattern);
		return this;
	}
	
	/**
	 * Convenience method for registerServlet(servletClass).
	 * @param servletClass servlet class to be registered. Informed class must be annotated with {@linkplain javax.servlet.annotation.WebServlet}.
	 * @return this
	 */
	public final ServletContainerBuilder registerServlet(Class servletClass) {
		contextHandlerBuilder.registerServlet(servletClass);
		return this;
	}
	
	public ServletContainerBuilder registerErrorPage(int code, String url) {
		contextHandlerBuilder.registerErrorPage(code, url);
		return this;
	}
	
	public ServletContainerBuilder setErrorHandler(ErrorHandler errorHandler) {
		contextHandlerBuilder.setErrorHandler(errorHandler);
		return this;
	}
	
	public ServletContainerBuilder setLocalPort(int localPort) {
		if (this.localPort != null)
			throw new IllegalStateException("Local port is already set");
		
		if (localPort < 1 || localPort > 65535)
			throw new IllegalArgumentException("Invalid port: " + localPort);
		
		this.localPort = localPort;
		return this;
	}
	
	public ServletContainer build() {
		
		contextHandlerBuilder.endContext();

		if (localPort == null)
			localPort = 0;
		
		Server server = new Server(localPort);
		
		Handler[] handlers = new Handler[contextBuilders.size()];
		
		int i = 0;
		for (Map.Entry entry : contextBuilders.entrySet()) {
			ServletContextHandler servletContextHandler = entry.getValue().build();
			servletContextHandler.setContextPath(entry.getKey());
			handlers[i] = servletContextHandler;
			i++;
		}
		
		ContextHandlerCollection contextHandlerCollection = new ContextHandlerCollection();
		contextHandlerCollection.setHandlers(handlers);
		
		server.setHandler(contextHandlerCollection);

		return new ServletContainer(server);
	}
	// =========================================================================
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy