Author: mrdon Date: Sat Sep 23 23:49:04 2006 New Revision: 449367 URL: http://svn.apache.org/viewvc?view=rev&rev=449367 Log: Modified the process of getting the configuration so that it would only look for unmodified files once per request, and not for static resources. The problem arose when I modified the ActionMapper to take into consideration when determining the action mapping (allows action names with slashes). The Configuration was being checked before it determined if the request was for a static file or not.
WW-493 Modified: struts/struts2/trunk/core/src/main/java/org/apache/struts2/config/StrutsXmlConfigurationProvider.java struts/struts2/trunk/core/src/main/java/org/apache/struts2/dispatcher/FilterDispatcher.java struts/struts2/trunk/core/src/main/java/org/apache/struts2/dispatcher/ServletRedirectResult.java struts/struts2/trunk/core/src/main/java/org/apache/struts2/dispatcher/mapper/ActionMapper.java struts/struts2/trunk/core/src/main/java/org/apache/struts2/dispatcher/mapper/DefaultActionMapper.java struts/struts2/trunk/core/src/main/java/org/apache/struts2/dispatcher/mapper/RestfulActionMapper.java struts/struts2/trunk/core/src/main/java/org/apache/struts2/views/jsp/TagUtils.java struts/struts2/trunk/core/src/test/java/org/apache/struts2/dispatcher/FilterDispatcherTest.java struts/struts2/trunk/core/src/test/java/org/apache/struts2/dispatcher/NullActionMapper.java struts/struts2/trunk/core/src/test/java/org/apache/struts2/dispatcher/mapper/DefaultActionMapperTest.java Modified: struts/struts2/trunk/core/src/main/java/org/apache/struts2/config/StrutsXmlConfigurationProvider.java URL: http://svn.apache.org/viewvc/struts/struts2/trunk/core/src/main/java/org/apache/struts2/config/StrutsXmlConfigurationProvider.java?view=diff&rev=449367&r1=449366&r2=449367 ============================================================================== --- struts/struts2/trunk/core/src/main/java/org/apache/struts2/config/StrutsXmlConfigurationProvider.java (original) +++ struts/struts2/trunk/core/src/main/java/org/apache/struts2/config/StrutsXmlConfigurationProvider.java Sat Sep 23 23:49:04 2006 @@ -20,6 +20,7 @@ import org.apache.commons.logging.LogFactory; import org.apache.struts2.StrutsException; +import com.opensymphony.xwork2.ActionContext; import com.opensymphony.xwork2.config.providers.XmlConfigurationProvider; /** @@ -29,6 +30,7 @@ private static final Log LOG = LogFactory.getLog(StrutsXmlConfigurationProvider.class); private File baseDir = null; + private String filename; /** * Constructs the configuration provider @@ -47,7 +49,7 @@ */ public StrutsXmlConfigurationProvider(String filename, boolean errorIfMissing) { super(filename, errorIfMissing); - + this.filename = filename; Map<String,String> dtdMappings = new HashMap<String,String>(getDtdMappings()); dtdMappings.put("-//Apache Software Foundation//DTD Struts Configuration 2.0//EN", "struts-2.0.dtd"); setDtdMappings(dtdMappings); @@ -101,4 +103,21 @@ } return url; } + + /** + * Overrides needs reload to ensure it is only checked once per request + */ + @Override + public boolean needsReload() { + ActionContext ctx = ActionContext.getContext(); + String key = "configurationReload-"+filename; + if (ctx.get(key) == null) { + ctx.put(key, Boolean.TRUE); + return super.needsReload(); + } + return false; + + } + + } Modified: struts/struts2/trunk/core/src/main/java/org/apache/struts2/dispatcher/FilterDispatcher.java URL: http://svn.apache.org/viewvc/struts/struts2/trunk/core/src/main/java/org/apache/struts2/dispatcher/FilterDispatcher.java?view=diff&rev=449367&r1=449366&r2=449367 ============================================================================== --- struts/struts2/trunk/core/src/main/java/org/apache/struts2/dispatcher/FilterDispatcher.java (original) +++ struts/struts2/trunk/core/src/main/java/org/apache/struts2/dispatcher/FilterDispatcher.java Sat Sep 23 23:49:04 2006 @@ -220,7 +220,7 @@ ActionMapping mapping = null; try { mapper = ActionMapperFactory.getMapper(); - mapping = mapper.getMapping(request, du.getConfigurationManager().getConfiguration()); + mapping = mapper.getMapping(request, du.getConfigurationManager()); } catch (Exception ex) { du.sendError(request, response, servletContext, response.SC_INTERNAL_SERVER_ERROR, ex); ActionContextCleanUp.cleanUp(req); Modified: struts/struts2/trunk/core/src/main/java/org/apache/struts2/dispatcher/ServletRedirectResult.java URL: http://svn.apache.org/viewvc/struts/struts2/trunk/core/src/main/java/org/apache/struts2/dispatcher/ServletRedirectResult.java?view=diff&rev=449367&r1=449366&r2=449367 ============================================================================== --- struts/struts2/trunk/core/src/main/java/org/apache/struts2/dispatcher/ServletRedirectResult.java (original) +++ struts/struts2/trunk/core/src/main/java/org/apache/struts2/dispatcher/ServletRedirectResult.java Sat Sep 23 23:49:04 2006 @@ -105,7 +105,7 @@ if (isPathUrl(finalLocation)) { if (!finalLocation.startsWith("/")) { String namespace = ActionMapperFactory.getMapper().getMapping( - request, Dispatcher.getInstance().getConfigurationManager().getConfiguration()).getNamespace(); + request, Dispatcher.getInstance().getConfigurationManager()).getNamespace(); if ((namespace != null) && (namespace.length() > 0) && (!"/".equals(namespace))) { finalLocation = namespace + "/" + finalLocation; Modified: struts/struts2/trunk/core/src/main/java/org/apache/struts2/dispatcher/mapper/ActionMapper.java URL: http://svn.apache.org/viewvc/struts/struts2/trunk/core/src/main/java/org/apache/struts2/dispatcher/mapper/ActionMapper.java?view=diff&rev=449367&r1=449366&r2=449367 ============================================================================== --- struts/struts2/trunk/core/src/main/java/org/apache/struts2/dispatcher/mapper/ActionMapper.java (original) +++ struts/struts2/trunk/core/src/main/java/org/apache/struts2/dispatcher/mapper/ActionMapper.java Sat Sep 23 23:49:04 2006 @@ -19,7 +19,8 @@ import javax.servlet.http.HttpServletRequest; -import com.opensymphony.xwork2.config.Configuration; +import com.opensymphony.xwork2.config.ConfigurationManager; + /** * <!-- START SNIPPET: javadoc --> @@ -43,10 +44,10 @@ * Gets an action mapping for the current request * * @param request The servlet request - * @param config The current configuration + * @param config The current configuration manager * @return The appropriate action mapping */ - ActionMapping getMapping(HttpServletRequest request, Configuration config); + ActionMapping getMapping(HttpServletRequest request, ConfigurationManager configManager); /** * Converts an ActionMapping into a URI string Modified: struts/struts2/trunk/core/src/main/java/org/apache/struts2/dispatcher/mapper/DefaultActionMapper.java URL: http://svn.apache.org/viewvc/struts/struts2/trunk/core/src/main/java/org/apache/struts2/dispatcher/mapper/DefaultActionMapper.java?view=diff&rev=449367&r1=449366&r2=449367 ============================================================================== --- struts/struts2/trunk/core/src/main/java/org/apache/struts2/dispatcher/mapper/DefaultActionMapper.java (original) +++ struts/struts2/trunk/core/src/main/java/org/apache/struts2/dispatcher/mapper/DefaultActionMapper.java Sat Sep 23 23:49:04 2006 @@ -31,6 +31,7 @@ import org.apache.struts2.util.PrefixTrie; import com.opensymphony.xwork2.config.Configuration; +import com.opensymphony.xwork2.config.ConfigurationManager; import com.opensymphony.xwork2.config.entities.PackageConfig; /** @@ -204,11 +205,16 @@ /* (non-Javadoc) * @see org.apache.struts2.dispatcher.mapper.ActionMapper#getMapping(javax.servlet.http.HttpServletRequest) */ - public ActionMapping getMapping(HttpServletRequest request, Configuration config) { + public ActionMapping getMapping(HttpServletRequest request, ConfigurationManager configManager) { ActionMapping mapping = new ActionMapping(); String uri = getUri(request); - parseNameAndNamespace(uri, mapping, config); + uri = dropExtension(uri); + if (uri == null) { + return null; + } + + parseNameAndNamespace(uri, mapping, configManager.getConfiguration()); handleSpecialParameters(request, mapping); @@ -282,7 +288,7 @@ name = uri.substring(namespace.length() + 1); } mapping.setNamespace(namespace); - mapping.setName(dropExtension(name)); + mapping.setName(name); } /** Modified: struts/struts2/trunk/core/src/main/java/org/apache/struts2/dispatcher/mapper/RestfulActionMapper.java URL: http://svn.apache.org/viewvc/struts/struts2/trunk/core/src/main/java/org/apache/struts2/dispatcher/mapper/RestfulActionMapper.java?view=diff&rev=449367&r1=449366&r2=449367 ============================================================================== --- struts/struts2/trunk/core/src/main/java/org/apache/struts2/dispatcher/mapper/RestfulActionMapper.java (original) +++ struts/struts2/trunk/core/src/main/java/org/apache/struts2/dispatcher/mapper/RestfulActionMapper.java Sat Sep 23 23:49:04 2006 @@ -29,7 +29,8 @@ import org.apache.commons.logging.LogFactory; import org.apache.struts2.RequestUtils; -import com.opensymphony.xwork2.config.Configuration; +import com.opensymphony.xwork2.config.ConfigurationManager; + /** * A custom action mapper using the following format: @@ -60,7 +61,7 @@ /* (non-Javadoc) * @see org.apache.struts2.dispatcher.mapper.ActionMapper#getMapping(javax.servlet.http.HttpServletRequest) */ - public ActionMapping getMapping(HttpServletRequest request, Configuration config) { + public ActionMapping getMapping(HttpServletRequest request, ConfigurationManager configManager) { String uri = RequestUtils.getServletPath(request); int nextSlash = uri.indexOf('/', 1); Modified: struts/struts2/trunk/core/src/main/java/org/apache/struts2/views/jsp/TagUtils.java URL: http://svn.apache.org/viewvc/struts/struts2/trunk/core/src/main/java/org/apache/struts2/views/jsp/TagUtils.java?view=diff&rev=449367&r1=449366&r2=449367 ============================================================================== --- struts/struts2/trunk/core/src/main/java/org/apache/struts2/views/jsp/TagUtils.java (original) +++ struts/struts2/trunk/core/src/main/java/org/apache/struts2/views/jsp/TagUtils.java Sat Sep 23 23:49:04 2006 @@ -84,7 +84,7 @@ if (invocation == null) { ActionMapper mapper = ActionMapperFactory.getMapper(); ActionMapping mapping = mapper.getMapping(request, - Dispatcher.getInstance().getConfigurationManager().getConfiguration()); + Dispatcher.getInstance().getConfigurationManager()); if (mapping != null) { return mapping.getNamespace(); Modified: struts/struts2/trunk/core/src/test/java/org/apache/struts2/dispatcher/FilterDispatcherTest.java URL: http://svn.apache.org/viewvc/struts/struts2/trunk/core/src/test/java/org/apache/struts2/dispatcher/FilterDispatcherTest.java?view=diff&rev=449367&r1=449366&r2=449367 ============================================================================== --- struts/struts2/trunk/core/src/test/java/org/apache/struts2/dispatcher/FilterDispatcherTest.java (original) +++ struts/struts2/trunk/core/src/test/java/org/apache/struts2/dispatcher/FilterDispatcherTest.java Sat Sep 23 23:49:04 2006 @@ -41,7 +41,6 @@ import com.mockobjects.servlet.MockFilterChain; import com.opensymphony.xwork2.ObjectFactory; -import com.opensymphony.xwork2.config.Configuration; import com.opensymphony.xwork2.config.ConfigurationManager; import com.opensymphony.xwork2.config.impl.DefaultConfiguration; @@ -258,7 +257,7 @@ public static class InnerActionMapper implements ActionMapper { - public ActionMapping getMapping(HttpServletRequest request, Configuration config) { + public ActionMapping getMapping(HttpServletRequest request, ConfigurationManager config) { return new ActionMapping(); } @@ -268,7 +267,7 @@ } public static class NullActionMapper implements ActionMapper { - public ActionMapping getMapping(HttpServletRequest request, Configuration config) { + public ActionMapping getMapping(HttpServletRequest request, ConfigurationManager config) { return null; } Modified: struts/struts2/trunk/core/src/test/java/org/apache/struts2/dispatcher/NullActionMapper.java URL: http://svn.apache.org/viewvc/struts/struts2/trunk/core/src/test/java/org/apache/struts2/dispatcher/NullActionMapper.java?view=diff&rev=449367&r1=449366&r2=449367 ============================================================================== --- struts/struts2/trunk/core/src/test/java/org/apache/struts2/dispatcher/NullActionMapper.java (original) +++ struts/struts2/trunk/core/src/test/java/org/apache/struts2/dispatcher/NullActionMapper.java Sat Sep 23 23:49:04 2006 @@ -22,7 +22,8 @@ import org.apache.struts2.dispatcher.mapper.ActionMapper; import org.apache.struts2.dispatcher.mapper.ActionMapping; -import com.opensymphony.xwork2.config.Configuration; +import com.opensymphony.xwork2.config.ConfigurationManager; + /** * ActionMapper for testing FilterDispatcher (used in FilterDispaatcherTest) @@ -37,7 +38,7 @@ _actionMapping = actionMappingToBeRetrned; } - public ActionMapping getMapping(HttpServletRequest request, Configuration config) { + public ActionMapping getMapping(HttpServletRequest request, ConfigurationManager config) { return _actionMapping; } Modified: struts/struts2/trunk/core/src/test/java/org/apache/struts2/dispatcher/mapper/DefaultActionMapperTest.java URL: http://svn.apache.org/viewvc/struts/struts2/trunk/core/src/test/java/org/apache/struts2/dispatcher/mapper/DefaultActionMapperTest.java?view=diff&rev=449367&r1=449366&r2=449367 ============================================================================== --- struts/struts2/trunk/core/src/test/java/org/apache/struts2/dispatcher/mapper/DefaultActionMapperTest.java (original) +++ struts/struts2/trunk/core/src/test/java/org/apache/struts2/dispatcher/mapper/DefaultActionMapperTest.java Sat Sep 23 23:49:04 2006 @@ -25,9 +25,11 @@ import org.apache.struts2.dispatcher.ServletRedirectResult; import org.apache.struts2.views.jsp.StrutsMockHttpServletRequest; +import com.mockobjects.dynamic.Mock; import com.mockobjects.servlet.MockHttpServletRequest; import com.opensymphony.xwork2.Result; import com.opensymphony.xwork2.config.Configuration; +import com.opensymphony.xwork2.config.ConfigurationManager; import com.opensymphony.xwork2.config.entities.PackageConfig; import com.opensymphony.xwork2.config.impl.DefaultConfiguration; @@ -38,6 +40,7 @@ public class DefaultActionMapperTest extends StrutsTestCase { private MockHttpServletRequest req; + private ConfigurationManager configManager; private Configuration config; protected void setUp() throws Exception { @@ -51,6 +54,11 @@ PackageConfig pkg2 = new PackageConfig("my", "/my", false, null); config.addPackageConfig("mvns", pkg); config.addPackageConfig("my", pkg2); + configManager = new ConfigurationManager() { + public Configuration getConfiguration() { + return config; + } + }; } public void testGetMapping() throws Exception { @@ -61,7 +69,7 @@ req.addExpectedGetAttributeName("javax.servlet.include.servlet_path"); DefaultActionMapper mapper = new DefaultActionMapper(); - ActionMapping mapping = mapper.getMapping(req, config); + ActionMapping mapping = mapper.getMapping(req, configManager); assertEquals("/my/namespace", mapping.getNamespace()); assertEquals("actionName", mapping.getName()); @@ -76,7 +84,7 @@ req.addExpectedGetAttributeName("javax.servlet.include.servlet_path"); DefaultActionMapper mapper = new DefaultActionMapper(); - ActionMapping mapping = mapper.getMapping(req, config); + ActionMapping mapping = mapper.getMapping(req, configManager); assertEquals("/my/namespace", mapping.getNamespace()); assertEquals("actionName", mapping.getName()); @@ -91,7 +99,7 @@ req.addExpectedGetAttributeName("javax.servlet.include.servlet_path"); DefaultActionMapper mapper = new DefaultActionMapper(); - ActionMapping mapping = mapper.getMapping(req, config); + ActionMapping mapping = mapper.getMapping(req, configManager); assertEquals("/my", mapping.getNamespace()); assertEquals("foo/actionName", mapping.getName()); @@ -106,7 +114,7 @@ req.addExpectedGetAttributeName("javax.servlet.include.servlet_path"); DefaultActionMapper mapper = new DefaultActionMapper(); - ActionMapping mapping = mapper.getMapping(req, config); + ActionMapping mapping = mapper.getMapping(req, configManager); assertEquals("", mapping.getNamespace()); assertEquals("bo/foo/actionName", mapping.getName()); @@ -121,7 +129,7 @@ req.addExpectedGetAttributeName("javax.servlet.include.servlet_path"); DefaultActionMapper mapper = new DefaultActionMapper(); - ActionMapping mapping = mapper.getMapping(req, config); + ActionMapping mapping = mapper.getMapping(req, configManager); assertEquals("/my/namespace/actionName.action", mapper.getUriFromActionMapping(mapping)); } @@ -133,7 +141,7 @@ req.addExpectedGetAttributeName("javax.servlet.include.servlet_path"); DefaultActionMapper mapper = new DefaultActionMapper(); - ActionMapping mapping = mapper.getMapping(req, config); + ActionMapping mapping = mapper.getMapping(req, configManager); assertEquals("/my/namespace/actionName!add.action", mapper.getUriFromActionMapping(mapping)); } @@ -149,7 +157,7 @@ req.addExpectedGetAttributeName("javax.servlet.include.servlet_path"); DefaultActionMapper mapper = new DefaultActionMapper(); - ActionMapping mapping = mapper.getMapping(req, config); + ActionMapping mapping = mapper.getMapping(req, configManager); assertEquals("/my/namespace", mapping.getNamespace()); assertEquals("actionName", mapping.getName()); @@ -208,7 +216,7 @@ request.setupGetServletPath("/someServletPath.action"); DefaultActionMapper defaultActionMapper = new DefaultActionMapper(); - ActionMapping actionMapping = defaultActionMapper.getMapping(request, config); + ActionMapping actionMapping = defaultActionMapper.getMapping(request, configManager); assertEquals(actionMapping.getName(), "myAction"); } @@ -222,7 +230,7 @@ request.setParameterMap(parameterMap); DefaultActionMapper defaultActionMapper = new DefaultActionMapper(); - ActionMapping actionMapping = defaultActionMapper.getMapping(request, config); + ActionMapping actionMapping = defaultActionMapper.getMapping(request, configManager); Result result = actionMapping.getResult(); assertNotNull(result); @@ -240,7 +248,7 @@ request.setParameterMap(parameterMap); DefaultActionMapper defaultActionMapper = new DefaultActionMapper(); - ActionMapping actionMapping = defaultActionMapper.getMapping(request, config); + ActionMapping actionMapping = defaultActionMapper.getMapping(request, configManager); Result result = actionMapping.getResult(); assertNotNull(result);