diff --git a/backend/core/src/main/java/org/opencdmp/service/deposit/DepositClientImpl.java b/backend/core/src/main/java/org/opencdmp/service/deposit/DepositClientImpl.java index bb982580b..1c8f172a1 100644 --- a/backend/core/src/main/java/org/opencdmp/service/deposit/DepositClientImpl.java +++ b/backend/core/src/main/java/org/opencdmp/service/deposit/DepositClientImpl.java @@ -1,16 +1,11 @@ package org.opencdmp.service.deposit; +import gr.cite.tools.logging.LoggerService; import org.opencdmp.commonmodels.models.dmp.DmpModel; import org.opencdmp.depositbase.repository.DepositClient; import org.opencdmp.depositbase.repository.DepositConfiguration; -import gr.cite.tools.exception.MyApplicationException; -import gr.cite.tools.logging.LoggerService; -import gr.cite.tools.logging.MapLogEntry; import org.slf4j.LoggerFactory; import org.springframework.core.ParameterizedTypeReference; -import org.springframework.http.HttpHeaders; -import org.springframework.http.HttpStatusCode; -import org.springframework.http.MediaType; import org.springframework.web.reactive.function.client.WebClient; import reactor.core.publisher.Mono; @@ -26,21 +21,21 @@ public class DepositClientImpl implements DepositClient { @Override public String deposit(DmpModel dmpDepositModel, String repositoryAccessToken) throws Exception { - return depositClient.post().uri("", uriBuilder -> uriBuilder.queryParam("authToken", repositoryAccessToken).build()).bodyValue(dmpDepositModel).exchangeToMono(mono -> mono.statusCode().isError() ? mono.createException().flatMap(Mono::error) : mono.bodyToMono(String.class)).block(); + return this.depositClient.post().uri("", uriBuilder -> uriBuilder.queryParam("authToken", repositoryAccessToken).build()).bodyValue(dmpDepositModel).exchangeToMono(mono -> mono.statusCode().isError() ? mono.createException().flatMap(Mono::error) : mono.bodyToMono(String.class)).block(); } @Override public String authenticate(String code) { - return depositClient.get().uri("/authenticate/", uriBuilder -> uriBuilder.queryParam("authToken", code).build()).exchangeToMono(mono -> mono.statusCode().isError() ? mono.createException().flatMap(Mono::error) : mono.bodyToMono(String.class)).block(); + return this.depositClient.get().uri("/authenticate/", uriBuilder -> uriBuilder.queryParam("authToken", code).build()).exchangeToMono(mono -> mono.statusCode().isError() ? mono.createException().flatMap(Mono::error) : mono.bodyToMono(String.class)).block(); } @Override public DepositConfiguration getConfiguration() { - return depositClient.get().uri("/configuration").exchangeToMono(mono -> mono.statusCode().isError() ? mono.createException().flatMap(Mono::error) : mono.bodyToMono(new ParameterizedTypeReference() {})).block(); + return this.depositClient.get().uri("/configuration").exchangeToMono(mono -> mono.statusCode().isError() ? mono.createException().flatMap(Mono::error) : mono.bodyToMono(new ParameterizedTypeReference() {})).block(); } @Override public String getLogo() { - return depositClient.get().uri("/logo").exchangeToMono(mono -> mono.statusCode().isError() ? mono.createException().flatMap(Mono::error) : mono.bodyToMono(String.class)).block(); + return this.depositClient.get().uri("/logo").exchangeToMono(mono -> mono.statusCode().isError() ? mono.createException().flatMap(Mono::error) : mono.bodyToMono(String.class)).block(); } } diff --git a/backend/core/src/main/java/org/opencdmp/service/deposit/DepositServiceImpl.java b/backend/core/src/main/java/org/opencdmp/service/deposit/DepositServiceImpl.java index 5091bfaea..24fda730f 100644 --- a/backend/core/src/main/java/org/opencdmp/service/deposit/DepositServiceImpl.java +++ b/backend/core/src/main/java/org/opencdmp/service/deposit/DepositServiceImpl.java @@ -62,7 +62,9 @@ import org.springframework.context.MessageSource; import org.springframework.context.event.EventListener; import org.springframework.context.i18n.LocaleContextHolder; import org.springframework.stereotype.Service; +import org.springframework.web.reactive.function.client.ExchangeFilterFunction; import org.springframework.web.reactive.function.client.WebClient; +import reactor.core.publisher.Mono; import javax.crypto.BadPaddingException; import javax.crypto.IllegalBlockSizeException; @@ -150,7 +152,12 @@ public class DepositServiceImpl implements DepositService { if (source != null) { TokenExchangeModel tokenExchangeModel = new TokenExchangeModel("deposit:" + repositoryIdByTenant, source.getIssuerUrl(), source.getClientId(), source.getClientSecret(), source.getScope()); TokenExchangeFilterFunction apiKeyExchangeFilterFunction = new TokenExchangeFilterFunction(this.tokenExchangeCacheService, tokenExchangeModel); - WebClient webClient = WebClient.builder().baseUrl(source.getUrl() + "/api/deposit").filters(exchangeFilterFunctions -> exchangeFilterFunctions.add(apiKeyExchangeFilterFunction)).build(); + WebClient webClient = WebClient.builder().baseUrl(source.getUrl() + "/api/deposit") + .filters(exchangeFilterFunctions -> { + exchangeFilterFunctions.add(apiKeyExchangeFilterFunction); + exchangeFilterFunctions.add(logRequest()); + exchangeFilterFunctions.add(logResponse()); + }).build(); DepositClientImpl repository = new DepositClientImpl(webClient); this.clients.put(repositoryIdByTenant, repository); return repository; @@ -376,4 +383,26 @@ public class DepositServiceImpl implements DepositService { return depositClient.authenticate(model.getCode()); } + private static ExchangeFilterFunction logRequest() { + return ExchangeFilterFunction.ofRequestProcessor(clientRequest -> { + logger.debug("Request: {} {}", clientRequest.method(), clientRequest.url()); + return Mono.just(clientRequest); + }); + } + + private static ExchangeFilterFunction logResponse() { + return ExchangeFilterFunction.ofResponseProcessor(response -> { + if (response.statusCode().isError()) { + return response.mutate().build().bodyToMono(String.class) + .flatMap(body -> { + logger.error("Request: {} {}", response.request().getMethod(), response.request().getURI()); + logger.error("Response: {} {}", response.statusCode(), body); + return Mono.just(response); + }); + } + return Mono.just(response); + + }); + } + } diff --git a/backend/core/src/main/java/org/opencdmp/service/externalfetcher/ExternalFetcherServiceImpl.java b/backend/core/src/main/java/org/opencdmp/service/externalfetcher/ExternalFetcherServiceImpl.java index a3e8ec9ad..4238c195f 100644 --- a/backend/core/src/main/java/org/opencdmp/service/externalfetcher/ExternalFetcherServiceImpl.java +++ b/backend/core/src/main/java/org/opencdmp/service/externalfetcher/ExternalFetcherServiceImpl.java @@ -12,8 +12,8 @@ import org.opencdmp.commons.enums.ExternalFetcherSourceType; import org.opencdmp.commons.types.externalfetcher.StaticOptionEntity; import org.opencdmp.convention.ConventionService; import org.opencdmp.data.ReferenceEntity; -import org.opencdmp.model.reference.Reference; import org.opencdmp.model.reference.Field; +import org.opencdmp.model.reference.Reference; import org.opencdmp.service.externalfetcher.config.entities.*; import org.opencdmp.service.externalfetcher.criteria.ExternalReferenceCriteria; import org.opencdmp.service.externalfetcher.models.ExternalDataResult; @@ -28,7 +28,9 @@ import org.springframework.http.ResponseEntity; import org.springframework.http.client.reactive.ReactorClientHttpConnector; import org.springframework.http.codec.json.Jackson2JsonDecoder; import org.springframework.stereotype.Service; +import org.springframework.web.reactive.function.client.ExchangeFilterFunction; import org.springframework.web.reactive.function.client.WebClient; +import reactor.core.publisher.Mono; import reactor.netty.http.client.HttpClient; import java.util.*; @@ -51,10 +53,13 @@ public class ExternalFetcherServiceImpl implements ExternalFetcherService { private WebClient getWebClient() { if (this.webClient == null) { - this.webClient = WebClient.builder().codecs(clientCodecConfigurer -> { - clientCodecConfigurer.defaultCodecs().jackson2JsonDecoder(new Jackson2JsonDecoder(new ObjectMapper(), MediaType.APPLICATION_JSON)); - clientCodecConfigurer.defaultCodecs().maxInMemorySize(2 * ((int) Math.pow(1024, 3))); //GK: Why here??? - } + this.webClient = WebClient.builder().filters(exchangeFilterFunctions -> { + exchangeFilterFunctions.add(logRequest()); + exchangeFilterFunctions.add(logResponse()); + }).codecs(clientCodecConfigurer -> { + clientCodecConfigurer.defaultCodecs().jackson2JsonDecoder(new Jackson2JsonDecoder(new ObjectMapper(), MediaType.APPLICATION_JSON)); + clientCodecConfigurer.defaultCodecs().maxInMemorySize(2 * ((int) Math.pow(1024, 3))); //GK: Why here??? + } ).clientConnector(new ReactorClientHttpConnector(HttpClient.create().followRedirect(true))).build(); } return this.webClient; @@ -151,8 +156,9 @@ public class ExternalFetcherServiceImpl implements ExternalFetcherService { Map response = this.getWebClient().method(method).uri(authenticationConfiguration.getAuthUrl()) .contentType(MediaType.APPLICATION_JSON) .bodyValue(this.parseBodyString(authenticationConfiguration.getAuthRequestBody())) - .exchangeToMono(mono -> mono.bodyToMono(new ParameterizedTypeReference>() { - })).block(); + .exchangeToMono(mono -> mono.statusCode().isError() ? + mono.createException().flatMap(Mono::error) : mono.bodyToMono(new ParameterizedTypeReference>() {})) + .block(); if (response == null) throw new MyApplicationException("Authentication " + authenticationConfiguration.getAuthUrl() + " failed"); return authenticationConfiguration.getType() + " " + response.getOrDefault(authenticationConfiguration.getAuthTokenPath(), null); @@ -374,4 +380,26 @@ public class ExternalFetcherServiceImpl implements ExternalFetcherService { return finalBodyString; } + private static ExchangeFilterFunction logRequest() { + return ExchangeFilterFunction.ofRequestProcessor(clientRequest -> { + logger.debug("Request: {} {}", clientRequest.method(), clientRequest.url()); + return Mono.just(clientRequest); + }); + } + + private static ExchangeFilterFunction logResponse() { + return ExchangeFilterFunction.ofResponseProcessor(response -> { + if (response.statusCode().isError()) { + return response.mutate().build().bodyToMono(String.class) + .flatMap(body -> { + logger.error("Request: {} {}", response.request().getMethod(), response.request().getURI()); + logger.error("Response: {} {}", response.statusCode(), body); + return Mono.just(response); + }); + } + return Mono.just(response); + + }); + } + } diff --git a/backend/core/src/main/java/org/opencdmp/service/filetransformer/FileTransformerServiceImpl.java b/backend/core/src/main/java/org/opencdmp/service/filetransformer/FileTransformerServiceImpl.java index 548e7b739..2d678131d 100644 --- a/backend/core/src/main/java/org/opencdmp/service/filetransformer/FileTransformerServiceImpl.java +++ b/backend/core/src/main/java/org/opencdmp/service/filetransformer/FileTransformerServiceImpl.java @@ -108,6 +108,7 @@ public class FileTransformerServiceImpl implements FileTransformerService { FileTransformerRepository repository = new FileTransformerRepository(WebClient.builder().baseUrl(source.getUrl() + "/api/file-transformer").filters(exchangeFilterFunctions -> { exchangeFilterFunctions.add(tokenExchangeFilterFunction); exchangeFilterFunctions.add(logRequest()); + exchangeFilterFunctions.add(logResponse()); }).build()); this.clients.put(repositoryIdByTenant, repository); return repository; @@ -259,12 +260,27 @@ public class FileTransformerServiceImpl implements FileTransformerService { return result; } - // This method returns filter function which will log request data + + private static ExchangeFilterFunction logRequest() { return ExchangeFilterFunction.ofRequestProcessor(clientRequest -> { - logger.info("Request: {} {}", clientRequest.method(), clientRequest.url()); - clientRequest.headers().forEach((name, values) -> values.forEach(value -> logger.info("{}={}", name, value))); + logger.debug("Request: {} {}", clientRequest.method(), clientRequest.url()); return Mono.just(clientRequest); }); } + + private static ExchangeFilterFunction logResponse() { + return ExchangeFilterFunction.ofResponseProcessor(response -> { + if (response.statusCode().isError()) { + return response.mutate().build().bodyToMono(String.class) + .flatMap(body -> { + logger.error("Request: {} {}", response.request().getMethod(), response.request().getURI()); + logger.error("Response: {} {}", response.statusCode(), body); + return Mono.just(response); + }); + } + return Mono.just(response); + + }); + } }