From 36a12978b4bd9968cc7a7941d06ead2edec8117e Mon Sep 17 00:00:00 2001
From: AndrewLamb <andrew.a.lamb@est.tech>
Date: Wed, 29 Apr 2020 15:33:19 +0100
Subject: Fix Parsing Of Etsi Catalog Notifications

Change-Id: I18290572d7569d8260d185284546db491ae78768
Issue-ID: SO-2825
Signed-off-by: AndrewLamb <andrew.a.lamb@est.tech>
---
 .../AbstractServiceProviderConfiguration.java      |  9 ++++-
 .../EtsiSubscriptionNotificationController.java    | 45 +++++++++++++++++++---
 .../OAuthNotificationServiceProvider.java          |  1 +
 3 files changed, 49 insertions(+), 6 deletions(-)

(limited to 'adapters/etsi-sol003-adapter/etsi-sol003-package-management/etsi-sol003-package-management-adapter/src/main')

diff --git a/adapters/etsi-sol003-adapter/etsi-sol003-package-management/etsi-sol003-package-management-adapter/src/main/java/org/onap/so/adapters/etsi/sol003/adapter/packagemanagement/extclients/AbstractServiceProviderConfiguration.java b/adapters/etsi-sol003-adapter/etsi-sol003-package-management/etsi-sol003-package-management-adapter/src/main/java/org/onap/so/adapters/etsi/sol003/adapter/packagemanagement/extclients/AbstractServiceProviderConfiguration.java
index 5ac9fe6a0d..1129c40154 100644
--- a/adapters/etsi-sol003-adapter/etsi-sol003-package-management/etsi-sol003-package-management-adapter/src/main/java/org/onap/so/adapters/etsi/sol003/adapter/packagemanagement/extclients/AbstractServiceProviderConfiguration.java
+++ b/adapters/etsi-sol003-adapter/etsi-sol003-package-management/etsi-sol003-package-management-adapter/src/main/java/org/onap/so/adapters/etsi/sol003/adapter/packagemanagement/extclients/AbstractServiceProviderConfiguration.java
@@ -20,13 +20,16 @@
 
 package org.onap.so.adapters.etsi.sol003.adapter.packagemanagement.extclients;
 
+import java.time.LocalDateTime;
 import java.util.Iterator;
 import org.onap.so.adapters.etsi.sol003.adapter.packagemanagement.JSON;
+import org.onap.so.adapters.etsi.sol003.adapter.packagemanagement.rest.EtsiSubscriptionNotificationController;
 import org.springframework.http.converter.HttpMessageConverter;
 import org.springframework.http.converter.json.GsonHttpMessageConverter;
 import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
 import org.springframework.web.client.RestTemplate;
 import com.google.gson.Gson;
+import org.threeten.bp.OffsetDateTime;
 
 /**
  * A base class that can be extended by classes for configuring HttpRestServiceProvider classes. Provides common methods
@@ -35,6 +38,7 @@ import com.google.gson.Gson;
  * @author gareth.roper@est.tech
  */
 public abstract class AbstractServiceProviderConfiguration {
+    private final JSON.OffsetDateTimeTypeAdapter offsetDateTimeTypeAdapter = new JSON.OffsetDateTimeTypeAdapter();
 
     public void setGsonMessageConverter(final RestTemplate restTemplate) {
         final Iterator<HttpMessageConverter<?>> iterator = restTemplate.getMessageConverters().iterator();
@@ -43,7 +47,10 @@ public abstract class AbstractServiceProviderConfiguration {
                 iterator.remove();
             }
         }
-        final Gson gson = new JSON().getGson();
+        final Gson gson = JSON.createGson().registerTypeAdapter(OffsetDateTime.class, offsetDateTimeTypeAdapter)
+                .registerTypeAdapter(LocalDateTime.class,
+                        new EtsiSubscriptionNotificationController.LocalDateTimeTypeAdapter())
+                .create();
         restTemplate.getMessageConverters().add(new GsonHttpMessageConverter(gson));
     }
 }
diff --git a/adapters/etsi-sol003-adapter/etsi-sol003-package-management/etsi-sol003-package-management-adapter/src/main/java/org/onap/so/adapters/etsi/sol003/adapter/packagemanagement/rest/EtsiSubscriptionNotificationController.java b/adapters/etsi-sol003-adapter/etsi-sol003-package-management/etsi-sol003-package-management-adapter/src/main/java/org/onap/so/adapters/etsi/sol003/adapter/packagemanagement/rest/EtsiSubscriptionNotificationController.java
index 0d821fcd69..71ff4a907b 100644
--- a/adapters/etsi-sol003-adapter/etsi-sol003-package-management/etsi-sol003-package-management-adapter/src/main/java/org/onap/so/adapters/etsi/sol003/adapter/packagemanagement/rest/EtsiSubscriptionNotificationController.java
+++ b/adapters/etsi-sol003-adapter/etsi-sol003-package-management/etsi-sol003-package-management-adapter/src/main/java/org/onap/so/adapters/etsi/sol003/adapter/packagemanagement/rest/EtsiSubscriptionNotificationController.java
@@ -42,6 +42,12 @@ import com.google.gson.Gson;
 import com.google.gson.GsonBuilder;
 import com.google.gson.JsonObject;
 import com.google.gson.JsonParser;
