You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@myfaces.apache.org by ma...@apache.org on 2011/04/22 19:25:50 UTC
svn commit: r1095966 - in /myfaces/core/trunk/impl/src:
main/java/org/apache/myfaces/application/NavigationHandlerImpl.java
test/java/org/apache/myfaces/application/NavigationHandlerImplTest.java
Author: martinkoci
Date: Fri Apr 22 17:25:49 2011
New Revision: 1095966
URL: http://svn.apache.org/viewvc?rev=1095966&view=rev
Log:
MYFACES-3101: NavigationHandlerImpl throws NullpointerException if view is expired
Modified:
myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/application/NavigationHandlerImpl.java
myfaces/core/trunk/impl/src/test/java/org/apache/myfaces/application/NavigationHandlerImplTest.java
Modified: myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/application/NavigationHandlerImpl.java
URL: http://svn.apache.org/viewvc/myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/application/NavigationHandlerImpl.java?rev=1095966&r1=1095965&r2=1095966&view=diff
==============================================================================
--- myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/application/NavigationHandlerImpl.java (original)
+++ myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/application/NavigationHandlerImpl.java Fri Apr 22 17:25:49 2011
@@ -114,9 +114,10 @@ public class NavigationHandlerImpl
// PartialViewContext.setRenderAll(true)...". The effect is that ajax requests
// are included on navigation.
PartialViewContext partialViewContext = facesContext.getPartialViewContext();
+ String viewId = facesContext.getViewRoot() != null ? facesContext.getViewRoot().getViewId() : null;
if ( partialViewContext.isPartialRequest() &&
!partialViewContext.isRenderAll() &&
- !facesContext.getViewRoot().getViewId().equals(toViewId))
+ !toViewId.equals(viewId))
{
partialViewContext.setRenderAll(true);
}
@@ -143,9 +144,10 @@ public class NavigationHandlerImpl
// PartialViewContext.setRenderAll(true)...". The effect is that ajax requests
// are included on navigation.
PartialViewContext partialViewContext = facesContext.getPartialViewContext();
+ String viewId = facesContext.getViewRoot() != null ? facesContext.getViewRoot().getViewId() : null;
if ( partialViewContext.isPartialRequest() &&
!partialViewContext.isRenderAll() &&
- !facesContext.getViewRoot().getViewId().equals(newViewId))
+ !newViewId.equals(viewId))
{
partialViewContext.setRenderAll(true);
}
@@ -200,15 +202,20 @@ public class NavigationHandlerImpl
*/
public NavigationCase getNavigationCase(FacesContext facesContext, String fromAction, String outcome)
{
- String viewId = facesContext.getViewRoot().getViewId();
+ String viewId = facesContext.getViewRoot() != null ? facesContext.getViewRoot().getViewId() : null;
+
Map<String, Set<NavigationCase>> casesMap = getNavigationCases();
NavigationCase navigationCase = null;
-
- Set<? extends NavigationCase> casesSet = casesMap.get(viewId);
- if (casesSet != null)
+
+ Set<? extends NavigationCase> casesSet;
+ if (viewId != null)
{
- // Exact match?
- navigationCase = calcMatchingNavigationCase(facesContext, casesSet, fromAction, outcome);
+ casesSet = casesMap.get(viewId);
+ if (casesSet != null)
+ {
+ // Exact match?
+ navigationCase = calcMatchingNavigationCase(facesContext, casesSet, fromAction, outcome);
+ }
}
if (navigationCase == null)
@@ -273,7 +280,7 @@ public class NavigationHandlerImpl
boolean isRedirect = false;
String queryString = null;
NavigationCase result = null;
- String viewId = facesContext.getViewRoot().getViewId();
+ String viewId = facesContext.getViewRoot() != null ? facesContext.getViewRoot().getViewId() : null;
String viewIdToTest = outcome;
// If viewIdToTest contains a query string, remove it and set queryString with that value.
@@ -300,7 +307,7 @@ public class NavigationHandlerImpl
// If viewIdToTest does not have a "file extension", use the one from the current viewId.
index = viewIdToTest.indexOf (".");
- if (index == -1)
+ if (index == -1 && viewId != null)
{
index = viewId.lastIndexOf(".");
@@ -313,7 +320,7 @@ public class NavigationHandlerImpl
// If viewIdToTest does not start with "/", look for the last "/" in viewId. If not found, simply prepend "/".
// Otherwise, prepend everything before and including the last "/" in viewId.
- if (!viewIdToTest.startsWith ("/"))
+ if (!viewIdToTest.startsWith ("/") && viewId != null)
{
index = viewId.lastIndexOf ("/");
Modified: myfaces/core/trunk/impl/src/test/java/org/apache/myfaces/application/NavigationHandlerImplTest.java
URL: http://svn.apache.org/viewvc/myfaces/core/trunk/impl/src/test/java/org/apache/myfaces/application/NavigationHandlerImplTest.java?rev=1095966&r1=1095965&r2=1095966&view=diff
==============================================================================
--- myfaces/core/trunk/impl/src/test/java/org/apache/myfaces/application/NavigationHandlerImplTest.java (original)
+++ myfaces/core/trunk/impl/src/test/java/org/apache/myfaces/application/NavigationHandlerImplTest.java Fri Apr 22 17:25:49 2011
@@ -18,6 +18,9 @@
*/
package org.apache.myfaces.application;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
@@ -565,4 +568,37 @@ public class NavigationHandlerImplTest e
Assert.assertTrue("redirect=true in the query String must "
+ "set redirect to true.", navigationCase.isRedirect());
}
+
+ /**
+ * Test for MYFACES-3101
+ */
+ @Test
+ public void testHandleViewExpiredExpcetion() throws Exception {
+ NavigationHandlerImpl underTest = new NavigationHandlerImpl();
+ // simulate no available ViewRoot (in case of VEE)
+ facesContext.setViewRoot(null);
+ // test is based on:
+ // http://www.nfjsone.com/blog/ed_burns/2009/09/dealing_gracefully_with_viewexpiredexception_in_jsf2
+ underTest.handleNavigation(facesContext, null, "viewExpired");
+
+ assertNotNull(facesContext.getViewRoot());
+ assertEquals("viewExpired", facesContext.getViewRoot().getViewId());
+
+ }
+
+ /**
+ * Test for MYFACES-3101 - partial request (without redirect)
+ */
+ @Test
+ public void testHandleViewExpiredExpcetionForPartial() throws Exception {
+ NavigationHandlerImpl underTest = new NavigationHandlerImpl();
+ // simulate no available ViewRoot (in case of VEE)
+ facesContext.setViewRoot(null);
+ facesContext.getPartialViewContext().setPartialRequest(true);
+
+ underTest.handleNavigation(facesContext, null, "/viewExpired.xhtml");
+
+ assertNotNull(facesContext.getViewRoot());
+ assertEquals("/viewExpired.xhtml", facesContext.getViewRoot().getViewId());
+ }
}