1 16 package org.springframework.webflow.engine.builder; 17 18 import org.springframework.binding.convert.ConversionContext; 19 import org.springframework.binding.convert.support.ConversionServiceAwareConverter; 20 import org.springframework.binding.expression.Expression; 21 import org.springframework.util.StringUtils; 22 import org.springframework.webflow.engine.NullViewSelector; 23 import org.springframework.webflow.engine.ViewSelector; 24 import org.springframework.webflow.engine.support.ApplicationViewSelector; 25 import org.springframework.webflow.engine.support.ExternalRedirectSelector; 26 import org.springframework.webflow.engine.support.FlowDefinitionRedirectSelector; 27 import org.springframework.webflow.execution.support.ApplicationView; 28 import org.springframework.webflow.execution.support.ExternalRedirect; 29 import org.springframework.webflow.execution.support.FlowDefinitionRedirect; 30 import org.springframework.webflow.execution.support.FlowExecutionRedirect; 31 32 60 public class TextToViewSelector extends ConversionServiceAwareConverter { 61 62 66 public static final String REDIRECT_PREFIX = "redirect:"; 67 68 72 public static final String EXTERNAL_REDIRECT_PREFIX = "externalRedirect:"; 73 74 78 public static final String FLOW_DEFINITION_REDIRECT_PREFIX = "flowRedirect:"; 79 80 84 private static final String BEAN_PREFIX = "bean:"; 85 86 89 private FlowServiceLocator flowServiceLocator; 90 91 95 public TextToViewSelector(FlowServiceLocator flowServiceLocator) { 96 this.flowServiceLocator = flowServiceLocator; 97 setConversionService(flowServiceLocator.getConversionService()); 98 } 99 100 public Class [] getSourceClasses() { 101 return new Class [] { String .class }; 102 } 103 104 public Class [] getTargetClasses() { 105 return new Class [] { ViewSelector.class }; 106 } 107 108 protected Object doConvert(Object source, Class targetClass, ConversionContext context) throws Exception { 109 String encodedView = (String )source; 110 if (!StringUtils.hasText(encodedView)) { 111 return NullViewSelector.INSTANCE; 112 } 113 else { 114 return convertEncodedViewSelector(encodedView); 115 } 116 } 117 118 123 protected ViewSelector convertEncodedViewSelector(String encodedView) { 124 if (encodedView.startsWith(REDIRECT_PREFIX)) { 125 String viewName = encodedView.substring(REDIRECT_PREFIX.length()); 126 Expression viewNameExpr = (Expression)fromStringTo(Expression.class).execute(viewName); 127 return new ApplicationViewSelector(viewNameExpr, true); 129 } 130 else if (encodedView.startsWith(EXTERNAL_REDIRECT_PREFIX)) { 131 String externalUrl = encodedView.substring(EXTERNAL_REDIRECT_PREFIX.length()); 132 Expression urlExpr = (Expression)fromStringTo(Expression.class).execute(externalUrl); 133 return new ExternalRedirectSelector(urlExpr); 134 } 135 else if (encodedView.startsWith(FLOW_DEFINITION_REDIRECT_PREFIX)) { 136 String flowRedirect = encodedView.substring(FLOW_DEFINITION_REDIRECT_PREFIX.length()); 137 Expression redirectExpr = (Expression)fromStringTo(Expression.class).execute(flowRedirect); 138 return new FlowDefinitionRedirectSelector(redirectExpr); 139 } 140 else if (encodedView.startsWith(BEAN_PREFIX)) { 141 String id = encodedView.substring(BEAN_PREFIX.length()); 142 return flowServiceLocator.getViewSelector(id); 143 } 144 else { 145 Expression viewNameExpr = (Expression)fromStringTo(Expression.class).execute(encodedView); 146 return new ApplicationViewSelector(viewNameExpr); 147 } 148 } 149 } | Popular Tags |