+import com.google.gson.TypeAdapter;
+import com.google.gson.stream.JsonReader;
+import com.google.gson.stream.JsonWriter;
+import java.time.LocalDateTime;
+import java.io.IOException;
+import java.time.format.DateTimeFormatter;
 
 /**
  * This controller handles the ETSI Subscription Notification Endpoints.
@@ -61,7 +67,7 @@ public class EtsiSubscriptionNotificationController {
     @Autowired
     public EtsiSubscriptionNotificationController(final NotificationManager notificationManager) {
         this.notificationManager = notificationManager;
-        this.gson = new GsonBuilder().create();
+        this.gson = new GsonBuilder().registerTypeAdapter(LocalDateTime.class, new LocalDateTimeTypeAdapter()).create();
     }
 
     @GetMapping(value = "/notification")
@@ -72,15 +78,16 @@ public class EtsiSubscriptionNotificationController {
 
     /**
      * POST notification on to subscriber.
-     * 
+     *
      * @param notification The notification to send.
      * @return Response Code: 204 No Content if Successful, ProblemDetails Object if not.
      */
     @PostMapping(value = "/notification", consumes = MediaType.APPLICATION_JSON, produces = MediaType.APPLICATION_JSON)
-    public ResponseEntity<?> postSubscriptionNotification(@RequestBody final String notification) {
-        logger.info("Posting subscription notification \n{}", notification);
+    public ResponseEntity<?> postSubscriptionNotification(@RequestBody final Object notification) {
+        logger.info("Posting subscription notification class: {} \n{}", notification.getClass(), notification);
+        final String notificationString = gson.toJson(notification);
 
-        final Entry<String, Object> notificationObject = getNotificationObject(notification);
+        final Entry<String, Object> notificationObject = getNotificationObject(notificationString);
         if (notificationManager.processSubscriptionNotification(notificationObject.getValue(),
                 notificationObject.getKey())) {
             logger.info("Notification Delivered Successfully");
@@ -92,6 +99,7 @@ public class EtsiSubscriptionNotificationController {
     }
 
     private Entry<String, Object> getNotificationObject(final String notification) {
+        logger.info("getNotificationObject() notification: {}", notification);
         final String notificationType = getNotificationType(notification);
         if (PkgOnboardingNotification.NotificationTypeEnum.VNFPACKAGEONBOARDINGNOTIFICATION.getValue()
                 .equals(notificationType)) {
@@ -118,6 +126,7 @@ public class EtsiSubscriptionNotificationController {
 
     private String getNotificationType(final String notification) {
         try {
+            logger.info("getNotificationType() notification: {}", notification);
             final JsonParser parser = new JsonParser();
             final JsonObject element = (JsonObject) parser.parse(notification);
             return element.get("notificationType").getAsString();
@@ -128,4 +137,30 @@ public class EtsiSubscriptionNotificationController {
                 "Unable to parse notification type in object \n" + notification);
     }
 
+    public static class LocalDateTimeTypeAdapter extends TypeAdapter<LocalDateTime> {
+
+        private static final DateTimeFormatter FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
+
+        @Override
+        public void write(final JsonWriter out, final LocalDateTime localDateTime) throws IOException {
+            if (localDateTime == null) {
+                out.nullValue();
+            } else {
+                out.value(FORMATTER.format(localDateTime));
+            }
+        }
+
+        @Override
+        public LocalDateTime read(final JsonReader in) throws IOException {
+            switch (in.peek()) {
+                case NULL:
+                    in.nextNull();
+                    return null;
+                default:
+                    final String dateTime = in.nextString();
+                    return LocalDateTime.parse(dateTime, FORMATTER);
+            }
+        }
+    }
+
 }
diff --git a/adapters/etsi-sol003-adapter/etsi-sol003-package-management/etsi-sol003-package-management-adapter/src/main/java/org/onap/so/adapters/etsi/sol003/adapter/packagemanagement/subscriptionmanagement/OAuthNotificationServiceProvider.java b/adapters/etsi-sol003-adapter/etsi-sol003-package-management/etsi-sol003-package-management-adapter/src/main/java/org/onap/so/adapters/etsi/sol003/adapter/packagemanagement/subscriptionmanagement/OAuthNotificationServiceProvider.java
index e5bc5bdbed..213eb11a0d 100644
--- a/adapters/etsi-sol003-adapter/etsi-sol003-package-management/etsi-sol003-package-management-adapter/src/main/java/org/onap/so/adapters/etsi/sol003/adapter/packagemanagement/subscriptionmanagement/OAuthNotificationServiceProvider.java
+++ b/adapters/etsi-sol003-adapter/etsi-sol003-package-management/etsi-sol003-package-management-adapter/src/main/java/org/onap/so/adapters/etsi/sol003/adapter/packagemanagement/subscriptionmanagement/OAuthNotificationServiceProvider.java
@@ -45,6 +45,7 @@ public class OAuthNotificationServiceProvider extends AbstractNotificationServic
     public boolean send(final Object notification, final SubscriptionsAuthentication subscriptionsAuthentication,
             final String callbackUri) {
         logger.info("Sending notification to uri: {}", callbackUri);
+        logger.info("Object: {}", notification);
         final String token = getAccessToken(subscriptionsAuthentication);
 
         if (token == null) {
-- 
cgit