To late for me to check it... can you bring it to the jira and asign the "bug" to me. Will take a look next days.
thx, matthias On 6/17/06, Erik Gustavson <[EMAIL PROTECTED]> wrote:
Hello all, I was just testing out the SVN trunk in my application and 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); - } - -
-- Matthias Wessendorf Aechterhoek 18 48282 Emsdetten blog: http://jroller.com/page/mwessendorf mail: mwessendorf-at-gmail-dot-com
