Fixing broken tests.

This commit is contained in:
Jeremy Grelle
2007-11-19 21:35:05 +00:00
parent 58808df2ca
commit 5e15d6eb12
12 changed files with 129 additions and 359 deletions

View File

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

View File

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

View File

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

View File

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

View File

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