Fixing broken tests.
This commit is contained in:
@@ -0,0 +1,15 @@
|
||||
package org.springframework.faces.webflow;
|
||||
|
||||
import javax.faces.component.UIViewRoot;
|
||||
import javax.faces.lifecycle.Lifecycle;
|
||||
|
||||
import org.springframework.faces.ui.AjaxViewRoot;
|
||||
import org.springframework.webflow.execution.RequestContext;
|
||||
|
||||
public class AjaxJsfView extends JsfView {
|
||||
|
||||
public AjaxJsfView(UIViewRoot viewRoot, Lifecycle facesLifecycle, RequestContext context) {
|
||||
super(new AjaxViewRoot(viewRoot), facesLifecycle, context);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -16,7 +16,7 @@
|
||||
package org.springframework.faces.webflow;
|
||||
|
||||
import javax.faces.application.NavigationHandler;
|
||||
import javax.faces.component.ActionSource2;
|
||||
import javax.faces.component.ActionSource;
|
||||
import javax.faces.context.FacesContext;
|
||||
import javax.faces.event.AbortProcessingException;
|
||||
import javax.faces.event.ActionEvent;
|
||||
@@ -43,13 +43,13 @@ public class FlowActionListener implements ActionListener {
|
||||
|
||||
public void processAction(ActionEvent actionEvent) throws AbortProcessingException {
|
||||
FacesContext context = FacesContext.getCurrentInstance();
|
||||
ActionSource2 source = (ActionSource2) actionEvent.getSource();
|
||||
ActionSource source = (ActionSource) actionEvent.getSource();
|
||||
String result = null;
|
||||
if (source.getActionExpression() != null) {
|
||||
if (source.getAction() != null) {
|
||||
if (logger.isDebugEnabled()) {
|
||||
logger.debug("Invoking action expression " + source.getActionExpression());
|
||||
logger.debug("Invoking action " + source.getAction());
|
||||
}
|
||||
result = (String) source.getActionExpression().invoke(context.getELContext(), null);
|
||||
result = (String) source.getAction().invoke(context, null);
|
||||
}
|
||||
if (StringUtils.hasText(result)) {
|
||||
if (logger.isDebugEnabled()) {
|
||||
|
||||
@@ -34,7 +34,6 @@ import org.springframework.binding.message.Severity;
|
||||
import org.springframework.context.MessageSource;
|
||||
import org.springframework.util.StringUtils;
|
||||
import org.springframework.webflow.execution.RequestContext;
|
||||
import org.springframework.webflow.execution.RequestContextHolder;
|
||||
|
||||
/**
|
||||
* Custom {@link FacesContext} implementation that delegates all standard FacesContext messaging functionality to a
|
||||
@@ -196,11 +195,11 @@ public class FlowFacesContext extends FacesContext {
|
||||
private int currentIndex = -1;
|
||||
|
||||
protected FacesMessageIterator() {
|
||||
this.messages = RequestContextHolder.getRequestContext().getMessageContext().getMessages();
|
||||
this.messages = context.getMessageContext().getMessages();
|
||||
}
|
||||
|
||||
protected FacesMessageIterator(String clientId) {
|
||||
this.messages = RequestContextHolder.getRequestContext().getMessageContext().getMessages(clientId);
|
||||
this.messages = context.getMessageContext().getMessages(clientId);
|
||||
}
|
||||
|
||||
public boolean hasNext() {
|
||||
@@ -237,7 +236,7 @@ public class FlowFacesContext extends FacesContext {
|
||||
int currentIndex = -1;
|
||||
|
||||
protected ClientIdIterator() {
|
||||
this.messages = RequestContextHolder.getRequestContext().getMessageContext().getMessages();
|
||||
this.messages = context.getMessageContext().getMessages();
|
||||
}
|
||||
|
||||
public boolean hasNext() {
|
||||
|
||||
@@ -26,7 +26,6 @@ import javax.faces.context.FacesContext;
|
||||
import javax.faces.context.FacesContextFactory;
|
||||
import javax.faces.event.PhaseId;
|
||||
import javax.faces.lifecycle.Lifecycle;
|
||||
import javax.faces.lifecycle.LifecycleFactory;
|
||||
|
||||
import org.apache.commons.logging.Log;
|
||||
import org.apache.commons.logging.LogFactory;
|
||||
@@ -54,50 +53,70 @@ public class JsfViewFactory implements ViewFactory {
|
||||
|
||||
private final ResourceLoader resourceLoader;
|
||||
|
||||
public JsfViewFactory(Expression viewExpr, ResourceLoader resourceLoader) {
|
||||
private final Lifecycle lifecycle;
|
||||
|
||||
public JsfViewFactory(Expression viewExpr, ResourceLoader resourceLoader, Lifecycle lifecycle) {
|
||||
this.viewExpr = viewExpr;
|
||||
this.resourceLoader = resourceLoader;
|
||||
this.lifecycle = lifecycle;
|
||||
}
|
||||
|
||||
public View getView(RequestContext context) {
|
||||
Lifecycle lifecycle = createFlowFacesLifecycle();
|
||||
|
||||
FacesContext facesContext = createFlowFacesContext(context, lifecycle);
|
||||
try {
|
||||
boolean restored = false;
|
||||
|
||||
if (!facesContext.getRenderResponse()) {
|
||||
JsfUtils.notifyBeforeListeners(PhaseId.RESTORE_VIEW, lifecycle, facesContext);
|
||||
}
|
||||
|
||||
JsfView view;
|
||||
String viewName = resolveViewName(context);
|
||||
ViewHandler viewHandler = facesContext.getApplication().getViewHandler();
|
||||
viewHandler.initView(facesContext);
|
||||
UIViewRoot viewRoot = viewHandler.restoreView(facesContext, viewName);
|
||||
if (viewRoot != null) {
|
||||
|
||||
if (viewExists(facesContext, viewName)) {
|
||||
if (logger.isDebugEnabled()) {
|
||||
logger.debug("View root restored for '" + viewName + "'");
|
||||
logger.debug("Existing view root found for '" + viewName + "'");
|
||||
}
|
||||
facesContext.setViewRoot(viewRoot);
|
||||
processComponentBinding(facesContext, viewRoot);
|
||||
JsfUtils.notifyAfterListeners(PhaseId.RESTORE_VIEW, lifecycle, facesContext);
|
||||
lifecycle.execute(facesContext);
|
||||
return new JsfView(viewRoot, lifecycle, context);
|
||||
view = createJsfView(facesContext.getViewRoot(), lifecycle, context);
|
||||
restored = true;
|
||||
} else {
|
||||
if (logger.isDebugEnabled()) {
|
||||
logger.debug("Creating view root for '" + viewName + "'");
|
||||
UIViewRoot viewRoot = viewHandler.restoreView(facesContext, viewName);
|
||||
if (viewRoot != null) {
|
||||
if (logger.isDebugEnabled()) {
|
||||
logger.debug("View root restored for '" + viewName + "'");
|
||||
}
|
||||
view = createJsfView(viewRoot, lifecycle, context);
|
||||
facesContext.setViewRoot(viewRoot);
|
||||
processComponentBinding(facesContext, viewRoot);
|
||||
restored = true;
|
||||
} else {
|
||||
if (logger.isDebugEnabled()) {
|
||||
logger.debug("Creating view root for '" + viewName + "'");
|
||||
}
|
||||
view = createJsfView(viewHandler.createView(facesContext, viewName), lifecycle, context);
|
||||
restored = false;
|
||||
}
|
||||
viewRoot = viewHandler.createView(facesContext, viewName);
|
||||
facesContext.setViewRoot(viewRoot);
|
||||
JsfUtils.notifyAfterListeners(PhaseId.RESTORE_VIEW, lifecycle, facesContext);
|
||||
return new JsfView(viewRoot, lifecycle, context);
|
||||
}
|
||||
|
||||
if (!facesContext.getRenderResponse()) {
|
||||
JsfUtils.notifyAfterListeners(PhaseId.RESTORE_VIEW, lifecycle, facesContext);
|
||||
}
|
||||
|
||||
if (restored && !facesContext.getResponseComplete() && !facesContext.getRenderResponse()) {
|
||||
lifecycle.execute(facesContext);
|
||||
facesContext.renderResponse();
|
||||
}
|
||||
|
||||
return view;
|
||||
} finally {
|
||||
facesContext.release();
|
||||
}
|
||||
}
|
||||
|
||||
private Lifecycle createFlowFacesLifecycle() {
|
||||
LifecycleFactory lifecycleFactory = (LifecycleFactory) FactoryFinder
|
||||
.getFactory(FactoryFinder.LIFECYCLE_FACTORY);
|
||||
Lifecycle defaultLifecycle = lifecycleFactory.getLifecycle(LifecycleFactory.DEFAULT_LIFECYCLE);
|
||||
return new FlowLifecycle(defaultLifecycle);
|
||||
private JsfView createJsfView(UIViewRoot root, Lifecycle lifecycle, RequestContext context) {
|
||||
return new JsfView(root, lifecycle, context);
|
||||
}
|
||||
|
||||
private FacesContext createFlowFacesContext(RequestContext context, Lifecycle lifecycle) {
|
||||
@@ -119,13 +138,23 @@ public class JsfViewFactory implements ViewFactory {
|
||||
}
|
||||
}
|
||||
|
||||
private boolean viewExists(FacesContext facesContext, String viewId) {
|
||||
if (facesContext.getViewRoot() != null && facesContext.getViewRoot().getViewId().equals(viewId)) {
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
private void processComponentBinding(FacesContext context, UIComponent component) {
|
||||
ValueExpression binding = component.getValueExpression("binding");
|
||||
if (binding != null) {
|
||||
binding.setValue(context.getELContext(), component);
|
||||
}
|
||||
for (Iterator<UIComponent> iter = component.getFacetsAndChildren(); iter.hasNext();) {
|
||||
processComponentBinding(context, iter.next());
|
||||
|
||||
Iterator i = component.getChildren().iterator();
|
||||
while (i.hasNext()) {
|
||||
UIComponent child = (UIComponent) i.next();
|
||||
processComponentBinding(context, child);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -15,6 +15,10 @@
|
||||
*/
|
||||
package org.springframework.faces.webflow;
|
||||
|
||||
import javax.faces.FactoryFinder;
|
||||
import javax.faces.lifecycle.Lifecycle;
|
||||
import javax.faces.lifecycle.LifecycleFactory;
|
||||
|
||||
import org.springframework.binding.expression.Expression;
|
||||
import org.springframework.core.io.ResourceLoader;
|
||||
import org.springframework.webflow.engine.builder.ViewFactoryCreator;
|
||||
@@ -28,12 +32,25 @@ import org.springframework.webflow.execution.ViewFactory;
|
||||
*/
|
||||
public class JsfViewFactoryCreator implements ViewFactoryCreator {
|
||||
|
||||
private Lifecycle lifecycle;
|
||||
|
||||
public JsfViewFactoryCreator() {
|
||||
lifecycle = createFlowFacesLifecycle();
|
||||
}
|
||||
|
||||
public Action createFinalResponseAction(Expression viewName, ResourceLoader resourceLoader) {
|
||||
return new JsfFinalResponseAction(new JsfViewFactory(viewName, resourceLoader));
|
||||
return new JsfFinalResponseAction(new JsfViewFactory(viewName, resourceLoader, lifecycle));
|
||||
}
|
||||
|
||||
public ViewFactory createViewFactory(Expression viewName, ResourceLoader resourceLoader) {
|
||||
return new JsfViewFactory(viewName, resourceLoader);
|
||||
return new JsfViewFactory(viewName, resourceLoader, lifecycle);
|
||||
}
|
||||
|
||||
private Lifecycle createFlowFacesLifecycle() {
|
||||
LifecycleFactory lifecycleFactory = (LifecycleFactory) FactoryFinder
|
||||
.getFactory(FactoryFinder.LIFECYCLE_FACTORY);
|
||||
Lifecycle defaultLifecycle = lifecycleFactory.getLifecycle(LifecycleFactory.DEFAULT_LIFECYCLE);
|
||||
return new FlowLifecycle(defaultLifecycle);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user