Using ResourceLoader to resolve viewId's.

This commit is contained in:
Jeremy Grelle
2007-10-30 00:42:39 +00:00
parent 978a83baf7
commit fee73320ee
5 changed files with 30 additions and 15 deletions

View File

@@ -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;

View File

@@ -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);
}
}

View File

@@ -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")));

View File

@@ -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();

View File

@@ -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);