NONRTRIC - improved logging

Signed-off-by: PatrikBuhr <patrik.buhr@est.tech>
Issue-ID: NONRTRIC-773
Change-Id: I5b263e1cf3a80e660bd7dcbf85880a401404be0f
diff --git a/src/main/java/org/oransc/ics/clients/AsyncRestClient.java b/src/main/java/org/oransc/ics/clients/AsyncRestClient.java
index 09b07b2..3edabf9 100644
--- a/src/main/java/org/oransc/ics/clients/AsyncRestClient.java
+++ b/src/main/java/org/oransc/ics/clients/AsyncRestClient.java
@@ -39,6 +39,7 @@
 import org.springframework.web.reactive.function.client.ExchangeStrategies;
 import org.springframework.web.reactive.function.client.WebClient;
 import org.springframework.web.reactive.function.client.WebClient.RequestHeadersSpec;
+import org.springframework.web.reactive.function.client.WebClientResponseException;
 
 import reactor.core.publisher.Mono;
 import reactor.netty.http.client.HttpClient;
@@ -138,7 +139,15 @@
             request.headers(h -> h.setBearerAuth(securityContext.getBearerAuthToken()));
         }
         return request.retrieve() //
-            .toEntity(String.class);
+            .toEntity(String.class) //
+            .doOnError(this::onError);
+    }
+
+    private void onError(Throwable t) {
+        if (t instanceof WebClientResponseException) {
+            WebClientResponseException e = (WebClientResponseException) t;
+            logger.debug("Response error: {}", e.getResponseBodyAsString());
+        }
     }
 
     private static Object createTraceTag() {
diff --git a/src/main/java/org/oransc/ics/controllers/ErrorResponse.java b/src/main/java/org/oransc/ics/controllers/ErrorResponse.java
index 25b0c16..ebad66a 100644
--- a/src/main/java/org/oransc/ics/controllers/ErrorResponse.java
+++ b/src/main/java/org/oransc/ics/controllers/ErrorResponse.java
@@ -26,7 +26,11 @@
 
 import io.swagger.v3.oas.annotations.media.Schema;
 
+import java.lang.invoke.MethodHandles;
+
 import org.oransc.ics.exceptions.ServiceException;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 import org.springframework.http.HttpHeaders;
 import org.springframework.http.HttpStatus;
 import org.springframework.http.MediaType;
@@ -35,6 +39,7 @@
 
 public class ErrorResponse {
     private static Gson gson = new GsonBuilder().create();
+    private static final Logger logger = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
 
     // Returned as body for all failed REST calls
     @Schema(
@@ -96,10 +101,11 @@
                 code = se.getHttpStatus();
             }
         }
-        return create(e.toString(), code);
+        return create(e.getMessage(), code);
     }
 
     public static ResponseEntity<Object> create(String str, HttpStatus code) {
+        logger.debug("Error response: {}, {}", code, str);
         ErrorInfo errorInfo = new ErrorInfo(str, code.value());
         String json = gson.toJson(errorInfo);
         HttpHeaders headers = new HttpHeaders();
diff --git a/src/main/java/org/oransc/ics/controllers/r1consumer/ConsumerController.java b/src/main/java/org/oransc/ics/controllers/r1consumer/ConsumerController.java
index c988595..2690974 100644
--- a/src/main/java/org/oransc/ics/controllers/r1consumer/ConsumerController.java
+++ b/src/main/java/org/oransc/ics/controllers/r1consumer/ConsumerController.java
@@ -103,6 +103,7 @@
         })
     public ResponseEntity<Object> getinfoTypeIdentifiers( //
     ) {
+        logger.debug("GET info type identifier");
         List<String> result = new ArrayList<>();
         for (InfoType infoType : this.infoTypes.getAllInfoTypes()) {
             result.add(infoType.getId());
@@ -127,6 +128,7 @@
     public ResponseEntity<Object> getInfoType( //
         @PathVariable(ConsumerConsts.INFO_TYPE_ID_PATH) String infoTypeId) {
         try {
+            logger.debug("GET info type {}", infoTypeId);
             InfoType type = this.infoTypes.getType(infoTypeId);
             ConsumerInfoTypeInfo info = toInfoTypeInfo(type);
             return new ResponseEntity<>(gson.toJson(info), HttpStatus.OK);
@@ -160,6 +162,7 @@
             description = ConsumerConsts.OWNER_PARAM_DESCRIPTION) //
         @RequestParam(name = ConsumerConsts.OWNER_PARAM, required = false) String owner) {
         try {
+            logger.debug("GET info jobs, id: {}, owner: {}", infoTypeId, owner);
             List<String> result = new ArrayList<>();
             if (owner != null) {
                 for (InfoJob job : this.infoJobs.getJobsForOwner(owner)) {
@@ -196,6 +199,7 @@
     public ResponseEntity<Object> getIndividualEiJob( //
         @PathVariable(ConsumerConsts.INFO_JOB_ID_PATH) String infoJobId) {
         try {
+            logger.debug("GET info job, id: {}", infoJobId);
             InfoJob job = this.infoJobs.getJob(infoJobId);
             return new ResponseEntity<>(gson.toJson(toInfoJobInfo(job)), HttpStatus.OK);
         } catch (Exception e) {
@@ -219,6 +223,7 @@
     public ResponseEntity<Object> getEiJobStatus( //
         @PathVariable(ConsumerConsts.INFO_JOB_ID_PATH) String jobId) {
         try {
+            logger.debug("GET info job status, id: {}", jobId);
             InfoJob job = this.infoJobs.getJob(jobId);
             return new ResponseEntity<>(gson.toJson(toInfoJobStatus(job)), HttpStatus.OK);
         } catch (Exception e) {
@@ -256,6 +261,7 @@
     public ResponseEntity<Object> deleteIndividualEiJob( //
         @PathVariable(ConsumerConsts.INFO_JOB_ID_PATH) String jobId) {
         try {
+            logger.debug("DELETE info job, id: {}", jobId);
             InfoJob job = this.infoJobs.getJob(jobId);
             this.infoJobs.remove(job, this.infoProducers);
             return new ResponseEntity<>(HttpStatus.NO_CONTENT);
@@ -297,6 +303,8 @@
 
         final boolean isNewJob = this.infoJobs.get(jobId) == null;
 
+        logger.debug("PUT info job, id: {}, obj: {}", jobId, informationJobObject);
+
         return validatePutInfoJob(jobId, informationJobObject) //
             .flatMap(this::startInfoSubscriptionJob) //
             .doOnNext(this.infoJobs::put) //
@@ -322,6 +330,7 @@
             description = ConsumerConsts.OWNER_PARAM_DESCRIPTION) //
         @RequestParam(name = ConsumerConsts.OWNER_PARAM, required = false) String owner) {
         try {
+            logger.debug("GET info type subscriptions, owner: {}", owner);
             List<String> result = new ArrayList<>();
             if (owner != null) {
                 this.infoTypeSubscriptions.getSubscriptionsForOwner(owner)
@@ -352,6 +361,7 @@
     public ResponseEntity<Object> getIndividualTypeSubscription( //
         @PathVariable(ConsumerConsts.SUBSCRIPTION_ID_PATH) String subscriptionId) {
         try {
+            logger.debug("GET info type subscription, subscriptionId: {}", subscriptionId);
             InfoTypeSubscriptions.SubscriptionInfo subscription =
                 this.infoTypeSubscriptions.getSubscription(subscriptionId);
             return new ResponseEntity<>(gson.toJson(toTypeSuscriptionInfo(subscription)), HttpStatus.OK);
@@ -382,6 +392,7 @@
         @PathVariable(ConsumerConsts.SUBSCRIPTION_ID_PATH) String subscriptionId, //
         @RequestBody ConsumerTypeSubscriptionInfo subscription) {
 
+        logger.debug("PUT info type subscription, subscriptionId: {}, body: {}", subscriptionId, subscription);
         final boolean isNewSubscription = this.infoTypeSubscriptions.get(subscriptionId) == null;
         this.infoTypeSubscriptions.put(toTypeSuscriptionInfo(subscription, subscriptionId));
         return Mono.just(new ResponseEntity<>(isNewSubscription ? HttpStatus.CREATED : HttpStatus.OK));
@@ -407,6 +418,7 @@
     public ResponseEntity<Object> deleteIndividualTypeSubscription( //
         @PathVariable(ConsumerConsts.SUBSCRIPTION_ID_PATH) String subscriptionId) {
         try {
+            logger.debug("DELETE info type subscription, subscriptionId: {}", subscriptionId);
             InfoTypeSubscriptions.SubscriptionInfo subscription =
                 this.infoTypeSubscriptions.getSubscription(subscriptionId);
             this.infoTypeSubscriptions.remove(subscription);
diff --git a/src/main/java/org/oransc/ics/controllers/r1consumer/ConsumerJobInfo.java b/src/main/java/org/oransc/ics/controllers/r1consumer/ConsumerJobInfo.java
index 7babf87..4495530 100644
--- a/src/main/java/org/oransc/ics/controllers/r1consumer/ConsumerJobInfo.java
+++ b/src/main/java/org/oransc/ics/controllers/r1consumer/ConsumerJobInfo.java
@@ -24,7 +24,9 @@
 import com.google.gson.annotations.SerializedName;
 
 import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.ToString;
 
+@ToString
 @Schema(name = "consumer_job", description = "Information for an Information Job")
 public class ConsumerJobInfo {
 
diff --git a/src/main/java/org/oransc/ics/controllers/r1consumer/ConsumerTypeSubscriptionInfo.java b/src/main/java/org/oransc/ics/controllers/r1consumer/ConsumerTypeSubscriptionInfo.java
index 84e8e9d..fc3c35d 100644
--- a/src/main/java/org/oransc/ics/controllers/r1consumer/ConsumerTypeSubscriptionInfo.java
+++ b/src/main/java/org/oransc/ics/controllers/r1consumer/ConsumerTypeSubscriptionInfo.java
@@ -25,7 +25,9 @@
 
 import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.EqualsAndHashCode;
+import lombok.ToString;
 
+@ToString
 @EqualsAndHashCode
 @Schema(name = "consumer_type_subscription_info", description = "Information for an information type subscription")
 public class ConsumerTypeSubscriptionInfo {
diff --git a/src/main/java/org/oransc/ics/controllers/r1producer/ProducerController.java b/src/main/java/org/oransc/ics/controllers/r1producer/ProducerController.java
index 0372248..5241001 100644
--- a/src/main/java/org/oransc/ics/controllers/r1producer/ProducerController.java
+++ b/src/main/java/org/oransc/ics/controllers/r1producer/ProducerController.java
@@ -32,6 +32,7 @@
 import io.swagger.v3.oas.annotations.responses.ApiResponses;
 import io.swagger.v3.oas.annotations.tags.Tag;
 
+import java.lang.invoke.MethodHandles;
 import java.net.URI;
 import java.net.URISyntaxException;
 import java.util.ArrayList;
@@ -48,6 +49,8 @@
 import org.oransc.ics.repository.InfoType;
 import org.oransc.ics.repository.InfoTypeSubscriptions;
 import org.oransc.ics.repository.InfoTypes;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.http.HttpStatus;
 import org.springframework.http.MediaType;
@@ -66,6 +69,7 @@
 public class ProducerController {
 
     private static Gson gson = new GsonBuilder().create();
+    private static final Logger logger = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
 
     @Autowired
     private InfoJobs infoJobs;
@@ -90,6 +94,7 @@
         })
     public ResponseEntity<Object> getInfoTypdentifiers( //
     ) {
+        logger.debug("GET info type identifiers");
         List<String> result = new ArrayList<>();
         for (InfoType infoType : this.infoTypes.getAllInfoTypes()) {
             result.add(infoType.getId());
@@ -115,6 +120,7 @@
     public ResponseEntity<Object> getInfoType( //
         @PathVariable(ProducerConsts.INFO_TYPE_ID_PATH) String infoTypeId) {
         try {
+            logger.debug("GET info type, infoTypeId: {}", infoTypeId);
             InfoType t = this.infoTypes.getType(infoTypeId);
             ProducerInfoTypeInfo info = toInfoTypeInfo(t);
             return new ResponseEntity<>(gson.toJson(info), HttpStatus.OK);
@@ -145,6 +151,8 @@
         @PathVariable(ProducerConsts.INFO_TYPE_ID_PATH) String infoTypeId, //
         @RequestBody ProducerInfoTypeInfo registrationInfo) {
 
+        logger.debug("PUT info type, infoTypeId: {}, info: {}", infoTypeId, registrationInfo);
+
         InfoType previousDefinition = this.infoTypes.get(infoTypeId);
         if (registrationInfo.jobDataSchema == null) {
             return ErrorResponse.create("No schema provided", HttpStatus.BAD_REQUEST);
@@ -182,6 +190,7 @@
     public ResponseEntity<Object> deleteInfoType( //
         @PathVariable(ProducerConsts.INFO_TYPE_ID_PATH) String infoTypeId) {
 
+        logger.debug("DELETE info type, infoTypeId: {}", infoTypeId);
         InfoType type = this.infoTypes.get(infoTypeId);
         if (type == null) {
             return ErrorResponse.create("Information type not found", HttpStatus.NOT_FOUND);
@@ -212,6 +221,7 @@
             description = "If given, only the producers for the EI Data type is returned.") //
         @RequestParam(name = ProducerConsts.INFO_TYPE_ID_PARAM, required = false) String typeId //
     ) {
+        logger.debug("GET producer identifiers");
         List<String> result = new ArrayList<>();
         for (InfoProducer infoProducer : typeId == null ? this.infoProducers.getAllProducers()
             : this.infoProducers.getProducersForType(typeId)) {
@@ -239,6 +249,7 @@
     public ResponseEntity<Object> getInfoProducer( //
         @PathVariable(ProducerConsts.INFO_PRODUCER_ID_PATH) String infoProducerId) {
         try {
+            logger.debug("GET info producer, infoProducerId: {}", infoProducerId);
             InfoProducer producer = this.infoProducers.getProducer(infoProducerId);
             ProducerRegistrationInfo info = toProducerRegistrationInfo(producer);
             return new ResponseEntity<>(gson.toJson(info), HttpStatus.OK);
@@ -267,6 +278,7 @@
     public ResponseEntity<Object> getInfoProducerJobs( //
         @PathVariable(ProducerConsts.INFO_PRODUCER_ID_PATH) String infoProducerId) {
         try {
+            logger.debug("GET info producer, infoProducerId: {}", infoProducerId);
             InfoProducer producer = this.infoProducers.getProducer(infoProducerId);
             Collection<ProducerJobInfo> producerJobs = new ArrayList<>();
             for (InfoType type : producer.getInfoTypes()) {
@@ -300,6 +312,7 @@
     public ResponseEntity<Object> getInfoProducerStatus( //
         @PathVariable(ProducerConsts.INFO_PRODUCER_ID_PATH) String infoProducerId) {
         try {
+            logger.debug("GET producer status, infoProducerId: {}", infoProducerId);
             InfoProducer producer = this.infoProducers.getProducer(infoProducerId);
             return new ResponseEntity<>(gson.toJson(producerStatusInfo(producer)), HttpStatus.OK);
         } catch (Exception e) {
@@ -340,6 +353,7 @@
         @PathVariable("infoProducerId") String infoProducerId, //
         @RequestBody ProducerRegistrationInfo registrationInfo) {
         try {
+            logger.debug("PUT info producer, infoProducerId: {}, body: {}", infoProducerId, registrationInfo);
             validateUri(registrationInfo.jobCallbackUrl);
             validateUri(registrationInfo.producerSupervisionCallbackUrl);
             InfoProducer previousDefinition = this.infoProducers.get(infoProducerId);
@@ -387,6 +401,7 @@
     public ResponseEntity<Object> deleteInfoProducer(
         @PathVariable(ProducerConsts.INFO_PRODUCER_ID_PATH) String infoProducerId) {
         try {
+            logger.debug("DELETE info producer, infoProducerId: {}", infoProducerId);
             final InfoProducer producer = this.infoProducers.getProducer(infoProducerId);
             this.infoProducers.deregisterProducer(producer);
             return new ResponseEntity<>(HttpStatus.NO_CONTENT);
diff --git a/src/main/java/org/oransc/ics/controllers/r1producer/ProducerRegistrationInfo.java b/src/main/java/org/oransc/ics/controllers/r1producer/ProducerRegistrationInfo.java
index ee82546..f2c7ad1 100644
--- a/src/main/java/org/oransc/ics/controllers/r1producer/ProducerRegistrationInfo.java
+++ b/src/main/java/org/oransc/ics/controllers/r1producer/ProducerRegistrationInfo.java
@@ -27,6 +27,9 @@
 
 import java.util.Collection;
 
+import lombok.ToString;
+
+@ToString
 @Schema(name = "producer_registration_info", description = "Information for an Information Producer")
 public class ProducerRegistrationInfo {
 
diff --git a/src/main/java/org/oransc/ics/repository/InfoType.java b/src/main/java/org/oransc/ics/repository/InfoType.java
index 69ae67c..1a3f6e5 100644
--- a/src/main/java/org/oransc/ics/repository/InfoType.java
+++ b/src/main/java/org/oransc/ics/repository/InfoType.java
@@ -21,7 +21,9 @@
 package org.oransc.ics.repository;
 
 import lombok.Getter;
+import lombok.ToString;
 
+@ToString
 public class InfoType {
     @Getter
     private final String id;