You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@struts.apache.org by bp...@apache.org on 2008/01/27 20:12:14 UTC

svn commit: r615631 - /struts/sandbox/trunk/struts2-convention-plugin/src/main/java/org/apache/struts2/convention/ConventionUnknownHandler.java

Author: bpontarelli
Date: Sun Jan 27 11:12:13 2008
New Revision: 615631

URL: http://svn.apache.org/viewvc?rev=615631&view=rev
Log:
Fixed the redirect to slash handling to work with results without actions

Modified:
    struts/sandbox/trunk/struts2-convention-plugin/src/main/java/org/apache/struts2/convention/ConventionUnknownHandler.java

Modified: struts/sandbox/trunk/struts2-convention-plugin/src/main/java/org/apache/struts2/convention/ConventionUnknownHandler.java
URL: http://svn.apache.org/viewvc/struts/sandbox/trunk/struts2-convention-plugin/src/main/java/org/apache/struts2/convention/ConventionUnknownHandler.java?rev=615631&r1=615630&r2=615631&view=diff
==============================================================================
--- struts/sandbox/trunk/struts2-convention-plugin/src/main/java/org/apache/struts2/convention/ConventionUnknownHandler.java (original)
+++ struts/sandbox/trunk/struts2-convention-plugin/src/main/java/org/apache/struts2/convention/ConventionUnknownHandler.java Sun Jan 27 11:12:13 2008
@@ -59,7 +59,7 @@
  * and actions in nested packages. For example, if there is an action
  * <strong>/foo/index</strong> and the URL <strong>/foo</strong> is used,
  * this will render the index action in the /foo namespace.
- * </p> 
+ * </p>
  *
  * @author  Brian Pontarelli
  */
