/** * Copyright (c) 2013-2016, The SeedStack authors <http://seedstack.org> * * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ package org.seedstack.seed.undertow.internal; import io.undertow.servlet.Servlets; import io.undertow.servlet.api.DeploymentInfo; import io.undertow.servlet.api.DeploymentManager; import io.undertow.servlet.api.InstanceFactory; import io.undertow.servlet.api.InstanceHandle; import io.undertow.servlet.api.ServletContainerInitializerInfo; import io.undertow.servlet.util.ImmediateInstanceHandle; import org.seedstack.coffig.Coffig; import org.seedstack.seed.web.WebConfig; import javax.servlet.ServletContainerInitializer; import java.util.HashSet; import java.util.ServiceLoader; import java.util.Set; class DeploymentManagerFactory { DeploymentManager createDeploymentManager(Coffig baseConfiguration) { WebConfig.ServerConfig serverConfig = baseConfiguration.get(WebConfig.ServerConfig.class); DeploymentInfo servletBuilder = configureDeploymentInfo(serverConfig.getContextPath()); return Servlets.defaultContainer().addDeployment(servletBuilder); } private DeploymentInfo configureDeploymentInfo(String contextPath) { DeploymentInfo deploymentInfo = Servlets.deployment() .setClassLoader(UndertowLauncher.class.getClassLoader()) .setDeploymentName("app.war") .setContextPath(contextPath); for (ServletContainerInitializer servletContainerInitializer : loadServletContainerInitializers()) { deploymentInfo.addServletContainerInitalizer(createServletContainerInitializerInfo(servletContainerInitializer)); } return deploymentInfo; } private <T extends ServletContainerInitializer> ServletContainerInitializerInfo createServletContainerInitializerInfo(final T servletContainerInitializer) { return new ServletContainerInitializerInfo(servletContainerInitializer.getClass(), () -> new ImmediateInstanceHandle<>(servletContainerInitializer), null); } private Set<ServletContainerInitializer> loadServletContainerInitializers() { Set<ServletContainerInitializer> servletContainerInitializers = new HashSet<>(); for (ServletContainerInitializer servletContainerInitializer : ServiceLoader.load(ServletContainerInitializer.class)) { servletContainerInitializers.add(servletContainerInitializer); } return servletContainerInitializers; } }