diff --git a/openapi/openapi.json b/openapi/openapi.json index 037c881d..e77cc3a1 100644 --- a/openapi/openapi.json +++ b/openapi/openapi.json @@ -1,170 +1,151 @@ { - "openapi": "3.0.1", - "info": { - "description": "A service that permits to handle nodoInviaRPT and nodoInviaCarrelloRPT request from WISP, converting them in NMU payments.\n\n**STANDARD ERRORS:**\nNAME | CODE | DESCRIPTION\n- | - | -\n**WIC-500** | *ERROR* | *...error description...*\n**WIC-1000** | *GENERIC_ERROR* | Error while executing conversion flow. *...error description...*\n**WIC-1001** | *PARSING_GENERIC_ERROR* | Error while parsing payload. *...error description...*\n**WIC-1002** | *PARSING_INVALID_HEADER* | Error while parsing payload. The SOAP header in payload is invalid: *...error description...*\n**WIC-1003** | *PARSING_INVALID_BODY* | Error while parsing payload. The SOAP body in payload is invalid: *...error description...*\n**WIC-1004** | *PARSING_INVALID_XML_NODES* | Error while parsing payload. The list of nodes extracted from document must be greater than zero, but currently it is zero.\n**WIC-1005** | *PARSING_INVALID_ZIPPED_PAYLOAD* | Error while parsing payload. Cannot unzip payload correctly.\n**WIC-1006** | *PARSING_PRIMITIVE_NOT_VALID* | Error while checking primitive. Primitive [*...content...*] not valid.\n**WIC-1100** | *VALIDATION_INVALID_MULTIBENEFICIARY_CART* | Error while generating debt position for GPD service. The cart is defined as multi-beneficiary but there are a number of RPTs lower than 2.\n**WIC-1101** | *VALIDATION_INVALID_IBANS* | Error while generating debt position for GPD service. The IBAN field must be set if digital stamp is not defined for the transfer.\n**WIC-1102** | *VALIDATION_INVALID_DEBTOR* | Error while generating debt position for GPD service. The debtor subject information is different between the various RPT of the cart.\n**WIC-1103** | *VALIDATION_INVALID_CREDITOR_INSTITUTION* | Error while generating debt position for GPD service. The creditor institution information is different between the various RPT of the cart.\n**WIC-1200** | *CONFIGURATION_INVALID_STATION* | Error while generating cart for Checkout service. No valid station found with code [*...content...*].\n**WIC-1201** | *CONFIGURATION_INVALID_STATION_REDIRECT_URL* | Error while generating cart for Checkout service. The station with code [*...content...*] contains wrong redirect URL and it is not possible to generate valid URI.\n**WIC-2000** | *PERSISTENCE_RPT_NOT_FOUND* | Error while retrieving RPT. RPT with sessionId [*...content...*] not found.\n**WIC-2001** | *PERSISTENCE_REQUESTID_CACHING_ERROR* | Error while caching RequestID. *...error description...*\n**WIC-3000** | *CLIENT_APICONFIGCACHE* | Error while communicating with APIConfig cache service. *...error description...*\n**WIC-3001** | *CLIENT_GPD* | Error while communicating with GPD service. *...error description...*\n**WIC-3002** | *CLIENT_IUVGENERATOR* | Error while communicating with IUV Generator service. *...error description...*\n**WIC-3003** | *CLIENT_DECOUPLER_CACHING* | Error while communicating with decoupler caching API. *...error description...*\n**WIC-3004** | *CLIENT_CHECKOUT* | Error while communicating with Checkout service. *...error description...*\n**WIC-3005** | *CLIENT_CHECKOUT_NO_REDIRECT_LOCATION* | Error while communicating with Checkout service. No valid 'Location' header was found,\n**WIC-3006** | *CLIENT_CHECKOUT_INVALID_REDIRECT_LOCATION* | Error while communicating with Checkout service. An empty 'Location' header was found.\n", - "termsOfService": "https://www.pagopa.gov.it/", - "title": "WISP Converter", - "version": "0.0.7" + "openapi" : "3.0.1", + "info" : { + "description" : "A service that permits to handle nodoInviaRPT and nodoInviaCarrelloRPT request from WISP, converting them in NMU payments.\n\n**STANDARD ERRORS:**\nNAME | CODE | DESCRIPTION\n- | - | -\n**WIC-500** | *ERROR* | *...error description...*\n**WIC-1000** | *GENERIC_ERROR* | Error while executing conversion flow. *...error description...*\n**WIC-1001** | *PARSING_GENERIC_ERROR* | Error while parsing payload. *...error description...*\n**WIC-1002** | *PARSING_INVALID_HEADER* | Error while parsing payload. The SOAP header in payload is invalid: *...error description...*\n**WIC-1003** | *PARSING_INVALID_BODY* | Error while parsing payload. The SOAP body in payload is invalid: *...error description...*\n**WIC-1004** | *PARSING_INVALID_XML_NODES* | Error while parsing payload. The list of nodes extracted from document must be greater than zero, but currently it is zero.\n**WIC-1005** | *PARSING_INVALID_ZIPPED_PAYLOAD* | Error while parsing payload. Cannot unzip payload correctly.\n**WIC-1006** | *PARSING_PRIMITIVE_NOT_VALID* | Error while checking primitive. Primitive [*...content...*] not valid.\n**WIC-1100** | *VALIDATION_INVALID_MULTIBENEFICIARY_CART* | Error while generating debt position for GPD service. The cart is defined as multi-beneficiary but there are a number of RPTs lower than 2.\n**WIC-1101** | *VALIDATION_INVALID_IBANS* | Error while generating debt position for GPD service. The IBAN field must be set if digital stamp is not defined for the transfer.\n**WIC-1102** | *VALIDATION_INVALID_DEBTOR* | Error while generating debt position for GPD service. The debtor subject information is different between the various RPT of the cart.\n**WIC-1103** | *VALIDATION_INVALID_CREDITOR_INSTITUTION* | Error while generating debt position for GPD service. The creditor institution information is different between the various RPT of the cart.\n**WIC-1200** | *CONFIGURATION_INVALID_STATION* | Error while generating cart for Checkout service. No valid station found with code [*...content...*].\n**WIC-1201** | *CONFIGURATION_INVALID_STATION_REDIRECT_URL* | Error while generating cart for Checkout service. The station with code [*...content...*] contains wrong redirect URL and it is not possible to generate valid URI.\n**WIC-2000** | *PERSISTENCE_RPT_NOT_FOUND* | Error while retrieving RPT. RPT with sessionId [*...content...*] not found.\n**WIC-2001** | *PERSISTENCE_REQUESTID_CACHING_ERROR* | Error while caching RequestID. *...error description...*\n**WIC-3000** | *CLIENT_APICONFIGCACHE* | Error while communicating with APIConfig cache service. *...error description...*\n**WIC-3001** | *CLIENT_GPD* | Error while communicating with GPD service. *...error description...*\n**WIC-3002** | *CLIENT_IUVGENERATOR* | Error while communicating with IUV Generator service. *...error description...*\n**WIC-3003** | *CLIENT_DECOUPLER_CACHING* | Error while communicating with decoupler caching API. *...error description...*\n**WIC-3004** | *CLIENT_CHECKOUT* | Error while communicating with Checkout service. *...error description...*\n**WIC-3005** | *CLIENT_CHECKOUT_NO_REDIRECT_LOCATION* | Error while communicating with Checkout service. No valid 'Location' header was found,\n**WIC-3006** | *CLIENT_CHECKOUT_INVALID_REDIRECT_LOCATION* | Error while communicating with Checkout service. An empty 'Location' header was found.\n", + "termsOfService" : "https://www.pagopa.gov.it/", + "title" : "WISP Converter", + "version" : "0.0.7" }, - "servers": [ - { - "url": "http://localhost", - "description": "Generated server url" - } - ], - "tags": [ - { - "description": "Application info APIs", - "name": "Home" - }, - { - "description": "Conversion and redirection APIs", - "name": "Redirect" - } - ], - "paths": { - "/info": { - "get": { - "operationId": "healthCheck", - "responses": { - "200": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/AppInfoResponse" + "servers" : [ { + "url" : "http://localhost", + "description" : "Generated server url" + } ], + "tags" : [ { + "description" : "Application info APIs", + "name" : "Home" + }, { + "description" : "Conversion and redirection APIs", + "name" : "Redirect" + } ], + "paths" : { + "/info" : { + "get" : { + "operationId" : "healthCheck", + "responses" : { + "200" : { + "content" : { + "application/json" : { + "schema" : { + "$ref" : "#/components/schemas/AppInfoResponse" } } }, - "description": "OK.", - "headers": { - "X-Request-Id": { - "description": "This header identifies the call", - "schema": { - "type": "string" + "description" : "OK.", + "headers" : { + "X-Request-Id" : { + "description" : "This header identifies the call", + "schema" : { + "type" : "string" } } } } }, - "security": [ - { - "ApiKey": [] - } - ], - "summary": "Return OK if application is started", - "tags": [ - "Home" - ] + "security" : [ { + "ApiKey" : [ ] + } ], + "summary" : "Return OK if application is started", + "tags" : [ "Home" ] }, - "parameters": [ - { - "description": "This header identifies the call, if not passed it is self-generated. This ID is returned in the response.", - "in": "header", - "name": "X-Request-Id", - "schema": { - "type": "string" - } + "parameters" : [ { + "description" : "This header identifies the call, if not passed it is self-generated. This ID is returned in the response.", + "in" : "header", + "name" : "X-Request-Id", + "schema" : { + "type" : "string" } - ] + } ] }, - "/redirect": { - "get": { - "operationId": "redirect_1", - "parameters": [ - { - "example": "identificativoIntermediarioPA_sessionId", - "in": "query", - "name": "sessionId", - "required": true, - "schema": { - "type": "string" - } + "/redirect" : { + "get" : { + "operationId" : "redirect_1", + "parameters" : [ { + "example" : "identificativoIntermediarioPA_sessionId", + "in" : "query", + "name" : "sessionId", + "required" : true, + "schema" : { + "type" : "string" } - ], - "responses": { - "200": { - "content": { - "*/*": { - "schema": { - "$ref": "#/components/schemas/RedirectResponse" + } ], + "responses" : { + "200" : { + "content" : { + "*/*" : { + "schema" : { + "$ref" : "#/components/schemas/RedirectResponse" } } }, - "description": "Redirect info to Checkout service.", - "headers": { - "X-Request-Id": { - "description": "This header identifies the call", - "schema": { - "type": "string" + "description" : "Redirect info to Checkout service.", + "headers" : { + "X-Request-Id" : { + "description" : "This header identifies the call", + "schema" : { + "type" : "string" } } } }, - "302": { - "description": "Redirect to Checkout service.", - "headers": { - "X-Request-Id": { - "description": "This header identifies the call", - "schema": { - "type": "string" + "302" : { + "description" : "Redirect to Checkout service.", + "headers" : { + "X-Request-Id" : { + "description" : "This header identifies the call", + "schema" : { + "type" : "string" } } } } }, - "security": [ - { - "ApiKey": [] - } - ], - "tags": [ - "Redirect" - ] + "security" : [ { + "ApiKey" : [ ] + } ], + "tags" : [ "Redirect" ] }, - "parameters": [ - { - "description": "This header identifies the call, if not passed it is self-generated. This ID is returned in the response.", - "in": "header", - "name": "X-Request-Id", - "schema": { - "type": "string" - } + "parameters" : [ { + "description" : "This header identifies the call, if not passed it is self-generated. This ID is returned in the response.", + "in" : "header", + "name" : "X-Request-Id", + "schema" : { + "type" : "string" } - ] + } ] } }, - "components": { - "schemas": { - "AppInfoResponse": { - "type": "object", - "properties": { - "environment": { - "type": "string" + "components" : { + "schemas" : { + "AppInfoResponse" : { + "type" : "object", + "properties" : { + "environment" : { + "type" : "string" }, - "name": { - "type": "string" + "name" : { + "type" : "string" }, - "version": { - "type": "string" + "version" : { + "type" : "string" } } }, - "RedirectResponse": { - "type": "object", - "properties": { - "redirect-url": { - "type": "string" + "RedirectResponse" : { + "type" : "object", + "properties" : { + "redirect-url" : { + "type" : "string" } } } }, - "securitySchemes": { - "ApiKey": { - "description": "The API key to access this function app.", - "in": "header", - "name": "Ocp-Apim-Subscription-Key", - "type": "apiKey" + "securitySchemes" : { + "ApiKey" : { + "description" : "The API key to access this function app.", + "in" : "header", + "name" : "Ocp-Apim-Subscription-Key", + "type" : "apiKey" } } } -} +} \ No newline at end of file diff --git a/src/main/java/it/gov/pagopa/wispconverter/config/FilterConfiguration.java b/src/main/java/it/gov/pagopa/wispconverter/config/FilterConfiguration.java index ceb0d562..35d786f6 100644 --- a/src/main/java/it/gov/pagopa/wispconverter/config/FilterConfiguration.java +++ b/src/main/java/it/gov/pagopa/wispconverter/config/FilterConfiguration.java @@ -1,10 +1,8 @@ package it.gov.pagopa.wispconverter.config; -import it.gov.pagopa.wispconverter.service.ReService; -import it.gov.pagopa.wispconverter.util.filter.ReFilter; + import it.gov.pagopa.wispconverter.util.filter.RequestIdFilter; import it.gov.pagopa.wispconverter.util.filter.RequestResponseWrapperFilter; -import it.gov.pagopa.wispconverter.util.filter.AppServerLoggingFilterFilter; import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; @@ -18,28 +16,6 @@ @RequiredArgsConstructor public class FilterConfiguration { - private final ReService reService; - - @Value("${log.server.request.include-headers}") - private boolean serverRequestIncludeHeaders; - @Value("${log.server.request.include-client-info}") - private boolean serverRequestIncludeClientInfo; - @Value("${log.server.request.include-payload}") - private boolean serverRequestIncludePayload; - @Value("${log.server.request.max-payload-length}") - private int serverRequestMaxLength; - @Value("${log.server.response.include-headers}") - private boolean serverResponseIncludeHeaders; - @Value("${log.server.response.include-payload}") - private boolean serverResponseIncludePayload; - @Value("${log.server.response.max-payload-length}") - private int serverResponseMaxLength; - - @Value("${log.server.request.pretty}") - private boolean serverRequestPretty; - - @Value("${log.server.response.pretty}") - private boolean serverResponsePretty; @Value("${filter.exclude-url-patterns}") private List excludeUrlPatterns; @@ -60,33 +36,29 @@ public RequestResponseWrapperFilter requestResponseWrapperFilter() { return filter; } - @Bean - @Order(Ordered.HIGHEST_PRECEDENCE+2) - public AppServerLoggingFilterFilter appServerLogging() { - AppServerLoggingFilterFilter filter = new AppServerLoggingFilterFilter(); - - filter.setRequestIncludeHeaders(serverRequestIncludeHeaders); - filter.setRequestIncludeClientInfo(serverRequestIncludeClientInfo); - filter.setRequestIncludePayload(serverRequestIncludePayload); - filter.setRequestMaxPayloadLength(serverRequestMaxLength); - filter.setRequestPretty(serverRequestPretty); - - filter.setResponseIncludeHeaders(serverResponseIncludeHeaders); - filter.setResponseIncludePayload(serverResponseIncludePayload); - filter.setResponseMaxPayloadLength(serverResponseMaxLength); - filter.setResponsePretty(serverResponsePretty); - - filter.setExcludeUrlPatterns(excludeUrlPatterns); - return filter; - } - - @Bean - @Order(Ordered.HIGHEST_PRECEDENCE+3) - public ReFilter reFilter() { - ReFilter filter = new ReFilter(reService); - filter.setExcludeUrlPatterns(excludeUrlPatterns); - return filter; - } +// @Bean +// @ConfigurationProperties(prefix = "log.server") +// public ServerLoggingProperties serverLoggingProperties() { +// return new ServerLoggingProperties(); +// } +// +// @Bean +// @Order(Ordered.HIGHEST_PRECEDENCE+2) +// public AppServerLoggingFilterFilter appServerLogging() { +// ServerLoggingProperties serverLoggingProperties = serverLoggingProperties(); +// +// AppServerLoggingFilterFilter filter = new AppServerLoggingFilterFilter(serverLoggingProperties); +// filter.setExcludeUrlPatterns(excludeUrlPatterns); +// return filter; +// } + +// @Bean +// @Order(Ordered.HIGHEST_PRECEDENCE+3) +// public ReFilter reFilter() { +// ReFilter filter = new ReFilter(reService); +// filter.setExcludeUrlPatterns(excludeUrlPatterns); +// return filter; +// } } diff --git a/src/main/java/it/gov/pagopa/wispconverter/config/OpenApiConfig.java b/src/main/java/it/gov/pagopa/wispconverter/config/OpenApiConfig.java index 266fb3ba..c920ef5e 100644 --- a/src/main/java/it/gov/pagopa/wispconverter/config/OpenApiConfig.java +++ b/src/main/java/it/gov/pagopa/wispconverter/config/OpenApiConfig.java @@ -1,7 +1,5 @@ package it.gov.pagopa.wispconverter.config; -import static it.gov.pagopa.wispconverter.util.Constants.HEADER_REQUEST_ID; - import io.swagger.v3.oas.models.Components; import io.swagger.v3.oas.models.OpenAPI; import io.swagger.v3.oas.models.Paths; @@ -11,16 +9,17 @@ import io.swagger.v3.oas.models.parameters.Parameter; import io.swagger.v3.oas.models.responses.ApiResponses; import io.swagger.v3.oas.models.security.SecurityScheme; +import org.springdoc.core.customizers.OpenApiCustomizer; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; import java.util.Collections; import java.util.Map; import java.util.Objects; import java.util.Optional; -import org.springdoc.core.customizers.OpenApiCustomizer; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; +import static it.gov.pagopa.wispconverter.util.Constants.HEADER_REQUEST_ID; @Configuration public class OpenApiConfig { diff --git a/src/main/java/it/gov/pagopa/wispconverter/config/RedisConfig.java b/src/main/java/it/gov/pagopa/wispconverter/config/RedisConfig.java index a4edf240..90b5458d 100644 --- a/src/main/java/it/gov/pagopa/wispconverter/config/RedisConfig.java +++ b/src/main/java/it/gov/pagopa/wispconverter/config/RedisConfig.java @@ -1,7 +1,6 @@ package it.gov.pagopa.wispconverter.config; import com.fasterxml.jackson.databind.ObjectMapper; -import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; diff --git a/src/main/java/it/gov/pagopa/wispconverter/config/ScheduledJobsConfig.java b/src/main/java/it/gov/pagopa/wispconverter/config/ScheduledJobsConfig.java index 2b786d28..469fe48b 100644 --- a/src/main/java/it/gov/pagopa/wispconverter/config/ScheduledJobsConfig.java +++ b/src/main/java/it/gov/pagopa/wispconverter/config/ScheduledJobsConfig.java @@ -2,7 +2,6 @@ import it.gov.pagopa.wispconverter.service.ConfigCacheService; import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Configuration; import org.springframework.scheduling.annotation.EnableScheduling; import org.springframework.scheduling.annotation.Scheduled; diff --git a/src/main/java/it/gov/pagopa/wispconverter/config/WebMvcConfig.java b/src/main/java/it/gov/pagopa/wispconverter/config/WebMvcConfig.java index a307a7f1..333b0058 100644 --- a/src/main/java/it/gov/pagopa/wispconverter/config/WebMvcConfig.java +++ b/src/main/java/it/gov/pagopa/wispconverter/config/WebMvcConfig.java @@ -2,10 +2,15 @@ import com.fasterxml.jackson.databind.ObjectMapper; import it.gov.pagopa.wispconverter.config.model.AppCors; -import it.gov.pagopa.wispconverter.util.MDCEnrichInterceptor; +import it.gov.pagopa.wispconverter.service.ReService; +import it.gov.pagopa.wispconverter.util.interceptor.MDCEnrichInterceptor; +import it.gov.pagopa.wispconverter.util.interceptor.ReInterceptor; +import it.gov.pagopa.wispconverter.util.client.ServerLoggingProperties; +import it.gov.pagopa.wispconverter.util.interceptor.AppServerLoggingInterceptor; import lombok.RequiredArgsConstructor; import lombok.SneakyThrows; import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Primary; @@ -27,6 +32,8 @@ @RequiredArgsConstructor public class WebMvcConfig implements WebMvcConfigurer { + private final ReService reService; + List locales = Arrays.asList(Locale.ENGLISH, Locale.ITALIAN); @Value("${cors.configuration}") @@ -35,6 +42,12 @@ public class WebMvcConfig implements WebMvcConfigurer { @Value("${filter.exclude-url-patterns}") private List excludeUrlPatterns; + @Bean + @ConfigurationProperties(prefix = "log.server") + public ServerLoggingProperties serverLoggingProperties() { + return new ServerLoggingProperties(); + } + @SneakyThrows @Override @@ -76,7 +89,12 @@ public LocalValidatorFactoryBean getValidator() { @Override public void addInterceptors(InterceptorRegistry registry) { + ServerLoggingProperties serverLoggingProperties = serverLoggingProperties(); + + registry.addInterceptor(new AppServerLoggingInterceptor(serverLoggingProperties)).excludePathPatterns(excludeUrlPatterns); + registry.addInterceptor(new ReInterceptor(reService)).excludePathPatterns(excludeUrlPatterns); registry.addInterceptor(new MDCEnrichInterceptor()).excludePathPatterns(excludeUrlPatterns); + } } diff --git a/src/main/java/it/gov/pagopa/wispconverter/config/client/APIConfigCacheClientConfig.java b/src/main/java/it/gov/pagopa/wispconverter/config/client/APIConfigCacheClientConfig.java index c5991ccd..d4f800bb 100644 --- a/src/main/java/it/gov/pagopa/wispconverter/config/client/APIConfigCacheClientConfig.java +++ b/src/main/java/it/gov/pagopa/wispconverter/config/client/APIConfigCacheClientConfig.java @@ -1,13 +1,13 @@ package it.gov.pagopa.wispconverter.config.client; import it.gov.pagopa.wispconverter.service.ReService; -import it.gov.pagopa.wispconverter.util.client.MDCInterceptor; -import it.gov.pagopa.wispconverter.util.client.ReInterceptor; +import it.gov.pagopa.wispconverter.util.client.ClientLoggingProperties; import it.gov.pagopa.wispconverter.util.client.apiconfigcache.ApiConfigCacheClientLoggingInterceptor; import it.gov.pagopa.wispconverter.util.client.apiconfigcache.ApiConfigCacheClientResponseErrorHandler; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.http.client.BufferingClientHttpRequestFactory; @@ -37,48 +37,22 @@ public class APIConfigCacheClientConfig { @Value("${client.cache.api-key}") private String apiKey; - @Value("${log.client.cache.request.include-headers}") - private boolean clientRequestIncludeHeaders; - @Value("${log.client.cache.request.include-payload}") - private boolean clientRequestIncludePayload; - @Value("${log.client.cache.request.max-payload-length}") - private int clientRequestMaxLength; - @Value("${log.client.cache.response.include-headers}") - private boolean clientResponseIncludeHeaders; - @Value("${log.client.cache.response.include-payload}") - private boolean clientResponseIncludePayload; - @Value("${log.client.cache.response.max-payload-length}") - private int clientResponseMaxLength; - - @Value("${log.client.cache.mask.header.name}") - private String maskHeaderName; - - @Value("${log.client.cache.request.pretty}") - private boolean clientRequestPretty; - - @Value("${log.client.cache.response.pretty}") - private boolean clientResponsePretty; + @Bean + @ConfigurationProperties(prefix = "log.client.cache") + public ClientLoggingProperties cacheClientLoggingProperties() { + return new ClientLoggingProperties(); + } @Bean public it.gov.pagopa.gen.wispconverter.client.cache.invoker.ApiClient configCacheClient() { - ApiConfigCacheClientLoggingInterceptor clientLogging = new ApiConfigCacheClientLoggingInterceptor(); - clientLogging.setRequestIncludeHeaders(clientRequestIncludeHeaders); - clientLogging.setRequestIncludePayload(clientRequestIncludePayload); - clientLogging.setRequestMaxPayloadLength(clientRequestMaxLength); - clientLogging.setRequestHeaderPredicate(p -> !p.equals(maskHeaderName)); - clientLogging.setRequestPretty(clientRequestPretty); - - clientLogging.setResponseIncludeHeaders(clientResponseIncludeHeaders); - clientLogging.setResponseIncludePayload(clientResponseIncludePayload); - clientLogging.setResponseMaxPayloadLength(clientResponseMaxLength); - clientLogging.setResponsePretty(clientResponsePretty); + ClientLoggingProperties clientLoggingProperties = cacheClientLoggingProperties(); + + ApiConfigCacheClientLoggingInterceptor clientLogging = new ApiConfigCacheClientLoggingInterceptor(clientLoggingProperties, reService); RestTemplate restTemplate = restTemplate(); List currentInterceptors = restTemplate.getInterceptors(); - currentInterceptors.add(new MDCInterceptor()); - currentInterceptors.add(new ReInterceptor(reService)); currentInterceptors.add(clientLogging); restTemplate.setInterceptors(currentInterceptors); diff --git a/src/main/java/it/gov/pagopa/wispconverter/config/client/CheckoutClientConfig.java b/src/main/java/it/gov/pagopa/wispconverter/config/client/CheckoutClientConfig.java index fdb0b652..67fcff06 100644 --- a/src/main/java/it/gov/pagopa/wispconverter/config/client/CheckoutClientConfig.java +++ b/src/main/java/it/gov/pagopa/wispconverter/config/client/CheckoutClientConfig.java @@ -1,13 +1,13 @@ package it.gov.pagopa.wispconverter.config.client; import it.gov.pagopa.wispconverter.service.ReService; -import it.gov.pagopa.wispconverter.util.client.MDCInterceptor; -import it.gov.pagopa.wispconverter.util.client.ReInterceptor; +import it.gov.pagopa.wispconverter.util.client.ClientLoggingProperties; import it.gov.pagopa.wispconverter.util.client.checkout.CheckoutClientLoggingInterceptor; import it.gov.pagopa.wispconverter.util.client.checkout.CheckoutClientResponseErrorHandler; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.http.client.BufferingClientHttpRequestFactory; @@ -38,47 +38,22 @@ public class CheckoutClientConfig { @Value("${client.checkout.api-key}") private String apiKey; - @Value("${log.client.checkout.request.include-headers}") - private boolean clientRequestIncludeHeaders; - @Value("${log.client.checkout.request.include-payload}") - private boolean clientRequestIncludePayload; - @Value("${log.client.checkout.request.max-payload-length}") - private int clientRequestMaxLength; - @Value("${log.client.checkout.response.include-headers}") - private boolean clientResponseIncludeHeaders; - @Value("${log.client.checkout.response.include-payload}") - private boolean clientResponseIncludePayload; - @Value("${log.client.checkout.response.max-payload-length}") - private int clientResponseMaxLength; - @Value("${log.client.checkout.mask.header.name}") - private String maskHeaderName; - - @Value("${log.client.checkout.request.pretty}") - private boolean clientRequestPretty; - - @Value("${log.client.checkout.response.pretty}") - private boolean clientResponsePretty; + @Bean + @ConfigurationProperties(prefix = "log.client.checkout") + public ClientLoggingProperties checkoutClientLoggingProperties() { + return new ClientLoggingProperties(); + } @Bean public it.gov.pagopa.gen.wispconverter.client.checkout.invoker.ApiClient checkoutClient() { - CheckoutClientLoggingInterceptor clientLogging = new CheckoutClientLoggingInterceptor(); - clientLogging.setRequestIncludeHeaders(clientRequestIncludeHeaders); - clientLogging.setRequestIncludePayload(clientRequestIncludePayload); - clientLogging.setRequestMaxPayloadLength(clientRequestMaxLength); - clientLogging.setRequestHeaderPredicate(p -> !p.equals(maskHeaderName)); - clientLogging.setRequestPretty(clientRequestPretty); - - clientLogging.setResponseIncludeHeaders(clientResponseIncludeHeaders); - clientLogging.setResponseIncludePayload(clientResponseIncludePayload); - clientLogging.setResponseMaxPayloadLength(clientResponseMaxLength); - clientLogging.setResponsePretty(clientResponsePretty); + ClientLoggingProperties clientLoggingProperties = checkoutClientLoggingProperties(); + + CheckoutClientLoggingInterceptor clientLogging = new CheckoutClientLoggingInterceptor(clientLoggingProperties, reService); RestTemplate restTemplate = restTemplate(); List currentInterceptors = restTemplate.getInterceptors(); - currentInterceptors.add(new MDCInterceptor()); - currentInterceptors.add(new ReInterceptor(reService)); currentInterceptors.add(clientLogging); restTemplate.setInterceptors(currentInterceptors); diff --git a/src/main/java/it/gov/pagopa/wispconverter/config/client/DecouplerCachingClientConfig.java b/src/main/java/it/gov/pagopa/wispconverter/config/client/DecouplerCachingClientConfig.java index 3d5b366f..09195e7b 100644 --- a/src/main/java/it/gov/pagopa/wispconverter/config/client/DecouplerCachingClientConfig.java +++ b/src/main/java/it/gov/pagopa/wispconverter/config/client/DecouplerCachingClientConfig.java @@ -1,13 +1,13 @@ package it.gov.pagopa.wispconverter.config.client; import it.gov.pagopa.wispconverter.service.ReService; -import it.gov.pagopa.wispconverter.util.client.MDCInterceptor; -import it.gov.pagopa.wispconverter.util.client.ReInterceptor; +import it.gov.pagopa.wispconverter.util.client.ClientLoggingProperties; import it.gov.pagopa.wispconverter.util.client.decouplercaching.DecouplerCachingClientLoggingInterceptor; import it.gov.pagopa.wispconverter.util.client.decouplercaching.DecouplerCachingClientResponseErrorHandler; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.http.client.BufferingClientHttpRequestFactory; @@ -23,6 +23,7 @@ @Slf4j @RequiredArgsConstructor public class DecouplerCachingClientConfig { + private final ReService reService; @Value("${client.decoupler-caching.read-timeout}") @@ -37,47 +38,22 @@ public class DecouplerCachingClientConfig { @Value("${client.decoupler-caching.api-key}") private String apiKey; - @Value("${log.client.decoupler-caching.request.include-headers}") - private boolean clientRequestIncludeHeaders; - @Value("${log.client.decoupler-caching.request.include-payload}") - private boolean clientRequestIncludePayload; - @Value("${log.client.decoupler-caching.request.max-payload-length}") - private int clientRequestMaxLength; - @Value("${log.client.decoupler-caching.response.include-headers}") - private boolean clientResponseIncludeHeaders; - @Value("${log.client.decoupler-caching.response.include-payload}") - private boolean clientResponseIncludePayload; - @Value("${log.client.decoupler-caching.response.max-payload-length}") - private int clientResponseMaxLength; - - @Value("${log.client.decoupler-caching.mask.header.name}") - private String maskHeaderName; - - @Value("${log.client.decoupler-caching.request.pretty}") - private boolean clientRequestPretty; - @Value("${log.client.decoupler-caching.response.pretty}") - private boolean clientResponsePretty; + @Bean + @ConfigurationProperties(prefix = "log.client.decoupler-caching") + public ClientLoggingProperties decouplerCachingClientLoggingProperties() { + return new ClientLoggingProperties(); + } @Bean public it.gov.pagopa.gen.wispconverter.client.decouplercaching.invoker.ApiClient decouplerCachingClient() { - DecouplerCachingClientLoggingInterceptor clientLogging = new DecouplerCachingClientLoggingInterceptor(); - clientLogging.setRequestIncludeHeaders(clientRequestIncludeHeaders); - clientLogging.setRequestIncludePayload(clientRequestIncludePayload); - clientLogging.setRequestMaxPayloadLength(clientRequestMaxLength); - clientLogging.setRequestHeaderPredicate(p -> !p.equals(maskHeaderName)); - clientLogging.setRequestPretty(clientRequestPretty); - - clientLogging.setResponseIncludeHeaders(clientResponseIncludeHeaders); - clientLogging.setResponseIncludePayload(clientResponseIncludePayload); - clientLogging.setResponseMaxPayloadLength(clientResponseMaxLength); - clientLogging.setResponsePretty(clientResponsePretty); + ClientLoggingProperties clientLoggingProperties = decouplerCachingClientLoggingProperties(); + + DecouplerCachingClientLoggingInterceptor clientLogging = new DecouplerCachingClientLoggingInterceptor(clientLoggingProperties, reService); RestTemplate restTemplate = restTemplate(); List currentInterceptors = restTemplate.getInterceptors(); - currentInterceptors.add(new MDCInterceptor()); - currentInterceptors.add(new ReInterceptor(reService)); currentInterceptors.add(clientLogging); restTemplate.setInterceptors(currentInterceptors); diff --git a/src/main/java/it/gov/pagopa/wispconverter/config/client/GpdClientConfig.java b/src/main/java/it/gov/pagopa/wispconverter/config/client/GpdClientConfig.java index 0b2304a1..a3e6565b 100644 --- a/src/main/java/it/gov/pagopa/wispconverter/config/client/GpdClientConfig.java +++ b/src/main/java/it/gov/pagopa/wispconverter/config/client/GpdClientConfig.java @@ -1,13 +1,13 @@ package it.gov.pagopa.wispconverter.config.client; import it.gov.pagopa.wispconverter.service.ReService; -import it.gov.pagopa.wispconverter.util.client.MDCInterceptor; -import it.gov.pagopa.wispconverter.util.client.ReInterceptor; +import it.gov.pagopa.wispconverter.util.client.ClientLoggingProperties; import it.gov.pagopa.wispconverter.util.client.gpd.GpdClientLoggingInterceptor; import it.gov.pagopa.wispconverter.util.client.gpd.GpdClientResponseErrorHandler; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.http.client.BufferingClientHttpRequestFactory; @@ -23,6 +23,7 @@ @Slf4j @RequiredArgsConstructor public class GpdClientConfig { + private final ReService reService; @Value("${client.gpd.read-timeout}") @@ -37,47 +38,22 @@ public class GpdClientConfig { @Value("${client.gpd.api-key}") private String apiKey; - @Value("${log.client.gpd.request.include-headers}") - private boolean clientRequestIncludeHeaders; - @Value("${log.client.gpd.request.include-payload}") - private boolean clientRequestIncludePayload; - @Value("${log.client.gpd.request.max-payload-length}") - private int clientRequestMaxLength; - @Value("${log.client.gpd.response.include-headers}") - private boolean clientResponseIncludeHeaders; - @Value("${log.client.gpd.response.include-payload}") - private boolean clientResponseIncludePayload; - @Value("${log.client.gpd.response.max-payload-length}") - private int clientResponseMaxLength; - - @Value("${log.client.gpd.mask.header.name}") - private String maskHeaderName; - - @Value("${log.client.gpd.request.pretty}") - private boolean clientRequestPretty; - @Value("${log.client.gpd.response.pretty}") - private boolean clientResponsePretty; + @Bean + @ConfigurationProperties(prefix = "log.client.gpd") + public ClientLoggingProperties gpdClientLoggingProperties() { + return new ClientLoggingProperties(); + } @Bean public it.gov.pagopa.gen.wispconverter.client.gpd.invoker.ApiClient gpdClient() { - GpdClientLoggingInterceptor clientLogging = new GpdClientLoggingInterceptor(); - clientLogging.setRequestIncludeHeaders(clientRequestIncludeHeaders); - clientLogging.setRequestIncludePayload(clientRequestIncludePayload); - clientLogging.setRequestMaxPayloadLength(clientRequestMaxLength); - clientLogging.setRequestHeaderPredicate(p -> !p.equals(maskHeaderName)); - clientLogging.setRequestPretty(clientRequestPretty); - - clientLogging.setResponseIncludeHeaders(clientResponseIncludeHeaders); - clientLogging.setResponseIncludePayload(clientResponseIncludePayload); - clientLogging.setResponseMaxPayloadLength(clientResponseMaxLength); - clientLogging.setResponsePretty(clientResponsePretty); + ClientLoggingProperties clientLoggingProperties = gpdClientLoggingProperties(); + + GpdClientLoggingInterceptor clientLogging = new GpdClientLoggingInterceptor(clientLoggingProperties, reService); RestTemplate restTemplate = restTemplate(); List currentInterceptors = restTemplate.getInterceptors(); - currentInterceptors.add(new MDCInterceptor()); - currentInterceptors.add(new ReInterceptor(reService)); currentInterceptors.add(clientLogging); restTemplate.setInterceptors(currentInterceptors); diff --git a/src/main/java/it/gov/pagopa/wispconverter/config/client/IuvGeneratorClientConfig.java b/src/main/java/it/gov/pagopa/wispconverter/config/client/IuvGeneratorClientConfig.java index 7e468e77..e0388401 100644 --- a/src/main/java/it/gov/pagopa/wispconverter/config/client/IuvGeneratorClientConfig.java +++ b/src/main/java/it/gov/pagopa/wispconverter/config/client/IuvGeneratorClientConfig.java @@ -1,13 +1,13 @@ package it.gov.pagopa.wispconverter.config.client; import it.gov.pagopa.wispconverter.service.ReService; -import it.gov.pagopa.wispconverter.util.client.MDCInterceptor; -import it.gov.pagopa.wispconverter.util.client.ReInterceptor; +import it.gov.pagopa.wispconverter.util.client.ClientLoggingProperties; import it.gov.pagopa.wispconverter.util.client.iuvgenerator.IuvGeneratorClientLoggingInterceptor; import it.gov.pagopa.wispconverter.util.client.iuvgenerator.IuvGeneratorClientResponseErrorHandler; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.http.client.BufferingClientHttpRequestFactory; @@ -23,6 +23,7 @@ @Slf4j @RequiredArgsConstructor public class IuvGeneratorClientConfig { + private final ReService reService; @Value("${client.iuvgenerator.read-timeout}") @@ -37,48 +38,23 @@ public class IuvGeneratorClientConfig { @Value("${client.iuvgenerator.api-key}") private String apiKey; - @Value("${log.client.iuvgenerator.request.include-headers}") - private boolean clientRequestIncludeHeaders; - @Value("${log.client.iuvgenerator.request.include-payload}") - private boolean clientRequestIncludePayload; - @Value("${log.client.iuvgenerator.request.max-payload-length}") - private int clientRequestMaxLength; - @Value("${log.client.iuvgenerator.response.include-headers}") - private boolean clientResponseIncludeHeaders; - @Value("${log.client.iuvgenerator.response.include-payload}") - private boolean clientResponseIncludePayload; - @Value("${log.client.iuvgenerator.response.max-payload-length}") - private int clientResponseMaxLength; - - @Value("${log.client.iuvgenerator.mask.header.name}") - private String maskHeaderName; - - @Value("${log.client.iuvgenerator.request.pretty}") - private boolean clientRequestPretty; - @Value("${log.client.iuvgenerator.response.pretty}") - private boolean clientResponsePretty; + @Bean + @ConfigurationProperties(prefix = "log.client.iuvgenerator") + public ClientLoggingProperties iuvGeneratorClientLoggingProperties() { + return new ClientLoggingProperties(); + } @Bean public it.gov.pagopa.gen.wispconverter.client.iuvgenerator.invoker.ApiClient iuvGeneratorClient() { - IuvGeneratorClientLoggingInterceptor clientLogging = new IuvGeneratorClientLoggingInterceptor(); - clientLogging.setRequestIncludeHeaders(clientRequestIncludeHeaders); - clientLogging.setRequestIncludePayload(clientRequestIncludePayload); - clientLogging.setRequestMaxPayloadLength(clientRequestMaxLength); - clientLogging.setRequestHeaderPredicate(p -> !p.equals(maskHeaderName)); - clientLogging.setRequestPretty(clientRequestPretty); - - clientLogging.setResponseIncludeHeaders(clientResponseIncludeHeaders); - clientLogging.setResponseIncludePayload(clientResponseIncludePayload); - clientLogging.setResponseMaxPayloadLength(clientResponseMaxLength); - clientLogging.setResponsePretty(clientResponsePretty); + ClientLoggingProperties clientLoggingProperties = iuvGeneratorClientLoggingProperties(); + + IuvGeneratorClientLoggingInterceptor clientLogging = new IuvGeneratorClientLoggingInterceptor(clientLoggingProperties, reService); RestTemplate restTemplate = restTemplate(); List currentInterceptors = restTemplate.getInterceptors(); - currentInterceptors.add(new MDCInterceptor()); - currentInterceptors.add(new ReInterceptor(reService)); currentInterceptors.add(clientLogging); restTemplate.setInterceptors(currentInterceptors); diff --git a/src/main/java/it/gov/pagopa/wispconverter/controller/RedirectController.java b/src/main/java/it/gov/pagopa/wispconverter/controller/RedirectController.java index 9e4d9f98..b8fc0b12 100644 --- a/src/main/java/it/gov/pagopa/wispconverter/controller/RedirectController.java +++ b/src/main/java/it/gov/pagopa/wispconverter/controller/RedirectController.java @@ -14,6 +14,7 @@ import it.gov.pagopa.wispconverter.service.ConverterService; import it.gov.pagopa.wispconverter.util.Constants; import it.gov.pagopa.wispconverter.util.ErrorUtil; +import it.gov.pagopa.wispconverter.util.TraceReEvent; import jakarta.servlet.http.HttpServletResponse; import jakarta.validation.constraints.NotBlank; import lombok.RequiredArgsConstructor; @@ -28,9 +29,7 @@ import org.springframework.ui.Model; import org.springframework.validation.annotation.Validated; import org.springframework.web.ErrorResponse; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.*; import java.time.Instant; import java.util.Map; @@ -47,11 +46,14 @@ public class RedirectController { private final ErrorUtil errorUtil; private final MessageSource messageSource; + private static final String BO_REDIRECT = "redirect"; + @Operation(summary = "", description = "", security = {@SecurityRequirement(name = "ApiKey")}, tags = {"Redirect"}) @ApiResponses(value = { @ApiResponse(responseCode = "302", description = "Redirect to Checkout service.", content = @Content(schema = @Schema())) }) @GetMapping(value = "/redirect") + @TraceReEvent(businessProcess=BO_REDIRECT) public String redirect(@Parameter(description = "", example = "identificativoIntermediarioPA_sessionId") @NotBlank(message = "{redirect.session-id.not-blank}") @RequestParam("sessionId") String sessionId, @@ -85,11 +87,13 @@ public String redirect(@Parameter(description = "", example = "identificativoInt } + @Operation(summary = "", description = "", security = {@SecurityRequirement(name = "ApiKey")}, tags = {"Redirect"}) @ApiResponses(value = { @ApiResponse(responseCode = "200", description = "Redirect info to Checkout service.", content = @Content(schema = @Schema(implementation = RedirectResponse.class))) }) @GetMapping(value = "/redirect", consumes = MediaType.APPLICATION_JSON_VALUE) + @TraceReEvent(businessProcess=BO_REDIRECT) public ResponseEntity redirectInfo(@Parameter(description = "", example = "identificativoIntermediarioPA_sessionId") @NotBlank(message = "{redirect.session-id.not-blank}") @RequestParam("sessionId") String sessionId) { diff --git a/src/main/java/it/gov/pagopa/wispconverter/controller/advice/GlobalExceptionHandler.java b/src/main/java/it/gov/pagopa/wispconverter/controller/advice/GlobalExceptionHandler.java index 30f02a47..be4d1a45 100644 --- a/src/main/java/it/gov/pagopa/wispconverter/controller/advice/GlobalExceptionHandler.java +++ b/src/main/java/it/gov/pagopa/wispconverter/controller/advice/GlobalExceptionHandler.java @@ -33,6 +33,9 @@ public class GlobalExceptionHandler extends ResponseEntityExceptionHandler { @ExceptionHandler(AppException.class) public ErrorResponse handleAppException(AppException appEx) { + String operationId = MDC.get(Constants.MDC_OPERATION_ID); + log.error(String.format("AppException: operation-id=[%s]", operationId!=null?operationId:"n/a"), appEx); + ErrorResponse errorResponse = errorUtil.forAppException(appEx); ProblemDetail problemDetail = errorResponse.updateAndGetBody(this.messageSource, LocaleContextHolder.getLocale()); errorUtil.finalizeError(problemDetail, errorResponse.getStatusCode().value()); diff --git a/src/main/java/it/gov/pagopa/wispconverter/exception/AppException.java b/src/main/java/it/gov/pagopa/wispconverter/exception/AppException.java index e782737a..af54383d 100644 --- a/src/main/java/it/gov/pagopa/wispconverter/exception/AppException.java +++ b/src/main/java/it/gov/pagopa/wispconverter/exception/AppException.java @@ -1,7 +1,6 @@ package it.gov.pagopa.wispconverter.exception; import lombok.Getter; -import org.apache.commons.lang3.StringUtils; import java.text.MessageFormat; diff --git a/src/main/java/it/gov/pagopa/wispconverter/service/ConverterService.java b/src/main/java/it/gov/pagopa/wispconverter/service/ConverterService.java index 5704df28..50d5d636 100644 --- a/src/main/java/it/gov/pagopa/wispconverter/service/ConverterService.java +++ b/src/main/java/it/gov/pagopa/wispconverter/service/ConverterService.java @@ -5,6 +5,8 @@ import it.gov.pagopa.wispconverter.repository.RPTRequestRepository; import it.gov.pagopa.wispconverter.repository.model.RPTRequestEntity; import it.gov.pagopa.wispconverter.service.model.CommonRPTFieldsDTO; +import it.gov.pagopa.wispconverter.service.model.re.ReEventDto; +import it.gov.pagopa.wispconverter.util.ReUtil; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; @@ -26,8 +28,16 @@ public class ConverterService { private final RPTRequestRepository rptRequestRepository; + private final ReService reService; + public String convert(String sessionId) { + //FIXME + ReEventDto reInternal = ReUtil.createBaseReInternal() + .psp("FIXME") + .build(); + reService.addRe(reInternal); + // get RPT request entity from database RPTRequestEntity rptRequestEntity = getRPTRequestEntity(sessionId); @@ -37,6 +47,9 @@ public String convert(String sessionId) { // calling GPD creation API in order to generate the debt position associated to RPTs this.debtPositionService.createDebtPositions(commonRPTFieldsDTO); + + + // call APIM policy for save key for decoupler and save in Redis cache the mapping of the request identifier needed for RT generation in next steps this.cacheService.storeRequestMappingInCache(commonRPTFieldsDTO, sessionId); diff --git a/src/main/java/it/gov/pagopa/wispconverter/service/ReService.java b/src/main/java/it/gov/pagopa/wispconverter/service/ReService.java index 0aec5391..465a27f0 100644 --- a/src/main/java/it/gov/pagopa/wispconverter/service/ReService.java +++ b/src/main/java/it/gov/pagopa/wispconverter/service/ReService.java @@ -1,5 +1,8 @@ package it.gov.pagopa.wispconverter.service; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; +import it.gov.pagopa.wispconverter.service.model.re.ReEventDto; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; @@ -8,7 +11,20 @@ @Slf4j @RequiredArgsConstructor public class ReService { - public void addRe(String dir) { - log.info("\n#################\n# RE INTERFACE " + dir + "\n#################"); + + private final ObjectMapper objectMapper; + + public void addRe(ReEventDto reEventDto) { + try { + log.info("\n" + + "#################\n" + + "# RE "+reEventDto.getCategoriaEvento()+"/"+reEventDto.getCallType()+"/"+reEventDto.getSottoTipoEvento()+" \n" + + objectMapper.writerWithDefaultPrettyPrinter().writeValueAsString(reEventDto) + "\n" + + "#################"); + } catch (JsonProcessingException e) { + throw new RuntimeException(e); + } } + + } diff --git a/src/main/java/it/gov/pagopa/wispconverter/service/model/re/CallTypeEnum.java b/src/main/java/it/gov/pagopa/wispconverter/service/model/re/CallTypeEnum.java new file mode 100644 index 00000000..ba5dfe28 --- /dev/null +++ b/src/main/java/it/gov/pagopa/wispconverter/service/model/re/CallTypeEnum.java @@ -0,0 +1,6 @@ +package it.gov.pagopa.wispconverter.service.model.re; + +public enum CallTypeEnum { + SERVER, + CLIENT; +} diff --git a/src/main/java/it/gov/pagopa/wispconverter/service/model/re/CategoriaEventoEnum.java b/src/main/java/it/gov/pagopa/wispconverter/service/model/re/CategoriaEventoEnum.java new file mode 100644 index 00000000..1aa3ff55 --- /dev/null +++ b/src/main/java/it/gov/pagopa/wispconverter/service/model/re/CategoriaEventoEnum.java @@ -0,0 +1,6 @@ +package it.gov.pagopa.wispconverter.service.model.re; + +public enum CategoriaEventoEnum { + INTERFACCIA, + INTERNO; +} diff --git a/src/main/java/it/gov/pagopa/wispconverter/service/model/re/ComponenteEnum.java b/src/main/java/it/gov/pagopa/wispconverter/service/model/re/ComponenteEnum.java new file mode 100644 index 00000000..f8e9994a --- /dev/null +++ b/src/main/java/it/gov/pagopa/wispconverter/service/model/re/ComponenteEnum.java @@ -0,0 +1,7 @@ +package it.gov.pagopa.wispconverter.service.model.re; + +public enum ComponenteEnum { +// FESP, + WISP_SOAP_CONVERTER, + WISP_CONVERTER; +} diff --git a/src/main/java/it/gov/pagopa/wispconverter/service/model/re/EsitoEnum.java b/src/main/java/it/gov/pagopa/wispconverter/service/model/re/EsitoEnum.java new file mode 100644 index 00000000..4aaeefcb --- /dev/null +++ b/src/main/java/it/gov/pagopa/wispconverter/service/model/re/EsitoEnum.java @@ -0,0 +1,5 @@ +package it.gov.pagopa.wispconverter.service.model.re; + +public enum EsitoEnum { + INVIATA, INVIATA_KO, RICEVUTA, RICEVUTA_KO, CAMBIO_STATO; +} diff --git a/src/main/java/it/gov/pagopa/wispconverter/service/model/re/ReEventDto.java b/src/main/java/it/gov/pagopa/wispconverter/service/model/re/ReEventDto.java new file mode 100644 index 00000000..ca0fa707 --- /dev/null +++ b/src/main/java/it/gov/pagopa/wispconverter/service/model/re/ReEventDto.java @@ -0,0 +1,82 @@ +package it.gov.pagopa.wispconverter.service.model.re; + +import com.fasterxml.jackson.annotation.JsonPropertyOrder; +import lombok.*; + +import java.time.Instant; + +@Data +@EqualsAndHashCode +@AllArgsConstructor +@NoArgsConstructor +@Builder +@JsonPropertyOrder() +public class ReEventDto { + //// START KEY + private String id; + //// END KEY + + //// START LOGICAL REF + private String requestId; //gruppo, tutte le chiamate fatte con lo stesso X-Request-ID + private String operationId; //id operation associato a un requestId + private String clientOperationId; //id client operation associato a un operationId + private ComponenteEnum componente; //componente che scrive l'evento + private Instant insertedTimestamp; //ora di inserimento evento + //// END LOGICAL REF + + //// START FIELD FOR INTERFACE AND INTERN CHANGE + private CategoriaEventoEnum categoriaEvento; + private SottoTipoEventoEnum sottoTipoEvento; + //// END FIELD FOR INTERFACE AND INTERN CHANGE + + //// START FIELD FOR INTERFACE + private CallTypeEnum callType; + + private String fruitore; + private String fruitoreDescr; + private String erogatore; + private String erogatoreDescr; + + private EsitoEnum esito; + + private String httpMethod; + private String httpUri; + private String httpHeaders; + private String httpCallRemoteAddress; + + private Integer httpStatusCode; + private Long executionTimeMs; + + private String compressedPayload; //zip+Base64 + private Integer compressedPayloadLength; + + private String businessProcess; + + private String operationStatus; //dettaglio response in uscita + private String operationErrorTitle; //dettaglio response in uscita + private String operationErrorDetail; //dettaglio response in uscita + private String operationErrorCode; //dettaglio response in uscita + //// END FIELD FOR INTERFACE + + //// START FIELD FOR INTERN CHANGE + private String idDominio; + private String iuv; + private String ccp; + private String psp; + private String tipoVersamento; + private String tipoEvento; + private String stazione; + private String canale; + private String parametriSpecificiInterfaccia; + private String status; + private String info; + + private String pspDescr; + private String noticeNumber; + private String creditorReferenceId; + private String paymentToken; + private String sessionIdOriginal; + private Boolean standIn; + //// END FIELD FOR INTERN CHANGE + +} diff --git a/src/main/java/it/gov/pagopa/wispconverter/service/model/re/SottoTipoEventoEnum.java b/src/main/java/it/gov/pagopa/wispconverter/service/model/re/SottoTipoEventoEnum.java new file mode 100644 index 00000000..f63d5b3f --- /dev/null +++ b/src/main/java/it/gov/pagopa/wispconverter/service/model/re/SottoTipoEventoEnum.java @@ -0,0 +1,7 @@ +package it.gov.pagopa.wispconverter.service.model.re; + +public enum SottoTipoEventoEnum { + REQ, + RESP, + INTERN; +} diff --git a/src/main/java/it/gov/pagopa/wispconverter/util/AppBase64Util.java b/src/main/java/it/gov/pagopa/wispconverter/util/AppBase64Util.java new file mode 100644 index 00000000..f1b1d215 --- /dev/null +++ b/src/main/java/it/gov/pagopa/wispconverter/util/AppBase64Util.java @@ -0,0 +1,18 @@ +package it.gov.pagopa.wispconverter.util; + +import java.nio.charset.StandardCharsets; +import java.util.Base64; + +public class AppBase64Util { + + public static String base64Encode(byte[] compressed){ + return getUtf8String(Base64.getEncoder().encode(compressed)); + } + public static byte[] base64Decode(String base64Encoded){ + return Base64.getDecoder().decode(base64Encoded); + } + public static String getUtf8String(byte[] bytes){ + return new String(bytes, StandardCharsets.UTF_8); + } + +} diff --git a/src/main/java/it/gov/pagopa/wispconverter/util/Constants.java b/src/main/java/it/gov/pagopa/wispconverter/util/Constants.java index b850574d..e8f71bb6 100644 --- a/src/main/java/it/gov/pagopa/wispconverter/util/Constants.java +++ b/src/main/java/it/gov/pagopa/wispconverter/util/Constants.java @@ -19,7 +19,14 @@ public class Constants { public static final String MDC_REQUEST_ID = "requestId"; public static final String MDC_OPERATION_ID = "operationId"; + public static final String MDC_BUSINESS_PROCESS = "businessProcess"; + public static final String MDC_CLIENT_OPERATION_ID = "clientOperationId"; public static final String MDC_CLIENT_EXECUTION_TIME = "clientExecutionTime"; + public static final String MDC_EROGATORE = "erogatore"; + public static final String MDC_EROGATORE_DESCR = "erogatoreDescr"; + + + } diff --git a/src/main/java/it/gov/pagopa/wispconverter/util/MDCEnrichInterceptor.java b/src/main/java/it/gov/pagopa/wispconverter/util/MDCEnrichInterceptor.java deleted file mode 100644 index e945da34..00000000 --- a/src/main/java/it/gov/pagopa/wispconverter/util/MDCEnrichInterceptor.java +++ /dev/null @@ -1,20 +0,0 @@ -package it.gov.pagopa.wispconverter.util; - -import jakarta.servlet.http.HttpServletRequest; -import jakarta.servlet.http.HttpServletResponse; -import lombok.extern.slf4j.Slf4j; -import org.springframework.web.servlet.HandlerInterceptor; - -@Slf4j -public class MDCEnrichInterceptor implements HandlerInterceptor { - @Override - public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { - if(!MDCUtil.hasStatus()){ - log.debug("[afterCompletion] configure status"); - MDCUtil.setMDCCloseSuccessOperation(response.getStatus()); - } else { - log.debug("[afterCompletion] status already configured"); - } - } - -} diff --git a/src/main/java/it/gov/pagopa/wispconverter/util/ReUtil.java b/src/main/java/it/gov/pagopa/wispconverter/util/ReUtil.java new file mode 100644 index 00000000..94a2c93f --- /dev/null +++ b/src/main/java/it/gov/pagopa/wispconverter/util/ReUtil.java @@ -0,0 +1,326 @@ +package it.gov.pagopa.wispconverter.util; + +import it.gov.pagopa.wispconverter.service.model.re.*; +import it.gov.pagopa.wispconverter.util.filter.RepeatableContentCachingRequestWrapper; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.slf4j.MDC; +import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpRequest; +import org.springframework.http.client.ClientHttpResponse; +import org.springframework.util.StreamUtils; +import org.springframework.web.util.ContentCachingResponseWrapper; +import org.springframework.web.util.WebUtils; + +import java.io.*; +import java.nio.charset.StandardCharsets; +import java.time.Instant; +import java.util.Enumeration; +import java.util.Iterator; +import java.util.UUID; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +@Slf4j +public class ReUtil { + + private static final String NODO_DEI_PAGAMENTI_SP = "NodoDeiPagamentiSPC"; + + private static ReEventDto.ReEventDtoBuilder createBaseReInterface(CategoriaEventoEnum categoriaEvento, SottoTipoEventoEnum sottoTipoEvento, EsitoEnum esitoEnum, String erogatore, String erogatoreDescr, String fruitore, String fruitoreDescr, + String httpMethod, String httpUri, String httpHeaders, String httpCallRemoteAddress, String compressedPayload, Integer compressedPayloadLength, + CallTypeEnum callTypeEnum) { + + + return createBaseReBuilder() + + .categoriaEvento(categoriaEvento) + .sottoTipoEvento(sottoTipoEvento) + + .callType(callTypeEnum) + .fruitore(fruitore) + .fruitoreDescr(fruitoreDescr) + .erogatore(erogatore) + .erogatoreDescr(erogatoreDescr) + + .esito(esitoEnum) + + .httpMethod(httpMethod) + .httpUri(httpUri) + .httpHeaders(httpHeaders) + .httpCallRemoteAddress(httpCallRemoteAddress) + + .compressedPayload(compressedPayload) + .compressedPayloadLength(compressedPayloadLength); + } + + private static ReEventDto.ReEventDtoBuilder createBaseReBuilder(){ + return ReEventDto.builder() + .id(UUID.randomUUID().toString()) + .requestId(MDC.get(Constants.MDC_REQUEST_ID)) + .operationId(MDC.get(Constants.MDC_OPERATION_ID)) + .clientOperationId(MDC.get(Constants.MDC_CLIENT_OPERATION_ID)) + .componente(ComponenteEnum.WISP_CONVERTER) + .insertedTimestamp(Instant.ofEpochMilli(Long.parseLong(MDC.get(Constants.MDC_START_TIME)))) + .businessProcess(MDC.get(Constants.MDC_BUSINESS_PROCESS)); + } + + public static ReEventDto.ReEventDtoBuilder createBaseReInternal(){ + return createBaseReBuilder() + .categoriaEvento(CategoriaEventoEnum.INTERNO) + .sottoTipoEvento(SottoTipoEventoEnum.INTERN); + } + + + public static ReEventDto createReServerInterfaceRequest(HttpServletRequest request){ + String httpMethod = request.getMethod(); + + StringBuilder msg = new StringBuilder(request.getRequestURI()); + String queryString = request.getQueryString(); + if (queryString != null) { + msg.append('?').append(queryString); + } + String httpUri = msg.toString(); + String httpHeaders = formatServerRequestHeaders(request); + String httpCallRemoteAddress = request.getRemoteAddr(); + + String compressedPayload = null; + Integer compressedPayloadLength = null; + try { + String payload = getRequestMessagePayload(request); + if(payload!=null){ + compressedPayload = AppBase64Util.base64Encode(ZipUtil.zip(payload)); + compressedPayloadLength = compressedPayload.length(); + } + } catch (IOException e) { + log.error("Unzip error", e); + } + + + return createBaseReInterface( + CategoriaEventoEnum.INTERFACCIA, + SottoTipoEventoEnum.REQ, + EsitoEnum.RICEVUTA, + NODO_DEI_PAGAMENTI_SP, NODO_DEI_PAGAMENTI_SP, + null, null, + httpMethod, httpUri, httpHeaders, httpCallRemoteAddress, compressedPayload, compressedPayloadLength, + CallTypeEnum.SERVER) + .build(); + } + public static ReEventDto createReServerInterfaceResponse(HttpServletRequest request, HttpServletResponse response){ + + String httpHeaders = formatServerResponseHeaders(response); + String compressedPayload = null; + Integer compressedPayloadLength = null; + try { + String payload = getResponseMessagePayload(response); + if(payload!=null) { + compressedPayload = AppBase64Util.base64Encode(ZipUtil.zip(payload)); + compressedPayloadLength = compressedPayload.length(); + } + } catch (IOException e) { + log.error("Unzip error", e); + } + + int status = response.getStatus(); + String executionTime = MDC.get(Constants.MDC_EXECUTION_TIME); + + String httpMethod = request.getMethod(); + + StringBuilder msg = new StringBuilder(request.getRequestURI()); + String queryString = request.getQueryString(); + if (queryString != null) { + msg.append('?').append(queryString); + } + String httpUri = msg.toString(); + + ReEventDto.ReEventDtoBuilder target = createBaseReInterface( + CategoriaEventoEnum.INTERFACCIA, + SottoTipoEventoEnum.RESP, + EsitoEnum.INVIATA, + NODO_DEI_PAGAMENTI_SP, NODO_DEI_PAGAMENTI_SP, + null, null, + httpMethod, httpUri, httpHeaders, null, compressedPayload, compressedPayloadLength, + CallTypeEnum.SERVER); + + target.httpStatusCode(status); + target.executionTimeMs(Long.parseLong(executionTime)); + + target.operationStatus(MDC.get(Constants.MDC_STATUS)); + target.operationErrorTitle(MDC.get(Constants.MDC_ERROR_TITLE)); + target.operationErrorDetail(MDC.get(Constants.MDC_ERROR_DETAIL)); + target.operationErrorCode(MDC.get(Constants.MDC_ERROR_CODE)); + return target.build(); + } + + public static ReEventDto createReClientInterfaceRequest(HttpRequest request, byte[] reqBody){ + String httpMethod = request.getMethod().toString(); + String httpUri = request.getURI().toString(); + String httpHeaders = formatClientHeaders(request.getHeaders()); + + String compressedPayload = null; + Integer compressedPayloadPayloadLength = null; + try { + String payload = new String(reqBody, StandardCharsets.UTF_8); + if(!payload.isBlank()) { + compressedPayload = AppBase64Util.base64Encode(ZipUtil.zip(payload)); + compressedPayloadPayloadLength = compressedPayload.length(); + } + } catch (IOException e) { + log.error("Unzip error", e); + } + + String erogatore = MDC.get(Constants.MDC_EROGATORE); + String erogatoreDescr = MDC.get(Constants.MDC_EROGATORE_DESCR); + + return createBaseReInterface( + CategoriaEventoEnum.INTERFACCIA, + SottoTipoEventoEnum.REQ, + EsitoEnum.INVIATA, //FIXME INVIATA o INVIATA_KO + erogatore, erogatoreDescr, + NODO_DEI_PAGAMENTI_SP, NODO_DEI_PAGAMENTI_SP, + httpMethod, httpUri, httpHeaders, null, compressedPayload, compressedPayloadPayloadLength, + CallTypeEnum.CLIENT) + .build(); + } + + public static ReEventDto createReClientInterfaceResponse(HttpRequest request, ClientHttpResponse response){ + String httpHeaders = formatClientHeaders(response.getHeaders()); + String compressedPayload = null; + Integer compressedPayloadPayloadLength = null; + try { + String payload = bodyToString(response.getBody()); + if(!payload.isBlank()) { + compressedPayload = AppBase64Util.base64Encode(ZipUtil.zip(payload)); + compressedPayloadPayloadLength = compressedPayload.length(); + } + } catch (IOException e) { + log.error("Unzip error", e); + } + + Integer status = null; + try { + status = response.getStatusCode().value(); + } catch (IOException e) { + log.error("Retrieve status code error", e); + } + String executionTime = MDC.get(Constants.MDC_CLIENT_EXECUTION_TIME); + + String erogatore = MDC.get(Constants.MDC_EROGATORE); + String erogatoreDescr = MDC.get(Constants.MDC_EROGATORE_DESCR); + + String httpMethod = request.getMethod().toString(); + String httpUri = request.getURI().toString(); + + ReEventDto.ReEventDtoBuilder target = createBaseReInterface( + CategoriaEventoEnum.INTERFACCIA, + SottoTipoEventoEnum.RESP, + EsitoEnum.RICEVUTA, //FIXME RICEVUTA o RICEVUTA_KO + erogatore, erogatoreDescr, + NODO_DEI_PAGAMENTI_SP, NODO_DEI_PAGAMENTI_SP, + httpMethod, httpUri, httpHeaders, null, compressedPayload, compressedPayloadPayloadLength, + CallTypeEnum.CLIENT); + + target.httpStatusCode(status); + target.executionTimeMs(Long.parseLong(executionTime)); + + return target.build(); + } + + + private static String formatClientHeaders(HttpHeaders headers) { + headers.forEach((s,h)->{ + headers.add(s, StringUtils.join(h,",")); + }); + + return formatHeaders(headers); + } + + private static String formatServerRequestHeaders(HttpServletRequest request) { + HttpHeaders headers = new HttpHeaders(); + Enumeration headerNamesEnum = request.getHeaderNames(); + while (headerNamesEnum.hasMoreElements()) { + String headerName = headerNamesEnum.nextElement(); + Iterator iterator = request.getHeaders(headerName).asIterator(); + while (iterator.hasNext()) { + headers.add(headerName, iterator.next()); + } + } + + return formatHeaders(headers); + } + + private static String formatServerResponseHeaders(HttpServletResponse response) { + HttpHeaders headers = new HttpHeaders(); + for(String headerName : response.getHeaderNames()){ + headers.addAll(headerName, response.getHeaders(headerName).stream().toList()); + } + + return formatHeaders(headers); + } + + private static String formatHeaders(HttpHeaders headers) { + Stream stream = headers.entrySet().stream() + .map((entry) -> { + String values = entry.getValue().stream().collect(Collectors.joining("\", \"","\"","\"")); + return entry.getKey() + ": [" + values + "]"; + }); + return stream.collect(Collectors.joining(", ")); + } + + private static String getRequestMessagePayload(HttpServletRequest request) { + RepeatableContentCachingRequestWrapper wrapper = WebUtils.getNativeRequest(request, RepeatableContentCachingRequestWrapper.class); + if (wrapper != null) { + try { + byte[] buf = StreamUtils.copyToByteArray(wrapper.getInputStream()); + if (buf.length > 0) { + return safelyEncodePayload(buf, wrapper); + } else { + return null; + } + } catch (IOException e) { + log.error("Error 'unknown-read'", e); + return "[unknown-read]"; + } + } + return null; + } + + private static String safelyEncodePayload(byte[] buf, RepeatableContentCachingRequestWrapper wrapper) { + try { + return new String(buf, wrapper.getCharacterEncoding()); + } catch (UnsupportedEncodingException e) { + log.error("Error 'unknown-encoding'", e); + return "[unknown-encoding]"; + } + } + + private static String getResponseMessagePayload(HttpServletResponse response) { + ContentCachingResponseWrapper wrapper = WebUtils.getNativeResponse(response, ContentCachingResponseWrapper.class); + if (wrapper != null) { + byte[] buf = wrapper.getContentAsByteArray(); + if (buf.length > 0) { + try { + return new String(buf, wrapper.getCharacterEncoding()); + } catch (UnsupportedEncodingException ex) { + log.error("Error 'unknown'", ex); + return "[unknown]"; + } + } + } + return null; + } + + private static String bodyToString(InputStream body) throws IOException { + StringBuilder builder = new StringBuilder(); + BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(body, StandardCharsets.UTF_8)); + String line = bufferedReader.readLine(); + while (line != null) { + builder.append(line).append(System.lineSeparator()); + line = bufferedReader.readLine(); + } + bufferedReader.close(); + return builder.toString(); + } +} diff --git a/src/main/java/it/gov/pagopa/wispconverter/util/TraceReEvent.java b/src/main/java/it/gov/pagopa/wispconverter/util/TraceReEvent.java new file mode 100644 index 00000000..999b7497 --- /dev/null +++ b/src/main/java/it/gov/pagopa/wispconverter/util/TraceReEvent.java @@ -0,0 +1,12 @@ +package it.gov.pagopa.wispconverter.util; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +@Retention(RetentionPolicy.RUNTIME) +@Target(ElementType.METHOD) +public @interface TraceReEvent { + public String businessProcess() default "not-configured"; +} diff --git a/src/main/java/it/gov/pagopa/wispconverter/util/ZipUtil.java b/src/main/java/it/gov/pagopa/wispconverter/util/ZipUtil.java index fab182cf..6aa12b4e 100644 --- a/src/main/java/it/gov/pagopa/wispconverter/util/ZipUtil.java +++ b/src/main/java/it/gov/pagopa/wispconverter/util/ZipUtil.java @@ -1,15 +1,28 @@ package it.gov.pagopa.wispconverter.util; import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; import java.io.IOException; import java.nio.charset.StandardCharsets; import java.util.Base64; import java.util.zip.GZIPInputStream; +import java.util.zip.GZIPOutputStream; public class ZipUtil { private ZipUtil(){} + public static byte[] zip(String str) throws IOException { + byte[] strBytes = str.getBytes(StandardCharsets.UTF_8); + ByteArrayOutputStream bais = new ByteArrayOutputStream(strBytes.length); + GZIPOutputStream gzipOut = new GZIPOutputStream(bais); + gzipOut.write(strBytes); + gzipOut.close(); + byte[] compressed = bais.toByteArray(); + bais.close(); + return compressed; + } + public static byte[] unzip(byte[] compressed) throws IOException { ByteArrayInputStream bais = new ByteArrayInputStream(compressed); GZIPInputStream gzipInputStream = new GZIPInputStream(bais); diff --git a/src/main/java/it/gov/pagopa/wispconverter/util/client/AbstractAppClientLoggingInterceptor.java b/src/main/java/it/gov/pagopa/wispconverter/util/client/AbstractAppClientLoggingInterceptor.java index 905018f4..14e773c3 100644 --- a/src/main/java/it/gov/pagopa/wispconverter/util/client/AbstractAppClientLoggingInterceptor.java +++ b/src/main/java/it/gov/pagopa/wispconverter/util/client/AbstractAppClientLoggingInterceptor.java @@ -1,9 +1,11 @@ package it.gov.pagopa.wispconverter.util.client; +import it.gov.pagopa.wispconverter.service.ReService; +import it.gov.pagopa.wispconverter.service.model.re.ReEventDto; import it.gov.pagopa.wispconverter.util.CommonUtility; import it.gov.pagopa.wispconverter.util.Constants; -import lombok.Getter; -import lombok.Setter; +import it.gov.pagopa.wispconverter.util.ReUtil; +import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.slf4j.MDC; import org.springframework.http.HttpHeaders; @@ -23,10 +25,38 @@ import java.util.stream.Collectors; import java.util.stream.Stream; -@Getter -@Setter + +@Slf4j public abstract class AbstractAppClientLoggingInterceptor implements ClientHttpRequestInterceptor { + private final ReService reService; + + public AbstractAppClientLoggingInterceptor(ClientLoggingProperties clientLoggingProperties, ReService reService) { + this.reService = reService; + + if(clientLoggingProperties!=null){ + ClientLoggingProperties.Request request = clientLoggingProperties.getRequest(); + if(request!=null){ + this.requestIncludeHeaders = request.isIncludeHeaders(); + this.requestIncludePayload = request.isIncludePayload(); + this.requestMaxPayloadLength = request.getMaxPayloadLength() != null ? request.getMaxPayloadLength() : REQUEST_DEFAULT_MAX_PAYLOAD_LENGTH; + this.requestHeaderPredicate = s -> !s.equals(request.getMaskHeaderName()); + this.requestPretty = request.isPretty(); + } + ClientLoggingProperties.Response response = clientLoggingProperties.getResponse(); + if(response!=null){ + this.responseIncludeHeaders = response.isIncludeHeaders(); + this.responseIncludePayload = response.isIncludePayload(); + this.responseMaxPayloadLength = response.getMaxPayloadLength() != null ? response.getMaxPayloadLength() : RESPONSE_DEFAULT_MAX_PAYLOAD_LENGTH; + this.responseHeaderPredicate = null; + this.responsePretty = response.isPretty(); + } + } + + } + +// protected abstract ReService getReService(); + public static final String REQUEST_DEFAULT_MESSAGE_PREFIX = "===> CLIENT Request OPERATION_ID=%s, CLIENT_OPERATION_ID=%s - "; public static final String RESPONSE_DEFAULT_MESSAGE_PREFIX = "<=== CLIENT Response OPERATION_ID=%s, CLIENT_OPERATION_ID=%s -"; private static final int REQUEST_DEFAULT_MAX_PAYLOAD_LENGTH = 50; @@ -36,13 +66,13 @@ public abstract class AbstractAppClientLoggingInterceptor implements ClientHttpR private static final String PRETTY_OUT = "\n===> *"; private static final String PRETTY_IN = "\n<=== *"; - private boolean requestIncludeHeaders = false; + private boolean requestIncludeHeaders; - private boolean responseIncludeHeaders = false; + private boolean responseIncludeHeaders; - private boolean requestIncludePayload = false; + private boolean requestIncludePayload; - private boolean responseIncludePayload = false; + private boolean responseIncludePayload; private Predicate requestHeaderPredicate; @@ -52,9 +82,9 @@ public abstract class AbstractAppClientLoggingInterceptor implements ClientHttpR private int responseMaxPayloadLength = RESPONSE_DEFAULT_MAX_PAYLOAD_LENGTH; - private boolean requestPretty = false; + private boolean requestPretty; - private boolean responsePretty = false; + private boolean responsePretty; @Override public ClientHttpResponse intercept(HttpRequest request, byte[] body, ClientHttpRequestExecution execution) throws IOException { @@ -63,14 +93,35 @@ public ClientHttpResponse intercept(HttpRequest request, byte[] body, ClientHttp String clientOperationId = UUID.randomUUID().toString(); MDC.put(Constants.MDC_CLIENT_OPERATION_ID, clientOperationId); String operationId = MDC.get(Constants.MDC_OPERATION_ID); - request(clientOperationId, operationId, request, body); + +// MDC.getCopyOfContextMap().forEach((k,v) -> { +// log.debug(String.format("CLIENT AFTER MDC %s=%s",k, v)); +// }); + log.debug("[intercept] add RE CLIENT OUT"); + ReEventDto reEventDtoClientIN = ReUtil.createReClientInterfaceRequest(request, body); + reService.addRe(reEventDtoClientIN); + + ClientHttpResponse response = execution.execute(request, body); String executionClientTime = CommonUtility.getExecutionTime(startClient); MDC.put(Constants.MDC_CLIENT_EXECUTION_TIME, executionClientTime); response(clientOperationId, operationId, executionClientTime, request, response); + +// MDC.getCopyOfContextMap().forEach((k,v) -> { +// log.debug(String.format("CLIENT BEFORE MDC %s=%s",k, v)); +// }); + + log.debug("[intercept] add RE CLIENT IN"); + ReEventDto reEventDtoClientOUT = ReUtil.createReClientInterfaceResponse(request, response); + reService.addRe(reEventDtoClientOUT); + + + MDC.remove(Constants.MDC_CLIENT_OPERATION_ID); + MDC.remove(Constants.MDC_CLIENT_EXECUTION_TIME); + return response; } @@ -78,40 +129,44 @@ public ClientHttpResponse intercept(HttpRequest request, byte[] body, ClientHttp public String createRequestMessage(String clientOperationId, String operationId, HttpRequest request, byte[] reqBody) { StringBuilder msg = new StringBuilder(); msg.append(String.format(REQUEST_DEFAULT_MESSAGE_PREFIX, operationId, clientOperationId)); - if(isRequestPretty()){ + if(this.requestPretty){ msg.append(PRETTY_OUT).append(SPACE); } msg.append("path: ").append(request.getMethod()).append(' '); msg.append(request.getURI()); - if (isRequestIncludeHeaders()) { + if (this.requestIncludeHeaders) { HttpHeaders headers = new HttpHeaders(); request.getHeaders().forEach((s,h)->{ headers.add(s, StringUtils.join(h,",")); }); - if (getRequestHeaderPredicate() != null) { + if (this.requestHeaderPredicate != null) { headers.forEach( (key, value) -> { - if (!getRequestHeaderPredicate().test(key)) { + if (!this.requestHeaderPredicate.test(key)) { headers.set(key, "masked"); } }); } String formatRequestHeaders = formatRequestHeaders(headers); if(formatRequestHeaders!=null){ - if(isRequestPretty()){ + if(this.requestPretty){ msg.append(PRETTY_OUT).append(SPACE); } else{ msg.append(", "); } - msg.append("headers: ").append(formatRequestHeaders); + msg.append("headers: [").append(formatRequestHeaders); + if(this.requestPretty){ + msg.append(PRETTY_OUT).append(SPACE); + } + msg.append("]"); } } - if (isRequestIncludePayload()) { + if (this.requestIncludePayload) { String payload = new String(reqBody, StandardCharsets.UTF_8); if (payload != null) { - if(isRequestPretty()){ + if(this.requestPretty){ msg.append(PRETTY_OUT).append(SPACE); } else{ msg.append(", "); @@ -127,52 +182,56 @@ public String createResponseMessage(String clientOperationId, String operationId throws IOException { StringBuilder msg = new StringBuilder(); msg.append(String.format(RESPONSE_DEFAULT_MESSAGE_PREFIX, operationId, clientOperationId)); - if(isResponsePretty()){ + if(this.responsePretty){ msg.append(PRETTY_IN).append(SPACE); } msg.append("path: ").append(request.getMethod()).append(' '); msg.append(request.getURI()); - if(isResponsePretty()){ + if(this.responsePretty){ msg.append(PRETTY_IN).append(SPACE); } msg.append("status: ").append(response.getStatusCode().value()); - if(isResponsePretty()){ + if(this.responsePretty){ msg.append(PRETTY_IN).append(SPACE); } else{ msg.append(", "); } msg.append("client-execution-time: ").append(clientExecutionTime).append("ms"); - if (isResponseIncludeHeaders()) { + if (this.responseIncludeHeaders) { HttpHeaders headers = new HttpHeaders(); response.getHeaders().forEach((s,h)->{ headers.add(s, StringUtils.join(h,",")); }); - if (getResponseHeaderPredicate() != null) { + if (this.responseHeaderPredicate != null) { headers.forEach( (key, value) -> { - if (!getRequestHeaderPredicate().test(key)) { + if (!this.requestHeaderPredicate.test(key)) { headers.set(key, "masked"); } }); } String formatResponseHeaders = formatResponseHeaders(headers); if(formatResponseHeaders!=null){ - if(isRequestPretty()){ + if(this.requestPretty){ msg.append(PRETTY_IN).append(SPACE); } else{ msg.append(", "); } - msg.append("headers: ").append(formatResponseHeaders); + msg.append("headers: [").append(formatResponseHeaders); + if(this.requestPretty){ + msg.append(PRETTY_OUT).append(SPACE); + } + msg.append("]"); } } - if (isResponseIncludePayload()) { + if (this.responseIncludePayload) { String payload = bodyToString(response.getBody()); if (!payload.isBlank()) { - if(isRequestPretty()){ + if(this.requestPretty){ msg.append(PRETTY_IN).append(SPACE); } else{ msg.append(", "); @@ -193,7 +252,7 @@ public String createResponseMessage(String clientOperationId, String operationId private String formatRequestHeaders(MultiValueMap headers) { Stream stream = headers.entrySet().stream() .map((entry) -> { - if(isRequestPretty()){ + if(this.requestPretty){ String values = entry.getValue().stream().collect(Collectors.joining("\", \"","\"","\"")); return PRETTY_OUT +"*\t"+entry.getKey() + ": [" + values + "]"; } else { @@ -201,7 +260,7 @@ private String formatRequestHeaders(MultiValueMap headers) { return entry.getKey() + ": [" + values + "]"; } }); - if(isRequestPretty()){ + if(this.requestPretty){ return stream.collect(Collectors.joining("")); } else { return stream.collect(Collectors.joining(", ")); @@ -211,7 +270,7 @@ private String formatRequestHeaders(MultiValueMap headers) { private String formatResponseHeaders(MultiValueMap headers) { Stream stream = headers.entrySet().stream() .map((entry) -> { - if(isResponsePretty()){ + if(this.responsePretty){ String values = entry.getValue().stream().collect(Collectors.joining("\", \"","\"","\"")); return PRETTY_IN +"*\t"+entry.getKey().toLowerCase() + ": [" + values + "]"; } else { @@ -219,7 +278,7 @@ private String formatResponseHeaders(MultiValueMap headers) { return entry.getKey().toLowerCase() + ": [" + values + "]"; } }); - if(isRequestPretty()){ + if(this.requestPretty){ return stream.collect(Collectors.joining("")); } else { return stream.collect(Collectors.joining(", ")); diff --git a/src/main/java/it/gov/pagopa/wispconverter/util/client/ClientLoggingProperties.java b/src/main/java/it/gov/pagopa/wispconverter/util/client/ClientLoggingProperties.java new file mode 100644 index 00000000..31fe2b0c --- /dev/null +++ b/src/main/java/it/gov/pagopa/wispconverter/util/client/ClientLoggingProperties.java @@ -0,0 +1,30 @@ +package it.gov.pagopa.wispconverter.util.client; + +import lombok.Data; + +@Data +public class ClientLoggingProperties { + + + private Request request = new Request(); + private Response response = new Response(); + + @Data + public static class Request { + private String maskHeaderName; + private boolean includeHeaders; + private boolean includePayload; + private Integer maxPayloadLength; + private boolean pretty; + } + + @Data + public static class Response { + private boolean includeHeaders; + private boolean includePayload; + private Integer maxPayloadLength; + private boolean pretty; + } + + +} diff --git a/src/main/java/it/gov/pagopa/wispconverter/util/client/MDCInterceptor.java b/src/main/java/it/gov/pagopa/wispconverter/util/client/MDCInterceptor.java deleted file mode 100644 index ca29dfad..00000000 --- a/src/main/java/it/gov/pagopa/wispconverter/util/client/MDCInterceptor.java +++ /dev/null @@ -1,30 +0,0 @@ -package it.gov.pagopa.wispconverter.util.client; - -import it.gov.pagopa.wispconverter.util.Constants; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.slf4j.MDC; -import org.springframework.http.HttpRequest; -import org.springframework.http.client.ClientHttpRequestExecution; -import org.springframework.http.client.ClientHttpRequestInterceptor; -import org.springframework.http.client.ClientHttpResponse; - -import java.io.IOException; -import java.util.UUID; - -@Slf4j -@RequiredArgsConstructor -public class MDCInterceptor implements ClientHttpRequestInterceptor { - - - @Override - public ClientHttpResponse intercept(HttpRequest request, byte[] body, ClientHttpRequestExecution execution) throws IOException { - - ClientHttpResponse response = execution.execute(request, body); - - MDC.remove(Constants.MDC_CLIENT_OPERATION_ID); - MDC.remove(Constants.MDC_CLIENT_EXECUTION_TIME); - - return response; - } -} diff --git a/src/main/java/it/gov/pagopa/wispconverter/util/client/ReInterceptor.java b/src/main/java/it/gov/pagopa/wispconverter/util/client/ReInterceptor.java deleted file mode 100644 index 862ae100..00000000 --- a/src/main/java/it/gov/pagopa/wispconverter/util/client/ReInterceptor.java +++ /dev/null @@ -1,37 +0,0 @@ -package it.gov.pagopa.wispconverter.util.client; - -import it.gov.pagopa.wispconverter.service.ReService; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.slf4j.MDC; -import org.springframework.http.HttpRequest; -import org.springframework.http.client.ClientHttpRequestExecution; -import org.springframework.http.client.ClientHttpRequestInterceptor; -import org.springframework.http.client.ClientHttpResponse; - -import java.io.IOException; - -@Slf4j -@RequiredArgsConstructor -public class ReInterceptor implements ClientHttpRequestInterceptor { - - - private final ReService reService; - - @Override - public ClientHttpResponse intercept(HttpRequest request, byte[] body, ClientHttpRequestExecution execution) throws IOException { - - MDC.getCopyOfContextMap().forEach((k, v) -> { - log.debug(String.format("BEFORE MDC %s=%s",k, v)); - }); - reService.addRe("CLIENT IN"); - ClientHttpResponse response = execution.execute(request, body); - - MDC.getCopyOfContextMap().forEach((k,v) -> { - log.debug(String.format("AFTER MDC %s=%s",k, v)); - }); - reService.addRe("CLIENT OUT"); - - return response; - } -} diff --git a/src/main/java/it/gov/pagopa/wispconverter/util/client/ServerLoggingProperties.java b/src/main/java/it/gov/pagopa/wispconverter/util/client/ServerLoggingProperties.java new file mode 100644 index 00000000..434405e4 --- /dev/null +++ b/src/main/java/it/gov/pagopa/wispconverter/util/client/ServerLoggingProperties.java @@ -0,0 +1,30 @@ +package it.gov.pagopa.wispconverter.util.client; + +import lombok.Data; + +@Data +public class ServerLoggingProperties { + + + private Request request = new Request(); + private Response response = new Response(); + + @Data + public static class Request { + private String maskHeaderName; + private boolean includeHeaders; + private boolean includePayload; + private Integer maxPayloadLength; + private boolean pretty; + } + + @Data + public static class Response { + private boolean includeHeaders; + private boolean includePayload; + private Integer maxPayloadLength; + private boolean pretty; + } + + +} diff --git a/src/main/java/it/gov/pagopa/wispconverter/util/client/apiconfigcache/ApiConfigCacheClientLoggingInterceptor.java b/src/main/java/it/gov/pagopa/wispconverter/util/client/apiconfigcache/ApiConfigCacheClientLoggingInterceptor.java index 56bcc3bc..54154881 100644 --- a/src/main/java/it/gov/pagopa/wispconverter/util/client/apiconfigcache/ApiConfigCacheClientLoggingInterceptor.java +++ b/src/main/java/it/gov/pagopa/wispconverter/util/client/apiconfigcache/ApiConfigCacheClientLoggingInterceptor.java @@ -1,16 +1,19 @@ package it.gov.pagopa.wispconverter.util.client.apiconfigcache; +import it.gov.pagopa.wispconverter.service.ReService; import it.gov.pagopa.wispconverter.util.client.AbstractAppClientLoggingInterceptor; -import lombok.RequiredArgsConstructor; +import it.gov.pagopa.wispconverter.util.client.ClientLoggingProperties; import lombok.SneakyThrows; import lombok.extern.slf4j.Slf4j; import org.springframework.http.HttpRequest; import org.springframework.http.client.ClientHttpResponse; @Slf4j -@RequiredArgsConstructor public class ApiConfigCacheClientLoggingInterceptor extends AbstractAppClientLoggingInterceptor { + public ApiConfigCacheClientLoggingInterceptor(ClientLoggingProperties clientLoggingProperties, ReService reService){ + super(clientLoggingProperties, reService); + } @Override protected void request(String clientOperationId, String operationId, HttpRequest request, byte[] reqBody) { diff --git a/src/main/java/it/gov/pagopa/wispconverter/util/client/checkout/CheckoutClientLoggingInterceptor.java b/src/main/java/it/gov/pagopa/wispconverter/util/client/checkout/CheckoutClientLoggingInterceptor.java index 08c1ded2..51a8b328 100644 --- a/src/main/java/it/gov/pagopa/wispconverter/util/client/checkout/CheckoutClientLoggingInterceptor.java +++ b/src/main/java/it/gov/pagopa/wispconverter/util/client/checkout/CheckoutClientLoggingInterceptor.java @@ -1,17 +1,19 @@ package it.gov.pagopa.wispconverter.util.client.checkout; +import it.gov.pagopa.wispconverter.service.ReService; import it.gov.pagopa.wispconverter.util.client.AbstractAppClientLoggingInterceptor; -import lombok.RequiredArgsConstructor; +import it.gov.pagopa.wispconverter.util.client.ClientLoggingProperties; import lombok.SneakyThrows; import lombok.extern.slf4j.Slf4j; import org.springframework.http.HttpRequest; import org.springframework.http.client.ClientHttpResponse; @Slf4j -@RequiredArgsConstructor public class CheckoutClientLoggingInterceptor extends AbstractAppClientLoggingInterceptor { - + public CheckoutClientLoggingInterceptor(ClientLoggingProperties clientLoggingProperties, ReService reService){ + super(clientLoggingProperties, reService); + } @Override protected void request(String clientOperationId, String operationId, HttpRequest request, byte[] reqBody) { if(log.isDebugEnabled()){ diff --git a/src/main/java/it/gov/pagopa/wispconverter/util/client/decouplercaching/DecouplerCachingClientLoggingInterceptor.java b/src/main/java/it/gov/pagopa/wispconverter/util/client/decouplercaching/DecouplerCachingClientLoggingInterceptor.java index b094abcb..cc957ca2 100644 --- a/src/main/java/it/gov/pagopa/wispconverter/util/client/decouplercaching/DecouplerCachingClientLoggingInterceptor.java +++ b/src/main/java/it/gov/pagopa/wispconverter/util/client/decouplercaching/DecouplerCachingClientLoggingInterceptor.java @@ -1,16 +1,18 @@ package it.gov.pagopa.wispconverter.util.client.decouplercaching; +import it.gov.pagopa.wispconverter.service.ReService; import it.gov.pagopa.wispconverter.util.client.AbstractAppClientLoggingInterceptor; -import lombok.RequiredArgsConstructor; +import it.gov.pagopa.wispconverter.util.client.ClientLoggingProperties; import lombok.SneakyThrows; import lombok.extern.slf4j.Slf4j; import org.springframework.http.HttpRequest; import org.springframework.http.client.ClientHttpResponse; @Slf4j -@RequiredArgsConstructor public class DecouplerCachingClientLoggingInterceptor extends AbstractAppClientLoggingInterceptor { - + public DecouplerCachingClientLoggingInterceptor(ClientLoggingProperties clientLoggingProperties, ReService reService){ + super(clientLoggingProperties, reService); + } @Override protected void request(String clientOperationId, String operationId, HttpRequest request, byte[] reqBody) { diff --git a/src/main/java/it/gov/pagopa/wispconverter/util/client/gpd/GpdClientLoggingInterceptor.java b/src/main/java/it/gov/pagopa/wispconverter/util/client/gpd/GpdClientLoggingInterceptor.java index 2621c13f..a99ac322 100644 --- a/src/main/java/it/gov/pagopa/wispconverter/util/client/gpd/GpdClientLoggingInterceptor.java +++ b/src/main/java/it/gov/pagopa/wispconverter/util/client/gpd/GpdClientLoggingInterceptor.java @@ -1,16 +1,19 @@ package it.gov.pagopa.wispconverter.util.client.gpd; +import it.gov.pagopa.wispconverter.service.ReService; import it.gov.pagopa.wispconverter.util.client.AbstractAppClientLoggingInterceptor; -import lombok.RequiredArgsConstructor; +import it.gov.pagopa.wispconverter.util.client.ClientLoggingProperties; import lombok.SneakyThrows; import lombok.extern.slf4j.Slf4j; import org.springframework.http.HttpRequest; import org.springframework.http.client.ClientHttpResponse; @Slf4j -@RequiredArgsConstructor public class GpdClientLoggingInterceptor extends AbstractAppClientLoggingInterceptor { + public GpdClientLoggingInterceptor(ClientLoggingProperties clientLoggingProperties, ReService reService){ + super(clientLoggingProperties, reService); + } @Override protected void request(String clientOperationId, String operationId, HttpRequest request, byte[] reqBody) { diff --git a/src/main/java/it/gov/pagopa/wispconverter/util/client/iuvgenerator/IuvGeneratorClientLoggingInterceptor.java b/src/main/java/it/gov/pagopa/wispconverter/util/client/iuvgenerator/IuvGeneratorClientLoggingInterceptor.java index 2f429ce8..0122efdd 100644 --- a/src/main/java/it/gov/pagopa/wispconverter/util/client/iuvgenerator/IuvGeneratorClientLoggingInterceptor.java +++ b/src/main/java/it/gov/pagopa/wispconverter/util/client/iuvgenerator/IuvGeneratorClientLoggingInterceptor.java @@ -1,17 +1,19 @@ package it.gov.pagopa.wispconverter.util.client.iuvgenerator; +import it.gov.pagopa.wispconverter.service.ReService; import it.gov.pagopa.wispconverter.util.client.AbstractAppClientLoggingInterceptor; -import lombok.RequiredArgsConstructor; +import it.gov.pagopa.wispconverter.util.client.ClientLoggingProperties; import lombok.SneakyThrows; import lombok.extern.slf4j.Slf4j; import org.springframework.http.HttpRequest; import org.springframework.http.client.ClientHttpResponse; @Slf4j -@RequiredArgsConstructor public class IuvGeneratorClientLoggingInterceptor extends AbstractAppClientLoggingInterceptor { - + public IuvGeneratorClientLoggingInterceptor(ClientLoggingProperties clientLoggingProperties, ReService reService){ + super(clientLoggingProperties, reService); + } @Override protected void request(String clientOperationId, String operationId, HttpRequest request, byte[] reqBody) { if (log.isDebugEnabled()) { diff --git a/src/main/java/it/gov/pagopa/wispconverter/util/filter/AbstractAppServerLoggingFilter.java b/src/main/java/it/gov/pagopa/wispconverter/util/filter/AbstractAppServerLoggingFilter.java index 56e53666..4a75c9bb 100644 --- a/src/main/java/it/gov/pagopa/wispconverter/util/filter/AbstractAppServerLoggingFilter.java +++ b/src/main/java/it/gov/pagopa/wispconverter/util/filter/AbstractAppServerLoggingFilter.java @@ -1,347 +1,377 @@ -package it.gov.pagopa.wispconverter.util.filter; - -import it.gov.pagopa.wispconverter.util.Constants; -import jakarta.servlet.FilterChain; -import jakarta.servlet.ServletException; -import jakarta.servlet.http.HttpServletRequest; -import jakarta.servlet.http.HttpServletResponse; -import jakarta.servlet.http.HttpSession; -import lombok.Getter; -import lombok.Setter; -import lombok.extern.slf4j.Slf4j; -import org.slf4j.MDC; -import org.springframework.http.HttpHeaders; -import org.springframework.util.AntPathMatcher; -import org.springframework.util.MultiValueMap; -import org.springframework.util.StreamUtils; -import org.springframework.util.StringUtils; -import org.springframework.web.filter.OncePerRequestFilter; -import org.springframework.web.util.ContentCachingResponseWrapper; -import org.springframework.web.util.WebUtils; - -import java.io.IOException; -import java.io.UnsupportedEncodingException; -import java.util.Enumeration; -import java.util.Iterator; -import java.util.List; -import java.util.UUID; -import java.util.function.Predicate; -import java.util.stream.Collectors; -import java.util.stream.Stream; - -@Getter -@Setter -@Slf4j -public abstract class AbstractAppServerLoggingFilter extends OncePerRequestFilter { - - public static final String REQUEST_DEFAULT_MESSAGE_PREFIX = "=> SERVER Request OPERATION_ID=%s - "; - public static final String RESPONSE_DEFAULT_MESSAGE_PREFIX = "<= SERVER Response OPERATION_ID=%s - "; - private static final int REQUEST_DEFAULT_MAX_PAYLOAD_LENGTH = 50; - private static final int RESPONSE_DEFAULT_MAX_PAYLOAD_LENGTH = 50; - - private static final String SPACE = " "; - private static final String PRETTY_IN = "\n=> *"; - private static final String PRETTY_OUT = "\n<= *"; - - private boolean requestIncludeClientInfo = false; - - private boolean requestIncludeHeaders = false; - - private boolean responseIncludeHeaders = false; - - private boolean requestIncludePayload = false; - - private boolean responseIncludePayload = false; - - private Predicate requestHeaderPredicate; - - private Predicate responseHeaderPredicate; - - private int requestMaxPayloadLength = REQUEST_DEFAULT_MAX_PAYLOAD_LENGTH; - - private int responseMaxPayloadLength = RESPONSE_DEFAULT_MAX_PAYLOAD_LENGTH; - - private boolean requestPretty = false; - - private boolean responsePretty = false; - - private List excludeUrlPatterns; - - @Override - protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException { - try { - String operationId = UUID.randomUUID().toString(); - MDC.put(Constants.MDC_START_TIME, String.valueOf(System.currentTimeMillis())); - MDC.put(Constants.MDC_OPERATION_ID, operationId); - - request(operationId, request); - filterChain.doFilter(request, response); - } finally { - String operationId = MDC.get(Constants.MDC_OPERATION_ID); - String executionTime = MDC.get(Constants.MDC_EXECUTION_TIME); - MDC.put(Constants.MDC_EXECUTION_TIME, executionTime); - response(operationId, executionTime, request, response); - } - } - - @Override - protected boolean shouldNotFilter(HttpServletRequest request) { - AntPathMatcher pathMatcher = new AntPathMatcher(); - return excludeUrlPatterns - .stream() - .anyMatch(p -> pathMatcher.match(p, request.getServletPath())); - } - - private static String getExecutionTime(String startTime) { - if (startTime != null) { - long endTime = System.currentTimeMillis(); - long executionTime = endTime - Long.parseLong(startTime); - return String.valueOf(executionTime); - } - return "-"; - } - - - protected String createRequestMessage(String operationId, HttpServletRequest request) { - StringBuilder msg = new StringBuilder(); - msg.append(String.format(REQUEST_DEFAULT_MESSAGE_PREFIX, operationId)); - if(isRequestPretty()){ - msg.append(PRETTY_IN).append(SPACE); - } - msg.append("path: ").append(request.getMethod()).append(' '); - msg.append(request.getRequestURI()); - - String queryString = request.getQueryString(); - if (queryString != null) { - msg.append('?').append(queryString); - } - - if (isRequestIncludeClientInfo()) { - String client = request.getRemoteAddr(); - if (StringUtils.hasLength(client)) { - if(isRequestPretty()){ - msg.append(PRETTY_IN).append(SPACE); - } else{ - msg.append(", "); - } - msg.append("client: ").append(client); - } - HttpSession session = request.getSession(false); - if (session != null) { - if(isRequestPretty()){ - msg.append(PRETTY_IN).append(SPACE); - } else{ - msg.append(", "); - } - msg.append(", session: ").append(session.getId()); - } - String user = request.getRemoteUser(); - if (user != null) { - if(isRequestPretty()){ - msg.append(PRETTY_IN).append(SPACE); - } else{ - msg.append(", "); - } - msg.append(", user: ").append(user); - } - } - - if (isRequestIncludeHeaders()) { - HttpHeaders headers = new HttpHeaders(); - Enumeration headerNamesEnum = request.getHeaderNames(); - while (headerNamesEnum.hasMoreElements()) { - String headerName = headerNamesEnum.nextElement(); - if (getRequestHeaderPredicate() != null) { - if (!getRequestHeaderPredicate().test(headerName)) { - headers.add(headerName, "masked"); - } else { - Iterator iterator = request.getHeaders(headerName).asIterator(); - while (iterator.hasNext()) { - headers.add(headerName, iterator.next()); - } - } - } else { - Iterator iterator = request.getHeaders(headerName).asIterator(); - while (iterator.hasNext()) { - headers.add(headerName, iterator.next()); - } - } - } - String formatRequestHeaders = formatRequestHeaders(headers); - if(formatRequestHeaders!=null){ - if(isRequestPretty()){ - msg.append(PRETTY_IN).append(SPACE); - } else{ - msg.append(", "); - } - msg.append("headers: ").append(formatRequestHeaders); - } - } - - if (isRequestIncludePayload()) { - String payload = getRequestMessagePayload(request); - if (payload != null) { - if(isRequestPretty()){ - msg.append(PRETTY_IN).append(SPACE); - } else{ - msg.append(", "); - } - msg.append("payload: ").append(payload); - } - } - - return msg.toString(); - } - - protected String createResponseMessage(String id, String executionTime, HttpServletRequest request, HttpServletResponse response) { - StringBuilder msg = new StringBuilder(); - msg.append(String.format(RESPONSE_DEFAULT_MESSAGE_PREFIX, id)); - - if(isResponsePretty()){ - msg.append(PRETTY_OUT).append(SPACE); - } - msg.append("path: ").append(request.getMethod()).append(' '); - msg.append(request.getRequestURI()); - - String queryString = request.getQueryString(); - if (queryString != null) { - msg.append('?').append(queryString); - } - - if(isResponsePretty()){ - msg.append(PRETTY_OUT).append(SPACE); - } - msg.append("status: ").append(response.getStatus()); - if(isResponsePretty()){ - msg.append(PRETTY_OUT).append(SPACE); - } else{ - msg.append(", "); - } - msg.append("execution-time: ").append(executionTime).append("ms"); - - if (isResponseIncludeHeaders()) { - HttpHeaders headers = new HttpHeaders(); - for(String headerName : response.getHeaderNames()){ - if (getResponseHeaderPredicate() != null) { - if (!getResponseHeaderPredicate().test(headerName)) { - headers.add(headerName, "masked"); - } else { - headers.addAll(headerName, response.getHeaders(headerName).stream().toList()); - } - } else { - headers.addAll(headerName, response.getHeaders(headerName).stream().toList()); - } - } - String formatResponseHeaders = formatResponseHeaders(headers); - if(formatResponseHeaders!=null){ - if(isRequestPretty()){ - msg.append(PRETTY_OUT).append(SPACE); - } else{ - msg.append(", "); - } - msg.append("headers: ").append(formatResponseHeaders); - } - } - - if (isResponseIncludePayload()) { - String payload = getResponseMessagePayload(response); - if (payload != null) { - if(isRequestPretty()){ - msg.append(PRETTY_OUT).append(SPACE); - } else{ - msg.append(", "); - } - msg.append("payload: ").append(payload); - } - } - - return msg.toString(); - } - - - private String getRequestMessagePayload(HttpServletRequest request) { - RepeatableContentCachingRequestWrapper wrapper = WebUtils.getNativeRequest(request, RepeatableContentCachingRequestWrapper.class); - if (wrapper != null) { - try { - byte[] buf = StreamUtils.copyToByteArray(wrapper.getInputStream()); - if (buf.length > 0) { - return safelyEncodePayload(buf, wrapper); - } else { - return null; - } - } catch (IOException e) { - log.error("Error 'unknown-read'", e); - return "[unknown-read]"; - } - } - return null; - } - - private String safelyEncodePayload(byte[] buf, RepeatableContentCachingRequestWrapper wrapper) { - int length = Math.min(buf.length, getRequestMaxPayloadLength()); - try { - return new String(buf, 0, length, wrapper.getCharacterEncoding()); - } catch (UnsupportedEncodingException e) { - log.error("Error 'unknown-encoding'", e); - return "[unknown-encoding]"; - } - } - - - private String getResponseMessagePayload(HttpServletResponse response) { - ContentCachingResponseWrapper wrapper = WebUtils.getNativeResponse(response, ContentCachingResponseWrapper.class); - if (wrapper != null) { - byte[] buf = wrapper.getContentAsByteArray(); - if (buf.length > 0) { - int length = Math.min(buf.length, getResponseMaxPayloadLength()); - try { - return new String(buf, 0, length, wrapper.getCharacterEncoding()); - } catch (UnsupportedEncodingException ex) { - log.error("Error 'unknown'", ex); - return "[unknown]"; - } - } - } - return null; - } - - protected abstract void request(String operationId, HttpServletRequest request); - - protected abstract void response(String operationId, String executionTime, HttpServletRequest request, HttpServletResponse response); - - private String formatRequestHeaders(MultiValueMap headers) { - Stream stream = headers.entrySet().stream() - .map((entry) -> { - if(isRequestPretty()){ - String values = entry.getValue().stream().collect(Collectors.joining("\", \"","\"","\"")); - return PRETTY_IN +"*\t"+entry.getKey() + ": [" + values + "]"; - } else { - String values = entry.getValue().stream().collect(Collectors.joining("\", \"","\"","\"")); - return entry.getKey() + ": [" + values + "]"; - } - }); - if(isRequestPretty()){ - return stream.collect(Collectors.joining("")); - } else { - return stream.collect(Collectors.joining(", ")); - } - } - - private String formatResponseHeaders(MultiValueMap headers) { - Stream stream = headers.entrySet().stream() - .map((entry) -> { - if(isResponsePretty()){ - String values = entry.getValue().stream().collect(Collectors.joining("\", \"","\"","\"")); - return PRETTY_OUT +"*\t"+entry.getKey().toLowerCase() + ": [" + values + "]"; - } else { - String values = entry.getValue().stream().collect(Collectors.joining("\", \"","\"","\"")); - return entry.getKey().toLowerCase() + ": [" + values + "]"; - } - }); - if(isRequestPretty()){ - return stream.collect(Collectors.joining("")); - } else { - return stream.collect(Collectors.joining(", ")); - } - } -} +//package it.gov.pagopa.wispconverter.util.filter; +// +//import it.gov.pagopa.wispconverter.util.Constants; +//import it.gov.pagopa.wispconverter.util.client.ServerLoggingProperties; +//import jakarta.servlet.FilterChain; +//import jakarta.servlet.ServletException; +//import jakarta.servlet.http.HttpServletRequest; +//import jakarta.servlet.http.HttpServletResponse; +//import jakarta.servlet.http.HttpSession; +//import lombok.Setter; +//import lombok.extern.slf4j.Slf4j; +//import org.slf4j.MDC; +//import org.springframework.http.HttpHeaders; +//import org.springframework.util.AntPathMatcher; +//import org.springframework.util.MultiValueMap; +//import org.springframework.util.StreamUtils; +//import org.springframework.util.StringUtils; +//import org.springframework.web.filter.OncePerRequestFilter; +//import org.springframework.web.util.ContentCachingResponseWrapper; +//import org.springframework.web.util.WebUtils; +// +//import java.io.IOException; +//import java.io.UnsupportedEncodingException; +//import java.util.Enumeration; +//import java.util.Iterator; +//import java.util.List; +//import java.util.UUID; +//import java.util.function.Predicate; +//import java.util.stream.Collectors; +//import java.util.stream.Stream; +// +//@Slf4j +//public abstract class AbstractAppServerLoggingFilter extends OncePerRequestFilter { +// +// public AbstractAppServerLoggingFilter(ServerLoggingProperties serverLoggingProperties) { +// if(serverLoggingProperties!=null){ +// ServerLoggingProperties.Request request = serverLoggingProperties.getRequest(); +// if(request!=null){ +// this.requestIncludeHeaders = request.isIncludeHeaders(); +// this.requestIncludePayload = request.isIncludePayload(); +// this.requestMaxPayloadLength = request.getMaxPayloadLength() != null ? request.getMaxPayloadLength() : REQUEST_DEFAULT_MAX_PAYLOAD_LENGTH; +// this.requestHeaderPredicate = s -> !s.equals(request.getMaskHeaderName()); +// this.requestPretty = request.isPretty(); +// } +// ServerLoggingProperties.Response response = serverLoggingProperties.getResponse(); +// if(response!=null){ +// this.responseIncludeHeaders = response.isIncludeHeaders(); +// this.responseIncludePayload = response.isIncludePayload(); +// this.responseMaxPayloadLength = response.getMaxPayloadLength() != null ? response.getMaxPayloadLength() : RESPONSE_DEFAULT_MAX_PAYLOAD_LENGTH; +// this.responseHeaderPredicate = null; +// this.responsePretty = response.isPretty(); +// } +// } +// +// } +// +// +// public static final String REQUEST_DEFAULT_MESSAGE_PREFIX = "=> SERVER Request OPERATION_ID=%s - "; +// public static final String RESPONSE_DEFAULT_MESSAGE_PREFIX = "<= SERVER Response OPERATION_ID=%s - "; +// private static final int REQUEST_DEFAULT_MAX_PAYLOAD_LENGTH = 50; +// private static final int RESPONSE_DEFAULT_MAX_PAYLOAD_LENGTH = 50; +// +// private static final String SPACE = " "; +// private static final String PRETTY_IN = "\n=> *"; +// private static final String PRETTY_OUT = "\n<= *"; +// +// private boolean requestIncludeClientInfo = false; +// +// private boolean requestIncludeHeaders = false; +// +// private boolean responseIncludeHeaders = false; +// +// private boolean requestIncludePayload = false; +// +// private boolean responseIncludePayload = false; +// +// private Predicate requestHeaderPredicate; +// +// private Predicate responseHeaderPredicate; +// +// private int requestMaxPayloadLength = REQUEST_DEFAULT_MAX_PAYLOAD_LENGTH; +// +// private int responseMaxPayloadLength = RESPONSE_DEFAULT_MAX_PAYLOAD_LENGTH; +// +// private boolean requestPretty = false; +// +// private boolean responsePretty = false; +// +// @Setter +// private List excludeUrlPatterns; +// +// @Override +// protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException { +// try { +// String operationId = UUID.randomUUID().toString(); +// MDC.put(Constants.MDC_START_TIME, String.valueOf(System.currentTimeMillis())); +// MDC.put(Constants.MDC_OPERATION_ID, operationId); +// +// request(operationId, request); +// filterChain.doFilter(request, response); +// } finally { +// String operationId = MDC.get(Constants.MDC_OPERATION_ID); +// String executionTime = MDC.get(Constants.MDC_EXECUTION_TIME); +// MDC.put(Constants.MDC_EXECUTION_TIME, executionTime); +// response(operationId, executionTime, request, response); +// } +// } +// +// @Override +// protected boolean shouldNotFilter(HttpServletRequest request) { +// AntPathMatcher pathMatcher = new AntPathMatcher(); +// return excludeUrlPatterns +// .stream() +// .anyMatch(p -> pathMatcher.match(p, request.getServletPath())); +// } +// +// private static String getExecutionTime(String startTime) { +// if (startTime != null) { +// long endTime = System.currentTimeMillis(); +// long executionTime = endTime - Long.parseLong(startTime); +// return String.valueOf(executionTime); +// } +// return "-"; +// } +// +// +// protected String createRequestMessage(String operationId, HttpServletRequest request) { +// StringBuilder msg = new StringBuilder(); +// msg.append(String.format(REQUEST_DEFAULT_MESSAGE_PREFIX, operationId)); +// if(this.requestPretty){ +// msg.append(PRETTY_IN).append(SPACE); +// } +// msg.append("path: ").append(request.getMethod()).append(' '); +// msg.append(request.getRequestURI()); +// +// String queryString = request.getQueryString(); +// if (queryString != null) { +// msg.append('?').append(queryString); +// } +// +// if (this.requestIncludeClientInfo) { +// String client = request.getRemoteAddr(); +// if (StringUtils.hasLength(client)) { +// if(this.requestPretty){ +// msg.append(PRETTY_IN).append(SPACE); +// } else{ +// msg.append(", "); +// } +// msg.append("client: ").append(client); +// } +// HttpSession session = request.getSession(false); +// if (session != null) { +// if(this.requestPretty){ +// msg.append(PRETTY_IN).append(SPACE); +// } else{ +// msg.append(", "); +// } +// msg.append(", session: ").append(session.getId()); +// } +// String user = request.getRemoteUser(); +// if (user != null) { +// if(this.requestPretty){ +// msg.append(PRETTY_IN).append(SPACE); +// } else{ +// msg.append(", "); +// } +// msg.append(", user: ").append(user); +// } +// } +// +// if (this.requestIncludeHeaders) { +// HttpHeaders headers = new HttpHeaders(); +// Enumeration headerNamesEnum = request.getHeaderNames(); +// while (headerNamesEnum.hasMoreElements()) { +// String headerName = headerNamesEnum.nextElement(); +// if (this.requestHeaderPredicate != null) { +// if (!this.requestHeaderPredicate.test(headerName)) { +// headers.add(headerName, "masked"); +// } else { +// Iterator iterator = request.getHeaders(headerName).asIterator(); +// while (iterator.hasNext()) { +// headers.add(headerName, iterator.next()); +// } +// } +// } else { +// Iterator iterator = request.getHeaders(headerName).asIterator(); +// while (iterator.hasNext()) { +// headers.add(headerName, iterator.next()); +// } +// } +// } +// String formatRequestHeaders = formatRequestHeaders(headers); +// if(formatRequestHeaders!=null){ +// if(this.requestPretty){ +// msg.append(PRETTY_IN).append(SPACE); +// } else{ +// msg.append(", "); +// } +// msg.append("headers: [").append(formatRequestHeaders); +// if(this.requestPretty){ +// msg.append(PRETTY_IN).append(SPACE); +// } +// msg.append("]"); +// } +// } +// +// if (this.requestIncludePayload) { +// String payload = getRequestMessagePayload(request); +// if (payload != null) { +// if(this.requestPretty){ +// msg.append(PRETTY_IN).append(SPACE); +// } else{ +// msg.append(", "); +// } +// msg.append("payload: ").append(payload); +// } +// } +// +// return msg.toString(); +// } +// +// protected String createResponseMessage(String id, String executionTime, HttpServletRequest request, HttpServletResponse response) { +// StringBuilder msg = new StringBuilder(); +// msg.append(String.format(RESPONSE_DEFAULT_MESSAGE_PREFIX, id)); +// +// if(this.responsePretty){ +// msg.append(PRETTY_OUT).append(SPACE); +// } +// msg.append("path: ").append(request.getMethod()).append(' '); +// msg.append(request.getRequestURI()); +// +// String queryString = request.getQueryString(); +// if (queryString != null) { +// msg.append('?').append(queryString); +// } +// +// if(this.responsePretty){ +// msg.append(PRETTY_OUT).append(SPACE); +// } +// msg.append("status: ").append(response.getStatus()); +// if(this.responsePretty){ +// msg.append(PRETTY_OUT).append(SPACE); +// } else{ +// msg.append(", "); +// } +// msg.append("execution-time: ").append(executionTime).append("ms"); +// +// if (this.responseIncludeHeaders) { +// HttpHeaders headers = new HttpHeaders(); +// for(String headerName : response.getHeaderNames()){ +// if (this.responseHeaderPredicate != null) { +// if (!this.responseHeaderPredicate.test(headerName)) { +// headers.add(headerName, "masked"); +// } else { +// headers.addAll(headerName, response.getHeaders(headerName).stream().toList()); +// } +// } else { +// headers.addAll(headerName, response.getHeaders(headerName).stream().toList()); +// } +// } +// String formatResponseHeaders = formatResponseHeaders(headers); +// if(formatResponseHeaders!=null){ +// if(this.requestPretty){ +// msg.append(PRETTY_OUT).append(SPACE); +// } else{ +// msg.append(", "); +// } +// msg.append("headers: [").append(formatResponseHeaders); +// if(this.requestPretty){ +// msg.append(PRETTY_IN).append(SPACE); +// } +// msg.append("]"); +// } +// } +// +// if (this.responseIncludePayload) { +// String payload = getResponseMessagePayload(response); +// if (payload != null) { +// if(this.requestPretty){ +// msg.append(PRETTY_OUT).append(SPACE); +// } else{ +// msg.append(", "); +// } +// msg.append("payload: ").append(payload); +// } +// } +// +// return msg.toString(); +// } +// +// +// private String getRequestMessagePayload(HttpServletRequest request) { +// RepeatableContentCachingRequestWrapper wrapper = WebUtils.getNativeRequest(request, RepeatableContentCachingRequestWrapper.class); +// if (wrapper != null) { +// try { +// byte[] buf = StreamUtils.copyToByteArray(wrapper.getInputStream()); +// if (buf.length > 0) { +// return safelyEncodePayload(buf, wrapper); +// } else { +// return null; +// } +// } catch (IOException e) { +// log.error("Error 'unknown-read'", e); +// return "[unknown-read]"; +// } +// } +// return null; +// } +// +// private String safelyEncodePayload(byte[] buf, RepeatableContentCachingRequestWrapper wrapper) { +// int length = Math.min(buf.length, this.requestMaxPayloadLength); +// try { +// return new String(buf, 0, length, wrapper.getCharacterEncoding()); +// } catch (UnsupportedEncodingException e) { +// log.error("Error 'unknown-encoding'", e); +// return "[unknown-encoding]"; +// } +// } +// +// +// private String getResponseMessagePayload(HttpServletResponse response) { +// ContentCachingResponseWrapper wrapper = WebUtils.getNativeResponse(response, ContentCachingResponseWrapper.class); +// if (wrapper != null) { +// byte[] buf = wrapper.getContentAsByteArray(); +// if (buf.length > 0) { +// int length = Math.min(buf.length, this.responseMaxPayloadLength); +// try { +// return new String(buf, 0, length, wrapper.getCharacterEncoding()); +// } catch (UnsupportedEncodingException ex) { +// log.error("Error 'unknown'", ex); +// return "[unknown]"; +// } +// } +// } +// return null; +// } +// +// protected abstract void request(String operationId, HttpServletRequest request); +// +// protected abstract void response(String operationId, String executionTime, HttpServletRequest request, HttpServletResponse response); +// +// private String formatRequestHeaders(MultiValueMap headers) { +// Stream stream = headers.entrySet().stream() +// .map((entry) -> { +// if(this.requestPretty){ +// String values = entry.getValue().stream().collect(Collectors.joining("\", \"","\"","\"")); +// return PRETTY_IN +"*\t"+entry.getKey() + ": [" + values + "]"; +// } else { +// String values = entry.getValue().stream().collect(Collectors.joining("\", \"","\"","\"")); +// return entry.getKey() + ": [" + values + "]"; +// } +// }); +// if(this.requestPretty){ +// return stream.collect(Collectors.joining("")); +// } else { +// return stream.collect(Collectors.joining(", ")); +// } +// } +// +// private String formatResponseHeaders(MultiValueMap headers) { +// Stream stream = headers.entrySet().stream() +// .map((entry) -> { +// if(this.responsePretty){ +// String values = entry.getValue().stream().collect(Collectors.joining("\", \"","\"","\"")); +// return PRETTY_OUT +"*\t"+entry.getKey().toLowerCase() + ": [" + values + "]"; +// } else { +// String values = entry.getValue().stream().collect(Collectors.joining("\", \"","\"","\"")); +// return entry.getKey().toLowerCase() + ": [" + values + "]"; +// } +// }); +// if(this.requestPretty){ +// return stream.collect(Collectors.joining("")); +// } else { +// return stream.collect(Collectors.joining(", ")); +// } +// } +//} diff --git a/src/main/java/it/gov/pagopa/wispconverter/util/filter/AppServerLoggingFilterFilter.java b/src/main/java/it/gov/pagopa/wispconverter/util/filter/AppServerLoggingFilterFilter.java index 25fe03bf..3dfa2f9f 100644 --- a/src/main/java/it/gov/pagopa/wispconverter/util/filter/AppServerLoggingFilterFilter.java +++ b/src/main/java/it/gov/pagopa/wispconverter/util/filter/AppServerLoggingFilterFilter.java @@ -1,25 +1,28 @@ -package it.gov.pagopa.wispconverter.util.filter; - -import jakarta.servlet.http.HttpServletRequest; -import jakarta.servlet.http.HttpServletResponse; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; - -@RequiredArgsConstructor -@Slf4j -public class AppServerLoggingFilterFilter extends AbstractAppServerLoggingFilter { - - @Override - protected void request(String operationId, HttpServletRequest request) { - if(log.isDebugEnabled()){ - log.debug(createRequestMessage(operationId, request)); - } - } - - @Override - protected void response(String operationId, String executionTime, HttpServletRequest request, HttpServletResponse response) { - if(log.isDebugEnabled()){ - log.debug(createResponseMessage(operationId, executionTime, request, response)); - } - } -} +//package it.gov.pagopa.wispconverter.util.filter; +// +//import it.gov.pagopa.wispconverter.util.client.ServerLoggingProperties; +//import jakarta.servlet.http.HttpServletRequest; +//import jakarta.servlet.http.HttpServletResponse; +//import lombok.extern.slf4j.Slf4j; +// +//@Slf4j +//public class AppServerLoggingFilterFilter extends AbstractAppServerLoggingFilter { +// +// public AppServerLoggingFilterFilter(ServerLoggingProperties serverLoggingProperties){ +// super(serverLoggingProperties); +// } +// +// @Override +// protected void request(String operationId, HttpServletRequest request) { +// if(log.isDebugEnabled()){ +// log.debug(createRequestMessage(operationId, request)); +// } +// } +// +// @Override +// protected void response(String operationId, String executionTime, HttpServletRequest request, HttpServletResponse response) { +// if(log.isDebugEnabled()){ +// log.debug(createResponseMessage(operationId, executionTime, request, response)); +// } +// } +//} diff --git a/src/main/java/it/gov/pagopa/wispconverter/util/filter/ReFilter.java b/src/main/java/it/gov/pagopa/wispconverter/util/filter/ReFilter.java index 03083c4d..e4f96322 100644 --- a/src/main/java/it/gov/pagopa/wispconverter/util/filter/ReFilter.java +++ b/src/main/java/it/gov/pagopa/wispconverter/util/filter/ReFilter.java @@ -1,56 +1,56 @@ -package it.gov.pagopa.wispconverter.util.filter; - -import it.gov.pagopa.wispconverter.service.ReService; -import jakarta.servlet.FilterChain; -import jakarta.servlet.ServletException; -import jakarta.servlet.http.HttpServletRequest; -import jakarta.servlet.http.HttpServletResponse; -import lombok.Getter; -import lombok.RequiredArgsConstructor; -import lombok.Setter; -import lombok.extern.slf4j.Slf4j; -import org.slf4j.MDC; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.util.AntPathMatcher; -import org.springframework.web.filter.OncePerRequestFilter; - -import java.io.IOException; -import java.util.List; - - -@Slf4j -@RequiredArgsConstructor -@Getter -@Setter -public class ReFilter extends OncePerRequestFilter { - - private final ReService reService; - - @Value("${filter.exclude-url-patterns}") - private List excludeUrlPatterns; - - @Override - protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException { - try{ - MDC.getCopyOfContextMap().forEach((k,v) -> { - log.debug(String.format("BEFORE MDC %s=%s",k, v)); - }); - reService.addRe("IN"); - filterChain.doFilter(request, response); - } finally { - MDC.getCopyOfContextMap().forEach((k,v) -> { - log.debug(String.format("AFTER MDC %s=%s",k, v)); - }); - reService.addRe("OUT"); - } - } - - @Override - protected boolean shouldNotFilter(HttpServletRequest request) { - AntPathMatcher pathMatcher = new AntPathMatcher(); - return excludeUrlPatterns - .stream() - .anyMatch(p -> pathMatcher.match(p, request.getServletPath())); - } - -} +//package it.gov.pagopa.wispconverter.util.filter; +// +//import it.gov.pagopa.wispconverter.service.ReService; +//import it.gov.pagopa.wispconverter.service.model.re.ReEventDto; +//import it.gov.pagopa.wispconverter.util.ReUtil; +//import jakarta.servlet.FilterChain; +//import jakarta.servlet.ServletException; +//import jakarta.servlet.http.HttpServletRequest; +//import jakarta.servlet.http.HttpServletResponse; +//import lombok.RequiredArgsConstructor; +//import lombok.Setter; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.util.AntPathMatcher; +//import org.springframework.web.filter.OncePerRequestFilter; +// +//import java.io.IOException; +//import java.util.List; +// +// +//@Slf4j +//@RequiredArgsConstructor +//public class ReFilter extends OncePerRequestFilter { +// +// private final ReService reService; +// +// @Setter +// private List excludeUrlPatterns; +// +// @Override +// protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException { +// ReEventDto reEventDtoServerIN = ReUtil.createReServerInterfaceRequest(request); +// try{ +//// MDC.getCopyOfContextMap().forEach((k,v) -> { +//// log.debug(String.format("SERVER BEFORE MDC %s=%s",k, v)); +//// }); +// reService.addRe(reEventDtoServerIN); +// filterChain.doFilter(request, response); +// } finally { +//// MDC.getCopyOfContextMap().forEach((k,v) -> { +//// log.debug(String.format("SERVER AFTER MDC %s=%s",k, v)); +//// }); +// ReEventDto reEventDtoServerOUT = ReUtil.createReServerInterfaceResponse(request, response); +// reService.addRe(reEventDtoServerOUT); +// } +// +// } +// +// @Override +// protected boolean shouldNotFilter(HttpServletRequest request) { +// AntPathMatcher pathMatcher = new AntPathMatcher(); +// return excludeUrlPatterns +// .stream() +// .anyMatch(p -> pathMatcher.match(p, request.getServletPath())); +// } +// +//} diff --git a/src/main/java/it/gov/pagopa/wispconverter/util/filter/RepeatableContentCachingRequestWrapper.java b/src/main/java/it/gov/pagopa/wispconverter/util/filter/RepeatableContentCachingRequestWrapper.java index 7456ed58..668b6b6f 100644 --- a/src/main/java/it/gov/pagopa/wispconverter/util/filter/RepeatableContentCachingRequestWrapper.java +++ b/src/main/java/it/gov/pagopa/wispconverter/util/filter/RepeatableContentCachingRequestWrapper.java @@ -1,11 +1,11 @@ package it.gov.pagopa.wispconverter.util.filter; -import org.springframework.util.StreamUtils; -import org.springframework.web.util.ContentCachingRequestWrapper; - import jakarta.servlet.ReadListener; import jakarta.servlet.ServletInputStream; import jakarta.servlet.http.HttpServletRequest; +import org.springframework.util.StreamUtils; +import org.springframework.web.util.ContentCachingRequestWrapper; + import java.io.ByteArrayInputStream; import java.io.IOException; import java.io.InputStream; diff --git a/src/main/java/it/gov/pagopa/wispconverter/util/filter/RequestIdFilter.java b/src/main/java/it/gov/pagopa/wispconverter/util/filter/RequestIdFilter.java index dddb5292..a1fb0cae 100644 --- a/src/main/java/it/gov/pagopa/wispconverter/util/filter/RequestIdFilter.java +++ b/src/main/java/it/gov/pagopa/wispconverter/util/filter/RequestIdFilter.java @@ -5,7 +5,6 @@ import jakarta.servlet.ServletException; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; -import lombok.Getter; import lombok.Setter; import lombok.extern.slf4j.Slf4j; import org.slf4j.MDC; @@ -21,10 +20,9 @@ @Slf4j -@Getter -@Setter public class RequestIdFilter extends OncePerRequestFilter { + @Setter private List excludeUrlPatterns; @Override @@ -45,6 +43,8 @@ protected void doFilterInternal(HttpServletRequest request, HttpServletResponse ((HttpServletResponse) response).setHeader(HEADER_REQUEST_ID, requestId); filterChain.doFilter(request, response); + + MDC.clear(); } @Override diff --git a/src/main/java/it/gov/pagopa/wispconverter/util/filter/RequestResponseWrapperFilter.java b/src/main/java/it/gov/pagopa/wispconverter/util/filter/RequestResponseWrapperFilter.java index ccde668a..e9e83115 100644 --- a/src/main/java/it/gov/pagopa/wispconverter/util/filter/RequestResponseWrapperFilter.java +++ b/src/main/java/it/gov/pagopa/wispconverter/util/filter/RequestResponseWrapperFilter.java @@ -7,7 +7,6 @@ import jakarta.servlet.ServletException; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; -import lombok.Getter; import lombok.Setter; import lombok.extern.slf4j.Slf4j; import org.slf4j.MDC; @@ -19,10 +18,9 @@ import java.util.List; @Slf4j -@Getter -@Setter public class RequestResponseWrapperFilter extends OncePerRequestFilter { + @Setter private List excludeUrlPatterns; @Override diff --git a/src/main/java/it/gov/pagopa/wispconverter/util/interceptor/AbstractAppServerLoggingInterceptor.java b/src/main/java/it/gov/pagopa/wispconverter/util/interceptor/AbstractAppServerLoggingInterceptor.java new file mode 100644 index 00000000..2a7a7b0a --- /dev/null +++ b/src/main/java/it/gov/pagopa/wispconverter/util/interceptor/AbstractAppServerLoggingInterceptor.java @@ -0,0 +1,397 @@ +package it.gov.pagopa.wispconverter.util.interceptor; + +import it.gov.pagopa.wispconverter.util.Constants; +import it.gov.pagopa.wispconverter.util.client.ServerLoggingProperties; +import it.gov.pagopa.wispconverter.util.filter.RepeatableContentCachingRequestWrapper; +import jakarta.servlet.FilterChain; +import jakarta.servlet.ServletException; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.servlet.http.HttpSession; +import lombok.Setter; +import lombok.extern.slf4j.Slf4j; +import org.slf4j.MDC; +import org.springframework.http.HttpHeaders; +import org.springframework.util.AntPathMatcher; +import org.springframework.util.MultiValueMap; +import org.springframework.util.StreamUtils; +import org.springframework.util.StringUtils; +import org.springframework.web.filter.OncePerRequestFilter; +import org.springframework.web.servlet.HandlerInterceptor; +import org.springframework.web.util.ContentCachingResponseWrapper; +import org.springframework.web.util.WebUtils; + +import java.io.IOException; +import java.io.UnsupportedEncodingException; +import java.util.Enumeration; +import java.util.Iterator; +import java.util.List; +import java.util.UUID; +import java.util.function.Predicate; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +@Slf4j +public abstract class AbstractAppServerLoggingInterceptor implements HandlerInterceptor { + + public AbstractAppServerLoggingInterceptor(ServerLoggingProperties serverLoggingProperties) { + if(serverLoggingProperties!=null){ + ServerLoggingProperties.Request request = serverLoggingProperties.getRequest(); + if(request!=null){ + this.requestIncludeHeaders = request.isIncludeHeaders(); + this.requestIncludePayload = request.isIncludePayload(); + this.requestMaxPayloadLength = request.getMaxPayloadLength() != null ? request.getMaxPayloadLength() : REQUEST_DEFAULT_MAX_PAYLOAD_LENGTH; + this.requestHeaderPredicate = s -> !s.equals(request.getMaskHeaderName()); + this.requestPretty = request.isPretty(); + } + ServerLoggingProperties.Response response = serverLoggingProperties.getResponse(); + if(response!=null){ + this.responseIncludeHeaders = response.isIncludeHeaders(); + this.responseIncludePayload = response.isIncludePayload(); + this.responseMaxPayloadLength = response.getMaxPayloadLength() != null ? response.getMaxPayloadLength() : RESPONSE_DEFAULT_MAX_PAYLOAD_LENGTH; + this.responseHeaderPredicate = null; + this.responsePretty = response.isPretty(); + } + } + + } + + + public static final String REQUEST_DEFAULT_MESSAGE_PREFIX = "=> SERVER Request OPERATION_ID=%s - "; + public static final String RESPONSE_DEFAULT_MESSAGE_PREFIX = "<= SERVER Response OPERATION_ID=%s - "; + private static final int REQUEST_DEFAULT_MAX_PAYLOAD_LENGTH = 50; + private static final int RESPONSE_DEFAULT_MAX_PAYLOAD_LENGTH = 50; + + private static final String SPACE = " "; + private static final String PRETTY_IN = "\n=> *"; + private static final String PRETTY_OUT = "\n<= *"; + + private boolean requestIncludeClientInfo = false; + + private boolean requestIncludeHeaders = false; + + private boolean responseIncludeHeaders = false; + + private boolean requestIncludePayload = false; + + private boolean responseIncludePayload = false; + + private Predicate requestHeaderPredicate; + + private Predicate responseHeaderPredicate; + + private int requestMaxPayloadLength = REQUEST_DEFAULT_MAX_PAYLOAD_LENGTH; + + private int responseMaxPayloadLength = RESPONSE_DEFAULT_MAX_PAYLOAD_LENGTH; + + private boolean requestPretty = false; + + private boolean responsePretty = false; + + @Setter + private List excludeUrlPatterns; + + @Override + public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { + String operationId = UUID.randomUUID().toString(); + MDC.put(Constants.MDC_START_TIME, String.valueOf(System.currentTimeMillis())); + MDC.put(Constants.MDC_OPERATION_ID, operationId); + + request(operationId, request); + return true; + } + + @Override + public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { + String operationId = MDC.get(Constants.MDC_OPERATION_ID); + String executionTime = MDC.get(Constants.MDC_EXECUTION_TIME); + MDC.put(Constants.MDC_EXECUTION_TIME, executionTime); + response(operationId, executionTime, request, response); + } + +// @Override +// protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException { +// try { +// String operationId = UUID.randomUUID().toString(); +// MDC.put(Constants.MDC_START_TIME, String.valueOf(System.currentTimeMillis())); +// MDC.put(Constants.MDC_OPERATION_ID, operationId); +// +// request(operationId, request); +// filterChain.doFilter(request, response); +// } finally { +// String operationId = MDC.get(Constants.MDC_OPERATION_ID); +// String executionTime = MDC.get(Constants.MDC_EXECUTION_TIME); +// MDC.put(Constants.MDC_EXECUTION_TIME, executionTime); +// response(operationId, executionTime, request, response); +// } +// } +// +// @Override +// protected boolean shouldNotFilter(HttpServletRequest request) { +// AntPathMatcher pathMatcher = new AntPathMatcher(); +// return excludeUrlPatterns +// .stream() +// .anyMatch(p -> pathMatcher.match(p, request.getServletPath())); +// } + + private static String getExecutionTime(String startTime) { + if (startTime != null) { + long endTime = System.currentTimeMillis(); + long executionTime = endTime - Long.parseLong(startTime); + return String.valueOf(executionTime); + } + return "-"; + } + + + protected String createRequestMessage(String operationId, HttpServletRequest request) { + StringBuilder msg = new StringBuilder(); + msg.append(String.format(REQUEST_DEFAULT_MESSAGE_PREFIX, operationId)); + if(this.requestPretty){ + msg.append(PRETTY_IN).append(SPACE); + } + msg.append("path: ").append(request.getMethod()).append(' '); + msg.append(request.getRequestURI()); + + String queryString = request.getQueryString(); + if (queryString != null) { + msg.append('?').append(queryString); + } + + if (this.requestIncludeClientInfo) { + String client = request.getRemoteAddr(); + if (StringUtils.hasLength(client)) { + if(this.requestPretty){ + msg.append(PRETTY_IN).append(SPACE); + } else{ + msg.append(", "); + } + msg.append("client: ").append(client); + } + HttpSession session = request.getSession(false); + if (session != null) { + if(this.requestPretty){ + msg.append(PRETTY_IN).append(SPACE); + } else{ + msg.append(", "); + } + msg.append(", session: ").append(session.getId()); + } + String user = request.getRemoteUser(); + if (user != null) { + if(this.requestPretty){ + msg.append(PRETTY_IN).append(SPACE); + } else{ + msg.append(", "); + } + msg.append(", user: ").append(user); + } + } + + if (this.requestIncludeHeaders) { + HttpHeaders headers = new HttpHeaders(); + Enumeration headerNamesEnum = request.getHeaderNames(); + while (headerNamesEnum.hasMoreElements()) { + String headerName = headerNamesEnum.nextElement(); + if (this.requestHeaderPredicate != null) { + if (!this.requestHeaderPredicate.test(headerName)) { + headers.add(headerName, "masked"); + } else { + Iterator iterator = request.getHeaders(headerName).asIterator(); + while (iterator.hasNext()) { + headers.add(headerName, iterator.next()); + } + } + } else { + Iterator iterator = request.getHeaders(headerName).asIterator(); + while (iterator.hasNext()) { + headers.add(headerName, iterator.next()); + } + } + } + String formatRequestHeaders = formatRequestHeaders(headers); + if(formatRequestHeaders!=null){ + if(this.requestPretty){ + msg.append(PRETTY_IN).append(SPACE); + } else{ + msg.append(", "); + } + msg.append("headers: [").append(formatRequestHeaders); + if(this.requestPretty){ + msg.append(PRETTY_IN).append(SPACE); + } + msg.append("]"); + } + } + + if (this.requestIncludePayload) { + String payload = getRequestMessagePayload(request); + if (payload != null) { + if(this.requestPretty){ + msg.append(PRETTY_IN).append(SPACE); + } else{ + msg.append(", "); + } + msg.append("payload: ").append(payload); + } + } + + return msg.toString(); + } + + protected String createResponseMessage(String id, String executionTime, HttpServletRequest request, HttpServletResponse response) { + StringBuilder msg = new StringBuilder(); + msg.append(String.format(RESPONSE_DEFAULT_MESSAGE_PREFIX, id)); + + if(this.responsePretty){ + msg.append(PRETTY_OUT).append(SPACE); + } + msg.append("path: ").append(request.getMethod()).append(' '); + msg.append(request.getRequestURI()); + + String queryString = request.getQueryString(); + if (queryString != null) { + msg.append('?').append(queryString); + } + + if(this.responsePretty){ + msg.append(PRETTY_OUT).append(SPACE); + } + msg.append("status: ").append(response.getStatus()); + if(this.responsePretty){ + msg.append(PRETTY_OUT).append(SPACE); + } else{ + msg.append(", "); + } + msg.append("execution-time: ").append(executionTime).append("ms"); + + if (this.responseIncludeHeaders) { + HttpHeaders headers = new HttpHeaders(); + for(String headerName : response.getHeaderNames()){ + if (this.responseHeaderPredicate != null) { + if (!this.responseHeaderPredicate.test(headerName)) { + headers.add(headerName, "masked"); + } else { + headers.addAll(headerName, response.getHeaders(headerName).stream().toList()); + } + } else { + headers.addAll(headerName, response.getHeaders(headerName).stream().toList()); + } + } + String formatResponseHeaders = formatResponseHeaders(headers); + if(formatResponseHeaders!=null){ + if(this.requestPretty){ + msg.append(PRETTY_OUT).append(SPACE); + } else{ + msg.append(", "); + } + msg.append("headers: [").append(formatResponseHeaders); + if(this.requestPretty){ + msg.append(PRETTY_IN).append(SPACE); + } + msg.append("]"); + } + } + + if (this.responseIncludePayload) { + String payload = getResponseMessagePayload(response); + if (payload != null) { + if(this.requestPretty){ + msg.append(PRETTY_OUT).append(SPACE); + } else{ + msg.append(", "); + } + msg.append("payload: ").append(payload); + } + } + + return msg.toString(); + } + + + private String getRequestMessagePayload(HttpServletRequest request) { + RepeatableContentCachingRequestWrapper wrapper = WebUtils.getNativeRequest(request, RepeatableContentCachingRequestWrapper.class); + if (wrapper != null) { + try { + byte[] buf = StreamUtils.copyToByteArray(wrapper.getInputStream()); + if (buf.length > 0) { + return safelyEncodePayload(buf, wrapper); + } else { + return null; + } + } catch (IOException e) { + log.error("Error 'unknown-read'", e); + return "[unknown-read]"; + } + } + return null; + } + + private String safelyEncodePayload(byte[] buf, RepeatableContentCachingRequestWrapper wrapper) { + int length = Math.min(buf.length, this.requestMaxPayloadLength); + try { + return new String(buf, 0, length, wrapper.getCharacterEncoding()); + } catch (UnsupportedEncodingException e) { + log.error("Error 'unknown-encoding'", e); + return "[unknown-encoding]"; + } + } + + + private String getResponseMessagePayload(HttpServletResponse response) { + ContentCachingResponseWrapper wrapper = WebUtils.getNativeResponse(response, ContentCachingResponseWrapper.class); + if (wrapper != null) { + byte[] buf = wrapper.getContentAsByteArray(); + if (buf.length > 0) { + int length = Math.min(buf.length, this.responseMaxPayloadLength); + try { + return new String(buf, 0, length, wrapper.getCharacterEncoding()); + } catch (UnsupportedEncodingException ex) { + log.error("Error 'unknown'", ex); + return "[unknown]"; + } + } + } + return null; + } + + protected abstract void request(String operationId, HttpServletRequest request); + + protected abstract void response(String operationId, String executionTime, HttpServletRequest request, HttpServletResponse response); + + private String formatRequestHeaders(MultiValueMap headers) { + Stream stream = headers.entrySet().stream() + .map((entry) -> { + if(this.requestPretty){ + String values = entry.getValue().stream().collect(Collectors.joining("\", \"","\"","\"")); + return PRETTY_IN +"*\t"+entry.getKey() + ": [" + values + "]"; + } else { + String values = entry.getValue().stream().collect(Collectors.joining("\", \"","\"","\"")); + return entry.getKey() + ": [" + values + "]"; + } + }); + if(this.requestPretty){ + return stream.collect(Collectors.joining("")); + } else { + return stream.collect(Collectors.joining(", ")); + } + } + + private String formatResponseHeaders(MultiValueMap headers) { + Stream stream = headers.entrySet().stream() + .map((entry) -> { + if(this.responsePretty){ + String values = entry.getValue().stream().collect(Collectors.joining("\", \"","\"","\"")); + return PRETTY_OUT +"*\t"+entry.getKey().toLowerCase() + ": [" + values + "]"; + } else { + String values = entry.getValue().stream().collect(Collectors.joining("\", \"","\"","\"")); + return entry.getKey().toLowerCase() + ": [" + values + "]"; + } + }); + if(this.requestPretty){ + return stream.collect(Collectors.joining("")); + } else { + return stream.collect(Collectors.joining(", ")); + } + } +} diff --git a/src/main/java/it/gov/pagopa/wispconverter/util/interceptor/AppServerLoggingInterceptor.java b/src/main/java/it/gov/pagopa/wispconverter/util/interceptor/AppServerLoggingInterceptor.java new file mode 100644 index 00000000..da5c031e --- /dev/null +++ b/src/main/java/it/gov/pagopa/wispconverter/util/interceptor/AppServerLoggingInterceptor.java @@ -0,0 +1,28 @@ +package it.gov.pagopa.wispconverter.util.interceptor; + +import it.gov.pagopa.wispconverter.util.client.ServerLoggingProperties; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import lombok.extern.slf4j.Slf4j; + +@Slf4j +public class AppServerLoggingInterceptor extends AbstractAppServerLoggingInterceptor { + + public AppServerLoggingInterceptor(ServerLoggingProperties serverLoggingProperties){ + super(serverLoggingProperties); + } + + @Override + protected void request(String operationId, HttpServletRequest request) { + if(log.isDebugEnabled()){ + log.debug(createRequestMessage(operationId, request)); + } + } + + @Override + protected void response(String operationId, String executionTime, HttpServletRequest request, HttpServletResponse response) { + if(log.isDebugEnabled()){ + log.debug(createResponseMessage(operationId, executionTime, request, response)); + } + } +} diff --git a/src/main/java/it/gov/pagopa/wispconverter/util/interceptor/MDCEnrichInterceptor.java b/src/main/java/it/gov/pagopa/wispconverter/util/interceptor/MDCEnrichInterceptor.java new file mode 100644 index 00000000..6e484de1 --- /dev/null +++ b/src/main/java/it/gov/pagopa/wispconverter/util/interceptor/MDCEnrichInterceptor.java @@ -0,0 +1,25 @@ +package it.gov.pagopa.wispconverter.util.interceptor; + +import it.gov.pagopa.wispconverter.util.MDCUtil; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.method.HandlerMethod; +import org.springframework.web.servlet.HandlerInterceptor; + +@Slf4j +public class MDCEnrichInterceptor implements HandlerInterceptor { + + @Override + public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { + if(handler instanceof HandlerMethod) { + if (!MDCUtil.hasStatus()) { + log.debug("[afterCompletion] configure status"); + MDCUtil.setMDCCloseSuccessOperation(response.getStatus()); + } else { + log.debug("[afterCompletion] status already configured"); + } + } + } + +} diff --git a/src/main/java/it/gov/pagopa/wispconverter/util/interceptor/ReInterceptor.java b/src/main/java/it/gov/pagopa/wispconverter/util/interceptor/ReInterceptor.java new file mode 100644 index 00000000..bb791f2f --- /dev/null +++ b/src/main/java/it/gov/pagopa/wispconverter/util/interceptor/ReInterceptor.java @@ -0,0 +1,50 @@ +package it.gov.pagopa.wispconverter.util.interceptor; + +import it.gov.pagopa.wispconverter.service.ReService; +import it.gov.pagopa.wispconverter.service.model.re.ReEventDto; +import it.gov.pagopa.wispconverter.util.Constants; +import it.gov.pagopa.wispconverter.util.ReUtil; +import it.gov.pagopa.wispconverter.util.TraceReEvent; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.slf4j.MDC; +import org.springframework.web.method.HandlerMethod; +import org.springframework.web.servlet.HandlerInterceptor; + +@Slf4j +@RequiredArgsConstructor +public class ReInterceptor implements HandlerInterceptor { + + private final ReService reService; + @Override + public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { + if(handler instanceof HandlerMethod){ + TraceReEvent traceReEvent = ((HandlerMethod) handler).getMethod().getAnnotation(TraceReEvent.class); + if(traceReEvent!=null){ + String businessProcess = traceReEvent.businessProcess(); + MDC.put(Constants.MDC_BUSINESS_PROCESS, businessProcess); + log.debug("[preHandle] trace RE SERVER IN businessProcess = [{}]", businessProcess); + ReEventDto reEventDtoServerIN = ReUtil.createReServerInterfaceRequest(request); + reService.addRe(reEventDtoServerIN); + } + } + return true; + } + + @Override + public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { + if(handler instanceof HandlerMethod){ + TraceReEvent traceReEvent = ((HandlerMethod) handler).getMethod().getAnnotation(TraceReEvent.class); + if(traceReEvent!=null){ + String businessProcess = traceReEvent.businessProcess(); + log.debug("[afterCompletion] trace RE SERVER OUT businessProcess = [{}]", businessProcess); + ReEventDto reEventDtoServerOUT = ReUtil.createReServerInterfaceResponse(request, response); + reService.addRe(reEventDtoServerOUT); + } + } + } + + +} diff --git a/src/main/resources/application-local.properties b/src/main/resources/application-local.properties index 5b28306e..6a2584ed 100644 --- a/src/main/resources/application-local.properties +++ b/src/main/resources/application-local.properties @@ -1,5 +1,11 @@ -# Info info.properties.environment=local + # Logging logging.level.it.gov.pagopa=DEBUG +logging.level.it.gov.pagopa.wispconverter.util.interceptor.AppServerLoggingInterceptor=DEBUG +logging.level.it.gov.pagopa.wispconverter.util.client.apiconfigcache.ApiConfigCacheClientLoggingInterceptor=DEBUG +logging.level.it.gov.pagopa.wispconverter.util.client.checkout.CheckoutClientLoggingInterceptor=DEBUG +logging.level.it.gov.pagopa.wispconverter.util.client.decouplercaching.DecouplerCachingClientLoggingInterceptor=DEBUG +logging.level.it.gov.pagopa.wispconverter.util.client.gpd.GpdClientLoggingInterceptor=DEBUG +logging.level.it.gov.pagopa.wispconverter.util.client.iuvgenerator.IuvGeneratorClientLoggingInterceptor=DEBUG diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index 53d9b7e7..6cdae6e2 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -29,6 +29,13 @@ server.port=8080 # Logging logging.level.root=${DEFAULT_LOGGING_LEVEL:INFO} logging.level.it.gov.pagopa=${APP_LOGGING_LEVEL:INFO} +logging.level.it.gov.pagopa.wispconverter.util.interceptor.AppServerLoggingInterceptor=DEBUG +logging.level.it.gov.pagopa.wispconverter.util.client.apiconfigcache.ApiConfigCacheClientLoggingInterceptor=DEBUG +logging.level.it.gov.pagopa.wispconverter.util.client.checkout.CheckoutClientLoggingInterceptor=DEBUG +logging.level.it.gov.pagopa.wispconverter.util.client.decouplercaching.DecouplerCachingClientLoggingInterceptor=DEBUG +logging.level.it.gov.pagopa.wispconverter.util.client.gpd.GpdClientLoggingInterceptor=DEBUG +logging.level.it.gov.pagopa.wispconverter.util.client.iuvgenerator.IuvGeneratorClientLoggingInterceptor=DEBUG + otel.service.name=${OTEL_SERVICE_NAME:pagopa-wisp-converter} @@ -91,7 +98,7 @@ wisp-converter-cache.refresh.cron=${CACHE_REFRESH_CRON:-} ## Exclude url from filter -filter.exclude-url-patterns=/swagger-ui/**,/v3/api-docs/** +filter.exclude-url-patterns=/swagger-ui/**,/v3/api-docs/**,/actuator/** ## Server Logging filter @@ -113,7 +120,7 @@ log.client.checkout.request.max-payload-length=10000 log.client.checkout.response.include-headers=true log.client.checkout.response.include-payload=true log.client.checkout.response.max-payload-length=10000 -log.client.checkout.mask.header.name=${CLIENT_CHECKOUT_API_KEY_NAME:Ocp-Apim-Subscription-Key} +log.client.checkout.request.mask-header-name=${CLIENT_CHECKOUT_API_KEY_NAME:Ocp-Apim-Subscription-Key} log.client.checkout.request.pretty=true log.client.checkout.response.pretty=true @@ -125,7 +132,7 @@ log.client.decoupler-caching.request.max-payload-length=10000 log.client.decoupler-caching.response.include-headers=true log.client.decoupler-caching.response.include-payload=true log.client.decoupler-caching.response.max-payload-length=10000 -log.client.decoupler-caching.mask.header.name=${CLIENT_DECOUPLERCACHING_API_KEY_NAME:Ocp-Apim-Subscription-Key} +log.client.decoupler-caching.request.mask-header-name=${CLIENT_DECOUPLERCACHING_API_KEY_NAME:Ocp-Apim-Subscription-Key} log.client.decoupler-caching.request.pretty=true log.client.decoupler-caching.response.pretty=true @@ -137,7 +144,7 @@ log.client.iuvgenerator.request.max-payload-length=10000 log.client.iuvgenerator.response.include-headers=true log.client.iuvgenerator.response.include-payload=true log.client.iuvgenerator.response.max-payload-length=10000 -log.client.iuvgenerator.mask.header.name=${CLIENT_IUVGENERATOR_API_KEY_NAME:Ocp-Apim-Subscription-Key} +log.client.iuvgenerator.request.mask-header-name=${CLIENT_IUVGENERATOR_API_KEY_NAME:Ocp-Apim-Subscription-Key} log.client.iuvgenerator.request.pretty=true log.client.iuvgenerator.response.pretty=true @@ -149,7 +156,7 @@ log.client.gpd.request.max-payload-length=10000 log.client.gpd.response.include-headers=true log.client.gpd.response.include-payload=true log.client.gpd.response.max-payload-length=10000 -log.client.gpd.mask.header.name=${CLIENT_GPD_API_KEY_NAME:Ocp-Apim-Subscription-Key} +log.client.gpd.request.mask-header-name=${CLIENT_GPD_API_KEY_NAME:Ocp-Apim-Subscription-Key} log.client.gpd.request.pretty=true log.client.gpd.response.pretty=true @@ -161,6 +168,6 @@ log.client.cache.request.max-payload-length=10000 log.client.cache.response.include-headers=true log.client.cache.response.include-payload=true log.client.cache.response.max-payload-length=10000 -log.client.cache.mask.header.name=${CLIENT_CONFIG_API_KEY_NAME:Ocp-Apim-Subscription-Key} +log.client.cache.request.mask-header-name=${CLIENT_CONFIG_API_KEY_NAME:Ocp-Apim-Subscription-Key} log.client.cache.request.pretty=true log.client.cache.response.pretty=true diff --git a/src/main/resources/i18n/messages_it.properties b/src/main/resources/i18n/messages_it.properties index 6de8459e..3e42351c 100644 --- a/src/main/resources/i18n/messages_it.properties +++ b/src/main/resources/i18n/messages_it.properties @@ -1,5 +1,5 @@ error-code.ERROR.title=Errore del sistema -error-code.ERROR.detail=Si è verificato un errore imprevisto. Si prega di contattare l'assistenza +error-code.ERROR.detail=Si è verificato un errore imprevisto. Si prega di contattare l''assistenza error-code.GENERIC_ERROR.title=Errore generico flusso error-code.GENERIC_ERROR.detail=Si è verificato un errore durante il flusso di conversione. {0} @@ -8,7 +8,7 @@ error-code.PARSING_GENERIC_ERROR.title=Errore generico di parsing error-code.PARSING_GENERIC_ERROR.detail=Si è verificato un errore durante il parsing del payload. {0} error-code.PARSING_INVALID_HEADER.title=Errore di parsing per SOAP Header -error-code.PARSING_INVALID_HEADER.detail=Si è verificato un errore durante il parsing del payload. L'header SOAP nel payload non è corretto: {0} +error-code.PARSING_INVALID_HEADER.detail=Si è verificato un errore durante il parsing del payload. L''header SOAP nel payload non è corretto: {0} error-code.PARSING_INVALID_BODY.title=Errore di parsing per SOAP Body error-code.PARSING_INVALID_BODY.detail=Si è verificato un errore durante il parsing del payload. Il body SOAP nel payload non è corretto: {0} @@ -17,7 +17,7 @@ error-code.PARSING_INVALID_XML_NODES.title=Errore di parsing per XML error-code.PARSING_INVALID_XML_NODES.detail=Si è verificato un errore durante il parsing del payload. La lista dei nodi estratti dal documento XML deve contenere almeno un elemento. error-code.PARSING_INVALID_ZIPPED_PAYLOAD.title=Errore di estrazione ZIP -error-code.PARSING_INVALID_ZIPPED_PAYLOAD.detail=Si è verificato un errore durante il parsing del payload. Impossibile effettuare l'unzip del payload. +error-code.PARSING_INVALID_ZIPPED_PAYLOAD.detail=Si è verificato un errore durante il parsing del payload. Impossibile effettuare l''unzip del payload. error-code.PARSING_PRIMITIVE_NOT_VALID.title=Primitiva non valida error-code.PARSING_PRIMITIVE_NOT_VALID.detail=Si è verificato un errore durante il check della primitiva. La primitive [{0}] non è valida. @@ -29,7 +29,7 @@ error-code.CONFIGURATION_INVALID_STATION.title=Stazione non trovata error-code.CONFIGURATION_INVALID_STATION.detail=Si è verificato un errore durante la generazione del carrello per il servizio Checkout. La stazione con codice [{0}] non esiste. error-code.PERSISTENCE_RPT_NOT_FOUND.title=RPT non trovata -error-code.PERSISTENCE_RPT_NOT_FOUND.detail=Si è verificato un errore durante la ricerca dell'RPT. L'RPT con sessionId [{0}] not esiste. +error-code.PERSISTENCE_RPT_NOT_FOUND.detail=Si è verificato un errore durante la ricerca dell''RPT. L''RPT con sessionId [{0}] not esiste. error-code.PERSISTENCE_REQUESTID_CACHING_ERROR.title=Errore di caching RequestID error-code.PERSISTENCE_REQUESTID_CACHING_ERROR.detail=Si è verificato un errore durante il caching della RequestID. {0} @@ -53,7 +53,7 @@ error-code.CLIENT_CHECKOUT.title=Errore CheckoutClient error-code.CLIENT_CHECKOUT.detail=CheckoutClient - {0} error-code.CLIENT_CHECKOUT_NO_REDIRECT_LOCATION.title=Errore di redirect Checkout -error-code.CLIENT_CHECKOUT_NO_REDIRECT_LOCATION.detail=Si è verificato un errore durante la comunicazione con il servizio Checkout. Nessun header 'Location' trovato. +error-code.CLIENT_CHECKOUT_NO_REDIRECT_LOCATION.detail=Si è verificato un errore durante la comunicazione con il servizio Checkout. Nessun header ''Location'' trovato. error-code.CLIENT_CHECKOUT_INVALID_REDIRECT_LOCATION.title=Errore di redirect Checkout -error-code.CLIENT_CHECKOUT_INVALID_REDIRECT_LOCATION.detail=Si è verificato un errore durante la comunicazione con il servizio Checkout. E' stato trovato un header 'Location' vuoto. +error-code.CLIENT_CHECKOUT_INVALID_REDIRECT_LOCATION.detail=Si è verificato un errore durante la comunicazione con il servizio Checkout. E'' stato trovato un header ''Location'' vuoto. diff --git a/src/main/resources/logback-spring.xml b/src/main/resources/logback-spring.xml index 350794d2..a61c8853 100644 --- a/src/main/resources/logback-spring.xml +++ b/src/main/resources/logback-spring.xml @@ -2,7 +2,7 @@ - + @@ -10,7 +10,7 @@ - + diff --git a/src/main/resources/xsd/PagInf_RPT_RT_6_2_0.xsd b/src/main/resources/xsd/PagInf_RPT_RT_6_2_0.xsd index 4b078247..0c3dc910 100644 --- a/src/main/resources/xsd/PagInf_RPT_RT_6_2_0.xsd +++ b/src/main/resources/xsd/PagInf_RPT_RT_6_2_0.xsd @@ -1,5 +1,7 @@ - + Richiesta Pagamento Telematico (RPT) e Ricevuta Telematica (RT) XSD RPT/RT relativo al documento base "SPECIFICHE ATTUATIVE DEL NODO DEI PAGAMENTI-SPC versione 1.7" diff --git a/src/test/java/it/gov/pagopa/wispconverter/CarrelloTest.java b/src/test/java/it/gov/pagopa/wispconverter/CarrelloTest.java index 578f3c44..751c78a2 100644 --- a/src/test/java/it/gov/pagopa/wispconverter/CarrelloTest.java +++ b/src/test/java/it/gov/pagopa/wispconverter/CarrelloTest.java @@ -2,7 +2,9 @@ import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.ActiveProfiles; +@ActiveProfiles(profiles = "test") @SpringBootTest(classes = Application.class) @AutoConfigureMockMvc class CarrelloTest { diff --git a/src/test/java/it/gov/pagopa/wispconverter/HomeTest.java b/src/test/java/it/gov/pagopa/wispconverter/HomeTest.java index a0161578..6b5e1d59 100644 --- a/src/test/java/it/gov/pagopa/wispconverter/HomeTest.java +++ b/src/test/java/it/gov/pagopa/wispconverter/HomeTest.java @@ -12,12 +12,14 @@ import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.http.MediaType; +import org.springframework.test.context.ActiveProfiles; import org.springframework.test.web.servlet.MockMvc; import org.springframework.test.web.servlet.request.MockMvcRequestBuilders; import org.springframework.test.web.servlet.result.MockMvcResultMatchers; import static org.junit.jupiter.api.Assertions.*; +@ActiveProfiles(profiles = "test") @SpringBootTest(classes = Application.class) @AutoConfigureMockMvc class HomeTest { diff --git a/src/test/java/it/gov/pagopa/wispconverter/OpenApiGenerationTest.java b/src/test/java/it/gov/pagopa/wispconverter/OpenApiGenerationTest.java index 5c45fb87..aed06bb5 100644 --- a/src/test/java/it/gov/pagopa/wispconverter/OpenApiGenerationTest.java +++ b/src/test/java/it/gov/pagopa/wispconverter/OpenApiGenerationTest.java @@ -10,6 +10,7 @@ import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.http.MediaType; +import org.springframework.test.context.ActiveProfiles; import org.springframework.test.web.servlet.MockMvc; import org.springframework.test.web.servlet.request.MockMvcRequestBuilders; import org.springframework.test.web.servlet.result.MockMvcResultMatchers; @@ -21,6 +22,7 @@ import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertNotNull; +@ActiveProfiles(profiles = "test") @SpringBootTest(classes = Application.class) @AutoConfigureMockMvc class OpenApiGenerationTest { diff --git a/src/test/java/it/gov/pagopa/wispconverter/RptTest.java b/src/test/java/it/gov/pagopa/wispconverter/RptTest.java index 00c2c5cf..63a8e482 100644 --- a/src/test/java/it/gov/pagopa/wispconverter/RptTest.java +++ b/src/test/java/it/gov/pagopa/wispconverter/RptTest.java @@ -2,7 +2,9 @@ import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.ActiveProfiles; +@ActiveProfiles(profiles = "test") @SpringBootTest(classes = Application.class) @AutoConfigureMockMvc class RptTest { diff --git a/src/test/resources/application-test.properties b/src/test/resources/application-test.properties new file mode 100644 index 00000000..ae2b77ab --- /dev/null +++ b/src/test/resources/application-test.properties @@ -0,0 +1,11 @@ +info.properties.environment=test + + +# Logging +logging.level.it.gov.pagopa=DEBUG +logging.level.it.gov.pagopa.wispconverter.util.interceptor.AppServerLoggingInterceptor=DEBUG +logging.level.it.gov.pagopa.wispconverter.util.client.apiconfigcache.ApiConfigCacheClientLoggingInterceptor=DEBUG +logging.level.it.gov.pagopa.wispconverter.util.client.checkout.CheckoutClientLoggingInterceptor=DEBUG +logging.level.it.gov.pagopa.wispconverter.util.client.decouplercaching.DecouplerCachingClientLoggingInterceptor=DEBUG +logging.level.it.gov.pagopa.wispconverter.util.client.gpd.GpdClientLoggingInterceptor=DEBUG +logging.level.it.gov.pagopa.wispconverter.util.client.iuvgenerator.IuvGeneratorClientLoggingInterceptor=DEBUG diff --git a/src/test/resources/application.properties b/src/test/resources/application.properties deleted file mode 100644 index e27d5aa5..00000000 --- a/src/test/resources/application.properties +++ /dev/null @@ -1,165 +0,0 @@ -# Info -info.application.name=WISP Converter -info.application.artifactId=WISP Converter -info.application.version=@project.version@ -info.application.description=A service that permits to handle nodoInviaRPT and nodoInviaCarrelloRPT request from WISP, converting them in NMU payments. -info.properties.environment=test - -# Actuator -management.endpoints.web.exposure.include=health,info -management.endpoints.jmx.exposure.include=health,info -management.info.env.enabled=true -management.endpoint.health.probes.enabled=true -management.health.livenessState.enabled=true -management.health.readinessState.enabled=true - - -# Openapi -springdoc.writer-with-order-by-keys=true -springdoc.writer-with-default-pretty-printer=true -springdoc.model-and-view-allowed=true - - -# Server -server.servlet.context-path=/ -server.port=8080 - - -# Logging -logging.level.root=${DEFAULT_LOGGING_LEVEL:INFO} -logging.level.it.gov.pagopa=${APP_LOGGING_LEVEL:INFO} -otel.service.name=${OTEL_SERVICE_NAME:pagopa-wisp-converter} - - -# CORS configuration -cors.configuration=${CORS_CONFIGURATION:{"origins": ["*"], "methods": ["*"]}} - - -# Databases configuration -azure.cosmos.uri=nn -azure.cosmos.key=nn -azure.cosmos.populate-query-metrics=false -azure.cosmos.database=wispconverter -spring.redis.host=nn -spring.redis.port=6380 -spring.redis.password=nn - - -# GPD client configuration -client.gpd.read-timeout=${CLIENT_GPD_READ_TIMEOUT:5000} -client.gpd.connect-timeout=${CLIENT_GPD_READ_TIMEOUT:5000} -client.gpd.base-path=${CLIENT_GPD_HOST:none} -client.gpd.api-key=${CLIENT_GPD_SUBKEY:none} - - -# IUV generator client configuration -client.iuvgenerator.read-timeout=${CLIENT_IUVGENERATOR_READ_TIMEOUT:5000} -client.iuvgenerator.connect-timeout=${CLIENT_IUVGENERATOR_READ_TIMEOUT:5000} -client.iuvgenerator.base-path=${CLIENT_IUVGENERATOR_HOST:https://api.dev.platform.pagopa.it/shared/iuv-generator-service/v1} -client.iuvgenerator.api-key=${CLIENT_IUVGENERATOR_SUBKEY:none} - - -# Checkout generator client configuration -client.checkout.read-timeout=${CLIENT_CHECKOUT_READ_TIMEOUT:5000} -client.checkout.connect-timeout=${CLIENT_CHECKOUT_READ_TIMEOUT:5000} -client.checkout.base-path=${CLIENT_CHECKOUT_HOST:none} -client.checkout.api-key=${CLIENT_CHECKOUT_SUBKEY:none} - - -## Decoupler's APIM policy configuration -client.decoupler-caching.read-timeout=${CLIENT_DECOUPLERCACHING_READ_TIMEOUT:5000} -client.decoupler-caching.connect-timeout=${CLIENT_DECOUPLERCACHING_READ_TIMEOUT:5000} -client.decoupler-caching.base-path=${CLIENT_DECOUPLERCACHING_HOST:none} -client.decoupler-caching.api-key=${CLIENT_DECOUPLERCACHING_SUBKEY:none} - - -# Cache client configuration -client.cache.read-timeout=${CLIENT_CACHE_READ_TIMEOUT:5000} -client.cache.connect-timeout=${CLIENT_CACHE_READ_TIMEOUT:5000} -client.cache.base-path=${CLIENT_CACHE_HOST:none} -client.cache.api-key=${CLIENT_CACHE_SUBKEY:none} - - -# Application domain configuration -exception.error-code.uri=${ERROR_CODE_URI:https://pagopa.gov/error-code} -wisp-converter.aux-digit=3 -wisp-converter.segregation-code=48 -wisp-converter.cached-requestid-mapping.ttl.minutes=${CACHED_REQUESTID_MAPPING_TTL_MINUTES:1440} -wisp-converter.poste-italiane.abi-code=07601 -wisp-converter-cache.refresh.cron=${CACHE_REFRESH_CRON:-} - - -## Exclude url from filter -filter.exclude-url-patterns=/swagger-ui/**,/v3/api-docs/** - - -## Server Logging filter -log.server.request.include-headers=true -log.server.request.include-client-info=true -log.server.request.include-payload=true -log.server.request.max-payload-length=10000 -log.server.request.pretty=true -log.server.response.include-headers=true -log.server.response.include-payload=true -log.server.response.max-payload-length=10000 -log.server.response.pretty=true - - -## Client logging Checkout -log.client.checkout.request.include-headers=true -log.client.checkout.request.include-payload=true -log.client.checkout.request.max-payload-length=10000 -log.client.checkout.response.include-headers=true -log.client.checkout.response.include-payload=true -log.client.checkout.response.max-payload-length=10000 -log.client.checkout.mask.header.name=${CLIENT_CHECKOUT_API_KEY_NAME:Ocp-Apim-Subscription-Key} -log.client.checkout.request.pretty=true -log.client.checkout.response.pretty=true - - -## Client logging Decoupler Caching -log.client.decoupler-caching.request.include-headers=true -log.client.decoupler-caching.request.include-payload=true -log.client.decoupler-caching.request.max-payload-length=10000 -log.client.decoupler-caching.response.include-headers=true -log.client.decoupler-caching.response.include-payload=true -log.client.decoupler-caching.response.max-payload-length=10000 -log.client.decoupler-caching.mask.header.name=${CLIENT_DECOUPLERCACHING_API_KEY_NAME:Ocp-Apim-Subscription-Key} -log.client.decoupler-caching.request.pretty=true -log.client.decoupler-caching.response.pretty=true - - -## Client logging Iuv Generator -log.client.iuvgenerator.request.include-headers=true -log.client.iuvgenerator.request.include-payload=true -log.client.iuvgenerator.request.max-payload-length=10000 -log.client.iuvgenerator.response.include-headers=true -log.client.iuvgenerator.response.include-payload=true -log.client.iuvgenerator.response.max-payload-length=10000 -log.client.iuvgenerator.mask.header.name=${CLIENT_IUVGENERATOR_API_KEY_NAME:Ocp-Apim-Subscription-Key} -log.client.iuvgenerator.request.pretty=true -log.client.iuvgenerator.response.pretty=true - - -## Client logging Gpd -log.client.gpd.request.include-headers=true -log.client.gpd.request.include-payload=true -log.client.gpd.request.max-payload-length=10000 -log.client.gpd.response.include-headers=true -log.client.gpd.response.include-payload=true -log.client.gpd.response.max-payload-length=10000 -log.client.gpd.mask.header.name=${CLIENT_GPD_API_KEY_NAME:Ocp-Apim-Subscription-Key} -log.client.gpd.request.pretty=true -log.client.gpd.response.pretty=true - - -## Client logging APIConfig cache -log.client.cache.request.include-headers=true -log.client.cache.request.include-payload=true -log.client.cache.request.max-payload-length=10000 -log.client.cache.response.include-headers=true -log.client.cache.response.include-payload=true -log.client.cache.response.max-payload-length=10000 -log.client.cache.mask.header.name=${CLIENT_CONFIG_API_KEY_NAME:Ocp-Apim-Subscription-Key} -log.client.cache.request.pretty=true -log.client.cache.response.pretty=true diff --git a/src/test/resources/logback-spring.xml b/src/test/resources/logback-spring.xml deleted file mode 100644 index fc9d47df..00000000 --- a/src/test/resources/logback-spring.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - - - - %clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(%5p) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m %clr(%mdc){magenta}%n%wEx - - - - - - - -