package hello.configuration;
import org.springframework.boot.autoconfigure.web.ResourceProperties;
import org.springframework.boot.autoconfigure.web.servlet.WebMvcProperties;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.MethodParameter;
import org.springframework.core.convert.ConversionService;
import org.springframework.core.io.Resource;
import org.springframework.core.task.SimpleAsyncTaskExecutor;
import org.springframework.format.AnnotationFormatterFactory;
import org.springframework.format.FormatterRegistry;
import org.springframework.format.Parser;
import org.springframework.format.Printer;
import org.springframework.format.number.CurrencyStyleFormatter;
import org.springframework.http.*;
import org.springframework.http.converter.ByteArrayHttpMessageConverter;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.converter.HttpMessageNotReadableException;
import org.springframework.http.converter.HttpMessageNotWritableException;
import org.springframework.ui.ModelMap;
import org.springframework.util.AntPathMatcher;
import org.springframework.util.PathMatcher;
import org.springframework.validation.MessageCodesResolver;
import org.springframework.validation.Validator;
import org.springframework.web.accept.PathExtensionContentNegotiationStrategy;
import org.springframework.web.accept.ServletPathExtensionContentNegotiationStrategy;
import org.springframework.web.bind.support.WebDataBinderFactory;
import org.springframework.web.context.request.NativeWebRequest;
import org.springframework.web.context.request.WebRequest;
import org.springframework.web.context.request.WebRequestInterceptor;
import org.springframework.web.context.request.async.CallableProcessingInterceptor;
import org.springframework.web.context.request.async.DeferredResult;
import org.springframework.web.context.request.async.DeferredResultProcessingInterceptor;
import org.springframework.web.method.HandlerTypePredicate;
import org.springframework.web.method.support.HandlerMethodArgumentResolver;
import org.springframework.web.method.support.HandlerMethodReturnValueHandler;
import org.springframework.web.method.support.ModelAndViewContainer;
import org.springframework.web.servlet.HandlerExceptionResolver;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.config.annotation.*;
import org.springframework.web.servlet.mvc.support.DefaultHandlerExceptionResolver;
import org.springframework.web.servlet.resource.ResourceResolver;
import org.springframework.web.servlet.resource.ResourceResolverChain;
import org.springframework.web.servlet.resource.ResourceTransformer;
import org.springframework.web.servlet.resource.ResourceTransformerChain;
import org.springframework.web.util.UrlPathHelper;
import sun.reflect.generics.visitor.Reifier;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.lang.annotation.Annotation;
import java.lang.reflect.Parameter;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Set;
import java.util.concurrent.Callable;
import java.util.function.Predicate;
@Configuration
public class TestConfiguration implements WebMvcConfigurer {
public void configurePathMatch(PathMatchConfigurer configurer) {
configurer.setUseSuffixPatternMatch(true);
configurer.setUseTrailingSlashMatch(true);
configurer.setUseRegisteredSuffixPatternMatch(true);
configurer.setUrlPathHelper(new UrlPathHelper());
configurer.setPathMatcher(new AntPathMatcher());
configurer.addPathPrefix("/prefix", (aClass) -> true);
}
public void configureContentNegotiation(ContentNegotiationConfigurer configurer) {
configurer.strategies(new ArrayList<>());
configurer.favorPathExtension(true);
configurer.mediaType("pdf", MediaType.APPLICATION_PDF)
.mediaType("json", MediaType.APPLICATION_JSON);
configurer.mediaTypes(new HashMap<>());
configurer.replaceMediaTypes(new HashMap<>());
configurer.ignoreUnknownPathExtensions(true);
configurer.useRegisteredExtensionsOnly(true);
configurer.favorParameter(true);
configurer.parameterName("format");
configurer.ignoreAcceptHeader(false);
configurer.defaultContentType(MediaType.APPLICATION_JSON, MediaType.APPLICATION_PDF);
configurer.defaultContentTypeStrategy(new PathExtensionContentNegotiationStrategy());
}
public void configureAsyncSupport(AsyncSupportConfigurer configurer) {
configurer.setTaskExecutor(new SimpleAsyncTaskExecutor());
configurer.setDefaultTimeout(100);
configurer.registerCallableInterceptors(new CallableProcessingInterceptor(){});
configurer.registerDeferredResultInterceptors(new DeferredResultProcessingInterceptor() {});
}
public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
configurer.enable();
configurer.enable("default");
}
public void addFormatters(FormatterRegistry registry) {
registry.addFormatter(new CurrencyStyleFormatter());
registry.addFormatterForFieldType(String.class, new CurrencyStyleFormatter());
registry.addFormatterForFieldAnnotation(new AnnotationFormatterFactory<Annotation>() {
@Override
public Set<Class<?>> getFieldTypes() {
return null;
}
@Override
public Printer<?> getPrinter(Annotation annotation, Class<?> fieldType) {
return null;
}
@Override
public Parser<?> getParser(Annotation annotation, Class<?> fieldType) {
return null;
}
});
}
public void addInterceptors(InterceptorRegistry registry) {
InterceptorRegistration interceptorRegistration = registry.addInterceptor(new HandlerInterceptor() {});
interceptorRegistration.addPathPatterns("/pathPattern1", "/pathPattern2");
interceptorRegistration.excludePathPatterns("/pathPattern1", "/pathPattern2");
interceptorRegistration.pathMatcher(new AntPathMatcher());
interceptorRegistration.order(1);
registry.addWebRequestInterceptor(new WebRequestInterceptor() {
@Override
public void preHandle(WebRequest request) throws Exception { }
@Override
public void postHandle(WebRequest request, ModelMap model) throws Exception { }
@Override
public void afterCompletion(WebRequest request, Exception ex) throws Exception { }
});
}
public void addResourceHandlers(ResourceHandlerRegistry registry) {
ResourceHandlerRegistration registration = registry.addResourceHandler("/pathPatterns");
registration.addResourceLocations("/resourceLocation1", "/resourceLocation2");
registration.setCachePeriod(0);
registration.setCacheControl(CacheControl.empty());
ResourceChainRegistration resourceChainRegistration = registration.resourceChain(true);
resourceChainRegistration.addResolver(new ResourceResolver() {
@Override
public Resource resolveResource(HttpServletRequest request, String requestPath, List<? extends Resource> locations, ResourceResolverChain chain) {
return null;
}
@Override
public String resolveUrlPath(String resourcePath, List<? extends Resource> locations, ResourceResolverChain chain) {
return null;
}
});
resourceChainRegistration.addTransformer(new ResourceTransformer() {
@Override
public Resource transform(HttpServletRequest request, Resource resource, ResourceTransformerChain transformerChain) throws IOException {
return null;
}
});
Boolean has = registry.hasMappingForPattern("/pathPattern");
registry.setOrder(1);
}
public void addCorsMappings(CorsRegistry registry) {
CorsRegistration corsRegistration = registry.addMapping("/pathPattern");
corsRegistration.allowedOrigins("http://domain1.com", "http://domain2.com");
corsRegistration.allowedMethods("GET", "POST");
corsRegistration.allowedHeaders("Cache-Control", "Content-Language");
corsRegistration.exposedHeaders("Cache-Control", "Content-Language");
corsRegistration.allowCredentials(true);
corsRegistration.maxAge(1);
}
public void addViewControllers(ViewControllerRegistry registry) {
ViewControllerRegistration viewControllerRegistration
= registry.addViewController("/admin/**");
viewControllerRegistration.setStatusCode(HttpStatus.valueOf(404));
viewControllerRegistration.setViewName("/foo/bar");
RedirectViewControllerRegistration redirectViewControllerRegistration
= registry.addRedirectViewController("/urlPath", "/redirectUrl");
redirectViewControllerRegistration.setStatusCode(HttpStatus.valueOf(302));
redirectViewControllerRegistration.setContextRelative(true);
redirectViewControllerRegistration.setKeepQueryParams(true);
registry.addStatusController("/urlPath", HttpStatus.valueOf(404));
registry.setOrder(1);
}
public void configureViewResolvers(ViewResolverRegistry registry) {
boolean has = registry.hasRegistrations();
registry.enableContentNegotiation();
registry.enableContentNegotiation(true);
}
public void addArgumentResolvers(List<HandlerMethodArgumentResolver> resolvers) {
resolvers.add(new HandlerMethodArgumentResolver() {
@Override
public boolean supportsParameter(MethodParameter parameter) {
return false;
}
@Override
public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer, NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception {
return null;
}
});
}
public void addReturnValueHandlers(List<HandlerMethodReturnValueHandler> handlers) {
handlers.add(new HandlerMethodReturnValueHandler() {
@Override
public boolean supportsReturnType(MethodParameter returnType) {
return false;
}
@Override
public void handleReturnValue(Object returnValue, MethodParameter returnType, ModelAndViewContainer mavContainer, NativeWebRequest webRequest) throws Exception {
}
});
}
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
converters.add(new ByteArrayHttpMessageConverter());
}
public void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
converters.add(1, new ByteArrayHttpMessageConverter());
}
public void configureHandlerExceptionResolvers(List<HandlerExceptionResolver> resolvers) {
resolvers.add(new DefaultHandlerExceptionResolver());
}
public void extendHandlerExceptionResolvers(List<HandlerExceptionResolver> resolvers) {
resolvers.add(1, new DefaultHandlerExceptionResolver());
}
public Validator getValidator() {
return null;
}
public MessageCodesResolver getMessageCodesResolver() {
return null;
}
}