package org.giavacms.common.view; import java.util.List; import java.util.Map; import javax.faces.application.ViewHandler; import javax.faces.application.ViewHandlerWrapper; import javax.faces.context.FacesContext; import javax.servlet.http.HttpServletRequest; import org.giavacms.common.filter.MappingFilter; import org.jboss.logging.Logger; public class MappingViewHandler extends ViewHandlerWrapper { private static final String ROOT_PATH = "/"; Logger logger = Logger.getLogger(getClass()); private ViewHandler wrappedHandler; public MappingViewHandler(ViewHandler defaultHandler) { this.wrappedHandler = defaultHandler; } @Override public ViewHandler getWrapped() { return wrappedHandler; } /** * This is the only method needed to be extended. First, we get the normal URL form the original ViewHandler. Then we * simply return the same URL with the extension stripped of. */ public String getActionURL(FacesContext context, String viewId) { HttpServletRequest httpServletRequest = (HttpServletRequest) context .getExternalContext().getRequest(); Object originalUri = httpServletRequest.getAttribute(MappingFilter.ORIGINAL_URI_ATTRIBUTE_NAME); if (originalUri != null && !originalUri.toString().isEmpty()) { return originalUri.toString(); } else { return getWrapped().getActionURL(context, viewId); } } @Override public String getRedirectURL(FacesContext paramFacesContext, String paramString, Map<String, List<String>> paramMap, boolean paramBoolean) { logger.debug("getRedirectURL: " + paramString); if (paramString == null || paramString.isEmpty()) { return super.getRedirectURL(paramFacesContext, paramString, paramMap, paramBoolean); } for (String reservedPath : MappingFilter.getReservedPaths()) { if (paramString.startsWith(reservedPath)) { return super.getRedirectURL(paramFacesContext, paramString, paramMap, paramBoolean); } } paramString = paramString.replace(MappingFilter.getPagesPath(), ROOT_PATH); int dotIdx = paramString.lastIndexOf("."); if (dotIdx > 0) { paramString = paramString.substring(0, dotIdx); } logger.debug("getRedirectURL rewrite:" + paramString); HttpServletRequest httpServletRequest = (HttpServletRequest) paramFacesContext .getExternalContext().getRequest(); httpServletRequest.setAttribute(MappingFilter.ORIGINAL_URI_ATTRIBUTE_NAME, paramString); return super.getRedirectURL(paramFacesContext, paramString, paramMap, paramBoolean); } }