org.springframework.faces.config.FlowBuilderServicesBuilder Maven / Gradle / Ivy
/*
* Copyright 2004-2014 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.springframework.faces.config;
import org.springframework.binding.convert.ConversionService;
import org.springframework.binding.convert.service.DefaultConversionService;
import org.springframework.binding.expression.ExpressionParser;
import org.springframework.expression.spel.standard.SpelExpressionParser;
import org.springframework.faces.model.converter.FacesConversionService;
import org.springframework.faces.webflow.FacesSpringELExpressionParser;
import org.springframework.faces.webflow.JsfViewFactoryCreator;
import org.springframework.util.Assert;
import org.springframework.validation.Validator;
import org.springframework.webflow.engine.builder.ViewFactoryCreator;
import org.springframework.webflow.engine.builder.support.FlowBuilderServices;
import org.springframework.webflow.expression.spel.WebFlowSpringELExpressionParser;
import org.springframework.webflow.validation.BeanValidationHintResolver;
import org.springframework.webflow.validation.ValidationHintResolver;
/**
* A builder for {@link FlowBuilderServices} instances for use in JSF applications.
* Designed for programmatic use in {@code @Bean} factory methods. For XML
* configuration consider using the {@code webflow-config} and {@code faces-config}
* XML namespaces.
*
* @author Rossen Stoyanchev
* @since 2.4
*/
public class FlowBuilderServicesBuilder {
private boolean enableManagedBeans = false;
private ConversionService conversionService = new FacesConversionService();
private ExpressionParser expressionParser;
private ViewFactoryCreator viewFactoryCreator = new JsfViewFactoryCreator();
private Validator validator;
private ValidationHintResolver validationHintResolver;
private boolean enableDevelopmentMode;
/**
* Whether to enable access to JSF-managed beans from EL expressions.
* When this attribute is set to true, a special EL expression parser will be registered.
* @param enableManagedBeans whether to enable JSF managed bean resolution
*/
public FlowBuilderServicesBuilder setEnableManagedBeans(boolean enableManagedBeans) {
this.enableManagedBeans = enableManagedBeans;
return this;
}
/**
* Set the {@link ConversionService} to use.
* By default a {@link DefaultConversionService} instance is used.
* @param conversionService the conversion service
*/
public FlowBuilderServicesBuilder setConversionService(ConversionService conversionService) {
this.conversionService = conversionService;
return this;
}
/**
* Set the {@link ExpressionParser} to use.
* By default a {@link WebFlowSpringELExpressionParser} with SpEL expressions is used.
* @param expressionParser the expression parser to use
*/
public FlowBuilderServicesBuilder setExpressionParser(ExpressionParser expressionParser) {
this.expressionParser = expressionParser;
return this;
}
/**
* Set a custom {@link ViewFactoryCreator} to use for rendering.
* By default an {@link JsfViewFactoryCreator} instance is used.
* @param viewFactoryCreator the ViewFactory creator to use
*/
public FlowBuilderServicesBuilder setViewFactoryCreator(ViewFactoryCreator viewFactoryCreator) {
this.viewFactoryCreator = viewFactoryCreator;
return this;
}
/**
* Set the {@link Validator} to use for validating a model declared on a view state.
* By default no validator is set.
* @param validator the validator to use
*/
public FlowBuilderServicesBuilder setValidator(Validator validator) {
this.validator = validator;
return this;
}
/**
* The {@link ValidationHintResolver} to use to resolve validation hints such as bean validation groups.
* By default a {@link BeanValidationHintResolver} is used.
* @param resolver the resolver to use
*/
public FlowBuilderServicesBuilder setValidationHintResolver(ValidationHintResolver resolver) {
this.validationHintResolver = resolver;
return this;
}
/**
* Put all flows in development mode. When set to {@code true}, changes to a flow
* definition are auto-detected and result in a flow refresh.
* By default this is set to {@code false}
* @param enableDevelopmentMode whether to enable development mode
*/
public FlowBuilderServicesBuilder setDevelopmentMode(boolean enableDevelopmentMode) {
this.enableDevelopmentMode = enableDevelopmentMode;
return this;
}
/**
* Create and return a {@link FlowBuilderServices} instance.
*/
public FlowBuilderServices build() {
FlowBuilderServices flowBuilderServices = new FlowBuilderServices();
flowBuilderServices.setConversionService(this.conversionService);
flowBuilderServices.setExpressionParser(getExpressionParser());
flowBuilderServices.setViewFactoryCreator(this.viewFactoryCreator);
flowBuilderServices.setValidator(this.validator);
flowBuilderServices.setValidationHintResolver(this.validationHintResolver);
flowBuilderServices.setDevelopment(this.enableDevelopmentMode);
return flowBuilderServices;
}
private ExpressionParser getExpressionParser() {
if (this.expressionParser != null) {
Assert.isTrue(!this.enableManagedBeans,
"Do not specify a custom expression-parser when enable-managed-beans is true");
return this.expressionParser;
}
else {
return (this.enableManagedBeans ?
new FacesSpringELExpressionParser(new SpelExpressionParser(), this.conversionService) :
new WebFlowSpringELExpressionParser(new SpelExpressionParser(), this.conversionService));
}
}
}