Using ResourceLoader to resolve viewId's.
This commit is contained in:
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -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")));
|
||||
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user