From 6c635c448a09fc3e166438814e2af7b35028cbb1 Mon Sep 17 00:00:00 2001 From: Keith Donald Date: Tue, 22 Apr 2008 19:35:41 +0000 Subject: [PATCH] jsf lifecycle updates --- .../faces/webflow/FlowActionListener.java | 1 + .../faces/webflow/FlowFacesContext.java | 12 +++--- .../faces/webflow/JsfViewFactory.java | 11 ++++- .../webflow/JsfFinalResponseActionTests.java | 2 +- .../faces/webflow/JsfViewTests.java | 40 +++++++++---------- 5 files changed, 37 insertions(+), 29 deletions(-) diff --git a/spring-faces/src/main/java/org/springframework/faces/webflow/FlowActionListener.java b/spring-faces/src/main/java/org/springframework/faces/webflow/FlowActionListener.java index 6683c252..e67f90f1 100644 --- a/spring-faces/src/main/java/org/springframework/faces/webflow/FlowActionListener.java +++ b/spring-faces/src/main/java/org/springframework/faces/webflow/FlowActionListener.java @@ -67,5 +67,6 @@ public class FlowActionListener implements ActionListener { logger.debug("No action event detected"); context.getExternalContext().getRequestMap().remove(JsfView.EVENT_KEY); } + context.renderResponse(); } } diff --git a/spring-faces/src/main/java/org/springframework/faces/webflow/FlowFacesContext.java b/spring-faces/src/main/java/org/springframework/faces/webflow/FlowFacesContext.java index de62f612..928c9409 100644 --- a/spring-faces/src/main/java/org/springframework/faces/webflow/FlowFacesContext.java +++ b/spring-faces/src/main/java/org/springframework/faces/webflow/FlowFacesContext.java @@ -50,12 +50,12 @@ public class FlowFacesContext extends FacesContext { /** * The key for storing the responseComplete flag */ - static final String RESPONSE_COMPLETE_KEY = "webFlowResponseComplete"; + static final String RESPONSE_COMPLETE_KEY = "flowResponseComplete"; /** * The key for storing the renderResponse flag */ - static final String RENDER_RESPONSE_KEY = "webFlowRenderResponse"; + static final String RENDER_RESPONSE_KEY = "flowRenderResponse"; /** * The key for storing the renderResponse flag @@ -151,7 +151,7 @@ public class FlowFacesContext extends FacesContext { } public boolean getRenderResponse() { - Boolean renderResponse = context.getRequestScope().getBoolean(RENDER_RESPONSE_KEY); + Boolean renderResponse = context.getFlashScope().getBoolean(RENDER_RESPONSE_KEY); if (renderResponse == null) { return false; } @@ -159,7 +159,7 @@ public class FlowFacesContext extends FacesContext { } public boolean getResponseComplete() { - Boolean responseComplete = context.getRequestScope().getBoolean(RESPONSE_COMPLETE_KEY); + Boolean responseComplete = context.getFlashScope().getBoolean(RESPONSE_COMPLETE_KEY); if (responseComplete == null) { return false; } @@ -167,11 +167,11 @@ public class FlowFacesContext extends FacesContext { } public void renderResponse() { - context.getRequestScope().put(RENDER_RESPONSE_KEY, Boolean.TRUE); + context.getFlashScope().put(RENDER_RESPONSE_KEY, Boolean.TRUE); } public void responseComplete() { - context.getRequestScope().put(RESPONSE_COMPLETE_KEY, Boolean.TRUE); + context.getFlashScope().put(RESPONSE_COMPLETE_KEY, Boolean.TRUE); } // ------------------ Pass-through delegate methods ----------------------// diff --git a/spring-faces/src/main/java/org/springframework/faces/webflow/JsfViewFactory.java b/spring-faces/src/main/java/org/springframework/faces/webflow/JsfViewFactory.java index b960fbdf..72fa6f0b 100644 --- a/spring-faces/src/main/java/org/springframework/faces/webflow/JsfViewFactory.java +++ b/spring-faces/src/main/java/org/springframework/faces/webflow/JsfViewFactory.java @@ -67,7 +67,9 @@ public class JsfViewFactory implements ViewFactory { public View getView(RequestContext context) { FacesContext facesContext = FlowFacesContext.newInstance(context, lifecycle); try { - JsfUtils.notifyBeforeListeners(PhaseId.RESTORE_VIEW, lifecycle, facesContext); + if (!facesContext.getRenderResponse()) { + JsfUtils.notifyBeforeListeners(PhaseId.RESTORE_VIEW, lifecycle, facesContext); + } ViewHandler viewHandler = facesContext.getApplication().getViewHandler(); if (JsfUtils.isAtLeastJsf12() && !JsfUtils.isPortlet(facesContext)) { viewHandler.initView(facesContext); @@ -78,6 +80,9 @@ public class JsfViewFactory implements ViewFactory { if (logger.isDebugEnabled()) { logger.debug("Existing view root found with id '" + facesContext.getViewRoot().getId() + "'"); } + UIViewRoot viewRoot = facesContext.getViewRoot(); + viewRoot.setLocale(context.getExternalContext().getLocale()); + processComponentBinding(facesContext, viewRoot); view = createJsfView(facesContext.getViewRoot(), lifecycle, context); view.setRestored(true); } else { @@ -99,7 +104,9 @@ public class JsfViewFactory implements ViewFactory { view.setRestored(true); } } - JsfUtils.notifyAfterListeners(PhaseId.RESTORE_VIEW, lifecycle, facesContext); + if (!facesContext.getRenderResponse()) { + JsfUtils.notifyAfterListeners(PhaseId.RESTORE_VIEW, lifecycle, facesContext); + } return view; } finally { facesContext.release(); diff --git a/spring-faces/src/test/java/org/springframework/faces/webflow/JsfFinalResponseActionTests.java b/spring-faces/src/test/java/org/springframework/faces/webflow/JsfFinalResponseActionTests.java index 53848550..68a3beef 100644 --- a/spring-faces/src/test/java/org/springframework/faces/webflow/JsfFinalResponseActionTests.java +++ b/spring-faces/src/test/java/org/springframework/faces/webflow/JsfFinalResponseActionTests.java @@ -79,7 +79,7 @@ public class JsfFinalResponseActionTests extends TestCase { ext.setNativeResponse(new MockHttpServletResponse()); EasyMock.expect(context.getExternalContext()).andStubReturn(ext); AttributeMap requestMap = new LocalAttributeMap(); - EasyMock.expect(context.getRequestScope()).andStubReturn(requestMap); + EasyMock.expect(context.getFlashScope()).andStubReturn(requestMap); EasyMock.expect(context.getRequestParameters()).andStubReturn(new LocalParameterMap(new HashMap())); } diff --git a/spring-faces/src/test/java/org/springframework/faces/webflow/JsfViewTests.java b/spring-faces/src/test/java/org/springframework/faces/webflow/JsfViewTests.java index 8901ee94..52850e71 100644 --- a/spring-faces/src/test/java/org/springframework/faces/webflow/JsfViewTests.java +++ b/spring-faces/src/test/java/org/springframework/faces/webflow/JsfViewTests.java @@ -49,7 +49,7 @@ public class JsfViewTests extends TestCase { private RequestContext context = (RequestContext) EasyMock.createMock(RequestContext.class); private FlowExecutionContext flowExecutionContext = (FlowExecutionContext) EasyMock .createMock(FlowExecutionContext.class); - private MutableAttributeMap requestMap = (MutableAttributeMap) EasyMock.createMock(MutableAttributeMap.class); + private MutableAttributeMap flashScope = (MutableAttributeMap) EasyMock.createMock(MutableAttributeMap.class); private MutableAttributeMap flowMap = (MutableAttributeMap) EasyMock.createMock(MutableAttributeMap.class); private FlowExecutionKey key = new FlowExecutionKey() { @@ -90,7 +90,7 @@ public class JsfViewTests extends TestCase { RequestContextHolder.setRequestContext(context); EasyMock.expect(context.getExternalContext()).andStubReturn(extContext); - EasyMock.expect(context.getRequestScope()).andStubReturn(requestMap); + EasyMock.expect(context.getFlashScope()).andStubReturn(flashScope); EasyMock.expect(context.getFlowScope()).andStubReturn(flowMap); EasyMock.expect(context.getFlowExecutionContext()).andStubReturn(flowExecutionContext); EasyMock.expect(flowExecutionContext.getKey()).andStubReturn(key); @@ -104,12 +104,12 @@ public class JsfViewTests extends TestCase { public final void testRender() throws IOException { - EasyMock.expect(requestMap.put(EasyMock.matches(FlowFacesContext.RENDER_RESPONSE_KEY), EasyMock.anyObject())) + EasyMock.expect(flashScope.put(EasyMock.matches(FlowFacesContext.RENDER_RESPONSE_KEY), EasyMock.anyObject())) .andStubReturn(null); - EasyMock.expect(requestMap.put(EasyMock.matches(FlowFacesContext.RESPONSE_COMPLETE_KEY), EasyMock.anyObject())) + EasyMock.expect(flashScope.put(EasyMock.matches(FlowFacesContext.RESPONSE_COMPLETE_KEY), EasyMock.anyObject())) .andStubReturn(null); - EasyMock.replay(new Object[] { context, flowExecutionContext, flowMap, requestMap }); + EasyMock.replay(new Object[] { context, flowExecutionContext, flowMap, flashScope }); view.render(); @@ -118,12 +118,12 @@ public class JsfViewTests extends TestCase { public final void testRenderException() throws IOException { - EasyMock.expect(requestMap.put(EasyMock.matches(FlowFacesContext.RENDER_RESPONSE_KEY), EasyMock.anyObject())) + EasyMock.expect(flashScope.put(EasyMock.matches(FlowFacesContext.RENDER_RESPONSE_KEY), EasyMock.anyObject())) .andStubReturn(null); - EasyMock.expect(requestMap.put(EasyMock.matches(FlowFacesContext.RESPONSE_COMPLETE_KEY), EasyMock.anyObject())) + EasyMock.expect(flashScope.put(EasyMock.matches(FlowFacesContext.RESPONSE_COMPLETE_KEY), EasyMock.anyObject())) .andStubReturn(null); - EasyMock.replay(new Object[] { context, flowExecutionContext, flowMap, requestMap }); + EasyMock.replay(new Object[] { context, flowExecutionContext, flowMap, flashScope }); jsfMock.application().setViewHandler(new ExceptionalViewHandler()); @@ -139,11 +139,11 @@ public class JsfViewTests extends TestCase { */ public final void testResume_Restored_NoEvent() { - EasyMock.expect(requestMap.getBoolean(EasyMock.matches(FlowFacesContext.RESPONSE_COMPLETE_KEY))).andStubReturn( + EasyMock.expect(flashScope.getBoolean(EasyMock.matches(FlowFacesContext.RESPONSE_COMPLETE_KEY))).andStubReturn( Boolean.FALSE); - EasyMock.expect(requestMap.getBoolean(EasyMock.matches(FlowFacesContext.RENDER_RESPONSE_KEY))).andStubReturn( + EasyMock.expect(flashScope.getBoolean(EasyMock.matches(FlowFacesContext.RENDER_RESPONSE_KEY))).andStubReturn( Boolean.FALSE); - EasyMock.expect(requestMap.put(EasyMock.matches(FlowFacesContext.RENDER_RESPONSE_KEY), EasyMock.anyObject())) + EasyMock.expect(flashScope.put(EasyMock.matches(FlowFacesContext.RENDER_RESPONSE_KEY), EasyMock.anyObject())) .andStubReturn(null); EasyMock.expect(context.getCurrentState()).andStubReturn(new MockViewState()); @@ -152,7 +152,7 @@ public class JsfViewTests extends TestCase { UIViewRoot existingRoot = new UIViewRoot(); existingRoot.setViewId(VIEW_ID); - EasyMock.replay(new Object[] { context, flowExecutionContext, flowMap, requestMap }); + EasyMock.replay(new Object[] { context, flowExecutionContext, flowMap, flashScope }); JsfView restoredView = new JsfView(existingRoot, lifecycle, context); restoredView.setRestored(true); @@ -169,11 +169,11 @@ public class JsfViewTests extends TestCase { */ public final void testGetView_Restore_Ajax_NoEvent() { - EasyMock.expect(requestMap.getBoolean(EasyMock.matches(FlowFacesContext.RESPONSE_COMPLETE_KEY))).andStubReturn( + EasyMock.expect(flashScope.getBoolean(EasyMock.matches(FlowFacesContext.RESPONSE_COMPLETE_KEY))).andStubReturn( Boolean.FALSE); - EasyMock.expect(requestMap.getBoolean(EasyMock.matches(FlowFacesContext.RENDER_RESPONSE_KEY))).andStubReturn( + EasyMock.expect(flashScope.getBoolean(EasyMock.matches(FlowFacesContext.RENDER_RESPONSE_KEY))).andStubReturn( Boolean.FALSE); - EasyMock.expect(requestMap.put(EasyMock.matches(FlowFacesContext.RENDER_RESPONSE_KEY), EasyMock.anyObject())) + EasyMock.expect(flashScope.put(EasyMock.matches(FlowFacesContext.RENDER_RESPONSE_KEY), EasyMock.anyObject())) .andStubReturn(null); EasyMock.expect(context.getCurrentState()).andStubReturn(new MockViewState()); @@ -183,7 +183,7 @@ public class JsfViewTests extends TestCase { existingRoot.setViewId(VIEW_ID); AjaxViewRoot ajaxRoot = new AjaxViewRoot(existingRoot); - EasyMock.replay(new Object[] { context, flowExecutionContext, flowMap, requestMap }); + EasyMock.replay(new Object[] { context, flowExecutionContext, flowMap, flashScope }); JsfView restoredView = new JsfView(ajaxRoot, lifecycle, context); restoredView.setRestored(true); @@ -199,11 +199,11 @@ public class JsfViewTests extends TestCase { */ public final void testGetView_Restore_EventSignaled() { - EasyMock.expect(requestMap.getBoolean(EasyMock.matches(FlowFacesContext.RESPONSE_COMPLETE_KEY))).andStubReturn( + EasyMock.expect(flashScope.getBoolean(EasyMock.matches(FlowFacesContext.RESPONSE_COMPLETE_KEY))).andStubReturn( Boolean.FALSE); - EasyMock.expect(requestMap.getBoolean(EasyMock.matches(FlowFacesContext.RENDER_RESPONSE_KEY))).andStubReturn( + EasyMock.expect(flashScope.getBoolean(EasyMock.matches(FlowFacesContext.RENDER_RESPONSE_KEY))).andStubReturn( Boolean.FALSE); - EasyMock.expect(requestMap.put(EasyMock.matches(FlowFacesContext.RENDER_RESPONSE_KEY), EasyMock.anyObject())) + EasyMock.expect(flashScope.put(EasyMock.matches(FlowFacesContext.RENDER_RESPONSE_KEY), EasyMock.anyObject())) .andStubReturn(null); EasyMock.expect(context.getCurrentState()).andStubReturn(new MockViewState()); @@ -212,7 +212,7 @@ public class JsfViewTests extends TestCase { UIViewRoot existingRoot = new UIViewRoot(); existingRoot.setViewId(VIEW_ID); - EasyMock.replay(new Object[] { context, flowExecutionContext, flowMap, requestMap }); + EasyMock.replay(new Object[] { context, flowExecutionContext, flowMap, flashScope }); JsfView restoredView = new JsfView(existingRoot, lifecycle, context); restoredView.setRestored(true);