From 45fc22e2a7115d0a8b2b673eeb0d14f1e075b26b Mon Sep 17 00:00:00 2001 From: Keith Donald Date: Wed, 28 Feb 2007 17:53:26 +0000 Subject: [PATCH] easy jsf config support --- .../main/webapp/WEB-INF/webflow-config.xml | 7 ++- .../webflow/executor/jsf/FlowFacesUtils.java | 53 ++++++++++--------- .../jsf/JsfFlowConfigurationException.java | 4 ++ 3 files changed, 37 insertions(+), 27 deletions(-) diff --git a/spring-webflow-samples/sellitem-jsf/src/main/webapp/WEB-INF/webflow-config.xml b/spring-webflow-samples/sellitem-jsf/src/main/webapp/WEB-INF/webflow-config.xml index 5db370a3..c8cfbd6f 100644 --- a/spring-webflow-samples/sellitem-jsf/src/main/webapp/WEB-INF/webflow-config.xml +++ b/spring-webflow-samples/sellitem-jsf/src/main/webapp/WEB-INF/webflow-config.xml @@ -7,9 +7,12 @@ http://www.springframework.org/schema/beans/spring-beans-2.0.xsd http://www.springframework.org/schema/webflow-config http://www.springframework.org/schema/webflow-config/spring-webflow-config-1.0.xsd"> - + + + + - + diff --git a/spring-webflow/src/main/java/org/springframework/webflow/executor/jsf/FlowFacesUtils.java b/spring-webflow/src/main/java/org/springframework/webflow/executor/jsf/FlowFacesUtils.java index f168e736..0c573ffd 100644 --- a/spring-webflow/src/main/java/org/springframework/webflow/executor/jsf/FlowFacesUtils.java +++ b/spring-webflow/src/main/java/org/springframework/webflow/executor/jsf/FlowFacesUtils.java @@ -17,7 +17,6 @@ package org.springframework.webflow.executor.jsf; import javax.faces.context.FacesContext; -import org.springframework.beans.factory.NoSuchBeanDefinitionException; import org.springframework.context.ApplicationContext; import org.springframework.web.jsf.FacesContextUtils; import org.springframework.webflow.conversation.impl.SessionBindingConversationManager; @@ -27,7 +26,6 @@ import org.springframework.webflow.engine.impl.FlowExecutionImplStateRestorer; import org.springframework.webflow.execution.FlowExecutionFactory; import org.springframework.webflow.execution.repository.FlowExecutionRepository; import org.springframework.webflow.execution.repository.support.SimpleFlowExecutionRepository; -import org.springframework.webflow.executor.FlowExecutor; import org.springframework.webflow.executor.FlowExecutorImpl; /** @@ -66,12 +64,12 @@ public class FlowFacesUtils { /** * The default flow execution repository implementation to use. */ - private static FlowExecutionRepository defaultRepository; + private static FlowExecutionRepository defaultExecutionRepository; /** * The default flow execution factory implementation to use. */ - private static FlowExecutionFactory defaultFactory; + private static FlowExecutionFactory defaultExecutionFactory; /** * Returns the locator for flow definitions to use in a JSF environment. @@ -83,15 +81,20 @@ public class FlowFacesUtils { */ public static FlowDefinitionLocator getDefinitionLocator(FacesContext context) { ApplicationContext ac = FacesContextUtils.getRequiredWebApplicationContext(context); - try { + if (ac.containsBean(FLOW_DEFINITION_LOCATOR_BEAN_NAME)) { return (FlowDefinitionLocator) ac.getBean(FLOW_DEFINITION_LOCATOR_BEAN_NAME, FlowDefinitionLocator.class); } - catch (NoSuchBeanDefinitionException e) { - String message = "No bean definition with id '" + FLOW_DEFINITION_LOCATOR_BEAN_NAME - + "' could be found; to use Spring Web Flow with JSF you must " - + "configure your context with a FlowDefinitionLocator bean with this id " - + "exposing a registry of flow definitions."; - throw new JsfFlowConfigurationException(message, e); + else { + FlowExecutorImpl flowExecutor = getFlowExecutor(context); + if (flowExecutor != null) { + return flowExecutor.getDefinitionLocator(); + } + else { + String message = "No bean definition with id '" + FLOW_DEFINITION_LOCATOR_BEAN_NAME + "' or '" + + FLOW_EXECUTOR_BEAN_NAME + + "' could be found; to use Spring Web Flow with JSF a FlowDefinitionLocator must be resolvable"; + throw new JsfFlowConfigurationException(message); + } } } @@ -112,17 +115,17 @@ public class FlowFacesUtils { FlowExecutionRepository.class); } else { - if (defaultRepository == null) { - FlowExecutor flowExecutor = getFlowExecutor(context); - if (flowExecutor != null && flowExecutor instanceof FlowExecutorImpl) { - defaultRepository = ((FlowExecutorImpl) flowExecutor).getExecutionRepository(); + if (defaultExecutionRepository == null) { + FlowExecutorImpl flowExecutor = getFlowExecutor(context); + if (flowExecutor != null) { + defaultExecutionRepository = flowExecutor.getExecutionRepository(); } else { - defaultRepository = new SimpleFlowExecutionRepository(new FlowExecutionImplStateRestorer( + defaultExecutionRepository = new SimpleFlowExecutionRepository(new FlowExecutionImplStateRestorer( getDefinitionLocator(context)), new SessionBindingConversationManager()); } } - return defaultRepository; + return defaultExecutionRepository; } } @@ -142,16 +145,16 @@ public class FlowFacesUtils { return (FlowExecutionFactory) ac.getBean(FLOW_EXECUTION_FACTORY_BEAN_NAME, FlowExecutionFactory.class); } else { - if (defaultFactory == null) { - FlowExecutor flowExecutor = getFlowExecutor(context); - if (flowExecutor != null && flowExecutor instanceof FlowExecutorImpl) { - defaultFactory = ((FlowExecutorImpl) flowExecutor).getExecutionFactory(); + if (defaultExecutionFactory == null) { + FlowExecutorImpl flowExecutor = getFlowExecutor(context); + if (flowExecutor != null) { + defaultExecutionFactory = flowExecutor.getExecutionFactory(); } else { - defaultFactory = new FlowExecutionImplFactory(); + defaultExecutionFactory = new FlowExecutionImplFactory(); } } - return defaultFactory; + return defaultExecutionFactory; } } @@ -163,10 +166,10 @@ public class FlowFacesUtils { * @param context the faces context * @return the flow executor, or null if no such bean exists */ - private synchronized static FlowExecutor getFlowExecutor(FacesContext context) { + private synchronized static FlowExecutorImpl getFlowExecutor(FacesContext context) { ApplicationContext ac = FacesContextUtils.getRequiredWebApplicationContext(context); if (ac.containsBean(FLOW_EXECUTOR_BEAN_NAME)) { - return (FlowExecutor) ac.getBean(FLOW_EXECUTOR_BEAN_NAME, FlowExecutor.class); + return (FlowExecutorImpl) ac.getBean(FLOW_EXECUTOR_BEAN_NAME, FlowExecutorImpl.class); } else { return null; diff --git a/spring-webflow/src/main/java/org/springframework/webflow/executor/jsf/JsfFlowConfigurationException.java b/spring-webflow/src/main/java/org/springframework/webflow/executor/jsf/JsfFlowConfigurationException.java index 3897bc3c..86d445fb 100644 --- a/spring-webflow/src/main/java/org/springframework/webflow/executor/jsf/JsfFlowConfigurationException.java +++ b/spring-webflow/src/main/java/org/springframework/webflow/executor/jsf/JsfFlowConfigurationException.java @@ -23,6 +23,10 @@ import org.springframework.webflow.core.FlowException; * @author Keith Donald */ public class JsfFlowConfigurationException extends FlowException { + + public JsfFlowConfigurationException(String msg) { + super(msg); + } public JsfFlowConfigurationException(String msg, Throwable cause) { super(msg, cause);