1 16 package org.springframework.webflow.executor.mvc; 17 18 import java.util.HashMap ; 19 import java.util.Map ; 20 21 import javax.servlet.http.HttpServletRequest ; 22 import javax.servlet.http.HttpServletResponse ; 23 24 import org.springframework.beans.factory.InitializingBean; 25 import org.springframework.util.Assert; 26 import org.springframework.web.servlet.ModelAndView; 27 import org.springframework.web.servlet.mvc.AbstractController; 28 import org.springframework.web.servlet.mvc.Controller; 29 import org.springframework.web.servlet.view.RedirectView; 30 import org.springframework.webflow.context.ExternalContext; 31 import org.springframework.webflow.context.servlet.ServletExternalContext; 32 import org.springframework.webflow.execution.support.ApplicationView; 33 import org.springframework.webflow.execution.support.ExternalRedirect; 34 import org.springframework.webflow.execution.support.FlowDefinitionRedirect; 35 import org.springframework.webflow.executor.FlowExecutor; 36 import org.springframework.webflow.executor.ResponseInstruction; 37 import org.springframework.webflow.executor.support.FlowExecutorArgumentHandler; 38 import org.springframework.webflow.executor.support.FlowRequestHandler; 39 import org.springframework.webflow.executor.support.RequestParameterFlowExecutorArgumentHandler; 40 import org.springframework.webflow.executor.support.RequestPathFlowExecutorArgumentHandler; 41 42 91 public class FlowController extends AbstractController implements InitializingBean { 92 93 97 private FlowExecutor flowExecutor; 98 99 102 private FlowExecutorArgumentHandler argumentHandler = new RequestParameterFlowExecutorArgumentHandler(); 103 104 109 public FlowController() { 110 setCacheSeconds(0); 113 } 114 115 119 public FlowExecutor getFlowExecutor() { 120 return flowExecutor; 121 } 122 123 127 public void setFlowExecutor(FlowExecutor flowExecutor) { 128 this.flowExecutor = flowExecutor; 129 } 130 131 136 public FlowExecutorArgumentHandler getArgumentHandler() { 137 return argumentHandler; 138 } 139 140 145 public void setArgumentHandler(FlowExecutorArgumentHandler argumentHandler) { 146 this.argumentHandler = argumentHandler; 147 } 148 149 158 public void setDefaultFlowId(String defaultFlowId) { 159 this.argumentHandler.setDefaultFlowId(defaultFlowId); 160 } 161 162 public void afterPropertiesSet() { 163 Assert.notNull(flowExecutor, "The flow executor property is required"); 164 Assert.notNull(argumentHandler, "The argument handler property is required"); 165 } 166 167 protected ModelAndView handleRequestInternal(HttpServletRequest request, HttpServletResponse response) 168 throws Exception { 169 ServletExternalContext context = new ServletExternalContext(getServletContext(), request, response); 170 ResponseInstruction responseInstruction = createRequestHandler().handleFlowRequest(context); 171 return toModelAndView(responseInstruction, context); 172 } 173 174 181 protected FlowRequestHandler createRequestHandler() { 182 return new FlowRequestHandler(getFlowExecutor(), getArgumentHandler()); 183 } 184 185 192 protected ModelAndView toModelAndView(ResponseInstruction response, ExternalContext context) { 193 if (response.isApplicationView()) { 194 ApplicationView view = (ApplicationView)response.getViewSelection(); 196 Map model = new HashMap (view.getModel()); 197 argumentHandler.exposeFlowExecutionContext( 198 response.getFlowExecutionKey(), response.getFlowExecutionContext(), model); 199 return new ModelAndView(view.getViewName(), model); 200 } 201 else if (response.isFlowDefinitionRedirect()) { 202 String flowUrl = argumentHandler.createFlowDefinitionUrl((FlowDefinitionRedirect)response.getViewSelection(), context); 204 return new ModelAndView(new RedirectView(flowUrl)); 205 } 206 else if (response.isFlowExecutionRedirect()) { 207 String flowExecutionUrl = argumentHandler.createFlowExecutionUrl( 209 response.getFlowExecutionKey(), response.getFlowExecutionContext(), context); 210 return new ModelAndView(new RedirectView(flowExecutionUrl)); 211 } 212 else if (response.isExternalRedirect()) { 213 ExternalRedirect redirect = (ExternalRedirect)response.getViewSelection(); 215 String externalUrl = argumentHandler.createExternalUrl(redirect, response.getFlowExecutionKey(), context); 216 return new ModelAndView(new RedirectView(externalUrl)); 217 } 218 else if (response.isNull()) { 219 return null; 221 } 222 else { 223 throw new IllegalArgumentException ("Don't know how to handle response instruction " + response); 224 } 225 } 226 } | Popular Tags |