// Path: src/main/java/org/esupportail/papercut/services/RequestResponseLoggingInterceptor.java
// public class RequestResponseLoggingInterceptor implements ClientHttpRequestInterceptor {
//  
//     private final Logger log = LoggerFactory.getLogger(this.getClass());
//  
//     @Override
//     public ClientHttpResponse intercept(HttpRequest request, byte[] body, ClientHttpRequestExecution execution) throws IOException {
//         logRequest(request, body);
//         ClientHttpResponse response = execution.execute(request, body);
//         logResponse(response);
//         return response;
//     }
//  
//     private void logRequest(HttpRequest request, byte[] body) throws IOException {
//         if (log.isDebugEnabled()) {
//             log.debug("===========================request begin================================================");
//             log.debug("URI         : {}", request.getURI());
//             log.debug("Method      : {}", request.getMethod());
//             log.debug("Headers     : {}", request.getHeaders());
//             log.debug("Request body: {}", new String(body, "UTF-8"));
//             log.debug("==========================request end================================================");
//         }
//     }
//  
//     private void logResponse(ClientHttpResponse response) throws IOException {
//         if (log.isDebugEnabled()) {
//             log.debug("============================response begin==========================================");
//             log.debug("Status code  : {}", response.getStatusCode());
//             log.debug("Status text  : {}", response.getStatusText());
//             log.debug("Headers      : {}", response.getHeaders());
//             log.debug("Response body: {}", StreamUtils.copyToString(response.getBody(), Charset.defaultCharset()));
//             log.debug("=======================response end=================================================");
//         }
//     }
// }


import com.fasterxml.jackson.databind.MapperFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
import java.util.Collections;
import org.esupportail.papercut.services.RequestResponseLoggingInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.client.BufferingClientHttpRequestFactory;
import org.springframework.http.client.SimpleClientHttpRequestFactory;
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
import org.springframework.web.client.RestTemplate;
import org.springframework.web.filter.CommonsRequestLoggingFilter;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import com.fasterxml.jackson.databind.DeserializationFeature;

/**
 * Licensed to EsupPortail under one or more contributor license
 * agreements. See the NOTICE file distributed with this work for
 * additional information regarding copyright ownership.
 *
 * EsupPortail licenses this file to you under the Apache License,
 * Version 2.0 (the "License"); you may not use this file except in
 * compliance with the License. You may obtain a copy of the License at:
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package org.esupportail.papercut.config;  




@Configuration  
public class RestConfig implements WebMvcConfigurer {  

	

	@Bean
	public ObjectMapper objectMapper() throws Exception {
		ObjectMapper mapper = new ObjectMapper();
		mapper.configure(MapperFeature.ACCEPT_CASE_INSENSITIVE_PROPERTIES, true);
		mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
		return mapper;
	}
	
	@Bean
	public MappingJackson2HttpMessageConverter jacksonConverter() throws Exception {
		MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter();
		converter.setObjectMapper(objectMapper());
		return converter;
	}
	
	@Bean
	public RestTemplate restTemplate() throws Exception {
		SimpleClientHttpRequestFactory requestFactory = new SimpleClientHttpRequestFactory();
		RestTemplate restTemplate = new RestTemplate(new BufferingClientHttpRequestFactory(requestFactory));

// Path: src/main/java/org/esupportail/papercut/services/RequestResponseLoggingInterceptor.java
// public class RequestResponseLoggingInterceptor implements ClientHttpRequestInterceptor {
//  
//     private final Logger log = LoggerFactory.getLogger(this.getClass());
//  
//     @Override
//     public ClientHttpResponse intercept(HttpRequest request, byte[] body, ClientHttpRequestExecution execution) throws IOException {
//         logRequest(request, body);
//         ClientHttpResponse response = execution.execute(request, body);
//         logResponse(response);
//         return response;
//     }
//  
//     private void logRequest(HttpRequest request, byte[] body) throws IOException {
//         if (log.isDebugEnabled()) {
//             log.debug("===========================request begin================================================");
//             log.debug("URI         : {}", request.getURI());
//             log.debug("Method      : {}", request.getMethod());
//             log.debug("Headers     : {}", request.getHeaders());
//             log.debug("Request body: {}", new String(body, "UTF-8"));
//             log.debug("==========================request end================================================");
//         }
//     }
//  
//     private void logResponse(ClientHttpResponse response) throws IOException {
//         if (log.isDebugEnabled()) {
//             log.debug("============================response begin==========================================");
//             log.debug("Status code  : {}", response.getStatusCode());
//             log.debug("Status text  : {}", response.getStatusText());
//             log.debug("Headers      : {}", response.getHeaders());
//             log.debug("Response body: {}", StreamUtils.copyToString(response.getBody(), Charset.defaultCharset()));
//             log.debug("=======================response end=================================================");
//         }
//     }
// }


// Path: src/main/java/org/esupportail/papercut/config/RestConfig.java
import com.fasterxml.jackson.databind.MapperFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
import java.util.Collections;
import org.esupportail.papercut.services.RequestResponseLoggingInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.client.BufferingClientHttpRequestFactory;
import org.springframework.http.client.SimpleClientHttpRequestFactory;
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
import org.springframework.web.client.RestTemplate;
import org.springframework.web.filter.CommonsRequestLoggingFilter;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import com.fasterxml.jackson.databind.DeserializationFeature;

/**
 * Licensed to EsupPortail under one or more contributor license
 * agreements. See the NOTICE file distributed with this work for
 * additional information regarding copyright ownership.
 *
 * EsupPortail licenses this file to you under the Apache License,
 * Version 2.0 (the "License"); you may not use this file except in
 * compliance with the License. You may obtain a copy of the License at:
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package org.esupportail.papercut.config;  




@Configuration  
public class RestConfig implements WebMvcConfigurer {  

	

	@Bean
	public ObjectMapper objectMapper() throws Exception {
		ObjectMapper mapper = new ObjectMapper();
		mapper.configure(MapperFeature.ACCEPT_CASE_INSENSITIVE_PROPERTIES, true);
		mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
		return mapper;
	}
	
	@Bean
	public MappingJackson2HttpMessageConverter jacksonConverter() throws Exception {
		MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter();
		converter.setObjectMapper(objectMapper());
		return converter;
	}
	
	@Bean
	public RestTemplate restTemplate() throws Exception {
		SimpleClientHttpRequestFactory requestFactory = new SimpleClientHttpRequestFactory();
		RestTemplate restTemplate = new RestTemplate(new BufferingClientHttpRequestFactory(requestFactory));

		restTemplate.setInterceptors(Collections.singletonList(new RequestResponseLoggingInterceptor()));
