All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.appng.api.config.RestConfig Maven / Gradle / Ivy

There is a newer version: 1.24.5
Show newest version
package org.appng.api.config;

import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;

import org.appng.api.Environment;
import org.appng.api.model.Application;
import org.appng.api.model.Site;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Lazy;
import org.springframework.core.MethodParameter;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.web.bind.support.WebDataBinderFactory;
import org.springframework.web.context.annotation.RequestScope;
import org.springframework.web.context.request.NativeWebRequest;
import org.springframework.web.method.support.HandlerMethodArgumentResolver;
import org.springframework.web.method.support.ModelAndViewContainer;
import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter;
import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping;
import org.springframework.web.util.UrlPathHelper;

import lombok.AllArgsConstructor;

@Configuration
public class RestConfig {

	@Bean
	public RequestMappingHandlerMapping requestMappingHandlerMapping(ApplicationContext context) {
		RequestMappingHandlerMapping requestMappingHandlerMapping = new RequestMappingHandlerMapping();
		requestMappingHandlerMapping.setApplicationContext(context);
		UrlPathHelper urlPathHelper = new UrlPathHelper();
		urlPathHelper.setRemoveSemicolonContent(false);
		requestMappingHandlerMapping.setUrlPathHelper(urlPathHelper);
		return requestMappingHandlerMapping;
	}

	@Bean
	@Lazy
	@RequestScope
	public RequestMappingHandlerAdapter RequestMappingHandlerAdapter(ApplicationContext context, Site site,
			Application application, Environment environment) {
		RequestMappingHandlerAdapter rmha = new RequestMappingHandlerAdapter();
		rmha.setApplicationContext(context);

		List> messageConverters = getMessageConverters(context);
		if (!messageConverters.isEmpty()) {
			rmha.setMessageConverters(messageConverters);
		}
		rmha.setCustomArgumentResolvers(getArgumentResolvers(context));
		return rmha;
	}

	public static List> getMessageConverters(ApplicationContext context) {
		return context.getBeansOfType(HttpMessageConverter.class).values().stream()
				.map(m -> (HttpMessageConverter) m).collect(Collectors.toList());
	}

	@Bean
	@Lazy
	public SiteAwareHandlerMethodArgumentResolver siteAwareHandlerMethodArgumentResolver(Site site,
			Application application, Environment environment) {
		return new SiteAwareHandlerMethodArgumentResolver(site, environment, application);
	}

	public static List getArgumentResolvers(ApplicationContext context) {
		return new ArrayList<>(context.getBeansOfType(HandlerMethodArgumentResolver.class).values());
	}

	@AllArgsConstructor
	public static class SiteAwareHandlerMethodArgumentResolver implements HandlerMethodArgumentResolver {

		private final Site site;
		private final Environment environment;
		private final Application application;

		public boolean supportsParameter(MethodParameter parameter) {
			return isSite(parameter) || isEnvironment(parameter) || isApplication(parameter);
		}

		public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer,
				NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception {
			return isSite(parameter) ? site
					: (isEnvironment(parameter) ? environment : (isApplication(parameter) ? application : null));
		}

		private boolean isEnvironment(MethodParameter parameter) {
			return isParameterType(parameter, Environment.class);
		}

		protected boolean isSite(MethodParameter parameter) {
			return isParameterType(parameter, Site.class);
		}

		private boolean isApplication(MethodParameter parameter) {
			return isParameterType(parameter, Application.class);
		}

		private boolean isParameterType(MethodParameter parameter, Class type) {
			return parameter.getParameterType().equals(type);
		}

	}

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy