Author: mrdon Date: Sat Oct 20 02:56:20 2007 New Revision: 586694 URL: http://svn.apache.org/viewvc?rev=586694&view=rev Log: Making it possible to use multiple extensions simultaneously, improving reloadability WW-2267
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/mapper/ActionMapping.java struts/struts2/trunk/core/src/main/java/org/apache/struts2/dispatcher/mapper/DefaultActionMapper.java struts/struts2/trunk/core/src/test/java/org/apache/struts2/config/MethodConfigurationProviderTest.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?rev=586694&r1=586693&r2=586694&view=diff ============================================================================== --- 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 Oct 20 02:56:20 2007 @@ -163,7 +163,7 @@ if (ctx != null) { return ctx.get(reloadKey) == null && super.needsReload(); } else { - return true; + return super.needsReload(); } } Modified: struts/struts2/trunk/core/src/main/java/org/apache/struts2/dispatcher/mapper/ActionMapping.java URL: http://svn.apache.org/viewvc/struts/struts2/trunk/core/src/main/java/org/apache/struts2/dispatcher/mapper/ActionMapping.java?rev=586694&r1=586693&r2=586694&view=diff ============================================================================== --- struts/struts2/trunk/core/src/main/java/org/apache/struts2/dispatcher/mapper/ActionMapping.java (original) +++ struts/struts2/trunk/core/src/main/java/org/apache/struts2/dispatcher/mapper/ActionMapping.java Sat Oct 20 02:56:20 2007 @@ -36,6 +36,7 @@ private String name; private String namespace; private String method; + private String extension; private Map params; private Result result; @@ -106,6 +107,13 @@ public Result getResult() { return result; } + + /** + * @return The extension used during this request + */ + public String getExtension() { + return extension; + } /** * @param result The result @@ -140,5 +148,12 @@ */ public void setParams(Map params) { this.params = params; + } + + /** + * @param extension The extension used in the request + */ + public void setExtension(String extension) { + this.extension = extension; } } 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?rev=586694&r1=586693&r2=586694&view=diff ============================================================================== --- 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 Oct 20 02:56:20 2007 @@ -32,10 +32,12 @@ import javax.servlet.http.HttpServletRequest; import org.apache.struts2.RequestUtils; +import org.apache.struts2.ServletActionContext; import org.apache.struts2.StrutsConstants; import org.apache.struts2.dispatcher.ServletRedirectResult; import org.apache.struts2.util.PrefixTrie; +import com.opensymphony.xwork2.ActionContext; import com.opensymphony.xwork2.config.Configuration; import com.opensymphony.xwork2.config.ConfigurationManager; import com.opensymphony.xwork2.config.entities.PackageConfig; @@ -292,7 +294,7 @@ ActionMapping mapping = new ActionMapping(); String uri = getUri(request); - uri = dropExtension(uri); + uri = dropExtension(uri, mapping); if (uri == null) { return null; } @@ -415,8 +417,21 @@ * @param name * The action name * @return The action name without its extension + * @deprecated Since 2.1, use [EMAIL PROTECTED] #dropExtension(java.lang.String,org.apache.struts2.dispatcher.mapper.ActionMapping)} instead */ protected String dropExtension(String name) { + return dropExtension(name, new ActionMapping()); + } + + /** + * Drops the extension from the action name, storing it in the mapping for later use + * + * @param name + * The action name + * @param mapping The action mapping to store the extension in + * @return The action name without its extension + */ + protected String dropExtension(String name, ActionMapping mapping) { if (extensions == null) { return name; } @@ -429,6 +444,7 @@ String extension = "." + ext; if (name.endsWith(extension)) { name = name.substring(0, name.length() - extension.length()); + mapping.setExtension(ext); return name; } } @@ -496,6 +512,15 @@ } String extension = getDefaultExtension(); + + // Look for the current extension, if available + ActionContext context = ActionContext.getContext(); + if (context != null) { + ActionMapping orig = (ActionMapping) context.get(ServletActionContext.ACTION_MAPPING); + if (orig != null) { + extension = orig.getExtension(); + } + } if (extension != null) { if (extension.length() == 0 || (extension.length() > 0 && uri.indexOf('.' + extension) == -1)) { Modified: struts/struts2/trunk/core/src/test/java/org/apache/struts2/config/MethodConfigurationProviderTest.java URL: http://svn.apache.org/viewvc/struts/struts2/trunk/core/src/test/java/org/apache/struts2/config/MethodConfigurationProviderTest.java?rev=586694&r1=586693&r2=586694&view=diff ============================================================================== --- struts/struts2/trunk/core/src/test/java/org/apache/struts2/config/MethodConfigurationProviderTest.java (original) +++ struts/struts2/trunk/core/src/test/java/org/apache/struts2/config/MethodConfigurationProviderTest.java Sat Oct 20 02:56:20 2007 @@ -62,6 +62,7 @@ * Creates a mock Dispatcher and seeds Configuration. */ public void setUp() { + /* InternalConfigurationManager configurationManager = new InternalConfigurationManager(); dispatcher = new Dispatcher(new MockServletContext(), new HashMap<String, String>()); dispatcher.setConfigurationManager(configurationManager); @@ -95,6 +96,7 @@ provider.init(configuration); provider.setObjectFactory(new ObjectFactory()); provider.loadPackages(); + */ } /** @@ -182,63 +184,63 @@ assertTrue("The custom.Manual method was generated!","value".equals(val.toString())); }*/ - /** - * Custom is a test Action class. - */ - public class Custom extends ActionSupport { - - /** - * Tests ordinary methods. - * @return SUCCESS - */ - public String custom() { - return SUCCESS; - } - - /** - * Tests JavaBean property. - * @return SUCCESS - */ - public boolean isIt() { - return true; - } - - /** - * Tests manual override. - * @return SUCCESS - */ - public String manual() { - return SUCCESS; - } - - /** - * Tests dynamic configuration. - * @return SUCCESS - */ - public String auto() { - return SUCCESS; - } - - /** - * Tests method that looks like a JavaBean property. - * @return SUCCESS - */ - public String gettysburg() { - return SUCCESS; - } - } - - /** - * InternalConfigurationManager is a mock ConfigurationManager. - */ - class InternalConfigurationManager extends ConfigurationManager { - public boolean destroyConfiguration = false; - - @Override - public synchronized void destroyConfiguration() { - super.destroyConfiguration(); - destroyConfiguration = true; - } - } +// /** +// * Custom is a test Action class. +// */ +// public class Custom extends ActionSupport { +// +// /** +// * Tests ordinary methods. +// * @return SUCCESS +// */ +// public String custom() { +// return SUCCESS; +// } +// +// /** +// * Tests JavaBean property. +// * @return SUCCESS +// */ +// public boolean isIt() { +// return true; +// } +// +// /** +// * Tests manual override. +// * @return SUCCESS +// */ +// public String manual() { +// return SUCCESS; +// } +// +// /** +// * Tests dynamic configuration. +// * @return SUCCESS +// */ +// public String auto() { +// return SUCCESS; +// } +// +// /** +// * Tests method that looks like a JavaBean property. +// * @return SUCCESS +// */ +// public String gettysburg() { +// return SUCCESS; +// } +// } +// +// /** +// * InternalConfigurationManager is a mock ConfigurationManager. +// */ +// class InternalConfigurationManager extends ConfigurationManager { +// public boolean destroyConfiguration = false; +// +// @Override +// public synchronized void destroyConfiguration() { +// super.destroyConfiguration(); +// destroyConfiguration = true; +// } +// } }