/* * Copyright 2004-2008 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.webflow.mvc.view; import org.springframework.binding.convert.ConversionService; import org.springframework.binding.expression.Expression; import org.springframework.binding.expression.ExpressionParser; import org.springframework.util.StringUtils; import org.springframework.validation.MessageCodesResolver; import org.springframework.validation.Validator; import org.springframework.webflow.engine.builder.BinderConfiguration; import org.springframework.webflow.execution.RequestContext; import org.springframework.webflow.execution.View; import org.springframework.webflow.execution.ViewFactory; import org.springframework.webflow.validation.ValidationHintResolver; /** * Base class for mvc view factories. * * @author Keith Donald */ public abstract class AbstractMvcViewFactory implements ViewFactory { private Expression viewId; private FlowViewResolver viewResolver; private ExpressionParser expressionParser; private ConversionService conversionService; private Validator validator; private ValidationHintResolver validationHintResolver; private BinderConfiguration binderConfiguration; private String eventIdParameterName; private String fieldMarkerPrefix; private MessageCodesResolver messageCodesResolver; /** * Creates a new MVC view factory. * @param viewId the id of the view as an expression * @param viewResolver the resolver to resolve the View implementation * @param expressionParser the expression parser * @param conversionService the conversion service * @param binderConfiguration the model binding configuration */ public AbstractMvcViewFactory(Expression viewId, FlowViewResolver viewResolver, ExpressionParser expressionParser, ConversionService conversionService, BinderConfiguration binderConfiguration, MessageCodesResolver messageCodesResolver) { this.viewId = viewId; this.viewResolver = viewResolver; this.expressionParser = expressionParser; this.conversionService = conversionService; this.binderConfiguration = binderConfiguration; this.messageCodesResolver = messageCodesResolver; } public void setEventIdParameterName(String eventIdParameterName) { this.eventIdParameterName = eventIdParameterName; } public void setFieldMarkerPrefix(String fieldMarkerPrefix) { this.fieldMarkerPrefix = fieldMarkerPrefix; } public void setValidator(Validator validator) { this.validator = validator; } public void setValidationHintResolver(ValidationHintResolver validationHintResolver) { this.validationHintResolver = validationHintResolver; } public View getView(RequestContext context) { String viewId = (String) this.viewId.getValue(context); org.springframework.web.servlet.View view = viewResolver.resolveView(viewId, context); AbstractMvcView mvcView = createMvcView(view, context); mvcView.setExpressionParser(expressionParser); mvcView.setConversionService(conversionService); mvcView.setBinderConfiguration(binderConfiguration); mvcView.setMessageCodesResolver(messageCodesResolver); mvcView.setValidator(validator); mvcView.setValidationHintResolver(validationHintResolver); if (StringUtils.hasText(eventIdParameterName)) { mvcView.setEventIdParameterName(eventIdParameterName); } if (StringUtils.hasText(fieldMarkerPrefix)) { mvcView.setFieldMarkerPrefix(fieldMarkerPrefix); } ViewActionStateHolder stateHolder = (ViewActionStateHolder) context.getFlashScope().get( View.USER_EVENT_STATE_ATTRIBUTE); if (stateHolder != null) { mvcView.restoreState(stateHolder); } return mvcView; } /** * Abstract factory method subclasses should implement to return the concrete MVC view implementation. * @param view the actual resolved view implementation * @param context the current request context * @return the mvc view */ protected abstract AbstractMvcView createMvcView(org.springframework.web.servlet.View view, RequestContext context); }