/** * Licensed to Apereo under one or more contributor license agreements. See the NOTICE file * distributed with this work for additional information regarding copyright ownership. Apereo * licenses this file to you 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 the * following location: * * <p>http://www.apache.org/licenses/LICENSE-2.0 * * <p>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.apereo.portal.utils.web.flow; import java.util.Collections; 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.validation.DefaultMessageCodesResolver; import org.springframework.validation.MessageCodesResolver; import org.springframework.web.servlet.View; import org.springframework.web.servlet.ViewResolver; import org.springframework.webflow.engine.builder.BinderConfiguration; import org.springframework.webflow.mvc.builder.FlowResourceFlowViewResolver; import org.springframework.webflow.mvc.builder.MvcViewFactoryCreator; import org.springframework.webflow.mvc.view.AbstractMvcViewFactory; import org.springframework.webflow.mvc.view.FlowViewResolver; import org.springframework.webflow.validation.WebFlowMessageCodesResolver; /** * Clone of {@link MvcViewFactoryCreator} that returns our {@link RuntimeMvcViewFactory}. * */ public class RuntimeMvcViewFactoryCreator extends MvcViewFactoryCreator { private final FlowResourceFlowViewResolver flowResourceFlowViewResolver = new FlowResourceFlowViewResolver(); private FlowViewResolver flowViewResolver = flowResourceFlowViewResolver; private MessageCodesResolver messageCodesResolver = new WebFlowMessageCodesResolver(); /** * Sets the message codes resolver strategy to use to resolve bind and validation error message * codes. If not set, {@link WebFlowMessageCodesResolver} is the default. Plug in a {@link * DefaultMessageCodesResolver} to resolve message codes consistently between Spring MVC * Controllers and Web Flow. * * @param messageCodesResolver the message codes resolver */ @Override public void setMessageCodesResolver(MessageCodesResolver messageCodesResolver) { super.setMessageCodesResolver(messageCodesResolver); this.messageCodesResolver = messageCodesResolver; } /** * Configure an {@link FlowResourceFlowViewResolver} capable of resolving view resources by * applying the specified default resource suffix. Default is .jsp. * * @param defaultViewSuffix the default view suffix */ @Override public void setDefaultViewSuffix(String defaultViewSuffix) { super.setDefaultViewSuffix(defaultViewSuffix); FlowResourceFlowViewResolver internalResourceResolver = new FlowResourceFlowViewResolver(); internalResourceResolver.setDefaultViewSuffix(defaultViewSuffix); this.flowViewResolver = internalResourceResolver; } /** * Set to fully customize how the flow system resolves Spring MVC {@link View} objects. * * @param flowViewResolver the flow view resolver */ @Override public void setFlowViewResolver(FlowViewResolver flowViewResolver) { super.setFlowViewResolver(flowViewResolver); this.flowViewResolver = flowViewResolver; } /** * Sets the chain of Spring MVC {@link ViewResolver view resolvers} to delegate to resolve views * selected by flows. Allows for reuse of existing View Resolvers configured in a Spring * application context. If multiple resolvers are to be used, the resolvers should be ordered in * the manner they should be applied. * * @param viewResolvers the view resolver list */ @Override public void setViewResolvers(List viewResolvers) { super.setViewResolvers(viewResolvers); this.flowViewResolver = new FallbackDelegatingFlowViewResolver( Collections.<FlowViewResolver>singletonList(flowResourceFlowViewResolver), viewResolvers); } /* (non-Javadoc) * @see org.springframework.webflow.mvc.builder.MvcViewFactoryCreator#createMvcViewFactory(org.springframework.binding.expression.Expression, org.springframework.binding.expression.ExpressionParser, org.springframework.binding.convert.ConversionService, org.springframework.webflow.engine.builder.BinderConfiguration) */ @Override protected AbstractMvcViewFactory createMvcViewFactory( Expression viewId, ExpressionParser expressionParser, ConversionService conversionService, BinderConfiguration binderConfiguration) { return new RuntimeMvcViewFactory( viewId, flowViewResolver, expressionParser, conversionService, binderConfiguration, messageCodesResolver); } }