|
View:
New views
1 Messages
—
Rating Filter:
Alert me
|
|
|
SF.net SVN: stripes: [945] trunkRevision: 945
http://stripes.svn.sourceforge.net/stripes/?rev=945&view=rev Author: javelotinfo Date: 2008-06-25 10:06:31 -0700 (Wed, 25 Jun 2008) Log Message: ----------- Made the DefaultViewActionBean attempted views easier to customize Modified Paths: -------------- trunk/stripes/src/net/sourceforge/stripes/controller/NameBasedActionResolver.java trunk/tests/src/net/sourceforge/stripes/controller/NameBasedActionResolverTest.java Modified: trunk/stripes/src/net/sourceforge/stripes/controller/NameBasedActionResolver.java =================================================================== --- trunk/stripes/src/net/sourceforge/stripes/controller/NameBasedActionResolver.java 2008-06-24 17:34:48 UTC (rev 944) +++ trunk/stripes/src/net/sourceforge/stripes/controller/NameBasedActionResolver.java 2008-06-25 17:06:31 UTC (rev 945) @@ -27,6 +27,7 @@ import java.lang.reflect.Method; import java.lang.reflect.Modifier; import java.net.MalformedURLException; +import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.Set; @@ -70,12 +71,12 @@ * URL that is not bound to an ActionBean the resolver will attempt to map the request to a view * and return a 'dummy' ActionBean that will take the user to the view. The exact behaviour is * modifiable by overriding one or more of - * {@link #handleActionBeanNotFound(ActionBeanContext, String)} or {@link #findView(String)}. The - * default behaviour is to map the URL being requested to three potential JSP names/paths, check - * for the existence of a JSP at those locations and if one exists then to return an ActionBean - * that will render the view. For example if a user requested '/account/ViewAccount.action' but - * an ActionBean does not yet exist bound to that URL, the resolver will check for JSPs in the - * following order:</p> + * {@link #handleActionBeanNotFound(ActionBeanContext, String)}, {@link #findView(String)} or + * {@link #getFindViewAttempts(String)}. The default behaviour is to map the URL being requested + * to three potential JSP names/paths, check for the existence of a JSP at those locations and if + * one exists then to return an ActionBean that will render the view. For example if a user + * requested '/account/ViewAccount.action' but an ActionBean does not yet exist bound to that URL, + * the resolver will check for JSPs in the following order:</p> * * <ul> * <li>/account/ViewAccount.jsp</li> @@ -212,6 +213,8 @@ /** * Returns a list of suffixes to be removed from the end of the Action Bean class name, if present. * The defaults are ["Bean", "Action"]. + * + * @since Stripes 1.5 */ protected List<String> getActionBeanSuffixes() { return DEFAULT_ACTION_BEAN_SUFFIXES; @@ -299,76 +302,87 @@ /** * <p>Attempts to locate a default view for the urlBinding provided and return a - * ForwardResolution that will take the user to the view. Looks for views by - * converting the incoming urlBinding with the following rules. For example if the - * urlBinding is '/account/ViewAccount.action' the following views will be looked for - * in order:</p> + * ForwardResolution that will take the user to the view. Looks for views by using the + * list of attempts returned by {@link #getFindViewAttempts(String)}. * - * <ul> - * <li>/account/ViewAccount.jsp</li> - * <li>/account/viewAccount.jsp</li> - * <li>/account/view_account.jsp</li> - * </ul> - * * <p>For each view name derived a check is performed using * {@link ServletContext#getResource(String)} to see if there is a file located at that URL. * Only if a file actually exists will a Resolution be returned.</p> * - * <p>Can be overridden to look for views with a different pattern, or to provide a different - * kind of resolution. It is strongly recommended when overriding this method to check for - * the actual existence of views prior to manufacturing a resolution in order not to cause - * confusion when URLs are mistyped.</p> + * <p>Can be overridden to provide a different kind of resolution. It is strongly recommended + * when overriding this method to check for the actual existence of views prior to manufacturing + * a resolution in order not to cause confusion when URLs are mistyped.</p> * * @param urlBinding the url being accessed by the client in the current request * @return a Resolution if a default view can be found, or null otherwise * @since Stripes 1.3 */ protected Resolution findView(String urlBinding) { + List<String> attempts = getFindViewAttempts(urlBinding); + + ServletContext ctx = StripesFilter.getConfiguration() + .getBootstrapPropertyResolver().getFilterConfig().getServletContext(); + + for (String jsp : attempts) { + try { + // This will try /account/ViewAccount.jsp + if (ctx.getResource(jsp) != null) { + return new ForwardResolution(jsp); + } + } + catch (MalformedURLException mue) { + } + } + return null; + } + + /** + * <p>Returns the list of attempts to locate a default view for the urlBinding provided. + * Generates attempts for views by converting the incoming urlBinding with the following rules. + * For example if the urlBinding is '/account/ViewAccount.action' the following views will be + * returned in order:</p> + * + * <ul> + * <li>/account/ViewAccount.jsp</li> + * <li>/account/viewAccount.jsp</li> + * <li>/account/view_account.jsp</li> + * </ul> + * + * <p>Can be overridden to look for views with a different pattern.</p> + * + * @param urlBinding the url being accessed by the client in the current request + * @since Stripes 1.5 + */ + protected List<String> getFindViewAttempts(String urlBinding) { + List<String> attempts = new ArrayList<String>(3); + int lastPeriod = urlBinding.lastIndexOf('.'); String path = urlBinding.substring(0, urlBinding.lastIndexOf("/") + 1); String name = (lastPeriod >= path.length()) ? urlBinding.substring(path.length(), lastPeriod) : urlBinding.substring(path.length()); - ServletContext ctx = StripesFilter.getConfiguration() - .getBootstrapPropertyResolver().getFilterConfig().getServletContext(); + // This will try /account/ViewAccount.jsp + attempts.add(path + name + ".jsp"); - try { - // This will try /account/ViewAccount.jsp - String jsp = path + name + ".jsp"; - if (ctx.getResource(jsp) != null) { - return new ForwardResolution(jsp); - } + // This will try /account/viewAccount.jsp + name = Character.toLowerCase(name.charAt(0)) + name.substring(1); + attempts.add(path + name + ".jsp"); - // This will try /account/viewAccount.jsp - name = Character.toLowerCase(name.charAt(0)) + name.substring(1); - jsp = path + name + ".jsp"; - if (ctx.getResource(jsp) != null) { - return new ForwardResolution(jsp); + // And finally this will try /account/view_account.jsp + StringBuilder builder = new StringBuilder(); + for (int i=0; i<name.length(); ++i) { + char ch = name.charAt(i); + if (Character.isUpperCase(ch)) { + builder.append("_"); + builder.append(Character.toLowerCase(ch)); } - - // And finally this will try /account/view_account.jsp - StringBuilder builder = new StringBuilder(); - for (int i=0; i<name.length(); ++i) { - char ch = name.charAt(i); - if (Character.isUpperCase(ch)) { - builder.append("_"); - builder.append(Character.toLowerCase(ch)); - } - else { - builder.append(ch); - } + else { + builder.append(ch); } + } + attempts.add(path + builder.toString() + ".jsp"); - jsp = path + builder.toString() + ".jsp"; - if (ctx.getResource(jsp) != null) { - return new ForwardResolution(jsp); - } - - return null; - } - catch (MalformedURLException mue) { - return null; - } + return attempts; } } Modified: trunk/tests/src/net/sourceforge/stripes/controller/NameBasedActionResolverTest.java =================================================================== --- trunk/tests/src/net/sourceforge/stripes/controller/NameBasedActionResolverTest.java 2008-06-24 17:34:48 UTC (rev 944) +++ trunk/tests/src/net/sourceforge/stripes/controller/NameBasedActionResolverTest.java 2008-06-25 17:06:31 UTC (rev 945) @@ -1,5 +1,6 @@ package net.sourceforge.stripes.controller; +import java.util.List; import org.testng.Assert; import org.testng.annotations.Test; import net.sourceforge.stripes.action.UrlBinding; @@ -74,4 +75,13 @@ getAnnotation(UrlBinding.class).value()); } + @Test(groups="fast") + public void testGetFindViewAttempts() { + String urlBinding = "/account/ViewAccount.action"; + List<String> viewAttempts = this.resolver.getFindViewAttempts(urlBinding); + Assert.assertEquals(viewAttempts.size(), 3); + Assert.assertEquals(viewAttempts.get(0), "/account/ViewAccount.jsp"); + Assert.assertEquals(viewAttempts.get(1), "/account/viewAccount.jsp"); + Assert.assertEquals(viewAttempts.get(2), "/account/view_account.jsp"); + } } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. ------------------------------------------------------------------------- Check out the new SourceForge.net Marketplace. It's the best place to buy or sell services for just about anything Open Source. http://sourceforge.net/services/buy/index.php _______________________________________________ Stripes-development mailing list Stripes-development@... https://lists.sourceforge.net/lists/listinfo/stripes-development |
| Free Forum Powered by Nabble | Forum Help |