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

com.aspectran.undertow.server.handler.ServletRequestHandlerFactory Maven / Gradle / Ivy

The newest version!
/*
 * Copyright (c) 2008-2025 The Aspectran Project
 *
 * 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.aspectran.undertow.server.handler;

import com.aspectran.core.service.CoreService;
import com.aspectran.undertow.server.handler.logging.LoggingGroupAssistHandlerWrapper;
import com.aspectran.undertow.server.handler.resource.TowResourceHandler;
import com.aspectran.undertow.server.handler.session.SessionAttachmentHandler;
import com.aspectran.undertow.server.servlet.TowServletContext;
import com.aspectran.undertow.server.servlet.TowWebSocketServerContainerInitializer;
import com.aspectran.undertow.server.session.TowSessionManager;
import com.aspectran.utils.Assert;
import com.aspectran.utils.annotation.jsr305.NonNull;
import com.aspectran.web.service.DefaultWebService;
import com.aspectran.web.service.DefaultWebServiceBuilder;
import com.aspectran.web.service.WebService;
import com.aspectran.web.service.WebServiceClassLoader;
import io.undertow.server.HttpHandler;
import io.undertow.server.handlers.PathHandler;
import io.undertow.server.handlers.resource.ResourceManager;
import io.undertow.server.session.SessionConfig;
import io.undertow.server.session.SessionManager;
import io.undertow.servlet.api.Deployment;
import io.undertow.servlet.api.DeploymentInfo;
import io.undertow.servlet.api.DeploymentManager;
import io.undertow.servlet.api.ServletContainer;
import io.undertow.servlet.core.ServletContainerImpl;
import jakarta.servlet.ServletContext;

/**
 * 

Created: 2019-08-04

*/ public class ServletRequestHandlerFactory extends AbstractRequestHandlerFactory implements RequestHandlerFactory { private TowServletContext[] towServletContexts; private ServletContainer servletContainer; public void setServletContexts(TowServletContext... servletContexts) { Assert.notNull(servletContexts, "servletContexts must not be null"); this.towServletContexts = servletContexts; } public HttpHandler createHandler() throws Exception { createServletContainer(); PathHandler pathHandler = new PathHandler(); for (String deploymentName : servletContainer.listDeployments()) { DeploymentManager manager = servletContainer.getDeployment(deploymentName); HttpHandler handler = manager.start(); SessionManager sessionManager = manager.getDeployment().getSessionManager(); if (sessionManager != null) { SessionConfig sessionConfig = manager.getDeployment().getServletContext().getSessionConfig(); handler = new SessionAttachmentHandler(handler, sessionManager, sessionConfig); } DeploymentInfo info = manager.getDeployment().getDeploymentInfo(); String contextPath = info.getContextPath(); ResourceManager resourceManager = info.getResourceManager(); if (resourceManager != null) { TowResourceHandler resourceHandler = new TowResourceHandler(resourceManager, handler); String pathPrefix = contextPath; if (pathPrefix != null && pathPrefix.endsWith("/")) { pathPrefix = pathPrefix.substring(0, pathPrefix.length() - 1); } resourceHandler.autoDetect(pathPrefix); if (resourceHandler.hasPatterns()) { handler = resourceHandler; } } pathHandler.addPrefixPath(contextPath, handler); } return wrapHandler(pathHandler); } @Override public ServletContainer getServletContainer() { Assert.notNull(servletContainer, "servletContainer not yet created"); return servletContainer; } @Override public void dispose() throws Exception { disposeServletContainer(); } @NonNull private void createServletContainer() throws Exception { Assert.state(servletContainer == null, "ServletContainer is already configured"); servletContainer = new ServletContainerImpl(); if (towServletContexts == null) { towServletContexts = getActivityContext().getBeanRegistry().getBeansOfType(TowServletContext.class); } if (towServletContexts != null) { for (TowServletContext towServletContext : towServletContexts) { ClassLoader webServiceClassLoader = new WebServiceClassLoader(getActivityContext().getClassLoader()); towServletContext.setClassLoader(webServiceClassLoader); if (hasLoggingGroupHandlerWrapper()) { towServletContext.addOuterHandlerChainWrapper(new LoggingGroupAssistHandlerWrapper()); } DeploymentManager manager = servletContainer.addDeployment(towServletContext); manager.deploy(); ServletContext servletContext = manager.getDeployment().getServletContext(); DefaultWebService rootWebService = createRootWebService(servletContext); if (towServletContext.getTowSessionManager() != null) { towServletContext.getTowSessionManager().start(); // for lazy stop } else { rootWebService.setSessionAdaptable(false); } } } } private void disposeServletContainer() throws Exception { for (String deploymentName : getServletContainer().listDeployments()) { DeploymentManager manager = getServletContainer().getDeployment(deploymentName); if (manager != null) { Deployment deployment = manager.getDeployment(); SessionManager sessionManager = deployment.getSessionManager(); ServletContext servletContext = deployment.getServletContext(); DefaultWebService webService = WebService.findWebService(servletContext); if (webService.isActive()) { webService.pause(); } TowWebSocketServerContainerInitializer.destroy(deployment); manager.stop(); manager.undeploy(); disposeRootWebService(webService); if (sessionManager instanceof TowSessionManager towSessionManager) { towSessionManager.stop(); // for lazy stop } } } servletContainer = null; } @NonNull private DefaultWebService createRootWebService(ServletContext servletContext) throws Exception { CoreService masterService = getActivityContext().getMasterService(); DefaultWebService rootWebService = DefaultWebServiceBuilder.build(servletContext, masterService); if (rootWebService.isOrphan()) { rootWebService.start(); } return rootWebService; } private void disposeRootWebService(@NonNull DefaultWebService webService) { if (webService.isActive()) { webService.stop(); } webService.withdraw(); } }




© 2015 - 2025 Weber Informatics LLC | Privacy Policy