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);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user