package pl.edu.icm.saos.webapp; import java.util.List; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.beans.factory.config.PropertiesFactoryBean; import org.springframework.context.MessageSource; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.ComponentScan.Filter; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.FilterType; import org.springframework.context.support.PropertySourcesPlaceholderConfigurer; import org.springframework.core.io.ClassPathResource; import org.springframework.core.io.FileSystemResource; import org.springframework.core.io.Resource; import org.springframework.data.web.PageableHandlerMethodArgumentResolver; import org.springframework.data.web.config.SpringDataWebConfiguration; import org.springframework.format.FormatterRegistry; import org.springframework.http.converter.HttpMessageConverter; import org.springframework.stereotype.Controller; import org.springframework.util.ResourceUtils; import org.springframework.web.bind.annotation.ControllerAdvice; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.servlet.LocaleResolver; import org.springframework.web.servlet.config.annotation.EnableWebMvc; import org.springframework.web.servlet.config.annotation.InterceptorRegistry; import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry; import org.springframework.web.servlet.view.tiles3.TilesConfigurer; import org.springframework.web.servlet.view.tiles3.TilesViewResolver; import pl.edu.icm.saos.api.formatter.DateTimeWithZoneFormatterFactory; import pl.edu.icm.saos.api.formatter.LawJournalEntryCodeFormatterFactory; import pl.edu.icm.saos.api.services.interceptor.AccessControlHeaderHandlerInterceptor; import pl.edu.icm.saos.api.services.interceptor.RestrictParamsHandlerInterceptor; import pl.edu.icm.saos.persistence.service.LawJournalEntryCodeExtractor; import pl.edu.icm.saos.webapp.common.RequestURLInterceptor; import pl.edu.icm.saos.webapp.format.MultiWordFormatterFactory; import pl.edu.icm.saos.webapp.format.StringTrimmingFormatter; @Configuration @ComponentScan(basePackages={"pl.edu.icm.saos"}, useDefaultFilters=false, includeFilters={@Filter(type=FilterType.ANNOTATION, value=Controller.class), @Filter(type=FilterType.ANNOTATION, value=RestController.class), @Filter(type=FilterType.ANNOTATION, value=ControllerAdvice.class)}) @EnableWebMvc public class WebappConfiguration extends SpringDataWebConfiguration { @Autowired private HttpMessageConverter<?> mappingJackson2HttpMessageConverter; @Autowired private MessageSource messageSource; @Autowired private LocaleResolver localeResolver; @Autowired private LawJournalEntryCodeExtractor lawJournalEntryCodeExtractor; @Value("${judgments.content.dir}") private String judgmentsContentPath; @Bean public TilesViewResolver viewResolver() { TilesViewResolver viewResolver = new TilesViewResolver(); return viewResolver; } @Bean public TilesConfigurer tilesConfigurer() { TilesConfigurer tilesConfigurer = new TilesConfigurer(); tilesConfigurer.setDefinitions(new String[]{"/WEB-INF/tiles.xml"}); return tilesConfigurer; } @Override public void addResourceHandlers(ResourceHandlerRegistry registry) { registry.addResourceHandler("/static/**").addResourceLocations("/WEB-INF/static/").setCachePeriod(3600*24*7); registry.addResourceHandler("/robots.txt").addResourceLocations("/WEB-INF/").setCachePeriod(0); registry.addResourceHandler("/sitemap.xml").addResourceLocations("/WEB-INF/sitemap.xml").setCachePeriod(0); registry.addResourceHandler("/files/judgments/**").addResourceLocations(ResourceUtils.FILE_URL_PREFIX + judgmentsContentPath).setCachePeriod(600); } @Override public void addFormatters(FormatterRegistry registry) { registry.addFormatterForFieldType(String.class, new StringTrimmingFormatter()); registry.addFormatterForFieldAnnotation(new DateTimeWithZoneFormatterFactory()); registry.addFormatterForFieldAnnotation(new LawJournalEntryCodeFormatterFactory(lawJournalEntryCodeExtractor)); registry.addFormatterForFieldAnnotation(new MultiWordFormatterFactory()); } @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(new AccessControlHeaderHandlerInterceptor()) .addPathPatterns("/api/**") .addPathPatterns("/analysis/generate*") .addPathPatterns("/cc/courts/**") .addPathPatterns("/sc/chambers/**") .addPathPatterns("/sc/judgmentForms/list") .addPathPatterns("/search/lawJournalEntries*") .addPathPatterns("/keywords/**"); registry.addInterceptor(new RestrictParamsHandlerInterceptor()); registry.addInterceptor(new RequestURLInterceptor()); } @Override public void configureMessageConverters(List<HttpMessageConverter<?>> httpMessageConverters) { httpMessageConverters.add(mappingJackson2HttpMessageConverter); } /** Properties exposed to view */ @Bean public PropertiesFactoryBean exposedProperties(@Value("${user.home}") String userHomeDir) { PropertiesFactoryBean exposedProperties = new PropertiesFactoryBean(); exposedProperties.setIgnoreResourceNotFound(true); exposedProperties.setLocations(new Resource[]{new ClassPathResource("saos.default.properties"), new FileSystemResource(userHomeDir + "/.icm/saos.local.properties")}); return exposedProperties; } /** Version exposed to view */ @Bean public PropertiesFactoryBean versionProperties() { PropertiesFactoryBean versionProperties = new PropertiesFactoryBean(); versionProperties.setLocation(new ClassPathResource("saos.version.properties")); return versionProperties; } @Bean public PageableHandlerMethodArgumentResolver pageableResolver() { PageableHandlerMethodArgumentResolver pageableResolver = new PageableHandlerMethodArgumentResolver(sortResolver()); pageableResolver.setOneIndexedParameters(true); pageableResolver.setMaxPageSize(100); return pageableResolver; } @Bean public static PropertySourcesPlaceholderConfigurer propertyPlaceholderConfigurer() { PropertySourcesPlaceholderConfigurer propertyPlaceholderConfigurer = new PropertySourcesPlaceholderConfigurer(); propertyPlaceholderConfigurer.setIgnoreUnresolvablePlaceholders(false); return propertyPlaceholderConfigurer; } }