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 2d165ed3..daef629d 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 @@ -27,6 +27,8 @@ import javax.faces.event.PhaseId; import javax.faces.lifecycle.Lifecycle; import org.springframework.binding.expression.Expression; +import org.springframework.core.io.ContextResource; +import org.springframework.core.io.ResourceLoader; import org.springframework.webflow.execution.RequestContext; import org.springframework.webflow.execution.View; import org.springframework.webflow.execution.ViewFactory; @@ -46,14 +48,18 @@ public class JsfViewFactory implements ViewFactory { private final Expression viewExpr; - public JsfViewFactory(Lifecycle facesLifecycle, Expression viewExpr) { + private final ResourceLoader resourceLoader; + + public JsfViewFactory(Lifecycle facesLifecycle, Expression viewExpr, ResourceLoader resourceLoader) { this.facesLifecycle = facesLifecycle; this.viewExpr = viewExpr; + this.resourceLoader = resourceLoader; } public View getView(RequestContext context) { + String viewName = resolveViewName(context); FacesContext facesContext = JsfFlowUtils.getFacesContext(facesLifecycle); try { boolean restored = false; @@ -66,11 +72,10 @@ public class JsfViewFactory implements ViewFactory { ViewHandler handler = facesContext.getApplication().getViewHandler(); - if (viewExists(facesContext, viewExpr.getValue(context).toString())) { + if (viewExists(facesContext, viewName)) { view = new JsfView(facesContext.getViewRoot(), facesLifecycle); restored = true; } else { - String viewName = (String) viewExpr.getValue(context); UIViewRoot root = handler.restoreView(facesContext, viewName); if (root != null) { view = new JsfView(root, facesLifecycle); @@ -100,6 +105,16 @@ public class JsfViewFactory implements ViewFactory { } } + private String resolveViewName(RequestContext context) { + String viewId = (String) viewExpr.getValue(context); + if (viewId.startsWith("/")) { + return viewId; + } else { + ContextResource viewResource = (ContextResource) resourceLoader.getResource(viewId); + return viewResource.getPathWithinContext(); + } + } + private boolean viewExists(FacesContext facesContext, String viewId) { if (facesContext.getViewRoot() != null && facesContext.getViewRoot().getViewId().equals(viewId)) { return true; diff --git a/spring-faces/src/main/java/org/springframework/faces/webflow/JsfViewFactoryCreator.java b/spring-faces/src/main/java/org/springframework/faces/webflow/JsfViewFactoryCreator.java index 964ff1a8..3235aa37 100644 --- a/spring-faces/src/main/java/org/springframework/faces/webflow/JsfViewFactoryCreator.java +++ b/spring-faces/src/main/java/org/springframework/faces/webflow/JsfViewFactoryCreator.java @@ -34,12 +34,12 @@ public class JsfViewFactoryCreator implements ViewFactoryCreator { public Action createFinalResponseAction(Expression viewName, ResourceLoader resourceLoader) { return new JsfRenderFinalResponseAction(new JsfViewFactory(((LifecycleFactory) FactoryFinder .getFactory(FactoryFinder.LIFECYCLE_FACTORY)).getLifecycle(FlowLifecycleFactory.FLOW_LIFECYCLE_ID), - viewName)); + viewName, resourceLoader)); } - public ViewFactory createViewFactory(Expression viewName, ResourceLoader resourceLaoder) { + public ViewFactory createViewFactory(Expression viewName, ResourceLoader resourceLoader) { return new JsfViewFactory(((LifecycleFactory) FactoryFinder.getFactory(FactoryFinder.LIFECYCLE_FACTORY)) - .getLifecycle(FlowLifecycleFactory.FLOW_LIFECYCLE_ID), viewName); + .getLifecycle(FlowLifecycleFactory.FLOW_LIFECYCLE_ID), viewName, resourceLoader); } } diff --git a/spring-faces/src/test/java/org/springframework/faces/webflow/JSFFlowExecutionTests.java b/spring-faces/src/test/java/org/springframework/faces/webflow/JSFFlowExecutionTests.java index 9069d801..8969e0c6 100644 --- a/spring-faces/src/test/java/org/springframework/faces/webflow/JSFFlowExecutionTests.java +++ b/spring-faces/src/test/java/org/springframework/faces/webflow/JSFFlowExecutionTests.java @@ -78,7 +78,7 @@ public class JSFFlowExecutionTests extends TestCase { flow = Flow.create("jsf-flow", null); ViewState view1 = new ViewState(flow, "viewState1", new JsfViewFactory(new TestLifecycle(jsf.lifecycle()), - parser.parseExpression("view1", RequestContext.class, String.class, null))); + parser.parseExpression("/view1", RequestContext.class, String.class, null), null)); view1.getTransitionSet().add(new Transition(on("event1"), to("doSomething"))); view1.getTransitionSet().add(new Transition(on("event2"), to("evalSomething"))); @@ -99,7 +99,7 @@ public class JSFFlowExecutionTests extends TestCase { evalSomething.getTransitionSet().add(new Transition(on("success"), to("viewState2"))); ViewState viewState2 = new ViewState(flow, "viewState2", new JsfViewFactory(new TestLifecycle(jsf.lifecycle()), - parser.parseExpression("view2", RequestContext.class, String.class, null))); + parser.parseExpression("/view2", RequestContext.class, String.class, null), null)); viewState2.getEntryActionList().add(new ViewState2SetupAction()); viewState2.getTransitionSet().add(new Transition(on("event1"), to("endState1"))); diff --git a/spring-faces/src/test/java/org/springframework/faces/webflow/JsfRenderFinalResponseActionTests.java b/spring-faces/src/test/java/org/springframework/faces/webflow/JsfRenderFinalResponseActionTests.java index 75597e3e..fc184c82 100644 --- a/spring-faces/src/test/java/org/springframework/faces/webflow/JsfRenderFinalResponseActionTests.java +++ b/spring-faces/src/test/java/org/springframework/faces/webflow/JsfRenderFinalResponseActionTests.java @@ -30,7 +30,7 @@ import org.springframework.webflow.test.MockExternalContext; public class JsfRenderFinalResponseActionTests extends TestCase { - private static final String VIEW_ID = "testView.xhtml"; + private static final String VIEW_ID = "/testView.xhtml"; private ViewFactory factory; @@ -68,7 +68,7 @@ public class JsfRenderFinalResponseActionTests extends TestCase { jsfMock.application().setViewHandler(viewHandler); lifecycle = new TestLifecycle(jsfMock.lifecycle()); factory = new JsfViewFactory(lifecycle, parser.parseExpression("#{'" + VIEW_ID + "'}", RequestContext.class, - String.class, null)); + String.class, null), null); finalResponseAction = new JsfRenderFinalResponseAction(factory); RequestContextHolder.setRequestContext(context); ExternalContext ext = new MockExternalContext(); diff --git a/spring-faces/src/test/java/org/springframework/faces/webflow/JsfViewFactoryTests.java b/spring-faces/src/test/java/org/springframework/faces/webflow/JsfViewFactoryTests.java index 2da1ca04..ae89e6f3 100644 --- a/spring-faces/src/test/java/org/springframework/faces/webflow/JsfViewFactoryTests.java +++ b/spring-faces/src/test/java/org/springframework/faces/webflow/JsfViewFactoryTests.java @@ -29,7 +29,7 @@ import org.springframework.webflow.test.MockExternalContext; public class JsfViewFactoryTests extends TestCase { - private static final String VIEW_ID = "testView.xhtml"; + private static final String VIEW_ID = "/testView.xhtml"; private ViewFactory factory; @@ -78,7 +78,7 @@ public class JsfViewFactoryTests extends TestCase { lifecycle = new NoEventLifecycle(jsfMock.lifecycle()); factory = new JsfViewFactory(lifecycle, parser.parseExpression(VIEW_ID, RequestContext.class, String.class, - null)); + null), null); UIViewRoot newRoot = new UIViewRoot(); newRoot.setViewId(VIEW_ID); @@ -100,7 +100,7 @@ public class JsfViewFactoryTests extends TestCase { lifecycle = new NoEventLifecycle(jsfMock.lifecycle()); factory = new JsfViewFactory(lifecycle, parser.parseExpression(VIEW_ID, RequestContext.class, String.class, - null)); + null), null); UIViewRoot existingRoot = new UIViewRoot(); existingRoot.setViewId(VIEW_ID); @@ -122,7 +122,7 @@ public class JsfViewFactoryTests extends TestCase { lifecycle = new EventSignalingLifecycle(jsfMock.lifecycle()); factory = new JsfViewFactory(lifecycle, parser.parseExpression(VIEW_ID, RequestContext.class, String.class, - null)); + null), null); UIViewRoot existingRoot = new UIViewRoot(); existingRoot.setViewId(VIEW_ID); @@ -174,7 +174,7 @@ public class JsfViewFactoryTests extends TestCase { lifecycle = new NoEventLifecycle(jsfMock.lifecycle()); factory = new JsfViewFactory(lifecycle, parser.parseExpression(VIEW_ID, RequestContext.class, String.class, - null)); + null), null); UIViewRoot newRoot = new UIViewRoot(); newRoot.setViewId(VIEW_ID);