package org.restler.spring.mvc; import com.fasterxml.jackson.databind.Module; import org.restler.RestlerConfig; import org.restler.client.CGLibClientFactory; import org.restler.client.CachingClientFactory; import org.restler.client.CallEnhancer; import org.restler.client.CoreModule; import org.restler.http.OkHttpRequestExecutor; import org.restler.http.RequestExecutor; import org.restler.spring.mvc.spring.DeferredResultHandler; import org.restler.spring.mvc.spring.SpringMvcRequestExecutor; import org.restler.spring.mvc.spring.SpringUtils; import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter; import org.springframework.web.client.RestTemplate; import java.util.ArrayList; import java.util.List; import java.util.function.Function; import java.util.stream.Collectors; import static java.util.Collections.singletonList; public class SpringMvcSupport implements Function<RestlerConfig, CoreModule> { private final List<Module> jacksonModules = new ArrayList<>(); private ParameterResolver parameterResolver = ParameterResolver.valueOfParamResolver(); private RequestExecutor requestExecutor = null; @Override public CoreModule apply(RestlerConfig config) { List<CallEnhancer> totalEnhancers = new ArrayList<>(); totalEnhancers.addAll(config.getEnhancers()); if (SpringUtils.isSpringAvailable()) { totalEnhancers.addAll(singletonList(new DeferredResultHandler(config.getRestlerThreadPool()))); } if(requestExecutor == null) { requestExecutor = createExecutor(); } return new SpringMvc(new CachingClientFactory(new CGLibClientFactory()), requestExecutor, totalEnhancers, config.getBaseUri(), parameterResolver); } public SpringMvcSupport addJacksonModule(Module module) { jacksonModules.add(module); return this; } public SpringMvcSupport requestExecutor(RequestExecutor requestExecutor) { this.requestExecutor = requestExecutor; return this; } public SpringMvcSupport parameterResolver(ParameterResolver parameterResolver) { this.parameterResolver = parameterResolver; return this; } private RequestExecutor createExecutor() { if(SpringUtils.isSpringAvailable()) { RestTemplate restTemplate = new RestTemplate(); List<MappingJackson2HttpMessageConverter> jacksonConverters = restTemplate.getMessageConverters().stream(). filter(converter -> converter instanceof MappingJackson2HttpMessageConverter). map(converter -> (MappingJackson2HttpMessageConverter) converter). collect(Collectors.toList()); jacksonModules.stream().forEach(module -> jacksonConverters.forEach(converter -> converter.getObjectMapper().registerModule(module))); return new SpringMvcRequestExecutor(restTemplate); } return new OkHttpRequestExecutor(jacksonModules); } }