package de.ppi.samples.fuwesta.config;
import java.util.List;
import java.util.Properties;
import net.sf.oval.Validator;
import net.sf.oval.configuration.annotation.AnnotationsConfigurer;
import net.sf.oval.integration.spring.SpringCheckInitializationListener;
import net.sf.oval.integration.spring.SpringValidator;
import org.springframework.context.MessageSource;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.support.ReloadableResourceBundleMessageSource;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.web.PageableHandlerMethodArgumentResolver;
import org.springframework.format.FormatterRegistry;
import org.springframework.web.method.support.HandlerMethodArgumentResolver;
import org.springframework.web.servlet.config.annotation.DefaultServletHandlerConfigurer;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
import de.ppi.fuwesta.spring.mvc.bind.ServletBindingService;
import de.ppi.fuwesta.spring.mvc.formatter.EnumConverter;
import de.ppi.fuwesta.spring.mvc.formatter.MessageSourceDateFormatter;
import de.ppi.fuwesta.spring.mvc.formatter.NonEmptyStringAnnotationFormatterFactory;
import de.ppi.fuwesta.spring.mvc.oval.DbCheckConfigurer;
import de.ppi.fuwesta.spring.mvc.oval.JPAAnnotationsConfigurer;
import de.ppi.fuwesta.spring.mvc.oval.MessageLookupContextRenderer;
import de.ppi.fuwesta.spring.mvc.oval.MessageLookupMessageValueFormatter;
import de.ppi.fuwesta.spring.mvc.oval.SpringMvcMessageResolver;
import de.ppi.fuwesta.spring.mvc.util.ApostropheEscapingPropertiesPersister;
import de.ppi.fuwesta.spring.mvc.util.EntityPropertiesToMessages;
import de.ppi.fuwesta.spring.mvc.util.RecursivePropertiesPersister;
import de.ppi.fuwesta.spring.mvc.util.UrlDefinitionsToMessages;
import de.ppi.samples.fuwesta.frontend.URL;
/**
* The frontend configuration for Spring.
*
*/
@Configuration
@ComponentScan(basePackages = { "net.sf.oval.integration.spring",
"de.ppi.fuwesta.jpa.helper" })
public class WebMvcConfig extends WebMvcConfigurerAdapter {
/**
* Page size if no other information is given.
*/
private static final int FALLBACK_PAGE_SIZE = 5;
/**
* The time in seconds messages are cached.
*/
private static final int MESSAGE_CACHE = 5;
/** The Constant MESSAGE_SOURCE. */
private static final String MESSAGE_SOURCE = "classpath:i18n/messages";
/** The Constant MESSAGE_SOURCE_FOR_OVAL. */
private static final String MESSAGE_SOURCE_OVAL =
"classpath:/net/sf/oval/Messages";
/** Messages from Spring-Security. */
private static final String MESSAGE_SOURCE_SPRING_SECURITY =
"classpath:org/springframework/security/messages";
/**
* Initiates the message resolver.
*
* @return a message source.
*/
@Bean(name = "messageSource")
public MessageSource configureMessageSource() {
ReloadableResourceBundleMessageSource messageSource =
new ReloadableResourceBundleMessageSource();
messageSource.setBasenames(MESSAGE_SOURCE, MESSAGE_SOURCE_OVAL,
MESSAGE_SOURCE_SPRING_SECURITY);
messageSource.setCacheSeconds(MESSAGE_CACHE);
messageSource.setFallbackToSystemLocale(false);
// Make sure Apostrophs must always be doubled..
messageSource.setAlwaysUseMessageFormat(true);
// This persister doubles Apostoph
messageSource.setPropertiesPersister(new RecursivePropertiesPersister(
new ApostropheEscapingPropertiesPersister()));
final Class<?>[] classes = URL.class.getDeclaredClasses();
final UrlDefinitionsToMessages urlDefinitions =
new UrlDefinitionsToMessages(classes);
urlDefinitions.addParamGroupAsMessages();
urlDefinitions.addParamsAsMessages();
urlDefinitions.addUrlsAsMessagesWithPositionedParameters();
urlDefinitions.addUrlsAsMessagesWithNamedParameters();
Properties staticMessages = urlDefinitions.getMessages();
final EntityPropertiesToMessages epm =
new EntityPropertiesToMessages("de.ppi.samples.fuwesta.model");
staticMessages.putAll(epm.getProperties());
messageSource.setCommonMessages(staticMessages);
return messageSource;
}
/**
* {@inheritDoc}
*/
@Override
public void addArgumentResolvers(
List<HandlerMethodArgumentResolver> argumentResolvers) {
PageableHandlerMethodArgumentResolver resolver =
new PageableHandlerMethodArgumentResolver();
resolver.setFallbackPageable(new PageRequest(0, FALLBACK_PAGE_SIZE));
argumentResolvers.add(resolver);
}
@Override
public void configureDefaultServletHandling(
DefaultServletHandlerConfigurer configurer) {
configurer.enable();
}
/**
* {@inheritDoc}
*/
@Override
public org.springframework.validation.Validator getValidator() {
final AnnotationsConfigurer annConfig = new AnnotationsConfigurer();
annConfig
.addCheckInitializationListener(SpringCheckInitializationListener.INSTANCE);
final DbCheckConfigurer dbConfig = new DbCheckConfigurer();
dbConfig.addCheckInitializationListener(SpringCheckInitializationListener.INSTANCE);
final Validator ovalValidator =
new Validator(annConfig, dbConfig,
new JPAAnnotationsConfigurer(false));
Validator
.setMessageValueFormatter(new MessageLookupMessageValueFormatter(
configureMessageSource()));
Validator.setContextRenderer(new MessageLookupContextRenderer(
configureMessageSource()));
Validator.setMessageResolver(new SpringMvcMessageResolver(
configureMessageSource()));
return new SpringValidator(ovalValidator);
}
@Override
public void addFormatters(FormatterRegistry registry) {
registry.addFormatterForFieldAnnotation(new NonEmptyStringAnnotationFormatterFactory());
registry.addFormatter(messageSourceDateFormatter());
registry.addConverter(new EnumConverter(configureMessageSource()));
// registry.addConverter(new StringTrimmerConverter(true));
super.addFormatters(registry);
}
/**
* Create the {@link MessageSourceDateFormatter}.
*
* @return the {@link MessageSourceDateFormatter}.
*/
@Bean
protected MessageSourceDateFormatter messageSourceDateFormatter() {
return new MessageSourceDateFormatter("format.date");
}
/**
* Creates a small service to bind request data to an object.
*
* @return the binding service.
*/
@Bean
public ServletBindingService servletBindingService() {
return new ServletBindingService();
}
}