viewExists -> viewAlreadySet

This commit is contained in:
Keith Donald
2008-04-22 04:46:18 +00:00
parent c5cfc66276
commit 688ad73619
2 changed files with 50 additions and 33 deletions

View File

@@ -74,22 +74,30 @@ public class JsfViewFactory implements ViewFactory {
}
JsfView view;
String viewName = resolveViewName(context);
UIViewRoot viewRoot = viewHandler.restoreView(facesContext, viewName);
if (viewRoot != null) {
if (viewAlreadySet(facesContext, viewName)) {
if (logger.isDebugEnabled()) {
logger.debug("View root restored for '" + viewName + "'");
logger.debug("Existing view root found for '" + viewName + "'");
}
view = createJsfView(viewRoot, lifecycle, context);
facesContext.setViewRoot(view.getViewRoot());
processComponentBinding(facesContext, view.getViewRoot());
view = createJsfView(facesContext.getViewRoot(), lifecycle, context);
view.setRestored(true);
} else {
if (logger.isDebugEnabled()) {
logger.debug("Creating view root for '" + viewName + "'");
UIViewRoot viewRoot = viewHandler.restoreView(facesContext, viewName);
if (viewRoot != null) {
if (logger.isDebugEnabled()) {
logger.debug("View root restored for '" + viewName + "'");
}
view = createJsfView(viewRoot, lifecycle, context);
facesContext.setViewRoot(view.getViewRoot());
processComponentBinding(facesContext, view.getViewRoot());
view.setRestored(true);
} else {
if (logger.isDebugEnabled()) {
logger.debug("Creating view root for '" + viewName + "'");
}
view = createJsfView(viewHandler.createView(facesContext, viewName), lifecycle, context);
facesContext.setViewRoot(view.getViewRoot());
view.setRestored(true);
}
view = createJsfView(viewHandler.createView(facesContext, viewName), lifecycle, context);
facesContext.setViewRoot(view.getViewRoot());
view.setRestored(true);
}
JsfUtils.notifyAfterListeners(PhaseId.RESTORE_VIEW, lifecycle, facesContext);
return view;
@@ -98,6 +106,15 @@ public class JsfViewFactory implements ViewFactory {
}
}
private boolean viewAlreadySet(FacesContext facesContext, String viewId) {
if (facesContext.getViewRoot() != null && facesContext.getViewRoot().getViewId().equals(viewId)) {
// the corner case where a BEFORE_VIEW PhaseListener has handled setting the UIViewRoot
return true;
} else {
return false;
}
}
private JsfView createJsfView(UIViewRoot root, Lifecycle lifecycle, RequestContext context) {
if (isSpringJavascriptAjaxRequest(context.getExternalContext())) {
return new JsfView(new AjaxViewRoot(root), lifecycle, context);
@@ -107,7 +124,7 @@ public class JsfViewFactory implements ViewFactory {
}
private boolean isSpringJavascriptAjaxRequest(ExternalContext context) {
// this is not that clean
// this is not very clean
if (context.getNativeContext() instanceof ServletContext) {
AjaxHandler handler = new SpringJavascriptAjaxHandler();
return handler.isAjaxRequest((ServletContext) context.getNativeContext(), (HttpServletRequest) context

View File

@@ -165,27 +165,27 @@ public class JsfViewFactoryTests extends TestCase {
/**
* Third party sets the view root before RESTORE_VIEW
*/
// public final void testGetView_ExternalViewRoot() {
//
// lifecycle = new NoExecutionLifecycle(jsfMock.lifecycle());
// factory = new JsfViewFactory(parser.parseExpression(VIEW_ID, new FluentParserContext().template().evaluate(
// RequestContext.class).expectResult(String.class)), lifecycle);
//
// UIViewRoot newRoot = new UIViewRoot();
// newRoot.setViewId(VIEW_ID);
// jsfMock.facesContext().setViewRoot(newRoot);
// jsfMock.facesContext().renderResponse();
//
// EasyMock.replay(new Object[] { context });
//
// View newView = factory.getView(context);
//
// assertNotNull("A View was not created", newView);
// assertTrue("A JsfView was expected", newView instanceof JsfView);
// assertEquals("View name did not match", VIEW_ID, ((JsfView) newView).getViewRoot().getViewId());
// assertSame("View root was not the third party instance", newRoot, ((JsfView) newView).getViewRoot());
// assertFalse("An unexpected event was signaled,", newView.hasFlowEvent());
// }
public final void testGetView_ExternalViewRoot() {
lifecycle = new NoExecutionLifecycle(jsfMock.lifecycle());
factory = new JsfViewFactory(parser.parseExpression(VIEW_ID, new FluentParserContext().template().evaluate(
RequestContext.class).expectResult(String.class)), lifecycle);
UIViewRoot newRoot = new UIViewRoot();
newRoot.setViewId(VIEW_ID);
jsfMock.facesContext().setViewRoot(newRoot);
jsfMock.facesContext().renderResponse();
EasyMock.replay(new Object[] { context });
View newView = factory.getView(context);
assertNotNull("A View was not created", newView);
assertTrue("A JsfView was expected", newView instanceof JsfView);
assertEquals("View name did not match", VIEW_ID, ((JsfView) newView).getViewRoot().getViewId());
assertSame("View root was not the third party instance", newRoot, ((JsfView) newView).getViewRoot());
assertFalse("An unexpected event was signaled,", newView.hasFlowEvent());
}
private class NoExecutionLifecycle extends FlowLifecycle {
public NoExecutionLifecycle(Lifecycle delegate) {