/* * Title: ConfigDecoratorMapper * Description: * * This software is published under the terms of the OpenSymphony Software * License version 1.1, of which a copy has been included with this * distribution in the LICENSE.txt file. */ package com.opensymphony.module.sitemesh.mapper; import com.opensymphony.module.sitemesh.Config; import com.opensymphony.module.sitemesh.Decorator; import com.opensymphony.module.sitemesh.DecoratorMapper; import com.opensymphony.module.sitemesh.Page; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import java.util.Properties; /** * Default implementation of DecoratorMapper. Reads decorators and * mappings from the <code>config</code> property (default '/WEB-INF/decorators.xml'). * * @author <a href="joe@truemesh.com">Joe Walnes</a> * @author <a href="mcannon@internet.com">Mike Cannon-Brookes</a> * @version $Revision: 1.2 $ * * @see com.opensymphony.module.sitemesh.DecoratorMapper * @see com.opensymphony.module.sitemesh.mapper.DefaultDecorator * @see com.opensymphony.module.sitemesh.mapper.ConfigLoader */ public class ConfigDecoratorMapper extends AbstractDecoratorMapper { private ConfigLoader configLoader = null; /** Create new ConfigLoader using '/WEB-INF/decorators.xml' file. */ public void init(Config config, Properties properties, DecoratorMapper parent) throws InstantiationException { super.init(config, properties, parent); try { String fileName = properties.getProperty("config", "/WEB-INF/decorators.xml"); configLoader = new ConfigLoader(fileName, config); } catch (Exception e) { throw new InstantiationException(e.toString()); } } /** Retrieve {@link com.opensymphony.module.sitemesh.Decorator} based on 'pattern' tag. */ public Decorator getDecorator(HttpServletRequest request, Page page) { String thisPath = request.getServletPath(); // getServletPath() returns null unless the mapping corresponds to a servlet if (thisPath == null) { String requestURI = request.getRequestURI(); if (request.getPathInfo() != null) { // strip the pathInfo from the requestURI thisPath = requestURI.substring(0, requestURI.indexOf(request.getPathInfo())); } else { thisPath = requestURI; } } else if ("".equals(thisPath)) { // in servlet 2.4, if a request is mapped to '/*', getServletPath returns null (SIM-130) thisPath = request.getPathInfo(); } String name = null; try { name = configLoader.getMappedName(thisPath); } catch (ServletException e) { e.printStackTrace(); } Decorator result = getNamedDecorator(request, name); return result == null ? super.getDecorator(request, page) : result; } /** Retrieve Decorator named in 'name' attribute. Checks the role if specified. */ public Decorator getNamedDecorator(HttpServletRequest request, String name) { Decorator result = null; try { result = configLoader.getDecoratorByName(name); } catch (ServletException e) { e.printStackTrace(); } if (result == null || (result.getRole() != null && !request.isUserInRole(result.getRole()))) { // if the result is null or the user is not in the role return super.getNamedDecorator(request, name); } else { return result; } } }