net.solarnetwork.web.support.UrlPathThemeResolver.java Source code

Java tutorial

Introduction

Here is the source code for net.solarnetwork.web.support.UrlPathThemeResolver.java

Source

/* ==================================================================
 * UrlPathThemeResolver.java - Apr 28, 2012 8:38:38 PM
 * 
 * Copyright 2007-2012 SolarNetwork.net Dev Team
 * 
 * This program is free software; you can redistribute it and/or 
 * modify it under the terms of the GNU General Public License as 
 * published by the Free Software Foundation; either version 2 of 
 * the License, or (at your option) any later version.
 * 
 * This program is distributed in the hope that it will be useful, 
 * but WITHOUT ANY WARRANTY; without even the implied warranty of 
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 
 * General Public License for more details.
 * 
 * You should have received a copy of the GNU General Public License 
 * along with this program; if not, write to the Free Software 
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 
 * 02111-1307 USA
 * ==================================================================
 * $Id$
 * ==================================================================
 */

package net.solarnetwork.web.support;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

import javax.servlet.ServletRequest;
import javax.servlet.ServletRequestWrapper;
import javax.servlet.http.HttpServletRequest;

import org.springframework.web.servlet.ThemeResolver;
import org.springframework.web.servlet.theme.CookieThemeResolver;

/**
 * {@link ThemeResolver} that resolves a theme name from a URL path variable.
 * 
 * <p>This class extends {@link CookieThemeResolver} and as such uses cookies
 * to persist the theme with the client browser. The theme can be changed
 * (or initially set) by passing a URL path variable with the HTTP request,
 * for example {@code /path/to/something.html;theme=mytheme}.</p>
 * 
 * <p>The configurable properties of this class are:</p>
 * 
 * <dl class="class-properties">
 *   <dt>themePathVariable</dt>
 *   <dd>The name of the URL path variable to look for the current theme in.
 *   Defaults to {@link #DEFAULT_THEME_PATH_VARIABLE}.</dd>
 * </dl>
 * 
 * @author matt
 * @version $Revision$
 */
public class UrlPathThemeResolver extends CookieThemeResolver {

    /** Default value for the {@link themePathVariable} property. */
    public static final String DEFAULT_THEME_PATH_VARIABLE = "theme";

    private String themePathVariable;
    private Pattern urlPattern;

    /**
     * Default constructor.
     */
    public UrlPathThemeResolver() {
        super();
        setThemePathVariable(DEFAULT_THEME_PATH_VARIABLE);
    }

    private HttpServletRequest originalRequest(HttpServletRequest request) {
        if (request instanceof ServletRequestWrapper) {
            ServletRequest wrapped = ((ServletRequestWrapper) request).getRequest();
            if (wrapped instanceof HttpServletRequest) {
                return originalRequest((HttpServletRequest) wrapped);
            }
        }
        return request;
    }

    @Override
    public String resolveThemeName(HttpServletRequest request) {
        String themeName = super.resolveThemeName(request);

        // look on the original request for the theme path, in case we've been 
        // forwarded to another request, e.g. /WEB-INF/jsp/index.jsp from
        // original request /myapp/;theme=foo
        String path = originalRequest(request).getRequestURI();
        Matcher m = urlPattern.matcher(path);
        if (m.find()) {
            themeName = m.group(1).toLowerCase();
        }
        return themeName;
    }

    public String getThemePathVariable() {
        return themePathVariable;
    }

    public void setThemePathVariable(String themePathVariable) {
        this.themePathVariable = themePathVariable;
        urlPattern = Pattern.compile("\\b" + themePathVariable + "=(\\w+)", Pattern.CASE_INSENSITIVE);
    }

}