package org.frameworkset.web.request.async; import javax.servlet.ServletRequest; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.frameworkset.util.ClassUtils; import org.frameworkset.web.servlet.context.RequestAttributes; import org.frameworkset.web.servlet.mvc.WebRequest; /** * Utility methods related to processing asynchronous web requests. * * @author Rossen Stoyanchev * @author Juergen Hoeller * @since 3.2 */ public abstract class WebAsyncUtils { public static final String WEB_ASYNC_MANAGER_ATTRIBUTE = WebAsyncManager.class.getName() + ".WEB_ASYNC_MANAGER"; // Determine whether Servlet 3.0's ServletRequest.startAsync method is available private static final boolean startAsyncAvailable = ClassUtils.hasMethod(ServletRequest.class, "startAsync"); /** * Obtain the {@link WebAsyncManager} for the current request, or if not * found, create and associate it with the request. */ public static WebAsyncManager getAsyncManager(ServletRequest servletRequest) { WebAsyncManager asyncManager = (WebAsyncManager) servletRequest.getAttribute(WEB_ASYNC_MANAGER_ATTRIBUTE); if (asyncManager == null) { asyncManager = new WebAsyncManager(); servletRequest.setAttribute(WEB_ASYNC_MANAGER_ATTRIBUTE, asyncManager); } return asyncManager; } /** * Obtain the {@link WebAsyncManager} for the current request, or if not * found, create and associate it with the request. */ public static WebAsyncManager getAsyncManager(WebRequest webRequest) { int scope = RequestAttributes.SCOPE_REQUEST; WebAsyncManager asyncManager = (WebAsyncManager) webRequest.getAttribute(WEB_ASYNC_MANAGER_ATTRIBUTE, scope); if (asyncManager == null) { asyncManager = new WebAsyncManager(); webRequest.setAttribute(WEB_ASYNC_MANAGER_ATTRIBUTE, asyncManager, scope); } return asyncManager; } /** * Create an AsyncWebRequest instance. By default, an instance of * {@link StandardServletAsyncWebRequest} gets created when running in * Servlet 3.0 (or higher) environment - as a fallback, an instance * of {@link NoSupportAsyncWebRequest} will be returned. * @param request the current request * @param response the current response * @return an AsyncWebRequest instance (never {@code null}) */ public static AsyncWebRequest createAsyncWebRequest(HttpServletRequest request, HttpServletResponse response) { return (startAsyncAvailable ? AsyncWebRequestFactory.createStandardAsyncWebRequest(request, response) : new NoSupportAsyncWebRequest(request, response)); } /** * Inner class to avoid a hard dependency on the Servlet 3.0 API. */ private static class AsyncWebRequestFactory { public static AsyncWebRequest createStandardAsyncWebRequest(HttpServletRequest request, HttpServletResponse response) { return new StandardServletAsyncWebRequest(request, response); } } }