package com.revolsys.ui.web.controller; import java.io.IOException; import java.util.HashMap; import javax.servlet.RequestDispatcher; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequestWrapper; import javax.servlet.http.HttpServletResponse; import org.springframework.web.context.request.RequestAttributes; import org.springframework.web.context.request.RequestContextHolder; import org.springframework.web.multipart.support.DefaultMultipartHttpServletRequest; import org.springframework.web.servlet.ModelAndView; import org.springframework.web.servlet.mvc.Controller; import org.springframework.web.util.WebUtils; import com.revolsys.ui.web.exception.PageNotFoundException; import com.revolsys.ui.web.utils.HttpServletUtils; import com.revolsys.util.Property; public class PathAliasController implements Controller { public static final String PATH_PREFIX = PathAliasController.class.getName() + ".originalPrefix"; public static boolean forward(final HttpServletRequest request, final HttpServletResponse response, final String path) throws IOException, ServletException { final RequestDispatcher requestDispatcher = request.getRequestDispatcher(path); if (requestDispatcher == null) { return false; } else { final HttpServletRequest wrappedRequest; if (request instanceof DefaultMultipartHttpServletRequest) { final DefaultMultipartHttpServletRequest multiPartRequest = (DefaultMultipartHttpServletRequest)request; wrappedRequest = new DefaultMultipartHttpServletRequest(multiPartRequest, multiPartRequest.getMultiFileMap(), new HashMap<String, String[]>(), new HashMap<String, String>()) { @Override public String getPathInfo() { return path; } }; } else { wrappedRequest = new HttpServletRequestWrapper(request) { @Override public String getPathInfo() { return path; } }; } final Object forwardPath = request.getAttribute(WebUtils.FORWARD_REQUEST_URI_ATTRIBUTE); if (forwardPath == null) { final String originalUri = request.getRequestURI(); wrappedRequest.setAttribute(WebUtils.FORWARD_REQUEST_URI_ATTRIBUTE, originalUri); } requestDispatcher.forward(wrappedRequest, response); wrappedRequest.setAttribute(WebUtils.FORWARD_REQUEST_URI_ATTRIBUTE, forwardPath); } return true; } public static String getAlias() { return (String)HttpServletUtils.getAttribute(PATH_PREFIX); } public static String getOriginalPrefix() { final RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes(); final String prefix = (String)requestAttributes.getAttribute(PATH_PREFIX, RequestAttributes.SCOPE_REQUEST); if (Property.hasValue(prefix)) { return prefix; } else { return ""; } } public static String getPath(final String path) { if (path == null) { return path; } else if (path.startsWith("/")) { final String prefix = getOriginalPrefix(); if (prefix.length() > 0) { return prefix + path; } else { return path; } } else { return path; } } private String aliasPrefix; private String prefix; public String getAliasPrefix() { return this.aliasPrefix; } public String getPrefix() { return this.prefix; } @Override public ModelAndView handleRequest(final HttpServletRequest request, final HttpServletResponse response) throws Exception { String path = request.getServletPath() + request.getPathInfo(); if (path.startsWith(this.prefix)) { if (getOriginalPrefix().length() == 0) { final RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes(); requestAttributes.setAttribute(PATH_PREFIX, this.prefix.replaceAll(this.aliasPrefix + "$", ""), RequestAttributes.SCOPE_REQUEST); } path = path.replaceFirst(this.prefix, this.aliasPrefix); if (!forward(request, response, path)) { throw new PageNotFoundException(); } } return null; } public void setAliasPrefix(final String aliasPrefix) { this.aliasPrefix = aliasPrefix; } public void setPrefix(final String prefix) { this.prefix = prefix; } }