/* 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.riotfamily.forms.controller; import java.util.Collection; import java.util.List; import java.util.Locale; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.riotfamily.common.freemarker.ResourceTemplateLoader; import org.riotfamily.common.i18n.AdvancedMessageCodesResolver; import org.riotfamily.common.i18n.MessageResolver; import org.riotfamily.common.i18n.RiotMessageCodesResolver; import org.riotfamily.common.util.Generics; import org.riotfamily.common.web.support.ServletUtils; import org.riotfamily.forms.FormContext; import org.riotfamily.forms.OptionsModelAdapter; import org.riotfamily.forms.TemplateRenderer; import org.riotfamily.forms.options.ArrayOptionsModelAdapter; import org.riotfamily.forms.options.CollectionOptionsModelAdapter; import org.riotfamily.forms.options.DependentOptionsModelAdapter; import org.riotfamily.forms.ui.DefaultElementSizing; import org.riotfamily.forms.ui.ElementSizing; import org.springframework.beans.BeansException; import org.springframework.beans.PropertyEditorRegistrar; import org.springframework.beans.factory.BeanFactory; import org.springframework.beans.factory.BeanFactoryAware; import org.springframework.beans.factory.InitializingBean; import org.springframework.beans.factory.ListableBeanFactory; import org.springframework.beans.factory.support.AbstractBeanFactory; import org.springframework.context.MessageSource; import org.springframework.context.MessageSourceAware; import org.springframework.context.ResourceLoaderAware; import org.springframework.core.io.ResourceLoader; import org.springframework.web.servlet.support.RequestContextUtils; import freemarker.template.Configuration; public final class FormContextFactory implements MessageSourceAware, ResourceLoaderAware, BeanFactoryAware, InitializingBean { private MessageSource messageSource; private ResourceLoader resourceLoader; private AdvancedMessageCodesResolver messageCodesResolver; private TemplateRenderer templateRenderer; private String resourcePath = "/riot/resources"; private Collection<PropertyEditorRegistrar> propertyEditorRegistrars; private List<OptionsModelAdapter> optionValuesAdapters = Generics.newArrayList(); private ElementSizing elementSizing = new DefaultElementSizing(); public FormContextFactory() { registerDefaultOptionValuesAdapters(); } /** * Sets the {@link AdvancedMessageCodesResolver} to be used. If not * set, a {@link RiotMessageCodesResolver} will be used by default. */ public void setMessageCodesResolver(AdvancedMessageCodesResolver resolver) { this.messageCodesResolver = resolver; } /** * Sets the {@link MessageSource} that is used to look up labels and * error messages. * * @see MessageSourceAware */ public void setMessageSource(MessageSource messageSource) { this.messageSource = messageSource; } /** * Sets the {@link ResourceLoader} that is used to load the FreeMarker * templates. * * @see ResourceLoaderAware */ public void setResourceLoader(ResourceLoader resourceLoader) { this.resourceLoader = resourceLoader; } public void setBeanFactory(BeanFactory beanFactory) throws BeansException { if (beanFactory instanceof AbstractBeanFactory) { AbstractBeanFactory abf = (AbstractBeanFactory) beanFactory; this.propertyEditorRegistrars = abf.getPropertyEditorRegistrars(); } if (beanFactory instanceof ListableBeanFactory) { ListableBeanFactory lbf = (ListableBeanFactory) beanFactory; optionValuesAdapters.addAll(lbf.getBeansOfType( OptionsModelAdapter.class).values()); } } private void registerDefaultOptionValuesAdapters() { optionValuesAdapters.add(new CollectionOptionsModelAdapter()); optionValuesAdapters.add(new ArrayOptionsModelAdapter()); optionValuesAdapters.add(new DependentOptionsModelAdapter()); } public void setResourcePath(String resourcePath) { this.resourcePath = resourcePath; } public void setTemplateRenderer(TemplateRenderer templateRenderer) { this.templateRenderer = templateRenderer; } public void afterPropertiesSet() { if (templateRenderer == null) { Configuration configuration = new Configuration(); ResourceTemplateLoader loader = new ResourceTemplateLoader(); loader.setResourceLoader(resourceLoader); configuration.setTemplateLoader(loader); templateRenderer = new TemplateRenderer(configuration); } if (messageCodesResolver == null) { messageCodesResolver = new RiotMessageCodesResolver(); } } public MessageResolver getMessageResolver(Locale locale) { return new MessageResolver(messageSource, messageCodesResolver, locale); } public FormContext createFormContext(HttpServletRequest request, HttpServletResponse response) { Locale locale = RequestContextUtils.getLocale(request); MessageResolver messageResolver = getMessageResolver(locale); String contextPath = request.getContextPath(); String formUrl = ServletUtils.getOriginatingRequestUri(request); return createFormContext(messageResolver, contextPath, formUrl); } public FormContext createFormContext(MessageResolver messageResolver, String contextPath, String formUrl) { return new DefaultFormContext(messageResolver, templateRenderer, contextPath, resourcePath, formUrl, propertyEditorRegistrars, optionValuesAdapters, elementSizing ); } }