1 16 package org.springframework.webflow.executor.support; 17 18 import java.io.UnsupportedEncodingException ; 19 import java.net.URLEncoder ; 20 import java.util.Map ; 21 22 import org.springframework.core.JdkVersion; 23 import org.springframework.util.StringUtils; 24 import org.springframework.webflow.context.ExternalContext; 25 import org.springframework.webflow.execution.FlowExecutionContext; 26 import org.springframework.webflow.execution.support.ExternalRedirect; 27 import org.springframework.webflow.execution.support.FlowDefinitionRedirect; 28 29 49 public abstract class FlowExecutorArgumentHandler implements FlowExecutorArgumentExtractor, FlowExecutorArgumentExposer { 50 51 53 57 private static final String FLOW_ID_ARGUMENT_NAME = "_flowId"; 58 59 63 private static final String FLOW_EXECUTION_KEY_ARGUMENT_NAME = "_flowExecutionKey"; 64 65 69 private static final String EVENT_ID_ARGUMENT_NAME = "_eventId"; 70 71 75 private String flowIdArgumentName = FLOW_ID_ARGUMENT_NAME; 76 77 81 private String flowExecutionKeyArgumentName = FLOW_EXECUTION_KEY_ARGUMENT_NAME; 82 83 87 private String eventIdArgumentName = EVENT_ID_ARGUMENT_NAME; 88 89 94 private String defaultFlowId; 95 96 99 public String getFlowIdArgumentName() { 100 return flowIdArgumentName; 101 } 102 103 106 public void setFlowIdArgumentName(String flowIdArgumentName) { 107 this.flowIdArgumentName = flowIdArgumentName; 108 } 109 110 114 public String getFlowExecutionKeyArgumentName() { 115 return flowExecutionKeyArgumentName; 116 } 117 118 122 public void setFlowExecutionKeyArgumentName(String flowExecutionKeyArgumentName) { 123 this.flowExecutionKeyArgumentName = flowExecutionKeyArgumentName; 124 } 125 126 130 public String getEventIdArgumentName() { 131 return eventIdArgumentName; 132 } 133 134 138 public void setEventIdArgumentName(String eventIdArgumentName) { 139 this.eventIdArgumentName = eventIdArgumentName; 140 } 141 142 147 public String getDefaultFlowId() { 148 return defaultFlowId; 149 } 150 151 157 public void setDefaultFlowId(String defaultFlowId) { 158 this.defaultFlowId = defaultFlowId; 159 } 160 161 163 167 private static final String FLOW_EXECUTION_KEY_ATTRIBUTE = "flowExecutionKey"; 168 169 173 private static final String FLOW_EXECUTION_CONTEXT_ATTRIBUTE = "flowExecutionContext"; 174 175 178 private static final String DEFAULT_URL_ENCODING_SCHEME = "UTF-8"; 179 180 184 private String flowExecutionKeyAttributeName = FLOW_EXECUTION_KEY_ATTRIBUTE; 185 186 190 private String flowExecutionContextAttributeName = FLOW_EXECUTION_CONTEXT_ATTRIBUTE; 191 192 196 private String urlEncodingScheme = DEFAULT_URL_ENCODING_SCHEME; 197 198 203 private boolean redirectContextRelative = true; 204 205 209 public String getFlowExecutionKeyAttributeName() { 210 return flowExecutionKeyAttributeName; 211 } 212 213 218 public void setFlowExecutionKeyAttributeName(String flowExecutionKeyAttributeName) { 219 this.flowExecutionKeyAttributeName = flowExecutionKeyAttributeName; 220 } 221 222 225 public String getFlowExecutionContextAttributeName() { 226 return flowExecutionContextAttributeName; 227 } 228 229 232 public void setFlowExecutionContextAttributeName(String flowExecutionContextAttributeName) { 233 this.flowExecutionContextAttributeName = flowExecutionContextAttributeName; 234 } 235 236 240 public String getUrlEncodingScheme() { 241 return urlEncodingScheme; 242 } 243 244 248 public void setUrlEncodingScheme(String urlEncodingScheme) { 249 this.urlEncodingScheme = urlEncodingScheme; 250 } 251 252 261 public void setRedirectContextRelative(boolean redirectContextRelative) { 262 this.redirectContextRelative = redirectContextRelative; 263 } 264 265 270 public boolean isRedirectContextRelative() { 271 return redirectContextRelative; 272 } 273 274 public abstract boolean isFlowIdPresent(ExternalContext context); 275 276 public abstract String extractFlowId(ExternalContext context) throws FlowExecutorArgumentExtractionException; 277 278 public abstract boolean isFlowExecutionKeyPresent(ExternalContext context); 279 280 public abstract String extractFlowExecutionKey(ExternalContext context) 281 throws FlowExecutorArgumentExtractionException; 282 283 public abstract boolean isEventIdPresent(ExternalContext context); 284 285 public abstract String extractEventId(ExternalContext context) throws FlowExecutorArgumentExtractionException; 286 287 public void exposeFlowExecutionContext(String flowExecutionKey, FlowExecutionContext context, Map model) { 288 if (flowExecutionKey != null) { 289 model.put(getFlowExecutionKeyAttributeName(), flowExecutionKey); 290 } 291 model.put(getFlowExecutionContextAttributeName(), context); 292 } 293 294 public abstract String createFlowDefinitionUrl(FlowDefinitionRedirect flowDefinitionRedirect, 295 ExternalContext context); 296 297 public abstract String createFlowExecutionUrl(String flowExecutionKey, FlowExecutionContext flowExecution, 298 ExternalContext context); 299 300 public abstract String createExternalUrl(ExternalRedirect redirect, String flowExecutionKey, ExternalContext context); 301 302 304 312 protected String applyDefaultFlowId(String extractedFlowId) { 313 return StringUtils.hasText(extractedFlowId) ? extractedFlowId : getDefaultFlowId(); 314 } 315 316 322 protected String encodeValue(Object value) { 323 return value != null ? urlEncode(value.toString()) : ""; 324 } 325 326 335 protected String makeRedirectUrlContextRelativeIfNecessary(String url, ExternalContext context) { 336 StringBuffer res = new StringBuffer (); 337 if (url.startsWith("/") && isRedirectContextRelative()) { 338 res.append(context.getContextPath()); 339 } 340 res.append(url); 341 return res.toString(); 342 } 343 344 346 355 private String urlEncode(String input) { 356 if (JdkVersion.getMajorJavaVersion() < JdkVersion.JAVA_14) { 357 return URLEncoder.encode(input); 358 } 359 try { 360 return URLEncoder.encode(input, getUrlEncodingScheme()); 361 } 362 catch (UnsupportedEncodingException e) { 363 throw new IllegalArgumentException ("Cannot encode URL " + input); 364 } 365 } 366 } | Popular Tags |