You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@myfaces.apache.org by "Erik Gustavson (JIRA)" <de...@myfaces.apache.org> on 2006/06/18 20:38:30 UTC

[jira] Created: (MYFACES-1340) wildcard navrule bug in NavigationHandlerImpl

wildcard navrule bug in NavigationHandlerImpl
---------------------------------------------

         Key: MYFACES-1340
         URL: http://issues.apache.org/jira/browse/MYFACES-1340
     Project: MyFaces Core
        Type: Bug

  Components: JSR-127  
    Versions: 1.1.4-SNAPSHOT    
 Environment: JBoss 4.x / Tomcat 5.5 / JDK5
    Reporter: Erik Gustavson


I think a subtle logic bug crept into NavigationHandlerImpl handling on wildcard matches during this revision:

http://svn.apache.org/viewvc/myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/application/NavigationHandlerImpl.java?r1=410138&r2=414102&diff_format=h

Here is the scenario:

there are two navigation rules:

    <navigation-rule>
        <from-view-id>/foo.jsp</from-view-id>
        <navigation-case>
            <from-outcome>success</from-outcome>
            <to-view-id>/bar.jsp</to-view-id>
        </navigation-case>
    </navigation-rule>

    <navigation-rule>
        <navigation-case>
            <from-outcome>foobar</from-outcome>
            <to-view-id>/foobar.jsp</to-view-id>
        </navigation-case>
    </navigation-rule>

Assuming you are in the view /foo.jsp and your action method returns "foobar" you would expect to end up matching on the wildcard navigation rule and be sent to /foobar.jsp.

It looks like the logic on lines 71-72 and 75-79 are erroneous and should be removed as they are present in the getNavigationCase(...) method called on line 73. The net effect of the problem is that even if you find a good match from line 73, if your viewId returns a list from the casesMap the code ends up overwriting the previously determined navigation case with a null - this send you right back to rerendering the view as if you nav case wasn't there at all.

I took out the lines in question and tested locally and everything seems to work for me...

-Erik


Diff:
Index: core/impl/src/main/java/org/apache/myfaces/application/NavigationHandlerImpl.java
===================================================================
--- core/impl/src/main/java/org/apache/myfaces/application/NavigationHandlerImpl.java   (revision 415098)
+++ core/impl/src/main/java/org/apache/myfaces/application/NavigationHandlerImpl.java   (working copy)
@@ -68,18 +68,8 @@
             return;
         }

-        String viewId = facesContext.getViewRoot().getViewId();
-        Map casesMap = getNavigationCases(facesContext);
         NavigationCase navigationCase = getNavigationCase(facesContext, fromAction, outcome);

-        List casesList = (List)casesMap.get(viewId);
-        if (casesList != null)
-        {
-            // Exact match?
-            navigationCase = calcMatchingNavigationCase(casesList, fromAction, outcome);
-        }
-
-


-- 
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators:
   http://issues.apache.org/jira/secure/Administrators.jspa
-
For more information on JIRA, see:
   http://www.atlassian.com/software/jira


[jira] Updated: (MYFACES-1340) wildcard navrule bug in NavigationHandlerImpl

Posted by "Erik Gustavson (JIRA)" <de...@myfaces.apache.org>.
     [ http://issues.apache.org/jira/browse/MYFACES-1340?page=all ]

Erik Gustavson updated MYFACES-1340:
------------------------------------

    Status: Patch Available  (was: Open)

> wildcard navrule bug in NavigationHandlerImpl
> ---------------------------------------------
>
>          Key: MYFACES-1340
>          URL: http://issues.apache.org/jira/browse/MYFACES-1340
>      Project: MyFaces Core
>         Type: Bug

>   Components: JSR-127
>     Versions: 1.1.4-SNAPSHOT
>  Environment: JBoss 4.x / Tomcat 5.5 / JDK5
>     Reporter: Erik Gustavson
>  Attachments: patchfile.txt
>
> I think a subtle logic bug crept into NavigationHandlerImpl handling on wildcard matches during this revision:
> http://svn.apache.org/viewvc/myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/application/NavigationHandlerImpl.java?r1=410138&r2=414102&diff_format=h
> Here is the scenario:
> there are two navigation rules:
>     <navigation-rule>
>         <from-view-id>/foo.jsp</from-view-id>
>         <navigation-case>
>             <from-outcome>success</from-outcome>
>             <to-view-id>/bar.jsp</to-view-id>
>         </navigation-case>
>     </navigation-rule>
>     <navigation-rule>
>         <navigation-case>
>             <from-outcome>foobar</from-outcome>
>             <to-view-id>/foobar.jsp</to-view-id>
>         </navigation-case>
>     </navigation-rule>
> Assuming you are in the view /foo.jsp and your action method returns "foobar" you would expect to end up matching on the wildcard navigation rule and be sent to /foobar.jsp.
> It looks like the logic on lines 71-72 and 75-79 are erroneous and should be removed as they are present in the getNavigationCase(...) method called on line 73. The net effect of the problem is that even if you find a good match from line 73, if your viewId returns a list from the casesMap the code ends up overwriting the previously determined navigation case with a null - this send you right back to rerendering the view as if you nav case wasn't there at all.
> I took out the lines in question and tested locally and everything seems to work for me...
> -Erik
> Diff:
> Index: core/impl/src/main/java/org/apache/myfaces/application/NavigationHandlerImpl.java
> ===================================================================
> --- core/impl/src/main/java/org/apache/myfaces/application/NavigationHandlerImpl.java   (revision 415098)
> +++ core/impl/src/main/java/org/apache/myfaces/application/NavigationHandlerImpl.java   (working copy)
> @@ -68,18 +68,8 @@
>              return;
>          }
> -        String viewId = facesContext.getViewRoot().getViewId();
> -        Map casesMap = getNavigationCases(facesContext);
>          NavigationCase navigationCase = getNavigationCase(facesContext, fromAction, outcome);
> -        List casesList = (List)casesMap.get(viewId);
> -        if (casesList != null)
> -        {
> -            // Exact match?
> -            navigationCase = calcMatchingNavigationCase(casesList, fromAction, outcome);
> -        }
> -
> -

-- 
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators:
   http://issues.apache.org/jira/secure/Administrators.jspa
-
For more information on JIRA, see:
   http://www.atlassian.com/software/jira