@@ -125,35 +125,24 @@
 
         // Try /idx/action.jsp if actionName is not empty, otherwise it will just be /.jsp
         if (!actionName.equals("")) {
-            for (String ext : resultsByExtension.keySet()) {
-                String path = string(pathPrefix, actionName, "." , ext);
-                if (logger.isLoggable(Level.FINEST)) {
-                    String fqan = namespace + "/" + actionName;
-                    logger.finest("Trying to locate the correct default result [" + path + "] for the FQ action [" +
-                        fqan + "] with an file extension of [" + ext + "] in the directory [" + pathPrefix + "]");
-                }
-
-                try {
-                    if (servletContext.getResource(path) != null) {
-                        actionConfig = buildActionConfig(path, resultsByExtension.get(ext));
-                        logger.finest("Found action config");
-                        break;
-                    }
-                } catch (MalformedURLException e) {
-                    logger.warning("Unable to parse path to the web application resource [" + path +
-                        "] skipping...");
-                }
+            Resource resource = findResource(resultsByExtension, pathPrefix, actionName);
+            if (resource != null) {
+                actionConfig = buildActionConfig(resource.path, resultsByExtension.get(resource.ext));
             }
         }
 
         if (actionConfig == null) {
+            Resource resource = findResource(resultsByExtension, pathPrefix, actionName, "/index");
+
             // If the URL is /foo and there is an action we can redirect to, send the redirect to /foo/.
             // However, if that action is not in the same namespace, it is the default, so I'm not going
             // to return that.
             if (!actionName.equals("") && redirectToSlash) {
+                ResultTypeConfig redirectResultTypeConfig = parentPackage.getAllResultTypeConfigs().get("redirect");
                 String redirectNamespace = namespace + "/" + actionName;
                 if (logger.isLoggable(Level.FINEST)) {
-                    logger.finest("Checking if there is an action named index in the namespace [" + redirectNamespace + "]");
+                    logger.finest("Checking if there is an action named index in the namespace [" +
+                        redirectNamespace + "]");
                 }
 
                 actionConfig = configuration.getRuntimeConfiguration().getActionConfig(redirectNamespace, "index");
@@ -163,47 +152,53 @@
                     PackageConfig packageConfig = configuration.getPackageConfig(actionConfig.getPackageName());
                     if (redirectNamespace.equals(packageConfig.getNamespace())) {
                         logger.finest("Action is not a default - redirecting");
-                        ResultTypeConfig redirectResultTypeConfig = resultsByExtension.get("redirect");
                         return buildActionConfig(redirectNamespace + "/", redirectResultTypeConfig);
                     }
 
                     logger.finest("Action was a default - NOT redirecting");
                 }
-            }
-
-            // Otherwise, if the URL is /foo or /foo/ look for index pages in /foo/
-            String resultPath = null;
-            String resultExt = null;
-            for (String ext : resultsByExtension.keySet()) {
-                if (logger.isLoggable(Level.FINEST)) {
-                    String fqan = namespace + "/" + actionName;
-                    logger.finest("Checking for [" + fqan + "/" + "index." + ext + "].");
-                }
 
-                String path = string(pathPrefix, actionName, "/index." , ext);
-                try {
-                    if (servletContext.getResource(path) != null) {
-                        resultPath = path;
-                        resultExt = ext;
-                        break;
-                    }
-                } catch (MalformedURLException e) {
-                    logger.warning("Unable to parse path to the web application resource [" + path +
-                        "] skipping...");
+                if (resource != null) {
+                    return buildActionConfig(redirectNamespace + "/", redirectResultTypeConfig);
                 }
             }
 
-            // If the URL is /foo and there is /foo/index.jsp, let's send a redirect to /foo/. If the URL is
-            // /foo/ (actionName is empty) and there is /foo/index.jsp, send a forward to that. Otherwise,
-            // just return null.
-            if (resultPath != null) {
-                actionConfig = buildActionConfig(resultPath, resultsByExtension.get(resultExt));
+            if (resource != null) {
+                // Otherwise, if the URL is /foo or /foo/ look for index pages in /foo/
+                actionConfig = buildActionConfig(resource.path, resultsByExtension.get(resource.ext));
             }
         }
 
         return actionConfig;
     }
 
+    /**
+     * Finds a resource using the given path parts and all of the extensions in the map.
+     *
+     * @param   resultsByExtension Map of extension to result type config objects.
+     * @param   parts The parts of the resource.
+     * @return  The resource path or null.
+     */
+    protected Resource findResource(Map<String, ResultTypeConfig> resultsByExtension, String... parts) {
+        for (String ext : resultsByExtension.keySet()) {
+            String path = string(parts) + "." + ext;
+            if (logger.isLoggable(Level.FINEST)) {
+                logger.finest("Checking for [" + path + "].");
+            }
+
+            try {
+                if (servletContext.getResource(path) != null) {
+                    return new Resource(path, ext);
+                }
+            } catch (MalformedURLException e) {
+                logger.warning("Unable to parse path to the web application resource [" + path +
+                    "] skipping...");
+            }
+        }
+
+        return null;
+    }
+
     protected ActionConfig buildActionConfig(String path, ResultTypeConfig resultTypeConfig) {
         Map<String, ResultConfig> results = new HashMap<String,ResultConfig>();
         HashMap<String, String> params = new HashMap<String, String>();
@@ -212,7 +207,7 @@
         }
         params.put(resultTypeConfig.getDefaultResultParam(), path);
 
-        PackageConfig pkg = configuration.getPackageConfig(defaultParentPackageName);
+//        PackageConfig pkg = configuration.getPackageConfig(defaultParentPackageName);
 //        List<InterceptorMapping> interceptors = InterceptorBuilder.constructInterceptorReference(pkg,
 //            pkg.getFullDefaultInterceptorRef(), Collections.EMPTY_MAP, null, objectFactory);
         ResultConfig config = new ResultConfig.Builder(Action.SUCCESS, resultTypeConfig.getClassName()).
@@ -380,4 +375,14 @@
 	public Object handleUnknownActionMethod(Object action, String methodName) throws NoSuchMethodException {
 		throw new NoSuchMethodException();
 	}
+
+    public static class Resource {
+        final String path;
+        final String ext;
+
+        public Resource(String path, String ext) {
+            this.path = path;
+            this.ext = ext;
+        }
+    }
 }