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);


Reply via email to