/* * Copyright 2010 Lincoln Baxter, III * * 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.ocpsoft.pretty.faces.application; import java.io.IOException; import javax.faces.context.ExternalContext; import javax.faces.context.FacesContext; import javax.servlet.http.HttpServletResponse; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import com.ocpsoft.pretty.PrettyContext; import com.ocpsoft.pretty.PrettyException; import com.ocpsoft.pretty.faces.beans.ExtractedValuesURLBuilder; import com.ocpsoft.pretty.faces.config.PrettyConfig; import com.ocpsoft.pretty.faces.config.mapping.UrlMapping; import com.ocpsoft.pretty.faces.url.QueryString; import com.ocpsoft.pretty.faces.url.URL; /** * @author Lincoln Baxter, III <lincoln@ocpsoft.com> */ public class PrettyRedirector { private static final Log log = LogFactory.getLog(PrettyRedirector.class); private final ExtractedValuesURLBuilder builder = new ExtractedValuesURLBuilder(); public static PrettyRedirector getInstance() { return new PrettyRedirector(); } public boolean redirect(final FacesContext context, final String action) { try { PrettyContext prettyContext = PrettyContext.getCurrentInstance(context); PrettyConfig config = prettyContext.getConfig(); ExternalContext externalContext = context.getExternalContext(); String contextPath = prettyContext.getContextPath(); if (PrettyContext.PRETTY_PREFIX.equals(action) && prettyContext.isPrettyRequest()) { URL url = prettyContext.getRequestURL(); QueryString query = prettyContext.getRequestQueryString(); String target = contextPath + url.encode() + query.toQueryString(); log.trace("Refreshing requested page [" + url + "]"); encodeURL(externalContext, config, target); return true; } else if (isPrettyNavigationCase(prettyContext, action)) { UrlMapping mapping = config.getMappingById(action); if (mapping != null) { String target = contextPath + builder.buildURL(mapping).encode() + builder.buildQueryString(mapping); log.trace("Redirecting to mappingId [" + mapping.getId() + "], [" + target + "]"); encodeURL(externalContext, config, target); } else { throw new PrettyException("PrettyFaces: Invalid mapping id supplied to navigation handler: " + action); } return true; } } catch (IOException e) { throw new RuntimeException("PrettyFaces: redirect failed for target: " + action, e); } return false; } private void encodeURL(ExternalContext externalContext, PrettyConfig config, String target) throws IOException { String redirectUrl = externalContext.encodeActionURL(target); if (config.isUseEncodeUrlForRedirects()) { redirectUrl = ((HttpServletResponse) externalContext.getResponse()).encodeURL(redirectUrl); } else { redirectUrl = ((HttpServletResponse) externalContext.getResponse()).encodeRedirectURL(redirectUrl); } externalContext.redirect(redirectUrl); } public void send404(final FacesContext facesContext) { try { HttpServletResponse response = (HttpServletResponse) facesContext.getExternalContext().getResponse(); response.sendError(HttpServletResponse.SC_NOT_FOUND); } catch (IOException e) { throw new PrettyException(e); } } private boolean isPrettyNavigationCase(final PrettyContext prettyContext, final String action) { PrettyConfig config = prettyContext.getConfig(); return (action != null) && config.isMappingId(action) && action.trim().startsWith(PrettyContext.PRETTY_PREFIX); } }