IN PROGRESS - issue SWF-720: Multiple checkboxes to Collection mapping

http://jira.springframework.org/browse/SWF-720
This commit is contained in:
Keith Donald
2008-06-30 20:24:57 +00:00
parent b181862cfb
commit 725814bd0a
25 changed files with 107 additions and 310 deletions

View File

@@ -20,7 +20,6 @@ import org.springframework.beans.factory.xml.AbstractSingleBeanDefinitionParser;
import org.springframework.beans.factory.xml.BeanDefinitionParser;
import org.springframework.beans.factory.xml.ParserContext;
import org.springframework.binding.convert.service.DefaultConversionService;
import org.springframework.binding.format.registry.DefaultFormatterRegistry;
import org.springframework.util.StringUtils;
import org.springframework.webflow.engine.builder.support.FlowBuilderServices;
import org.springframework.webflow.expression.DefaultExpressionParserFactory;
@@ -39,21 +38,11 @@ class FlowBuilderServicesBeanDefinitionParser extends AbstractSingleBeanDefiniti
}
protected void doParse(Element element, ParserContext context, BeanDefinitionBuilder builder) {
parseFormatterRegistry(element, builder, context);
parseConversionService(element, builder, context);
parseExpressionParser(element, builder, context);
parseViewFactoryCreator(element, builder, context);
}
private void parseFormatterRegistry(Element element, BeanDefinitionBuilder definitionBuilder, ParserContext context) {
String formatterRegistry = element.getAttribute("formatter-registry");
if (StringUtils.hasText(formatterRegistry)) {
definitionBuilder.addPropertyReference("formatterRegistry", formatterRegistry);
} else {
definitionBuilder.addPropertyValue("formatterRegistry", DefaultFormatterRegistry.getSharedInstance());
}
}
private void parseConversionService(Element element, BeanDefinitionBuilder definitionBuilder, ParserContext context) {
String conversionService = element.getAttribute("conversion-service");
if (StringUtils.hasText(conversionService)) {

View File

@@ -28,7 +28,6 @@ import org.springframework.beans.factory.xml.AbstractSingleBeanDefinitionParser;
import org.springframework.beans.factory.xml.BeanDefinitionParser;
import org.springframework.beans.factory.xml.ParserContext;
import org.springframework.binding.convert.service.DefaultConversionService;
import org.springframework.binding.format.registry.DefaultFormatterRegistry;
import org.springframework.util.StringUtils;
import org.springframework.util.xml.DomUtils;
import org.springframework.webflow.engine.builder.support.FlowBuilderServices;
@@ -127,7 +126,6 @@ class FlowRegistryBeanDefinitionParser extends AbstractSingleBeanDefinitionParse
private BeanDefinition createDefaultFlowBuilderServices(ParserContext context) {
BeanDefinitionBuilder defaultBuilder = BeanDefinitionBuilder.genericBeanDefinition(FlowBuilderServices.class);
defaultBuilder.addPropertyValue("formatterRegistry", DefaultFormatterRegistry.getSharedInstance());
defaultBuilder.addPropertyValue("conversionService", DefaultConversionService.getSharedInstance());
defaultBuilder.addPropertyValue("expressionParser", DefaultExpressionParserFactory.getExpressionParser());
defaultBuilder.addPropertyValue("viewFactoryCreator", BeanDefinitionBuilder.genericBeanDefinition(

View File

@@ -5,7 +5,7 @@
xmlns:beans="http://www.springframework.org/schema/beans"
targetNamespace="http://www.springframework.org/schema/webflow-config"
elementFormDefault="qualified" attributeFormDefault="unqualified"
version="2.0">
version="2.0.3">
<xsd:annotation>
<xsd:documentation>
@@ -188,15 +188,6 @@ This tag is only needed when you wish to plugin custom implementations.
<xsd:documentation>
<![CDATA[
The custom ConversionService implementation to use to convert from one type to another.
]]>
</xsd:documentation>
</xsd:annotation>
</xsd:attribute>
<xsd:attribute name="formatter-registry">
<xsd:annotation>
<xsd:documentation>
<![CDATA[
The custom FormatterRegistry implementation to use to format model properties for display in a View.
]]>
</xsd:documentation>
</xsd:annotation>

View File

@@ -17,7 +17,6 @@ package org.springframework.webflow.engine.builder;
import org.springframework.binding.convert.ConversionService;
import org.springframework.binding.expression.ExpressionParser;
import org.springframework.binding.format.FormatterRegistry;
import org.springframework.context.ApplicationContext;
import org.springframework.webflow.core.collection.AttributeMap;
import org.springframework.webflow.definition.registry.FlowDefinitionLocator;
@@ -71,12 +70,6 @@ public interface FlowBuilderContext {
*/
public ExpressionParser getExpressionParser();
/**
* Returns an application-wide registry of formatters for formatting view values.
* @return the formatter registry
*/
public FormatterRegistry getFormatterRegistry();
/**
* Returns the application context hosting the flow system.
* @return the application context

View File

@@ -15,9 +15,9 @@
*/
package org.springframework.webflow.engine.builder;
import org.springframework.binding.convert.ConversionService;
import org.springframework.binding.expression.Expression;
import org.springframework.binding.expression.ExpressionParser;
import org.springframework.binding.format.FormatterRegistry;
import org.springframework.webflow.execution.View;
import org.springframework.webflow.execution.ViewFactory;
@@ -32,11 +32,11 @@ public interface ViewFactoryCreator {
* provided identifier.
* @param viewId an expression that resolves the id of the view to render
* @param expressionParser an optional expression parser to use to resolve view expressions
* @param formatterRegistry an optional formatter registry to use to format text values
* @param conversionService an optional conversion service to use to format text values
* @return the view factory
*/
public ViewFactory createViewFactory(Expression viewId, ExpressionParser expressionParser,
FormatterRegistry formatterRegistry);
ConversionService conversionService);
/**
* Get the default id of the view to render in the provided view state by convention.

View File

@@ -608,7 +608,7 @@ public class FlowModelFlowBuilder extends AbstractFlowBuilder {
private ViewFactory createViewFactory(Expression viewId) {
return getLocalContext().getViewFactoryCreator().createViewFactory(viewId,
getLocalContext().getExpressionParser(), getLocalContext().getFormatterRegistry());
getLocalContext().getExpressionParser(), getLocalContext().getConversionService());
}
private ViewVariable[] parseViewVariables(List vars) {

View File

@@ -17,7 +17,6 @@ package org.springframework.webflow.engine.builder.model;
import org.springframework.binding.convert.ConversionService;
import org.springframework.binding.expression.ExpressionParser;
import org.springframework.binding.format.FormatterRegistry;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.GenericApplicationContext;
import org.springframework.webflow.core.collection.AttributeMap;
@@ -86,14 +85,6 @@ class LocalFlowBuilderContext implements FlowBuilderContext {
}
}
public FormatterRegistry getFormatterRegistry() {
if (localFlowContext.containsLocalBean("formatterRegistry")) {
return (FormatterRegistry) localFlowContext.getBean("formatterRegistry", FormatterRegistry.class);
} else {
return parent.getFormatterRegistry();
}
}
public ExpressionParser getExpressionParser() {
if (localFlowContext.containsLocalBean("expressionParser")) {
return (ExpressionParser) localFlowContext.getBean("expressionParser", ExpressionParser.class);

View File

@@ -20,7 +20,6 @@ import org.springframework.binding.convert.ConversionExecutor;
import org.springframework.binding.convert.ConversionService;
import org.springframework.binding.convert.service.GenericConversionService;
import org.springframework.binding.expression.ExpressionParser;
import org.springframework.binding.format.FormatterRegistry;
import org.springframework.context.ApplicationContext;
import org.springframework.util.Assert;
import org.springframework.webflow.core.collection.AttributeMap;
@@ -94,10 +93,6 @@ public class FlowBuilderContextImpl implements FlowBuilderContext {
return flowBuilderServices.getViewFactoryCreator();
}
public FormatterRegistry getFormatterRegistry() {
return flowBuilderServices.getFormatterRegistry();
}
public ExpressionParser getExpressionParser() {
return flowBuilderServices.getExpressionParser();
}

View File

@@ -19,7 +19,6 @@ import org.springframework.beans.BeansException;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.binding.convert.ConversionService;
import org.springframework.binding.expression.ExpressionParser;
import org.springframework.binding.format.FormatterRegistry;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.util.Assert;
@@ -60,11 +59,6 @@ public class FlowBuilderServices implements ApplicationContextAware, Initializin
*/
private ConversionService conversionService;
/**
* The service for formatting string values for display in a UI.
*/
private FormatterRegistry formatterRegistry;
/**
* The parser for parsing expression strings into expression objects. The default is Web Flow's default expression
* parser implementation.
@@ -100,14 +94,6 @@ public class FlowBuilderServices implements ApplicationContextAware, Initializin
this.conversionService = conversionService;
}
public FormatterRegistry getFormatterRegistry() {
return formatterRegistry;
}
public void setFormatterRegistry(FormatterRegistry formatterRegistry) {
this.formatterRegistry = formatterRegistry;
}
public ExpressionParser getExpressionParser() {
return expressionParser;
}
@@ -132,7 +118,6 @@ public class FlowBuilderServices implements ApplicationContextAware, Initializin
Assert.notNull(flowArtifactFactory, "The FlowArtifactFactory is required");
Assert.notNull(viewFactoryCreator, "The ViewFactoryCreator is required");
Assert.notNull(conversionService, "The type ConversionService is required");
Assert.notNull(formatterRegistry, "The FormatterRegistry is required");
Assert.notNull(expressionParser, "The expressionParser is required");
Assert.notNull(applicationContext, "The ApplicationContext is required");
}

View File

@@ -15,7 +15,7 @@
*/
package org.springframework.webflow.engine.builder.support;
import org.springframework.binding.convert.Converter;
import org.springframework.binding.convert.converters.Converter;
import org.springframework.binding.expression.Expression;
import org.springframework.binding.expression.ExpressionParser;
import org.springframework.binding.expression.support.FluentParserContext;
@@ -55,15 +55,15 @@ class TextToTargetStateResolver implements Converter {
this.flowBuilderContext = flowBuilderContext;
}
public Class[] getSourceClasses() {
return new Class[] { String.class };
public Class getSourceClass() {
return String.class;
}
public Class[] getTargetClasses() {
return new Class[] { TargetStateResolver.class };
public Class getTargetClass() {
return TargetStateResolver.class;
}
public Object convert(Object source, Class targetClass, Object context) throws Exception {
public Object convertSourceToTargetClass(Object source, Class targetClass) throws Exception {
String targetStateId = (String) source;
if (!StringUtils.hasText(targetStateId)) {
return null;

View File

@@ -16,7 +16,7 @@
package org.springframework.webflow.engine.builder.support;
import org.springframework.binding.convert.ConversionExecutionException;
import org.springframework.binding.convert.Converter;
import org.springframework.binding.convert.converters.Converter;
import org.springframework.binding.expression.Expression;
import org.springframework.binding.expression.ExpressionParser;
import org.springframework.binding.expression.support.FluentParserContext;
@@ -59,15 +59,15 @@ class TextToTransitionCriteria implements Converter {
this.flowBuilderContext = flowBuilderContext;
}
public Class[] getSourceClasses() {
return new Class[] { String.class };
public Class getSourceClass() {
return String.class;
}
public Class[] getTargetClasses() {
return new Class[] { TransitionCriteria.class };
public Class getTargetClass() {
return TransitionCriteria.class;
}
public Object convert(Object source, Class targetClass, Object context) throws Exception {
public Object convertSourceToTargetClass(Object source, Class targetClass) throws Exception {
String encodedCriteria = (String) source;
ExpressionParser parser = flowBuilderContext.getExpressionParser();
if (!StringUtils.hasText(encodedCriteria)

View File

@@ -17,9 +17,9 @@ package org.springframework.webflow.mvc.builder;
import java.util.List;
import org.springframework.binding.convert.ConversionService;
import org.springframework.binding.expression.Expression;
import org.springframework.binding.expression.ExpressionParser;
import org.springframework.binding.format.FormatterRegistry;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.web.servlet.View;
@@ -115,11 +115,11 @@ public class MvcViewFactoryCreator implements ViewFactoryCreator, ApplicationCon
}
public ViewFactory createViewFactory(Expression viewId, ExpressionParser expressionParser,
FormatterRegistry formatterRegistry) {
ConversionService conversionService) {
if (environment == MvcEnvironment.SERVLET) {
return new ServletMvcViewFactory(viewId, flowViewResolver, expressionParser, formatterRegistry);
return new ServletMvcViewFactory(viewId, flowViewResolver, expressionParser, conversionService);
} else if (environment == MvcEnvironment.PORTLET) {
return new PortletMvcViewFactory(viewId, flowViewResolver, expressionParser, formatterRegistry);
return new PortletMvcViewFactory(viewId, flowViewResolver, expressionParser, conversionService);
} else {
throw new IllegalStateException("Web MVC Environment " + environment + " not supported ");
}

View File

@@ -15,9 +15,9 @@
*/
package org.springframework.webflow.mvc.portlet;
import org.springframework.binding.convert.ConversionService;
import org.springframework.binding.expression.Expression;
import org.springframework.binding.expression.ExpressionParser;
import org.springframework.binding.format.FormatterRegistry;
import org.springframework.web.servlet.View;
import org.springframework.webflow.execution.RequestContext;
import org.springframework.webflow.mvc.view.AbstractMvcView;
@@ -31,22 +31,15 @@ import org.springframework.webflow.mvc.view.FlowViewResolver;
*/
public class PortletMvcViewFactory extends AbstractMvcViewFactory {
/**
* Creates a new portlet mvc view factory.
* @param viewId the view id expression
* @param viewResolver the flow view resolver
* @param expressionParser the expression parser
* @param formatterRegistry the view formatter registry
*/
public PortletMvcViewFactory(Expression viewId, FlowViewResolver viewResolver, ExpressionParser expressionParser,
FormatterRegistry formatterRegistry) {
super(viewId, viewResolver, expressionParser, formatterRegistry);
ConversionService conversionService) {
super(viewId, viewResolver, expressionParser, conversionService);
}
protected AbstractMvcView createMvcView(View view, RequestContext context) {
PortletMvcView mvcView = new PortletMvcView(view, context);
mvcView.setExpressionParser(getExpressionParser());
mvcView.setFormatterRegistry(getFormatterRegistry());
mvcView.setConversionService(getConversionService());
return mvcView;
}

View File

@@ -15,9 +15,9 @@
*/
package org.springframework.webflow.mvc.servlet;
import org.springframework.binding.convert.ConversionService;
import org.springframework.binding.expression.Expression;
import org.springframework.binding.expression.ExpressionParser;
import org.springframework.binding.format.FormatterRegistry;
import org.springframework.web.servlet.View;
import org.springframework.webflow.execution.RequestContext;
import org.springframework.webflow.mvc.view.AbstractMvcView;
@@ -32,14 +32,14 @@ import org.springframework.webflow.mvc.view.FlowViewResolver;
public class ServletMvcViewFactory extends AbstractMvcViewFactory {
public ServletMvcViewFactory(Expression viewId, FlowViewResolver viewResolver, ExpressionParser expressionParser,
FormatterRegistry formatterRegistry) {
super(viewId, viewResolver, expressionParser, formatterRegistry);
ConversionService conversionService) {
super(viewId, viewResolver, expressionParser, conversionService);
}
protected AbstractMvcView createMvcView(View view, RequestContext context) {
ServletMvcView mvcView = new ServletMvcView(view, context);
mvcView.setExpressionParser(getExpressionParser());
mvcView.setFormatterRegistry(getFormatterRegistry());
mvcView.setConversionService(getConversionService());
return mvcView;
}

View File

@@ -27,23 +27,19 @@ import java.util.Set;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.binding.convert.ConversionExecutionException;
import org.springframework.binding.convert.ConversionExecutor;
import org.springframework.binding.convert.ConversionService;
import org.springframework.binding.convert.service.DefaultConversionService;
import org.springframework.binding.expression.EvaluationException;
import org.springframework.binding.expression.Expression;
import org.springframework.binding.expression.ExpressionParser;
import org.springframework.binding.expression.ParserContext;
import org.springframework.binding.expression.support.FluentParserContext;
import org.springframework.binding.expression.support.StaticExpression;
import org.springframework.binding.format.Formatter;
import org.springframework.binding.format.FormatterRegistry;
import org.springframework.binding.format.InvalidFormatException;
import org.springframework.binding.mapping.MappingResult;
import org.springframework.binding.mapping.MappingResults;
import org.springframework.binding.mapping.MappingResultsCriteria;
import org.springframework.binding.mapping.impl.DefaultMapper;
import org.springframework.binding.mapping.impl.DefaultMapping;
import org.springframework.binding.mapping.impl.DefaultMappingContext;
import org.springframework.binding.message.MessageBuilder;
import org.springframework.binding.message.MessageContext;
import org.springframework.binding.message.MessageContextErrors;
@@ -52,7 +48,6 @@ import org.springframework.util.ReflectionUtils;
import org.springframework.util.StringUtils;
import org.springframework.validation.BindingResult;
import org.springframework.validation.Errors;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.util.WebUtils;
import org.springframework.webflow.core.collection.ParameterMap;
import org.springframework.webflow.definition.TransitionDefinition;
@@ -82,7 +77,7 @@ public abstract class AbstractMvcView implements View {
private ExpressionParser expressionParser = DefaultExpressionParserFactory.getExpressionParser();
private FormatterRegistry formatterRegistry;
private ConversionService conversionService = DefaultConversionService.getSharedInstance();
private MappingResults mappingResults;
@@ -94,8 +89,6 @@ public abstract class AbstractMvcView implements View {
private String fieldMarkerPrefix = "_";
private ConversionExecutor bindingTypeConverter;
/**
* Creates a new MVC view.
* @param view the Spring MVC view to render
@@ -118,9 +111,8 @@ public abstract class AbstractMvcView implements View {
* Sets the formatter registry to use to expose formatters for field values.
* @param formatterRegistry the formatter registry
*/
public void setFormatterRegistry(FormatterRegistry formatterRegistry) {
this.formatterRegistry = formatterRegistry;
bindingTypeConverter = new FormatterBackedMappingConversionExecutor(this.formatterRegistry);
public void setConversionService(ConversionService conversionService) {
this.conversionService = conversionService;
}
/**
@@ -248,7 +240,7 @@ public abstract class AbstractMvcView implements View {
Object modelObject = getModelObject();
if (modelObject != null) {
BindingModel bindingModel = new BindingModel(getModelExpression().getExpressionString(), modelObject,
expressionParser, formatterRegistry, requestContext.getMessageContext());
expressionParser, conversionService, requestContext.getMessageContext());
bindingModel.setMappingResults(mappingResults);
model.put(BindingResult.MODEL_KEY_PREFIX + getModelExpression().getExpressionString(), bindingModel);
}
@@ -283,6 +275,7 @@ public abstract class AbstractMvcView implements View {
logger.debug("Setting up view->model mappings");
}
DefaultMapper mapper = new DefaultMapper();
mapper.setConversionService(conversionService);
ParameterMap requestParameters = requestContext.getRequestParameters();
addDefaultMappings(mapper, requestParameters.asMap().keySet(), model);
return mapper.map(requestParameters, model);
@@ -357,7 +350,6 @@ public abstract class AbstractMvcView implements View {
ParserContext parserContext = new FluentParserContext().evaluate(model.getClass());
Expression target = expressionParser.parseExpression(parameter, parserContext);
DefaultMapping mapping = new DefaultMapping(source, target);
mapping.setTypeConverter(bindingTypeConverter);
if (logger.isDebugEnabled()) {
logger.debug("Adding mapping for parameter '" + parameter + "'");
}
@@ -460,78 +452,7 @@ public abstract class AbstractMvcView implements View {
}
public String toString() {
return parameterName;
return "parameter:'" + parameterName + "'";
}
}
private static class FormatterBackedMappingConversionExecutor implements ConversionExecutor {
private FormatterRegistry formatterRegistry;
public FormatterBackedMappingConversionExecutor(FormatterRegistry formatterRegistry) {
this.formatterRegistry = formatterRegistry;
}
public Object execute(Object source) throws ConversionExecutionException {
throw new UnsupportedOperationException("Should never be called");
}
public Object execute(Object source, Object context) throws ConversionExecutionException {
if (source instanceof MultipartFile) {
// for the case of MultipartFile parameters; nothing to do
return source;
}
if (source instanceof String[]) {
return source;
}
String formattedValue = (String) source;
DefaultMappingContext mappingContext = (DefaultMappingContext) context;
Expression target = mappingContext.getCurrentMapping().getTargetExpression();
Class targetClass = getTargetClass();
if (targetClass == null) {
try {
targetClass = target.getValueType(mappingContext.getTarget());
} catch (EvaluationException e) {
// ignore
}
}
if (targetClass == null) {
return formattedValue;
}
Formatter formatter = getFormatter(target, targetClass);
if (formatter != null) {
try {
return formatter.parse(formattedValue);
} catch (InvalidFormatException e) {
throw new ConversionExecutionException(formattedValue, String.class, targetClass, e);
}
} else {
return formattedValue;
}
}
private Formatter getFormatter(Expression target, Class targetClass) {
if (formatterRegistry != null) {
Formatter formatter = formatterRegistry.getFormatter(targetClass, target.getExpressionString());
if (formatter != null) {
return formatter;
} else {
return formatterRegistry.getFormatter(targetClass);
}
} else {
return null;
}
}
public Class getSourceClass() {
return String.class;
}
public Class getTargetClass() {
return null;
}
}
}

View File

@@ -15,9 +15,9 @@
*/
package org.springframework.webflow.mvc.view;
import org.springframework.binding.convert.ConversionService;
import org.springframework.binding.expression.Expression;
import org.springframework.binding.expression.ExpressionParser;
import org.springframework.binding.format.FormatterRegistry;
import org.springframework.webflow.execution.RequestContext;
import org.springframework.webflow.execution.View;
import org.springframework.webflow.execution.ViewFactory;
@@ -35,22 +35,22 @@ public abstract class AbstractMvcViewFactory implements ViewFactory {
private ExpressionParser expressionParser;
private FormatterRegistry formatterRegistry;
private ConversionService conversionService;
public AbstractMvcViewFactory(Expression viewId, FlowViewResolver viewResolver, ExpressionParser expressionParser,
FormatterRegistry formatterRegistry) {
ConversionService conversionService) {
this.viewId = viewId;
this.viewResolver = viewResolver;
this.expressionParser = expressionParser;
this.formatterRegistry = formatterRegistry;
this.conversionService = conversionService;
}
protected ExpressionParser getExpressionParser() {
return expressionParser;
}
protected FormatterRegistry getFormatterRegistry() {
return formatterRegistry;
protected ConversionService getConversionService() {
return conversionService;
}
public View getView(RequestContext context) {

View File

@@ -19,11 +19,11 @@ import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import org.springframework.binding.convert.ConversionExecutor;
import org.springframework.binding.convert.ConversionService;
import org.springframework.binding.expression.Expression;
import org.springframework.binding.expression.ExpressionParser;
import org.springframework.binding.expression.support.FluentParserContext;
import org.springframework.binding.format.Formatter;
import org.springframework.binding.format.FormatterRegistry;
import org.springframework.binding.mapping.MappingResult;
import org.springframework.binding.mapping.MappingResults;
import org.springframework.binding.mapping.MappingResultsCriteria;
@@ -55,7 +55,7 @@ public class BindingModel extends AbstractErrors {
private ExpressionParser expressionParser;
private FormatterRegistry formatterRegistry;
private ConversionService conversionService;
private MappingResults mappingResults;
@@ -70,13 +70,13 @@ public class BindingModel extends AbstractErrors {
* @param messageContext the message context containing flow messages to display
*/
public BindingModel(String objectName, Object boundObject, ExpressionParser expressionParser,
FormatterRegistry formatterRegistry, MessageContext messageContext) {
ConversionService conversionService, MessageContext messageContext) {
Assert.hasText(objectName, "The object name is required");
Assert.notNull(boundObject, "The bound object instance is required");
this.objectName = objectName;
this.boundObject = boundObject;
this.expressionParser = expressionParser;
this.formatterRegistry = formatterRegistry;
this.conversionService = conversionService;
this.messageContext = messageContext;
}
@@ -131,18 +131,18 @@ public class BindingModel extends AbstractErrors {
}
private Object getFormattedValue(Expression fieldExpression) {
Formatter formatter = getFormatter(fieldExpression);
if (formatter != null) {
return formatter.format(fieldExpression.getValue(boundObject));
ConversionExecutor converter = getConverter(fieldExpression);
if (converter != null) {
return converter.execute(fieldExpression.getValue(boundObject));
} else {
return fieldExpression.getValue(boundObject);
}
}
private Formatter getFormatter(Expression fieldExpression) {
if (formatterRegistry != null) {
private ConversionExecutor getConverter(Expression fieldExpression) {
if (conversionService != null) {
Class valueType = fieldExpression.getValueType(boundObject);
return formatterRegistry.getFormatter(valueType);
return conversionService.getConversionExecutor(valueType, String.class);
} else {
return null;
}

View File

@@ -17,9 +17,9 @@ package org.springframework.webflow.test;
import java.io.IOException;
import org.springframework.binding.convert.ConversionService;
import org.springframework.binding.expression.Expression;
import org.springframework.binding.expression.ExpressionParser;
import org.springframework.binding.format.FormatterRegistry;
import org.springframework.webflow.engine.builder.ViewFactoryCreator;
import org.springframework.webflow.execution.Event;
import org.springframework.webflow.execution.RequestContext;
@@ -35,7 +35,7 @@ import org.springframework.webflow.execution.ViewFactory;
class MockViewFactoryCreator implements ViewFactoryCreator {
public ViewFactory createViewFactory(Expression viewId, ExpressionParser expressionParser,
FormatterRegistry formatterRegistry) {
ConversionService conversionService) {
return new MockViewFactory(viewId);
}

View File

@@ -8,8 +8,6 @@ import org.springframework.binding.convert.ConversionService;
import org.springframework.binding.convert.service.DefaultConversionService;
import org.springframework.binding.expression.Expression;
import org.springframework.binding.expression.ExpressionParser;
import org.springframework.binding.format.Formatter;
import org.springframework.binding.format.FormatterRegistry;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.webflow.engine.builder.ViewFactoryCreator;
import org.springframework.webflow.engine.builder.support.FlowBuilderServices;
@@ -39,13 +37,12 @@ public class FlowBuilderServicesBeanDefinitionParserTests extends TestCase {
assertNotNull(builderServices.getExpressionParser());
assertTrue(builderServices.getViewFactoryCreator() instanceof TestViewFactoryCreator);
assertTrue(builderServices.getConversionService() instanceof TestConversionService);
assertTrue(builderServices.getFormatterRegistry() instanceof TestFormatterRegistry);
}
public static class TestViewFactoryCreator implements ViewFactoryCreator {
public ViewFactory createViewFactory(Expression viewIdExpression, ExpressionParser expressionParser,
FormatterRegistry formatterRegistry) {
ConversionService conversionService) {
throw new UnsupportedOperationException("Auto-generated method stub");
}
@@ -78,16 +75,4 @@ public class FlowBuilderServicesBeanDefinitionParserTests extends TestCase {
}
public static class TestFormatterRegistry implements FormatterRegistry {
public Formatter getFormatter(Class clazz) {
throw new UnsupportedOperationException("Auto-generated method stub");
}
public Formatter getFormatter(Class clazz, String id) {
throw new UnsupportedOperationException("Auto-generated method stub");
}
}
}
}

View File

@@ -13,15 +13,12 @@
<webflow:flow-builder-services id="flowBuilderServicesCustom"
expression-parser="customExpressionParser"
view-factory-creator="customViewFactoryCreator"
conversion-service="customConversionService"
formatter-registry="customFormatterRegistry"/>
conversion-service="customConversionService" />
<bean id="customExpressionParser" class="org.springframework.webflow.expression.DefaultExpressionParserFactory" factory-method="getExpressionParser"/>
<bean id="customViewFactoryCreator" class="org.springframework.webflow.config.FlowBuilderServicesBeanDefinitionParserTests$TestViewFactoryCreator"/>
<bean id="customConversionService" class="org.springframework.webflow.config.FlowBuilderServicesBeanDefinitionParserTests$TestConversionService"/>
<bean id="customFormatterRegistry" class="org.springframework.webflow.config.FlowBuilderServicesBeanDefinitionParserTests$TestFormatterRegistry"/>
</beans>

View File

@@ -32,8 +32,8 @@ public class TextToTargetStateResolverTests extends TestCase {
public void testStatic() throws Exception {
String expression = "mockState";
TargetStateResolver resolver = (TargetStateResolver) converter.convert(expression, TargetStateResolver.class,
null);
TargetStateResolver resolver = (TargetStateResolver) converter.convertSourceToTargetClass(expression,
TargetStateResolver.class);
MockRequestContext context = new MockRequestContext();
Transition transition = new Transition();
assertEquals("mockState", resolver.resolveTargetState(transition, null, context).getId());
@@ -41,8 +41,8 @@ public class TextToTargetStateResolverTests extends TestCase {
public void testDynamic() throws Exception {
String expression = "${flowScope.lastState}";
TargetStateResolver resolver = (TargetStateResolver) converter.convert(expression, TargetStateResolver.class,
null);
TargetStateResolver resolver = (TargetStateResolver) converter.convertSourceToTargetClass(expression,
TargetStateResolver.class);
MockRequestContext context = new MockRequestContext();
context.getFlowScope().put("lastState", "mockState");
Transition transition = new Transition();
@@ -51,15 +51,15 @@ public class TextToTargetStateResolverTests extends TestCase {
public void testNull() throws Exception {
String expression = null;
TargetStateResolver resolver = (TargetStateResolver) converter.convert(expression, TargetStateResolver.class,
null);
TargetStateResolver resolver = (TargetStateResolver) converter.convertSourceToTargetClass(expression,
TargetStateResolver.class);
assertNull(resolver);
}
public void testEmpty() throws Exception {
String expression = "";
TargetStateResolver resolver = (TargetStateResolver) converter.convert(expression, TargetStateResolver.class,
null);
TargetStateResolver resolver = (TargetStateResolver) converter.convertSourceToTargetClass(expression,
TargetStateResolver.class);
assertNull(resolver);
}
}

View File

@@ -41,43 +41,46 @@ public class TextToTransitionCriteriaTests extends TestCase {
public void testAny() throws Exception {
String expression = "*";
TransitionCriteria criterion = (TransitionCriteria) converter.convert(expression, TransitionCriteria.class,
null);
TransitionCriteria criterion = (TransitionCriteria) converter.convertSourceToTargetClass(expression,
TransitionCriteria.class);
RequestContext ctx = getRequestContext();
assertTrue("Criterion should evaluate to true", criterion.test(ctx));
assertSame(WildcardTransitionCriteria.INSTANCE, converter.convert("*", TransitionCriteria.class, null));
assertSame(WildcardTransitionCriteria.INSTANCE, converter.convert("", TransitionCriteria.class, null));
assertSame(WildcardTransitionCriteria.INSTANCE, converter.convert(null, TransitionCriteria.class, null));
assertSame(WildcardTransitionCriteria.INSTANCE, converter.convertSourceToTargetClass("*",
TransitionCriteria.class));
assertSame(WildcardTransitionCriteria.INSTANCE, converter.convertSourceToTargetClass("",
TransitionCriteria.class));
assertSame(WildcardTransitionCriteria.INSTANCE, converter.convertSourceToTargetClass(null,
TransitionCriteria.class));
}
public void testStaticEventId() throws Exception {
String expression = "sample";
TransitionCriteria criterion = (TransitionCriteria) converter.convert(expression, TransitionCriteria.class,
null);
TransitionCriteria criterion = (TransitionCriteria) converter.convertSourceToTargetClass(expression,
TransitionCriteria.class);
RequestContext ctx = getRequestContext();
assertTrue("Criterion should evaluate to true", criterion.test(ctx));
}
public void testTrueEvaluation() throws Exception {
String expression = "${flowScope.foo == 'bar'}";
TransitionCriteria criterion = (TransitionCriteria) converter.convert(expression, TransitionCriteria.class,
null);
TransitionCriteria criterion = (TransitionCriteria) converter.convertSourceToTargetClass(expression,
TransitionCriteria.class);
RequestContext ctx = getRequestContext();
assertTrue("Criterion should evaluate to true", criterion.test(ctx));
}
public void testFalseEvaluation() throws Exception {
String expression = "${flowScope.foo != 'bar'}";
TransitionCriteria criterion = (TransitionCriteria) converter.convert(expression, TransitionCriteria.class,
null);
TransitionCriteria criterion = (TransitionCriteria) converter.convertSourceToTargetClass(expression,
TransitionCriteria.class);
RequestContext ctx = getRequestContext();
assertFalse("Criterion should evaluate to false", criterion.test(ctx));
}
public void testNonStringEvaluation() throws Exception {
String expression = "${3 + 4}";
TransitionCriteria criterion = (TransitionCriteria) converter.convert(expression, TransitionCriteria.class,
null);
TransitionCriteria criterion = (TransitionCriteria) converter.convertSourceToTargetClass(expression,
TransitionCriteria.class);
MockRequestContext ctx = getRequestContext();
ctx.setCurrentEvent(new Event(this, "7"));
assertTrue("Criterion should evaluate to true", criterion.test(ctx));
@@ -85,8 +88,8 @@ public class TextToTransitionCriteriaTests extends TestCase {
public void testCurrenEventEval() throws Exception {
String expression = "${currentEvent == 'submit'}";
TransitionCriteria criterion = (TransitionCriteria) converter.convert(expression, TransitionCriteria.class,
null);
TransitionCriteria criterion = (TransitionCriteria) converter.convertSourceToTargetClass(expression,
TransitionCriteria.class);
MockRequestContext ctx = getRequestContext();
ctx.setCurrentEvent(new Event(this, "submit"));
assertTrue("Criterion should evaluate to true", criterion.test(ctx));
@@ -98,8 +101,8 @@ public class TextToTransitionCriteriaTests extends TestCase {
return new StaticExpression(null);
}
});
TransitionCriteria criterion = (TransitionCriteria) converter.convert("doesnt matter",
TransitionCriteria.class, null);
TransitionCriteria criterion = (TransitionCriteria) converter.convertSourceToTargetClass("doesnt matter",
TransitionCriteria.class);
RequestContext ctx = getRequestContext();
assertFalse("Criterion should evaluate to false", criterion.test(ctx));
}

View File

@@ -1,15 +1,11 @@
package org.springframework.webflow.mvc.portlet;
import java.util.Locale;
import javax.portlet.RenderRequest;
import javax.portlet.RenderResponse;
import junit.framework.TestCase;
import org.easymock.EasyMock;
import org.springframework.binding.format.formatters.DateFormatter;
import org.springframework.binding.format.registry.DefaultFormatterRegistry;
import org.springframework.mock.web.portlet.MockPortletContext;
import org.springframework.mock.web.portlet.MockRenderRequest;
import org.springframework.mock.web.portlet.MockRenderResponse;
@@ -20,14 +16,6 @@ import org.springframework.webflow.test.MockRequestContext;
public class PortletMvcViewTests extends TestCase {
private DefaultFormatterRegistry formatterRegistry = new DefaultFormatterRegistry();
protected void setUp() {
DateFormatter dateFormatter = new DateFormatter();
dateFormatter.setLocale(Locale.ENGLISH);
formatterRegistry.registerFormatter(dateFormatter);
}
public void testRender() throws Exception {
RenderRequest request = new MockRenderRequest();
RenderResponse response = new MockRenderResponse();
@@ -39,7 +27,6 @@ public class PortletMvcViewTests extends TestCase {
org.springframework.web.servlet.View mvcView = (org.springframework.web.servlet.View) EasyMock
.createMock(org.springframework.web.servlet.View.class);
AbstractMvcView view = new PortletMvcView(mvcView, context);
view.setFormatterRegistry(formatterRegistry);
view.render();
assertNotNull(request.getAttribute(ViewRendererServlet.VIEW_ATTRIBUTE));
assertNotNull(request.getAttribute(ViewRendererServlet.MODEL_ATTRIBUTE));

View File

@@ -3,7 +3,6 @@ package org.springframework.webflow.mvc.servlet;
import java.security.Principal;
import java.util.Calendar;
import java.util.Date;
import java.util.Locale;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
@@ -11,8 +10,6 @@ import javax.servlet.http.HttpServletResponse;
import junit.framework.TestCase;
import org.springframework.binding.format.formatters.DateFormatter;
import org.springframework.binding.format.registry.DefaultFormatterRegistry;
import org.springframework.mock.web.MockHttpServletRequest;
import org.springframework.mock.web.MockHttpServletResponse;
import org.springframework.mock.web.MockServletContext;
@@ -28,14 +25,6 @@ public class ServletMvcViewTests extends TestCase {
private Map model;
private DefaultFormatterRegistry formatterRegistry = new DefaultFormatterRegistry();
protected void setUp() {
DateFormatter dateFormatter = new DateFormatter();
dateFormatter.setLocale(Locale.ENGLISH);
formatterRegistry.registerFormatter(dateFormatter);
}
public void testRender() throws Exception {
MockRequestContext context = new MockRequestContext();
context.getRequestScope().put("foo", "bar");
@@ -50,7 +39,6 @@ public class ServletMvcViewTests extends TestCase {
context.getMockFlowExecutionContext().setKey(new MockFlowExecutionKey("c1v1"));
org.springframework.web.servlet.View mvcView = new MockView();
AbstractMvcView view = new ServletMvcView(mvcView, context);
view.setFormatterRegistry(formatterRegistry);
view.render();
assertTrue(renderCalled);
assertEquals("bar", model.get("foo"));

View File

@@ -5,7 +5,6 @@ import java.util.Calendar;
import java.util.Date;
import java.util.HashSet;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
@@ -14,8 +13,6 @@ import javax.servlet.http.HttpServletResponse;
import junit.framework.TestCase;
import org.springframework.binding.expression.support.StaticExpression;
import org.springframework.binding.format.formatters.DateFormatter;
import org.springframework.binding.format.registry.DefaultFormatterRegistry;
import org.springframework.mock.web.MockHttpServletRequest;
import org.springframework.mock.web.MockHttpServletResponse;
import org.springframework.mock.web.MockMultipartFile;
@@ -38,14 +35,6 @@ public class MvcViewTests extends TestCase {
private Map model;
private DefaultFormatterRegistry formatterRegistry = new DefaultFormatterRegistry();
protected void setUp() {
DateFormatter dateFormatter = new DateFormatter();
dateFormatter.setLocale(Locale.ENGLISH);
formatterRegistry.registerFormatter(dateFormatter);
}
public void testRender() throws Exception {
MockRequestControlContext context = new MockRequestControlContext();
context.setCurrentState(new ViewState(context.getRootFlow(), "test", new StubViewFactory()));
@@ -61,7 +50,6 @@ public class MvcViewTests extends TestCase {
context.getMockFlowExecutionContext().setKey(new MockFlowExecutionKey("c1v1"));
org.springframework.web.servlet.View mvcView = new MockView();
AbstractMvcView view = new MockMvcView(mvcView, context);
view.setFormatterRegistry(formatterRegistry);
view.render();
assertTrue(renderCalled);
assertEquals("bar", model.get("foo"));
@@ -91,7 +79,6 @@ public class MvcViewTests extends TestCase {
context.getMockExternalContext().setNativeResponse(new MockHttpServletResponse());
org.springframework.web.servlet.View mvcView = new MockView();
AbstractMvcView view = new MockMvcView(mvcView, context);
view.setFormatterRegistry(formatterRegistry);
view.render();
assertTrue(renderCalled);
assertEquals("bar", model.get("foo"));
@@ -119,7 +106,6 @@ public class MvcViewTests extends TestCase {
context.getMockFlowExecutionContext().setKey(new MockFlowExecutionKey("c1v1"));
org.springframework.web.servlet.View mvcView = new MockView();
AbstractMvcView view = new MockMvcView(mvcView, context);
view.setFormatterRegistry(formatterRegistry);
view.render();
assertEquals(context.getFlowScope().get("bindBean"), model.get("bindBean"));
BindingModel bm = (BindingModel) model.get(BindingResult.MODEL_KEY_PREFIX + "bindBean");
@@ -151,7 +137,6 @@ public class MvcViewTests extends TestCase {
context.getMockFlowExecutionContext().setKey(new MockFlowExecutionKey("c1v1"));
org.springframework.web.servlet.View mvcView = new MockView();
AbstractMvcView view = new MockMvcView(mvcView, context);
view.setFormatterRegistry(formatterRegistry);
view.processUserEvent();
assertTrue(view.hasFlowEvent());
assertEquals("submit", view.getFlowEvent().getId());
@@ -165,10 +150,10 @@ public class MvcViewTests extends TestCase {
context.putRequestParameter("dateProperty", "2007-01-01");
context.putRequestParameter("beanProperty.name", "foo");
context.putRequestParameter("multipartFile", new MockMultipartFile("foo", new byte[0]));
// context.putRequestParameter("stringArrayProperty", new String[] { "foo", "bar", "baz" });
// context.putRequestParameter("integerArrayProperty", new String[] { "1", "2", "3" });
// context.putRequestParameter("primitiveArrayProperty", new String[] { "1", "2", "3" });
// context.putRequestParameter("listProperty", new String[] { "1", "2", "3" });
context.putRequestParameter("stringArrayProperty", new String[] { "foo", "bar", "baz" });
context.putRequestParameter("integerArrayProperty", new String[] { "1", "2", "3" });
context.putRequestParameter("primitiveArrayProperty", new String[] { "1", "2", "3" });
context.putRequestParameter("listProperty", new String[] { "1", "2", "3" });
BindBean bindBean = new BindBean();
StaticExpression modelObject = new StaticExpression(bindBean);
modelObject.setExpressionString("bindBean");
@@ -180,7 +165,6 @@ public class MvcViewTests extends TestCase {
context.getMockFlowExecutionContext().setKey(new MockFlowExecutionKey("c1v1"));
org.springframework.web.servlet.View mvcView = new MockView();
AbstractMvcView view = new MockMvcView(mvcView, context);
view.setFormatterRegistry(formatterRegistry);
view.processUserEvent();
assertTrue(view.hasFlowEvent());
assertEquals("submit", view.getFlowEvent().getId());
@@ -192,22 +176,22 @@ public class MvcViewTests extends TestCase {
assertEquals(cal.getTime(), bindBean.getDateProperty());
assertEquals("foo", bindBean.getBeanProperty().getName());
assertEquals("foo", bindBean.getMultipartFile().getName());
// assertEquals(3, bindBean.getStringArrayProperty().length);
// assertEquals("foo", bindBean.getStringArrayProperty()[0]);
// assertEquals("bar", bindBean.getStringArrayProperty()[1]);
// assertEquals("baz", bindBean.getStringArrayProperty()[2]);
// assertEquals(3, bindBean.getIntegerArrayProperty().length);
// assertEquals(new Integer(1), bindBean.getIntegerArrayProperty()[0]);
// assertEquals(new Integer(2), bindBean.getIntegerArrayProperty()[1]);
// assertEquals(new Integer(3), bindBean.getIntegerArrayProperty()[2]);
// assertEquals(3, bindBean.getPrimitiveArrayProperty().length);
// assertEquals(1, bindBean.getPrimitiveArrayProperty()[0]);
// assertEquals(2, bindBean.getPrimitiveArrayProperty()[1]);
// assertEquals(3, bindBean.getPrimitiveArrayProperty()[2]);
// assertEquals(3, bindBean.getListProperty().size());
// assertEquals(new Integer(1), bindBean.getListProperty().get(0));
// assertEquals(new Integer(2), bindBean.getListProperty().get(1));
// assertEquals(new Integer(3), bindBean.getListProperty().get(2));
assertEquals(3, bindBean.getStringArrayProperty().length);
assertEquals("foo", bindBean.getStringArrayProperty()[0]);
assertEquals("bar", bindBean.getStringArrayProperty()[1]);
assertEquals("baz", bindBean.getStringArrayProperty()[2]);
assertEquals(3, bindBean.getIntegerArrayProperty().length);
assertEquals(new Integer(1), bindBean.getIntegerArrayProperty()[0]);
assertEquals(new Integer(2), bindBean.getIntegerArrayProperty()[1]);
assertEquals(new Integer(3), bindBean.getIntegerArrayProperty()[2]);
assertEquals(3, bindBean.getPrimitiveArrayProperty().length);
assertEquals(1, bindBean.getPrimitiveArrayProperty()[0]);
assertEquals(2, bindBean.getPrimitiveArrayProperty()[1]);
assertEquals(3, bindBean.getPrimitiveArrayProperty()[2]);
assertEquals(3, bindBean.getListProperty().size());
assertEquals("1", bindBean.getListProperty().get(0));
assertEquals("2", bindBean.getListProperty().get(1));
assertEquals("3", bindBean.getListProperty().get(2));
}
public void testResumeEventModelBindingAllowedFields() throws Exception {
@@ -228,7 +212,6 @@ public class MvcViewTests extends TestCase {
context.getMockFlowExecutionContext().setKey(new MockFlowExecutionKey("c1v1"));
org.springframework.web.servlet.View mvcView = new MockView();
AbstractMvcView view = new MockMvcView(mvcView, context);
view.setFormatterRegistry(formatterRegistry);
HashSet allowedBindFields = new HashSet();
allowedBindFields.add("stringProperty");
view.setAllowedBindFields(allowedBindFields);
@@ -259,7 +242,6 @@ public class MvcViewTests extends TestCase {
context.getMockFlowExecutionContext().setKey(new MockFlowExecutionKey("c1v1"));
org.springframework.web.servlet.View mvcView = new MockView();
AbstractMvcView view = new MockMvcView(mvcView, context);
view.setFormatterRegistry(formatterRegistry);
HashSet allowedBindFields = new HashSet();
allowedBindFields.add("booleanProperty");
view.setAllowedBindFields(allowedBindFields);
@@ -283,7 +265,6 @@ public class MvcViewTests extends TestCase {
context.getMockFlowExecutionContext().setKey(new MockFlowExecutionKey("c1v1"));
org.springframework.web.servlet.View mvcView = new MockView();
AbstractMvcView view = new MockMvcView(mvcView, context);
view.setFormatterRegistry(formatterRegistry);
view.processUserEvent();
assertEquals(true, bindBean.getBooleanProperty());
}