Refactor UEBNotification class 74/139174/6
authorFiete Ostkamp <Fiete.Ostkamp@telekom.de>
Tue, 8 Oct 2024 09:52:14 +0000 (11:52 +0200)
committerFiete Ostkamp <Fiete.Ostkamp@telekom.de>
Wed, 9 Oct 2024 09:12:06 +0000 (11:12 +0200)
- refactor UEBNotification class that it does not use ActiveMQ anymore
  and directly publishes to Kafka
- use .domain.NotificationEvent class
- serialize as late as possible

Issue-ID: AAI-3931
Signed-off-by: Fiete Ostkamp <Fiete.Ostkamp@telekom.de>
Change-Id: I3836519752f810f905a9aed96678d497783a2e5d

26 files changed:
aai-core/src/main/java/org/onap/aai/config/RestBeanConfig.java
aai-core/src/main/java/org/onap/aai/domain/notificationEvent/NotificationEvent.java
aai-core/src/main/java/org/onap/aai/kafka/MessageProducer.java
aai-core/src/main/java/org/onap/aai/kafka/NotificationProducer.java [new file with mode: 0644]
aai-core/src/main/java/org/onap/aai/kafka/NotificationProducerService.java [new file with mode: 0644]
aai-core/src/main/java/org/onap/aai/prevalidation/ValidationService.java
aai-core/src/main/java/org/onap/aai/rest/db/HttpEntry.java
aai-core/src/main/java/org/onap/aai/rest/notification/NotificationService.java
aai-core/src/main/java/org/onap/aai/rest/notification/UEBNotification.java
aai-core/src/main/java/org/onap/aai/web/KafkaConfig.java
aai-core/src/main/java/org/onap/aai/web/KafkaNotificationEventConfig.java [new file with mode: 0644]
aai-core/src/test/java/org/onap/aai/AAISetup.java
aai-core/src/test/java/org/onap/aai/DataLinkSetup.java
aai-core/src/test/java/org/onap/aai/HttpTestUtil.java
aai-core/src/test/java/org/onap/aai/introspection/IntrospectorSerializationTest.java
aai-core/src/test/java/org/onap/aai/kafka/AAIKafkaEventIntegrationTest.java
aai-core/src/test/java/org/onap/aai/prevalidation/ValidationServiceTest.java
aai-core/src/test/java/org/onap/aai/query/builder/QueryBuilderTestAbstraction.java
aai-core/src/test/java/org/onap/aai/rest/ImpliedDeleteIntegrationTest.java
aai-core/src/test/java/org/onap/aai/rest/NotificationDmaapEventTest.java
aai-core/src/test/java/org/onap/aai/rest/db/HttpEntryNotificationIntegrationTest.java
aai-core/src/test/java/org/onap/aai/rest/notification/NotificationServiceTest.java
aai-core/src/test/java/org/onap/aai/rest/notification/UEBNotificationTest.java
aai-core/src/test/java/org/onap/aai/serialization/db/DbSerializer_needsFakeRulesTest.java
aai-core/src/test/resources/payloads/resource/aai-event.json
aai-els-onap-logging/src/main/java/org/onap/aai/util/FormatDate.java

index c04e4e3..3cc1719 100644 (file)
@@ -32,8 +32,19 @@ import org.springframework.context.annotation.Configuration;
 import org.springframework.context.annotation.Scope;
 import org.springframework.web.context.annotation.RequestScope;
 
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.module.jaxb.JaxbAnnotationModule;
+
 @Configuration
 public class RestBeanConfig {
+
+    @Bean
+    public ObjectMapper objectMapper() {
+        ObjectMapper objectMapper = new ObjectMapper();
+        objectMapper.registerModule(new JaxbAnnotationModule());
+        return objectMapper;
+    }
+
     @Bean(name = "traversalUriHttpEntry")
     @Scope(scopeName = ConfigurableBeanFactory.SCOPE_PROTOTYPE)
     public HttpEntry traversalUriHttpEntry() {
index dad3566..9117e99 100644 (file)
  * limitations under the License.
  * ============LICENSE_END=========================================================
  */
-//
-// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.2.4-2
-// See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a>
-// Any modifications to this file will be lost upon recompilation of the source schema.
-// Generated on: 2016.01.06 at 05:38:00 PM EST
-//
-
 package org.onap.aai.domain.notificationEvent;
 
 import javax.xml.bind.annotation.*;
 
-import org.w3c.dom.Element;
+import com.fasterxml.jackson.annotation.JsonProperty;
 
-/**
- * <p>
- * Java class for anonymous complex type.
- *
- * <p>
- * The following schema fragment specifies the expected content contained within this class.
- *
- * <pre>
- * &lt;complexType>
- *   &lt;complexContent>
- *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
- *       &lt;sequence>
- *         &lt;element name="cambria.partition" type="{http://www.w3.org/2001/XMLSchema}string"/>
- *         &lt;element name="event-header" minOccurs="0">
- *           &lt;complexType>
- *             &lt;complexContent>
- *               &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
- *                 &lt;sequence>
- *                   &lt;element name="id" type="{http://www.w3.org/2001/XMLSchema}string"/>
- *                   &lt;element name="timestamp" type="{http://www.w3.org/2001/XMLSchema}string"/>
- *                   &lt;element name="source-name" type="{http://www.w3.org/2001/XMLSchema}string"/>
- *                   &lt;element name="domain" type="{http://www.w3.org/2001/XMLSchema}string"/>
- *                   &lt;element name="sequence-number" type="{http://www.w3.org/2001/XMLSchema}string"/>
- *                   &lt;element name="severity" type="{http://www.w3.org/2001/XMLSchema}string"/>
- *                   &lt;element name="event-type" type="{http://www.w3.org/2001/XMLSchema}string"/>
- *                   &lt;element name="version" type="{http://www.w3.org/2001/XMLSchema}string"/>
- *                   &lt;element name="action" type="{http://www.w3.org/2001/XMLSchema}string"/>
- *                   &lt;element name="entity-type" type="{http://www.w3.org/2001/XMLSchema}string"/>
- *                   &lt;element name="top-entity-type" type="{http://www.w3.org/2001/XMLSchema}string"/>
- *                   &lt;element name="entity-link" type="{http://www.w3.org/2001/XMLSchema}string"/>
- *                   &lt;element name="status" type="{http://www.w3.org/2001/XMLSchema}string"/>
- *                 &lt;/sequence>
- *               &lt;/restriction>
- *             &lt;/complexContent>
- *           &lt;/complexType>
- *         &lt;/element>
- *         &lt;any processContents='lax' namespace='##other' minOccurs="0"/>
- *       &lt;/sequence>
- *     &lt;/restriction>
- *   &lt;/complexContent>
- * &lt;/complexType>
- * </pre>
- *
- *
- */
+import lombok.Data;
+
+@Data
 @XmlAccessorType(XmlAccessType.FIELD)
 @XmlType(name = "", propOrder = {"cambriaPartition", "eventHeader", "entity"})
 @XmlRootElement(name = "NotificationEvent")
 public class NotificationEvent {
 
     @XmlElement(name = "cambria.partition")
+    @JsonProperty("cambria.partition")
     protected String cambriaPartition;
     @XmlElement(name = "event-header")
+    @JsonProperty("event-header")
     protected EventHeader eventHeader;
     @XmlAnyElement(lax = true)
     protected Object entity;
 
-    /**
-     * Gets the value of the eventHeader property.
-     *
-     * @return
-     *         possible object is
-     *         {@link EventHeader }
-     *
-     */
-    public EventHeader getEventHeader() {
-        return eventHeader;
-    }
-
-    /**
-     * Sets the value of the eventHeader property.
-     *
-     * @param value
-     *        allowed object is
-     *        {@link EventHeader }
-     *
-     */
-    public void setEventHeader(EventHeader value) {
-        this.eventHeader = value;
-    }
-
-    /**
-     * Gets the value of the any property.
-     *
-     * @return
-     *         possible object is
-     *         {@link Object }
-     *         {@link Element }
-     *
-     */
-    public Object getEntity() {
-        return entity;
-    }
-
-    /**
-     * Sets the value of the any property.
-     *
-     * @param value
-     *        allowed object is
-     *        {@link Object }
-     *        {@link Element }
-     *
-     */
-    public void setEntity(Object value) {
-        this.entity = value;
-    }
-
-    /**
-     * Gets the value of the cambriaPartition property.
-     *
-     * @return
-     *         possible object is
-     *         {@link String }
-     *
-     */
-    public String getCambriaPartition() {
-        return cambriaPartition;
-    }
-
-    /**
-     * Sets the value of the cambriaPartition property.
-     *
-     * @param value
-     *        allowed object is
-     *        {@link String }
-     *
-     */
-    public void setCambriaPartition(String value) {
-        this.cambriaPartition = value;
-    }
-
-    /**
-     * <p>
-     * Java class for anonymous complex type.
-     *
-     * <p>
-     * The following schema fragment specifies the expected content contained within this class.
-     *
-     * <pre>
-     * &lt;complexType>
-     *   &lt;complexContent>
-     *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
-     *       &lt;sequence>
-     *         &lt;element name="id" type="{http://www.w3.org/2001/XMLSchema}string"/>
-     *         &lt;element name="timestamp" type="{http://www.w3.org/2001/XMLSchema}string"/>
-     *         &lt;element name="source-name" type="{http://www.w3.org/2001/XMLSchema}string"/>
-     *         &lt;element name="domain" type="{http://www.w3.org/2001/XMLSchema}string"/>
-     *         &lt;element name="sequence-number" type="{http://www.w3.org/2001/XMLSchema}string"/>
-     *         &lt;element name="severity" type="{http://www.w3.org/2001/XMLSchema}string"/>
-     *         &lt;element name="event-type" type="{http://www.w3.org/2001/XMLSchema}string"/>
-     *         &lt;element name="version" type="{http://www.w3.org/2001/XMLSchema}string"/>
-     *         &lt;element name="action" type="{http://www.w3.org/2001/XMLSchema}string"/>
-     *         &lt;element name="entity-type" type="{http://www.w3.org/2001/XMLSchema}string"/>
-     *         &lt;element name="top-entity-type" type="{http://www.w3.org/2001/XMLSchema}string"/>
-     *         &lt;element name="entity-link" type="{http://www.w3.org/2001/XMLSchema}string"/>
-     *         &lt;element name="status" type="{http://www.w3.org/2001/XMLSchema}string"/>
-     *       &lt;/sequence>
-     *     &lt;/restriction>
-     *   &lt;/complexContent>
-     * &lt;/complexType>
-     * </pre>
-     *
-     *
-     */
+    @Data
     @XmlAccessorType(XmlAccessType.FIELD)
     @XmlType(
             name = "",
             propOrder = {"id", "timestamp", "sourceName", "domain", "sequenceNumber", "severity", "eventType",
-                    "version", "action", "entityType", "topEntityType", "entityLink", "status"})
+                    "version", "action", "entityType", "topEntityType", "entityLink"})
     public static class EventHeader {
 
         @XmlElement(required = true)
@@ -206,340 +53,31 @@ public class NotificationEvent {
         @XmlElement(required = true)
         protected String timestamp;
         @XmlElement(name = "source-name", required = true)
+        @JsonProperty("source-name")
         protected String sourceName;
         @XmlElement(required = true)
         protected String domain;
         @XmlElement(name = "sequence-number", required = true)
+        @JsonProperty("sequence-number")
         protected String sequenceNumber;
         @XmlElement(required = true)
         protected String severity;
         @XmlElement(name = "event-type", required = true)
+        @JsonProperty("event-type")
         protected String eventType;
         @XmlElement(required = true)
         protected String version;
         @XmlElement(required = true)
         protected String action;
         @XmlElement(name = "entity-type", required = true)
+        @JsonProperty("entity-type")
         protected String entityType;
         @XmlElement(name = "top-entity-type", required = true)
+        @JsonProperty("top-entity-type")
         protected String topEntityType;
         @XmlElement(name = "entity-link", required = true)
+        @JsonProperty("entity-link")
         protected String entityLink;
-        @XmlElement(required = true)
-        protected String status;
-
-        /**
-         * Gets the value of the id property.
-         *
-         * @return
-         *         possible object is
-         *         {@link String }
-         *
-         */
-        public String getId() {
-            return id;
-        }
-
-        /**
-         * Sets the value of the id property.
-         *
-         * @param value
-         *        allowed object is
-         *        {@link String }
-         *
-         */
-        public void setId(String value) {
-            this.id = value;
-        }
-
-        /**
-         * Gets the value of the timestamp property.
-         *
-         * @return
-         *         possible object is
-         *         {@link String }
-         *
-         */
-        public String getTimestamp() {
-            return timestamp;
-        }
-
-        /**
-         * Sets the value of the timestamp property.
-         *
-         * @param value
-         *        allowed object is
-         *        {@link String }
-         *
-         */
-        public void setTimestamp(String value) {
-            this.timestamp = value;
-        }
-
-        /**
-         * Gets the value of the sourceName property.
-         *
-         * @return
-         *         possible object is
-         *         {@link String }
-         *
-         */
-        public String getSourceName() {
-            return sourceName;
-        }
-
-        /**
-         * Sets the value of the sourceName property.
-         *
-         * @param value
-         *        allowed object is
-         *        {@link String }
-         *
-         */
-        public void setSourceName(String value) {
-            this.sourceName = value;
-        }
-
-        /**
-         * Gets the value of the domain property.
-         *
-         * @return
-         *         possible object is
-         *         {@link String }
-         *
-         */
-        public String getDomain() {
-            return domain;
-        }
-
-        /**
-         * Sets the value of the domain property.
-         *
-         * @param value
-         *        allowed object is
-         *        {@link String }
-         *
-         */
-        public void setDomain(String value) {
-            this.domain = value;
-        }
-
-        /**
-         * Gets the value of the sequenceNumber property.
-         *
-         * @return
-         *         possible object is
-         *         {@link String }
-         *
-         */
-        public String getSequenceNumber() {
-            return sequenceNumber;
-        }
-
-        /**
-         * Sets the value of the sequenceNumber property.
-         *
-         * @param value
-         *        allowed object is
-         *        {@link String }
-         *
-         */
-        public void setSequenceNumber(String value) {
-            this.sequenceNumber = value;
-        }
-
-        /**
-         * Gets the value of the severity property.
-         *
-         * @return
-         *         possible object is
-         *         {@link String }
-         *
-         */
-        public String getSeverity() {
-            return severity;
-        }
-
-        /**
-         * Sets the value of the severity property.
-         *
-         * @param value
-         *        allowed object is
-         *        {@link String }
-         *
-         */
-        public void setSeverity(String value) {
-            this.severity = value;
-        }
-
-        /**
-         * Gets the value of the eventType property.
-         *
-         * @return
-         *         possible object is
-         *         {@link String }
-         *
-         */
-        public String getEventType() {
-            return eventType;
-        }
-
-        /**
-         * Sets the value of the eventType property.
-         *
-         * @param value
-         *        allowed object is
-         *        {@link String }
-         *
-         */
-        public void setEventType(String value) {
-            this.eventType = value;
-        }
-
-        /**
-         * Gets the value of the version property.
-         *
-         * @return
-         *         possible object is
-         *         {@link String }
-         *
-         */
-        public String getVersion() {
-            return version;
-        }
-
-        /**
-         * Sets the value of the version property.
-         *
-         * @param value
-         *        allowed object is
-         *        {@link String }
-         *
-         */
-        public void setVersion(String value) {
-            this.version = value;
-        }
-
-        /**
-         * Gets the value of the action property.
-         *
-         * @return
-         *         possible object is
-         *         {@link String }
-         *
-         */
-        public String getAction() {
-            return action;
-        }
-
-        /**
-         * Sets the value of the action property.
-         *
-         * @param value
-         *        allowed object is
-         *        {@link String }
-         *
-         */
-        public void setAction(String value) {
-            this.action = value;
-        }
-
-        /**
-         * Gets the value of the entityType property.
-         *
-         * @return
-         *         possible object is
-         *         {@link String }
-         *
-         */
-        public String getEntityType() {
-            return entityType;
-        }
-
-        /**
-         * Sets the value of the entityType property.
-         *
-         * @param value
-         *        allowed object is
-         *        {@link String }
-         *
-         */
-        public void setEntityType(String value) {
-            this.entityType = value;
-        }
-
-        /**
-         * Gets the value of the topEntityType property.
-         *
-         * @return
-         *         possible object is
-         *         {@link String }
-         *
-         */
-        public String getTopEntityType() {
-            return topEntityType;
-        }
-
-        /**
-         * Sets the value of the topEntityType property.
-         *
-         * @param value
-         *        allowed object is
-         *        {@link String }
-         *
-         */
-        public void setTopEntityType(String value) {
-            this.topEntityType = value;
-        }
-
-        /**
-         * Gets the value of the entityLink property.
-         *
-         * @return
-         *         possible object is
-         *         {@link String }
-         *
-         */
-        public String getEntityLink() {
-            return entityLink;
-        }
-
-        /**
-         * Sets the value of the entityLink property.
-         *
-         * @param value
-         *        allowed object is
-         *        {@link String }
-         *
-         */
-        public void setEntityLink(String value) {
-            this.entityLink = value;
-        }
-
-        /**
-         * Gets the value of the status property.
-         *
-         * @return
-         *         possible object is
-         *         {@link String }
-         *
-         */
-        public String getStatus() {
-            return status;
-        }
-
-        /**
-         * Sets the value of the status property.
-         *
-         * @param value
-         *        allowed object is
-         *        {@link String }
-         *
-         */
-        public void setStatus(String value) {
-            this.status = value;
-        }
-
     }
 
 }
index d6a491e..09fc68a 100644 (file)
@@ -22,6 +22,12 @@ package org.onap.aai.kafka;
 
 import org.json.JSONObject;
 
+/**
+ * MessageProducer interface based on untyped messages
+ *
+ * @deprecated use {@link org.onap.aai.kafka.NotificationProducer} instead
+ */
+@Deprecated
 public interface MessageProducer {
 
     void sendMessageToDefaultDestination(JSONObject finalJson);
diff --git a/aai-core/src/main/java/org/onap/aai/kafka/NotificationProducer.java b/aai-core/src/main/java/org/onap/aai/kafka/NotificationProducer.java
new file mode 100644 (file)
index 0000000..3c73917
--- /dev/null
@@ -0,0 +1,31 @@
+/**
+ * ============LICENSE_START=======================================================
+ * org.onap.aai
+ * ================================================================================
+ * Copyright Â© 2024 Deutsche Telekom. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.aai.kafka;
+
+import org.onap.aai.domain.notificationEvent.NotificationEvent;
+import org.onap.aai.rest.notification.UEBNotification;
+import org.springframework.stereotype.Service;
+
+@Service
+public interface NotificationProducer {
+  public void sendNotification(NotificationEvent notificationEvent);
+  public void sendUEBNotification(UEBNotification uebNotification);
+}
diff --git a/aai-core/src/main/java/org/onap/aai/kafka/NotificationProducerService.java b/aai-core/src/main/java/org/onap/aai/kafka/NotificationProducerService.java
new file mode 100644 (file)
index 0000000..44a03ba
--- /dev/null
@@ -0,0 +1,48 @@
+/**
+ * ============LICENSE_START=======================================================
+ * org.onap.aai
+ * ================================================================================
+ * Copyright Â© 2024 Deutsche Telekom. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.aai.kafka;
+
+import org.onap.aai.domain.notificationEvent.NotificationEvent;
+import org.onap.aai.rest.notification.UEBNotification;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.kafka.core.KafkaTemplate;
+import org.springframework.stereotype.Service;
+
+import lombok.RequiredArgsConstructor;
+
+@Service
+@RequiredArgsConstructor
+public class NotificationProducerService implements NotificationProducer {
+
+  private final KafkaTemplate<String,NotificationEvent> kafkaTemplate;
+  @Value("${aai.notifications.enabled:true}") boolean notificationsEnabled;
+
+  public void sendNotification(NotificationEvent notificationEvent) {
+    if(notificationsEnabled) {
+      kafkaTemplate.send("AAI-EVENT", notificationEvent);
+    }
+  }
+
+  public void sendUEBNotification(UEBNotification uebNotification) {
+    uebNotification.getEvents().stream()
+      .forEach(this::sendNotification);
+  }
+}
index 093062a..9d8f5fd 100644 (file)
@@ -22,8 +22,8 @@
 
 package org.onap.aai.prevalidation;
 
-import com.google.gson.Gson;
-import com.google.gson.JsonSyntaxException;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
 
 import java.net.ConnectException;
 import java.net.SocketTimeoutException;
@@ -41,9 +41,10 @@ import java.util.stream.Collectors;
 import javax.annotation.PostConstruct;
 
 import org.apache.http.conn.ConnectTimeoutException;
+import org.onap.aai.domain.notificationEvent.NotificationEvent;
+import org.onap.aai.domain.notificationEvent.NotificationEvent.EventHeader;
 import org.onap.aai.exceptions.AAIException;
-import org.onap.aai.introspection.Introspector;
-import org.onap.aai.rest.notification.NotificationEvent;
+
 import org.onap.aai.restclient.RestClient;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -74,22 +75,19 @@ public class ValidationService {
     static final String VALIDATION_HEALTH_ENDPOINT = "/v1/info";
 
     private static final Logger LOGGER = LoggerFactory.getLogger(ValidationService.class);
-    private static final String ENTITY_TYPE = "entity-type";
-    private static final String ACTION = "action";
-    private static final String SOURCE_NAME = "source-name";
     private static final String DELETE = "DELETE";
 
     private final RestClient validationRestClient;
     private final String appName;
     private final Set<String> validationNodeTypes;
-    private final Gson gson;
-
-    private List<Pattern> exclusionList;
+    private final ObjectMapper mapper;
+    private final List<Pattern> exclusionList;
 
     public ValidationService(@Qualifier("validationRestClient") RestClient validationRestClient,
             @Value("${spring.application.name}") String appName,
             @Value("${validation.service.node-types}") String validationNodes,
-            @Value("${validation.service.exclusion-regexes:#{null}}") String exclusionRegexes) {
+            @Value("${validation.service.exclusion-regexes:#{null}}") String exclusionRegexes,
+            ObjectMapper mapper) {
         this.validationRestClient = validationRestClient;
         this.appName = appName;
 
@@ -101,7 +99,7 @@ public class ValidationService {
             this.exclusionList =
                     Arrays.stream(exclusionRegexes.split(",")).map(Pattern::compile).collect(Collectors.toList());
         }
-        this.gson = new Gson();
+        this.mapper = mapper;
         LOGGER.info("Successfully initialized the pre validation service");
     }
 
@@ -119,7 +117,7 @@ public class ValidationService {
         ResponseEntity<String> healthCheckResponse = null;
         try {
             healthCheckResponse =
-                    validationRestClient.execute(VALIDATION_HEALTH_ENDPOINT, HttpMethod.GET, httpHeaders, null);
+                    validationRestClient.execute(VALIDATION_HEALTH_ENDPOINT, HttpMethod.GET, httpHeaders);
         } catch (Exception ex) {
             AAIException validationException = new AAIException("AAI_4021", ex);
             throw validationException;
@@ -142,7 +140,7 @@ public class ValidationService {
         }
 
         for (NotificationEvent event : notificationEvents) {
-            Introspector eventHeader = event.getEventHeader();
+            EventHeader eventHeader = event.getEventHeader();
             if (eventHeader == null) {
                 // Should I skip processing the request and let it continue
                 // or fail the request and cause client impact
@@ -156,10 +154,10 @@ public class ValidationService {
             if (isDelete(eventHeader)) {
                 continue;
             }
-            String entityType = eventHeader.getValue(ENTITY_TYPE);
+            String entityType = eventHeader.getEntityType();
 
             if (this.shouldValidate(entityType)) {
-                List<String> violations = preValidate(event.getNotificationEvent());
+                List<String> violations = preValidate(event);
                 if (!violations.isEmpty()) {
                     AAIException aaiException = new AAIException("AAI_4019");
                     aaiException.getTemplateVars().addAll(violations);
@@ -172,8 +170,8 @@ public class ValidationService {
     /**
      * Determine if event is of type delete
      */
-    private boolean isDelete(Introspector eventHeader) {
-        String action = eventHeader.getValue(ACTION);
+    private boolean isDelete(EventHeader eventHeader) {
+        String action = eventHeader.getAction();
         return DELETE.equalsIgnoreCase(action);
     }
 
@@ -186,15 +184,15 @@ public class ValidationService {
         // Get the first notification and if the source of that notification
         // is in one of the regexes then we skip sending it to validation
         NotificationEvent notification = notificationEvents.get(0);
-        Introspector eventHeader = notification.getEventHeader();
+        EventHeader eventHeader = notification.getEventHeader();
         if (eventHeader != null) {
-            String source = eventHeader.getValue(SOURCE_NAME);
+            String source = eventHeader.getSourceName();
             return exclusionList.stream().anyMatch(pattern -> pattern.matcher(source).matches());
         }
         return false;
     }
 
-    public List<String> preValidate(String body) throws AAIException {
+    public List<String> preValidate(NotificationEvent notificationEvent) throws AAIException {
         Map<String, String> httpHeaders = new HashMap<>();
         httpHeaders.put("X-FromAppId", appName);
         httpHeaders.put("X-TransactionID", UUID.randomUUID().toString());
@@ -203,7 +201,8 @@ public class ValidationService {
         List<String> violations = new ArrayList<>();
         ResponseEntity<String> responseEntity;
         try {
-            responseEntity = validationRestClient.execute(VALIDATION_ENDPOINT, HttpMethod.POST, httpHeaders, body);
+            String requestBody = mapper.writeValueAsString(notificationEvent);
+            responseEntity = validationRestClient.execute(VALIDATION_ENDPOINT, HttpMethod.POST, httpHeaders, requestBody);
             Object responseBody = responseEntity.getBody();
             if (isSuccess(responseEntity)) {
                 LOGGER.debug("Validation Service returned following response status code {} and body {}",
@@ -242,8 +241,8 @@ public class ValidationService {
     private Validation getValidation(Object responseBody) {
         Validation validation = null;
         try {
-            validation = gson.fromJson(responseBody.toString(), Validation.class);
-        } catch (JsonSyntaxException jsonException) {
+            validation = mapper.readValue(responseBody.toString(), Validation.class);
+        } catch (JsonProcessingException jsonException) {
             LOGGER.warn("Unable to convert the response body {}", jsonException.getMessage());
         }
         return validation;
index c4f8439..dfebd6e 100644 (file)
@@ -130,7 +130,7 @@ public class HttpEntry {
         this.dbEngine = new JanusGraphDBEngine(queryStyle, loader);
 
         getDbEngine().startTransaction();
-        this.notification = new UEBNotification(loader, loaderFactory, schemaVersions);
+        this.notification = new UEBNotification(loaderFactory, schemaVersions);
         if ("true".equals(AAIConfig.get("aai.notification.depth.all.enabled", "true"))) {
             this.notificationDepth = AAIProperties.MAXIMUM_DEPTH;
         } else {
index 9c3dde1..c277069 100644 (file)
@@ -34,6 +34,7 @@ import org.onap.aai.db.props.AAIProperties;
 import org.onap.aai.exceptions.AAIException;
 import org.onap.aai.introspection.Introspector;
 import org.onap.aai.introspection.LoaderFactory;
+import org.onap.aai.kafka.NotificationProducer;
 import org.onap.aai.prevalidation.ValidationService;
 import org.onap.aai.serialization.db.DBSerializer;
 import org.onap.aai.serialization.engines.query.QueryEngine;
@@ -52,6 +53,7 @@ public class NotificationService {
   public static final Logger LOGGER = LoggerFactory.getLogger(NotificationService.class);
 
   private final ValidationService validationService;
+  private final NotificationProducer notificationProducer;
   private final LoaderFactory loaderFactory;
   private final boolean isDeltaEventsEnabled;
   private final String basePath;
@@ -60,11 +62,13 @@ public class NotificationService {
     @Nullable ValidationService validationService,
     LoaderFactory loaderFactory,
     @Value("${schema.uri.base.path}") String basePath,
-    @Value("${delta.events.enabled:false}") boolean isDeltaEventsEnabled) {
+    @Value("${delta.events.enabled:false}") boolean isDeltaEventsEnabled,
+    NotificationProducer notificationProducer) {
     this.validationService = validationService;
     this.loaderFactory = loaderFactory;
     this.basePath = basePath;
     this.isDeltaEventsEnabled = isDeltaEventsEnabled;
+    this.notificationProducer = notificationProducer;
   }
 
   /**
@@ -99,7 +103,7 @@ public class NotificationService {
       validationService.validate(notification.getEvents());
     }
 
-    notification.triggerEvents();
+    notificationProducer.sendUEBNotification(notification);
     if (isDeltaEventsEnabled) {
       try {
         DeltaEvents deltaEvents = new DeltaEvents(transactionId, sourceOfTruth, schemaVersion.toString(),
index a113cf1..d5803f9 100644 (file)
@@ -4,6 +4,8 @@
  * ================================================================================
  * Copyright Â© 2017-2018 AT&T Intellectual Property. All rights reserved.
  * ================================================================================
+ * Modifications Copyright Â© 2024 Deutsche Telekom.
+ * ================================================================================
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
  * You may obtain a copy of the License at
@@ -30,6 +32,7 @@ import java.util.Map;
 
 import javax.ws.rs.core.Response.Status;
 
+import org.onap.aai.domain.notificationEvent.NotificationEvent.EventHeader;
 import org.onap.aai.exceptions.AAIException;
 import org.onap.aai.introspection.Introspector;
 import org.onap.aai.introspection.Loader;
@@ -41,59 +44,31 @@ import org.onap.aai.logging.LogFormatTools;
 import org.onap.aai.parsers.uri.URIToObject;
 import org.onap.aai.setup.SchemaVersion;
 import org.onap.aai.setup.SchemaVersions;
+import org.onap.aai.util.AAIConfig;
+import org.onap.aai.util.AAIConstants;
+import org.onap.aai.util.FormatDate;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-/**
- * The Class UEBNotification.
- */
 public class UEBNotification {
 
     private static final Logger LOGGER = LoggerFactory.getLogger(UEBNotification.class);
+    private static final FormatDate FORMAT_DATE = new FormatDate("YYYYMMdd-HH:mm:ss:SSS");
+    private static final String EVENT_TYPE = "AAI-EVENT";
 
-    private Loader currentVersionLoader = null;
-    protected Map<String, NotificationEvent> events = null;
-    private SchemaVersion notificationVersion = null;
-
-    /**
-     * Instantiates a new UEB notification.
-     *
-     * @param loader the loader
-     */
-    public UEBNotification(Loader loader, LoaderFactory loaderFactory, SchemaVersions schemaVersions) {
-        events = new LinkedHashMap<>();
-        SchemaVersion defaultVersion = schemaVersions.getDefaultVersion();
-        currentVersionLoader = loaderFactory.createLoaderForVersion(loader.getModelType(), defaultVersion);
-        notificationVersion = defaultVersion;
-    }
+    private final String domain = AAIConfig.get("aai.notificationEvent.default.domain", "UNK");
+    private final String sequenceNumber = AAIConfig.get("aai.notificationEvent.default.sequenceNumber", "UNK");
+    private final String severity = AAIConfig.get("aai.notificationEvent.default.severity", "UNK");
+    private final Map<String, org.onap.aai.domain.notificationEvent.NotificationEvent> events;
+    private final Loader currentVersionLoader;
+    private final SchemaVersion notificationVersion;
 
-    /**
-     * Instantiates a new UEB notification.
-     *
-     * @param modelType - Model type
-     * @param loaderFactory - the loader factory
-     * @param schemaVersions the schema versions bean
-     */
-    public UEBNotification(ModelType modelType, LoaderFactory loaderFactory, SchemaVersions schemaVersions) {
+    public UEBNotification(LoaderFactory loaderFactory, SchemaVersions schemaVersions) {
         events = new LinkedHashMap<>();
-        SchemaVersion defaultVersion = schemaVersions.getDefaultVersion();
-        currentVersionLoader = loaderFactory.createLoaderForVersion(modelType, defaultVersion);
-        notificationVersion = defaultVersion;
+        notificationVersion = schemaVersions.getDefaultVersion();
+        currentVersionLoader = loaderFactory.createLoaderForVersion(ModelType.MOXY, notificationVersion);
     }
 
-    /**
-     * Creates the notification event.
-     *
-     * @param transactionId the X-TransactionId
-     * @param sourceOfTruth
-     * @param status the status
-     * @param uri the uri
-     * @param obj the obj
-     * @param basePath base URI path
-     * @throws AAIException the AAI exception
-     * @throws IllegalArgumentException the illegal argument exception
-     * @throws UnsupportedEncodingException the unsupported encoding exception
-     */
     public void createNotificationEvent(String transactionId, String sourceOfTruth, Status status, URI uri,
             Introspector obj, HashMap<String, Introspector> relatedObjects, String basePath)
             throws AAIException, UnsupportedEncodingException {
@@ -102,25 +77,32 @@ public class UEBNotification {
 
         try {
             EntityConverter entityConverter = new EntityConverter(new URIToObject(currentVersionLoader, uri, relatedObjects));
-            Introspector eventHeader = currentVersionLoader.introspectorFromName("notification-event-header");
+            EventHeader eventHeader = new EventHeader();
 
             basePath = formatBasePath(basePath);
-
             String entityLink = formatEntityLink(uri, basePath);
-
-            eventHeader.setValue("entity-link", entityLink);
-            eventHeader.setValue("action", action);
-            eventHeader.setValue("entity-type", obj.getDbName());
-            eventHeader.setValue("top-entity-type", entityConverter.getTopEntityName());
-            eventHeader.setValue("source-name", sourceOfTruth);
-            eventHeader.setValue("version", notificationVersion.toString());
-            eventHeader.setValue("id", transactionId);
-
-
-            Introspector eventObject = entityConverter.convert(obj);
-
-            final NotificationEvent event =
-                    new NotificationEvent(currentVersionLoader, eventHeader, eventObject, transactionId, sourceOfTruth);
+            eventHeader.setEntityLink(entityLink);
+            eventHeader.setAction(action);
+            eventHeader.setEntityType(obj.getDbName());
+            eventHeader.setTopEntityType(entityConverter.getTopEntityName());
+            eventHeader.setSourceName(sourceOfTruth);
+            eventHeader.setVersion(notificationVersion.toString());
+            eventHeader.setId(transactionId);
+
+            // default values
+            eventHeader.setTimestamp(FORMAT_DATE.getDateTime());
+            eventHeader.setEventType(EVENT_TYPE);
+            eventHeader.setDomain(domain);
+            eventHeader.setSequenceNumber(sequenceNumber);
+            eventHeader.setSeverity(severity);
+
+            Introspector entity = entityConverter.convert(obj);
+
+            final org.onap.aai.domain.notificationEvent.NotificationEvent event =
+                new org.onap.aai.domain.notificationEvent.NotificationEvent();
+            event.setEventHeader(eventHeader);
+            event.setCambriaPartition(AAIConstants.UEB_PUB_PARTITION_AAI);
+            event.setEntity(entity);
             events.put(uri.toString(), event);
         } catch (AAIUnknownObjectException e) {
             throw new RuntimeException("Fatal error - notification-event-header object not found!");
@@ -172,26 +154,10 @@ public class UEBNotification {
         return action;
     }
 
-    /**
-     * Trigger events.
-     *
-     * @throws AAIException the AAI exception
-     */
-    public void triggerEvents() throws AAIException {
-        for (NotificationEvent event : events.values()) {
-            event.trigger();
-        }
-        clearEvents();
-    }
-
-    public List<NotificationEvent> getEvents() {
+    public List<org.onap.aai.domain.notificationEvent.NotificationEvent> getEvents() {
         return new ArrayList<>(this.events.values());
     }
 
-    public Map<String, NotificationEvent> getEventsMap() {
-        return this.events;
-    }
-
     private String getUri(String uri, String basePath) {
         if (uri == null || uri.isEmpty()) {
             return "";
index c1e8357..d201134 100644 (file)
@@ -36,6 +36,7 @@ import org.onap.aai.introspection.LoaderFactory;
 import org.onap.aai.kafka.AAIKafkaEventJMSConsumer;
 import org.onap.aai.kafka.AAIKafkaEventJMSProducer;
 import org.onap.aai.kafka.MessageProducer;
+import org.onap.aai.kafka.NotificationProducer;
 import org.onap.aai.rest.notification.NotificationService;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -147,8 +148,8 @@ public class KafkaConfig {
         } else {
             props.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, bootstrapServers);
         }
-        props.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer");
-        props.put("value.serializer", "org.apache.kafka.common.serialization.StringSerializer");
+        props.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, "org.apache.kafka.common.serialization.StringSerializer");
+        props.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, "org.apache.kafka.common.serialization.StringSerializer");
         props.put(ProducerConfig.RETRIES_CONFIG, retries);
         props.put(ProducerConfig.MAX_IN_FLIGHT_REQUESTS_PER_CONNECTION, "5");
 
@@ -179,7 +180,7 @@ public class KafkaConfig {
     @ConditionalOnMissingBean
     public NotificationService notificationService(LoaderFactory loaderFactory,
     @Value("${schema.uri.base.path}") String basePath,
-    @Value("${delta.events.enabled:false}") boolean isDeltaEventsEnabled) {
-        return new NotificationService(null, loaderFactory, basePath, isDeltaEventsEnabled);
+    @Value("${delta.events.enabled:false}") boolean isDeltaEventsEnabled, NotificationProducer notificationProducer) {
+        return new NotificationService(null, loaderFactory, basePath, isDeltaEventsEnabled, notificationProducer);
     }
 }
diff --git a/aai-core/src/main/java/org/onap/aai/web/KafkaNotificationEventConfig.java b/aai-core/src/main/java/org/onap/aai/web/KafkaNotificationEventConfig.java
new file mode 100644 (file)
index 0000000..09d8b26
--- /dev/null
@@ -0,0 +1,111 @@
+/**
+ * ============LICENSE_START=======================================================
+ * org.onap.aai
+ * ================================================================================
+ * Copyright Â© 2024 Deutsche Telekom. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.aai.web;
+
+import java.util.Map;
+import java.util.HashMap;
+
+import org.apache.kafka.clients.producer.ProducerConfig;
+import org.apache.kafka.common.serialization.StringSerializer;
+import org.onap.aai.domain.notificationEvent.NotificationEvent;
+import org.onap.aai.kafka.NotificationProducer;
+import org.onap.aai.kafka.NotificationProducerService;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.kafka.core.DefaultKafkaProducerFactory;
+import org.springframework.kafka.core.KafkaTemplate;
+import org.springframework.kafka.core.ProducerFactory;
+import org.springframework.kafka.support.serializer.JsonSerializer;
+
+@Configuration
+public class KafkaNotificationEventConfig {
+
+    private static final Logger logger = LoggerFactory.getLogger(KafkaNotificationEventConfig.class);
+
+    @Value("${jms.bind.address}")
+    private String bindAddress;
+
+    @Value("${spring.kafka.producer.bootstrap-servers}")
+    private String bootstrapServers;
+
+    @Value("${spring.kafka.producer.properties.security.protocol}")
+    private String securityProtocol;
+
+    @Value("${spring.kafka.producer.properties.sasl.mechanism}")
+    private String saslMechanism;
+
+    @Value("${spring.kafka.producer.properties.sasl.jaas.config:#{null}}")
+    private String saslJaasConfig;
+
+    @Value("${spring.kafka.producer.retries:3}")
+    private String retries;
+
+    private Map<String, Object> buildKafkaProperties() throws Exception {
+        Map<String, Object> props = new HashMap<>();
+        if (bootstrapServers == null) {
+            logger.error("Environment Variable " + bootstrapServers + " is missing");
+            throw new Exception("Environment Variable " + bootstrapServers + " is missing");
+        } else {
+            props.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, bootstrapServers);
+        }
+        props.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, JsonSerializer.class);
+        props.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, StringSerializer.class);
+        props.put(ProducerConfig.RETRIES_CONFIG, retries);
+        props.put(ProducerConfig.MAX_IN_FLIGHT_REQUESTS_PER_CONNECTION, "5");
+
+        if (saslJaasConfig == null) {
+            logger.info("Not using any authentication for kafka interaction");
+        } else {
+            logger.info("Using authentication provided by kafka interaction");
+            // Strimzi Kafka security properties
+            props.put("security.protocol", securityProtocol);
+            props.put("sasl.mechanism", saslMechanism);
+            props.put("sasl.jaas.config", saslJaasConfig);
+        }
+        return props;
+    }
+
+    @Bean
+    public ProducerFactory<String, NotificationEvent> notificationEventProducerFactory() throws Exception {
+        Map<String, Object> props = buildKafkaProperties();
+
+        return new DefaultKafkaProducerFactory<>(props);
+    }
+
+    @Bean
+    public KafkaTemplate<String, NotificationEvent> kafkaNotificationEventTemplate(ProducerFactory<String, NotificationEvent> producerFactory) throws Exception {
+      try {
+
+        return new KafkaTemplate<>(producerFactory);
+      } catch (Exception e) {
+        String smth = "";
+        return null;
+      }
+    }
+
+    @Bean
+    public NotificationProducer notificationProducer(KafkaTemplate<String,NotificationEvent> kafkaTemplate) {
+        return new NotificationProducerService(kafkaTemplate);
+    }
+}
index 08a0e91..f51b573 100644 (file)
@@ -41,6 +41,7 @@ import org.onap.aai.setup.SchemaVersion;
 import org.onap.aai.setup.SchemaVersions;
 import org.onap.aai.util.AAIConstants;
 import org.onap.aai.web.KafkaConfig;
+import org.onap.aai.web.KafkaNotificationEventConfig;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.test.context.ContextConfiguration;
@@ -54,11 +55,12 @@ import org.springframework.test.context.web.WebAppConfiguration;
         classes = {ConfigConfiguration.class, AAIConfigTranslator.class, EdgeIngestor.class, EdgeSerializer.class,
                 NodeIngestor.class, SpringContextAware.class, IntrospectionConfig.class, RestBeanConfig.class,
                 XmlFormatTransformerConfiguration.class, ValidationService.class, ValidationConfiguration.class,
-                KafkaConfig.class, LoaderFactory.class, NotificationService.class})
+                KafkaConfig.class, LoaderFactory.class, NotificationService.class, KafkaNotificationEventConfig.class})
 @TestPropertySource(
         properties = {"schema.uri.base.path = /aai", "schema.xsd.maxoccurs = 5000", "schema.translator.list=config",
                 "schema.nodes.location=src/test/resources/onap/oxm",
-                "schema.edges.location=src/test/resources/onap/dbedgerules"})
+                "schema.edges.location=src/test/resources/onap/dbedgerules",
+                "aai.notifications.enabled=false"})
 public abstract class AAISetup {
 
     @ClassRule
index b38a5c6..b082516 100644 (file)
@@ -38,6 +38,7 @@ import org.onap.aai.setup.SchemaVersion;
 import org.onap.aai.setup.SchemaVersions;
 import org.onap.aai.testutils.TestUtilConfigTranslatorforDataLink;
 import org.onap.aai.util.AAIConstants;
+import org.onap.aai.web.KafkaNotificationEventConfig;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.test.annotation.DirtiesContext;
@@ -49,13 +50,13 @@ import org.springframework.test.context.junit4.rules.SpringMethodRule;
 @ContextConfiguration(
         classes = {ConfigConfiguration.class, TestUtilConfigTranslatorforDataLink.class, EdgeIngestor.class,
                 EdgeSerializer.class, NodeIngestor.class, SpringContextAware.class, IntrospectionConfig.class,
-                RestBeanConfig.class, XmlFormatTransformerConfiguration.class, LoaderFactory.class, NotificationService.class})
+                RestBeanConfig.class, XmlFormatTransformerConfiguration.class, LoaderFactory.class, NotificationService.class, KafkaNotificationEventConfig.class})
 @TestPropertySource(
         properties = {"schema.uri.base.path = /aai", "schema.xsd.maxoccurs = 5000", "schema.version.api.default = v4",
                 "schema.version.edge.label.start = v4", "schema.version.depth.start = v3",
                 "schema.version.app.root.start = v4", "schema.version.related.link.start = v4",
                 "schema.version.namespace.change.start = v4", "schema.version.list = v1,v2,v3,v4",
-                "schema.translator.list = config"})
+                "schema.translator.list = config","aai.notifications.enabled = false"})
 @DirtiesContext(classMode = DirtiesContext.ClassMode.BEFORE_CLASS)
 public abstract class DataLinkSetup {
 
index 49524c4..62f63ea 100644 (file)
@@ -153,14 +153,6 @@ public class HttpTestUtil extends RESTAPI {
 
         doReturn(null).when(queryParameters).remove(any());
         when(httpHeaders.getMediaType()).thenReturn(APPLICATION_JSON);
-
-        try {
-            if (notification != null) {
-                doNothing().when(notification).triggerEvents();
-            }
-        } catch (AAIException e) {
-            e.printStackTrace();
-        }
     }
 
     public Response doPut(String uri, String payload) throws UnsupportedEncodingException, AAIException {
index 51eb0ce..60749dd 100644 (file)
@@ -27,14 +27,14 @@ import java.nio.file.Path;
 import org.junit.Before;
 import org.junit.Test;
 import org.onap.aai.AAISetup;
-import org.onap.aai.exceptions.AAIException;
-import org.onap.aai.introspection.Introspector;
-import org.onap.aai.introspection.Loader;
+import org.onap.aai.domain.notificationEvent.NotificationEvent;
+import org.onap.aai.domain.notificationEvent.NotificationEvent.EventHeader;
 import org.onap.aai.introspection.exceptions.AAIUnmarshallingException;
 import org.onap.aai.setup.SchemaVersion;
 import org.skyscreamer.jsonassert.JSONAssert;
 
 import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.module.jaxb.JaxbAnnotationModule;
 
 public class IntrospectorSerializationTest extends AAISetup {
 
@@ -55,4 +55,33 @@ public class IntrospectorSerializationTest extends AAISetup {
     String result = mapper.writeValueAsString(introspector);
     JSONAssert.assertEquals(pserver, result, false);
   }
+
+  @Test
+  public void serializeNotificationEvent() throws IOException, AAIUnmarshallingException {
+    mapper = new ObjectMapper();
+    mapper.registerModule(new JaxbAnnotationModule());
+
+    String pserver = new String(Files.readAllBytes(Path.of("src/test/resources/payloads/templates/pserver.json"))).replace("${hostname}", "pserver1");
+    Introspector introspector = loader.unmarshal("pserver", pserver);
+
+    NotificationEvent notificationEvent = new NotificationEvent();
+    notificationEvent.setCambriaPartition("AAI");
+    notificationEvent.setEntity(introspector);
+    EventHeader eventHeader = new EventHeader();
+    eventHeader.setSeverity("NORMAL");
+    eventHeader.setEntityType("pserver");
+    eventHeader.setTopEntityType("pserver");
+    eventHeader.setEntityLink("/aai/v14/cloud-infrastructure/pservers/pserver/pserver1");
+    eventHeader.setEventType("AAI-EVENT");
+    eventHeader.setDomain("devINT1");
+    eventHeader.setAction("CREATE");
+    eventHeader.setSequenceNumber("0");
+    eventHeader.setId("someTransaction");
+    eventHeader.setSourceName("test");
+    eventHeader.setVersion("v14");
+    notificationEvent.setEventHeader(eventHeader);
+    String result = mapper.writeValueAsString(notificationEvent);
+    String expectedEvent = new String(Files.readAllBytes(Path.of("src/test/resources/payloads/expected/pserver-event.json")));
+    JSONAssert.assertEquals(expectedEvent, result, false);
+  }
 }
index ce636a5..fa52c01 100644 (file)
@@ -44,6 +44,7 @@ import org.junit.Test;
 import org.mockito.Mock;
 import org.onap.aai.AAISetup;
 import org.onap.aai.PayloadUtil;
+import org.onap.aai.domain.notificationEvent.NotificationEvent;
 import org.onap.aai.exceptions.AAIException;
 import org.onap.aai.introspection.Introspector;
 import org.onap.aai.introspection.Loader;
@@ -63,10 +64,11 @@ import org.springframework.kafka.test.utils.KafkaTestUtils;
 import org.springframework.test.context.ActiveProfiles;
 import org.springframework.test.context.TestPropertySource;
 
+import com.fasterxml.jackson.databind.ObjectMapper;
+
 import lombok.SneakyThrows;
 import lombok.extern.slf4j.Slf4j;
 
-@Ignore
 @Slf4j
 @ActiveProfiles("kafka")
 @Import(KafkaTestConfiguration.class)
@@ -77,7 +79,8 @@ import lombok.extern.slf4j.Slf4j;
           "aai.events.enabled=true",
           "spring.kafka.producer.retries=0",
           "spring.kafka.producer.properties.sasl.jaas.config=#{null}",
-          "spring.kafka.producer.bootstrap-servers=${spring.embedded.kafka.brokers}"
+          "spring.kafka.producer.bootstrap-servers=${spring.embedded.kafka.brokers}",
+          "aai.notifications.enabled=true"
         })
 public class AAIKafkaEventIntegrationTest extends AAISetup {
 
@@ -85,7 +88,10 @@ public class AAIKafkaEventIntegrationTest extends AAISetup {
     private KafkaTemplate<String, String> kafkaTemplate;
 
     @Autowired
-    MessageProducer messageProducer;
+    ObjectMapper mapper;
+
+    @Autowired
+    NotificationProducer messageProducer;
 
     @Autowired
     private ConsumerFactory<String, String> consumerFactory;
@@ -103,6 +109,7 @@ public class AAIKafkaEventIntegrationTest extends AAISetup {
     }
 
     @Test
+    @Ignore
     public void onMessage_shouldSendMessageToKafkaTopic_whenAAIEventReceived()
             throws Exception {
         Consumer<String, String> consumer = consumerFactory.createConsumer();
@@ -110,8 +117,9 @@ public class AAIKafkaEventIntegrationTest extends AAISetup {
         consumer.subscribe(Collections.singletonList("AAI-EVENT"));
 
         String payload = PayloadUtil.getResourcePayload("aai-event.json");
+        NotificationEvent event = mapper.readValue(payload, NotificationEvent.class);
         String expectedResponse = PayloadUtil.getExpectedPayload("aai-event.json");
-        messageProducer.sendMessageToDefaultDestination(payload);
+        messageProducer.sendNotification(event);
 
         ConsumerRecords<String, String> consumerRecords = KafkaTestUtils.getRecords(consumer, 10000);
         assertFalse(consumerRecords.isEmpty());
@@ -121,8 +129,6 @@ public class AAIKafkaEventIntegrationTest extends AAISetup {
     }
 
     @Test
-    @Ignore
-    // only works when aai.jms.enable=true in aaiconfig.properties
     public void thatEventsAreBeingCreated() throws AAIException, IOException {
         Consumer<String, String> consumer = consumerFactory.createConsumer();
         consumer.subscribe(Collections.singletonList("AAI-EVENT"));
index 8ef1d70..db9ee96 100644 (file)
@@ -24,9 +24,14 @@ import static org.hamcrest.CoreMatchers.containsString;
 import static org.hamcrest.CoreMatchers.is;
 import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertThat;
+import static org.mockito.ArgumentCaptor.forClass;
 import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyString;
 import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.verify;
 
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.module.jaxb.JaxbAnnotationModule;
 import com.google.gson.Gson;
 
 import java.io.IOException;
@@ -38,10 +43,13 @@ import org.apache.http.conn.ConnectTimeoutException;
 import org.junit.Before;
 import org.junit.Rule;
 import org.junit.Test;
+import org.mockito.ArgumentCaptor;
 import org.mockito.Mockito;
 import org.onap.aai.PayloadUtil;
+import org.onap.aai.domain.notificationEvent.NotificationEvent;
 import org.onap.aai.exceptions.AAIException;
 import org.onap.aai.restclient.RestClient;
+import org.skyscreamer.jsonassert.JSONAssert;
 import org.springframework.boot.test.system.OutputCaptureRule;
 import org.springframework.http.HttpMethod;
 import org.springframework.http.ResponseEntity;
@@ -56,12 +64,15 @@ public class ValidationServiceTest {
     public OutputCaptureRule capture = new OutputCaptureRule();
 
     private Gson gson;
+    private ObjectMapper mapper;
 
     @Before
     public void setUp() throws Exception {
+        mapper = new ObjectMapper();
+        mapper.registerModule(new JaxbAnnotationModule());
         gson = new Gson();
         restClient = Mockito.mock(RestClient.class);
-        validationService = Mockito.spy(new ValidationService(restClient, "JUNIT", "generic-vnf", null));
+        validationService = Mockito.spy(new ValidationService(restClient, "JUNIT", "generic-vnf", null, mapper));
     }
 
     @Test
@@ -81,14 +92,19 @@ public class ValidationServiceTest {
             throws IOException, AAIException {
 
         String pserverRequest = PayloadUtil.getResourcePayload("prevalidation/success-request-with-no-violations.json");
+        NotificationEvent notificationEvent = mapper.readValue(pserverRequest, NotificationEvent.class);
 
         Mockito.when(restClient.execute(eq(ValidationService.VALIDATION_ENDPOINT), eq(HttpMethod.POST), any(),
-                eq(pserverRequest))).thenThrow(new RuntimeException(new ConnectException("Connection refused")));
+                anyString())).thenThrow(new RuntimeException(new ConnectException("Connection refused")));
 
-        validationService.preValidate(pserverRequest);
+        validationService.preValidate(notificationEvent);
 
         assertThat(capture.toString(),
                 containsString("Connection refused to the validation microservice due to service unreachable"));
+                ArgumentCaptor<String> bodyCaptor = forClass(String.class);
+        verify(restClient).execute(eq(ValidationService.VALIDATION_ENDPOINT), eq(HttpMethod.POST), any(), bodyCaptor.capture());
+
+        JSONAssert.assertEquals(pserverRequest, bodyCaptor.getValue(), false);
     }
 
     @Test
@@ -96,15 +112,20 @@ public class ValidationServiceTest {
             throws IOException, AAIException {
 
         String pserverRequest = PayloadUtil.getResourcePayload("prevalidation/success-request-with-no-violations.json");
+        NotificationEvent notificationEvent = mapper.readValue(pserverRequest, NotificationEvent.class);
 
         Mockito.when(restClient.execute(eq(ValidationService.VALIDATION_ENDPOINT), eq(HttpMethod.POST), any(),
-                eq(pserverRequest)))
+                anyString()))
                 .thenThrow(new RuntimeException(new ConnectTimeoutException("Connection timed out")));
 
-        validationService.preValidate(pserverRequest);
+        validationService.preValidate(notificationEvent);
 
         assertThat(capture.toString(), containsString(
                 "Connection timeout to the validation microservice as this could indicate the server is unable to reach port"));
+        ArgumentCaptor<String> bodyCaptor = forClass(String.class);
+        verify(restClient).execute(eq(ValidationService.VALIDATION_ENDPOINT), eq(HttpMethod.POST), any(), bodyCaptor.capture());
+
+        JSONAssert.assertEquals(pserverRequest, bodyCaptor.getValue(), false);
     }
 
     @Test
@@ -112,22 +133,28 @@ public class ValidationServiceTest {
             throws IOException, AAIException {
 
         String pserverRequest = PayloadUtil.getResourcePayload("prevalidation/success-request-with-no-violations.json");
+        NotificationEvent notificationEvent = mapper.readValue(pserverRequest, NotificationEvent.class);
         String validationResponse =
                 PayloadUtil.getResourcePayload("prevalidation/success-response-with-empty-violations.json");
 
         ResponseEntity responseEntity = Mockito.mock(ResponseEntity.class, Mockito.RETURNS_DEEP_STUBS);
 
         Mockito.when(restClient.execute(eq(ValidationService.VALIDATION_ENDPOINT), eq(HttpMethod.POST), any(),
-                eq(pserverRequest))).thenReturn(responseEntity);
+                anyString())).thenReturn(responseEntity);
 
         Mockito.when(responseEntity.getStatusCodeValue()).thenReturn(200);
         Mockito.when(responseEntity.getBody()).thenReturn(validationResponse);
 
         Mockito.doReturn(true).when(validationService).isSuccess(responseEntity);
 
-        List<String> errorMessages = validationService.preValidate(pserverRequest);
+        List<String> errorMessages = validationService.preValidate(notificationEvent);
         assertNotNull("Expected the error messages to be not null", errorMessages);
         assertThat(errorMessages.size(), is(0));
+
+        ArgumentCaptor<String> bodyCaptor = forClass(String.class);
+        verify(restClient).execute(eq(ValidationService.VALIDATION_ENDPOINT), eq(HttpMethod.POST), any(), bodyCaptor.capture());
+
+        JSONAssert.assertEquals(pserverRequest, bodyCaptor.getValue(), false);
     }
 
     @Test
@@ -135,16 +162,21 @@ public class ValidationServiceTest {
             throws IOException, AAIException {
 
         String pserverRequest = PayloadUtil.getResourcePayload("prevalidation/success-request-with-no-violations.json");
+        NotificationEvent notificationEvent = mapper.readValue(pserverRequest, NotificationEvent.class);
 
         Mockito.when(restClient.execute(eq(ValidationService.VALIDATION_ENDPOINT), eq(HttpMethod.POST), any(),
-                eq(pserverRequest)))
+                anyString()))
                 .thenThrow(new RuntimeException(
                         new SocketTimeoutException("Request timed out due to taking longer than client expected")));
 
-        validationService.preValidate(pserverRequest);
+        validationService.preValidate(notificationEvent);
 
         assertThat(capture.toString(),
                 containsString("Request to validation service took longer than the currently set timeout"));
+                ArgumentCaptor<String> bodyCaptor = forClass(String.class);
+        verify(restClient).execute(eq(ValidationService.VALIDATION_ENDPOINT), eq(HttpMethod.POST), any(), bodyCaptor.capture());
+
+        JSONAssert.assertEquals(pserverRequest, bodyCaptor.getValue(), false);
     }
 
     @Test
index 8f4a209..629243a 100644 (file)
@@ -58,6 +58,7 @@ import org.onap.aai.serialization.db.exceptions.NoEdgeRuleFoundException;
 import org.onap.aai.serialization.queryformats.QueryFormatTestHelper;
 import org.onap.aai.setup.SchemaVersions;
 import org.onap.aai.util.AAIConstants;
+import org.onap.aai.web.KafkaNotificationEventConfig;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.test.annotation.DirtiesContext;
 import org.springframework.test.context.ContextConfiguration;
@@ -68,11 +69,12 @@ import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
 @ContextConfiguration(
         classes = {ConfigConfiguration.class, QueryTestsConfigTranslator.class, NodeIngestor.class, EdgeIngestor.class,
                 EdgeSerializer.class, SpringContextAware.class, IntrospectionConfig.class,
-                XmlFormatTransformerConfiguration.class, LoaderFactory.class, NotificationService.class})
+                XmlFormatTransformerConfiguration.class, LoaderFactory.class, NotificationService.class, KafkaNotificationEventConfig.class})
 @DirtiesContext(classMode = DirtiesContext.ClassMode.AFTER_CLASS)
 @TestPropertySource(
         properties = {"schema.translator.list = config", "schema.nodes.location=src/test/resources/onap/oxm",
-                "schema.edges.location=src/test/resources/onap/dbedgerules"})
+                "schema.edges.location=src/test/resources/onap/dbedgerules",
+                "aai.notifications.enabled=false"})
 public abstract class QueryBuilderTestAbstraction {
 
     protected Loader loader;
index 218c3a2..3873128 100644 (file)
@@ -45,8 +45,9 @@ import org.onap.aai.HttpTestUtil;
 import org.onap.aai.PayloadUtil;
 import org.onap.aai.db.props.AAIProperties;
 import org.onap.aai.dbmap.AAIGraph;
+import org.onap.aai.domain.notificationEvent.NotificationEvent;
+import org.onap.aai.domain.notificationEvent.NotificationEvent.EventHeader;
 import org.onap.aai.introspection.ModelType;
-import org.onap.aai.rest.notification.NotificationEvent;
 import org.onap.aai.rest.notification.UEBNotification;
 import org.onap.aai.serialization.engines.QueryStyle;
 import org.skyscreamer.jsonassert.JSONAssert;
@@ -73,7 +74,7 @@ public class ImpliedDeleteIntegrationTest extends AAISetup {
 
         String uri = "/aai/v12/cloud-infrastructure/pservers/pserver/test-pserver-implied-delete";
 
-        UEBNotification notification = Mockito.spy(new UEBNotification(ModelType.MOXY, loaderFactory, schemaVersions));
+        UEBNotification notification = Mockito.spy(new UEBNotification(loaderFactory, schemaVersions));
         HttpTestUtil httpTestUtil = new HttpTestUtil(queryStyle, notification, AAIProperties.MINIMUM_DEPTH);
 
         String resource = PayloadUtil.getResourcePayload("pserver-implied-delete.json");
@@ -91,7 +92,7 @@ public class ImpliedDeleteIntegrationTest extends AAISetup {
         JSONAssert.assertEquals(resource, response.getEntity().toString(), false);
         jsonObject.getJSONObject("p-interfaces").remove("p-interface");
 
-        notification = Mockito.spy(new UEBNotification(ModelType.MOXY, loaderFactory, schemaVersions));
+        notification = Mockito.spy(new UEBNotification(loaderFactory, schemaVersions));
         httpTestUtil = new HttpTestUtil(queryStyle, notification, AAIProperties.MINIMUM_DEPTH);
 
         response = httpTestUtil.doPut(uri, jsonObject.toString());
@@ -100,10 +101,11 @@ public class ImpliedDeleteIntegrationTest extends AAISetup {
         List<NotificationEvent> notificationEvents = notification.getEvents();
         assertThat(notificationEvents.size(), is(5));
 
-        List<String> notificationEventHeaders = notification.getEvents().stream()
-                .map(event -> event.getEventHeader().marshal(false)).collect(Collectors.toList());
+        List<EventHeader> notificationEventHeaders = notification.getEvents().stream()
+                .map(NotificationEvent::getEventHeader)
+                .collect(Collectors.toList());
 
-        Long deletedEventsCount = notificationEventHeaders.stream().filter(e -> e.contains("\"DELETE\"")).count();
+        Long deletedEventsCount = notificationEventHeaders.stream().filter(e -> "DELETE".equals(e.getAction())).count();
 
         assertThat(deletedEventsCount, is(4L));
 
index 4b52462..0eafdf1 100644 (file)
@@ -26,6 +26,7 @@ import static org.hamcrest.CoreMatchers.not;
 import static org.hamcrest.junit.MatcherAssert.assertThat;
 import static org.junit.Assert.assertEquals;
 
+import com.fasterxml.jackson.databind.ObjectMapper;
 import com.google.gson.JsonObject;
 import com.google.gson.JsonParser;
 
@@ -55,24 +56,29 @@ import org.onap.aai.HttpTestUtil;
 import org.onap.aai.PayloadUtil;
 import org.onap.aai.db.props.AAIProperties;
 import org.onap.aai.dbmap.AAIGraph;
+import org.onap.aai.domain.notificationEvent.NotificationEvent;
+import org.onap.aai.domain.notificationEvent.NotificationEvent.EventHeader;
 import org.onap.aai.exceptions.AAIException;
 import org.onap.aai.introspection.ModelType;
-import org.onap.aai.rest.notification.NotificationEvent;
 import org.onap.aai.rest.notification.UEBNotification;
 import org.onap.aai.serialization.engines.QueryStyle;
 import org.skyscreamer.jsonassert.JSONAssert;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.test.annotation.DirtiesContext;
 
 @RunWith(value = Parameterized.class)
 @DirtiesContext(classMode = DirtiesContext.ClassMode.BEFORE_CLASS)
 public class NotificationDmaapEventTest extends AAISetup {
 
+//     ObjectMapper mapper = new ObjectMapper();
+    @Autowired private ObjectMapper mapper;
+
     @Parameterized.Parameter
     public QueryStyle queryStyle;
 
     @Parameterized.Parameters(name = "QueryStyle.{0}")
     public static Collection<Object[]> data() {
-        return Arrays.asList(new Object[][] {{QueryStyle.TRAVERSAL}, {QueryStyle.TRAVERSAL_URI}});
+        return Arrays.asList(new Object[][] {{QueryStyle.TRAVERSAL}});
     }
 
     @Test
@@ -80,7 +86,7 @@ public class NotificationDmaapEventTest extends AAISetup {
             throws IOException, AAIException {
 
         String uri = "/aai/v14/cloud-infrastructure/pservers/pserver/example-hostname-val-85598";
-        UEBNotification notification = Mockito.spy(new UEBNotification(ModelType.MOXY, loaderFactory, schemaVersions));
+        UEBNotification notification = Mockito.spy(new UEBNotification(loaderFactory, schemaVersions));
         HttpTestUtil httpTestUtil = new HttpTestUtil(queryStyle, notification, AAIProperties.MINIMUM_DEPTH);
 
         String resource = PayloadUtil.getResourcePayload("pserver-with-children-for-notification.json");
@@ -97,13 +103,8 @@ public class NotificationDmaapEventTest extends AAISetup {
 
         // Verify all the events are create since its a new PUT
         notification.getEvents().forEach((event) -> {
-
-            String header = event.getEventHeader().marshal(false);
-
-            assertThat(event.getEventHeader().marshal(false), containsString("\"CREATE\""));
-
-            assertThat(header, containsString("\"top-entity-type\":\"pserver\""));
-
+            assertEquals("CREATE", event.getEventHeader().getAction());
+            assertEquals("pserver", event.getEventHeader().getTopEntityType());
         });
 
         response = httpTestUtil.doGet(uri);
@@ -116,7 +117,7 @@ public class NotificationDmaapEventTest extends AAISetup {
             throws IOException, AAIException {
 
         String uri = "/aai/v14/cloud-infrastructure/pservers/pserver/example-hostname-val-85598";
-        UEBNotification notification = Mockito.spy(new UEBNotification(ModelType.MOXY, loaderFactory, schemaVersions));
+        UEBNotification notification = Mockito.spy(new UEBNotification(loaderFactory, schemaVersions));
         HttpTestUtil httpTestUtil = new HttpTestUtil(queryStyle);
 
         String pserverResource = PayloadUtil.getResourcePayload("pserver-with-children-for-notification.json");
@@ -147,19 +148,20 @@ public class NotificationDmaapEventTest extends AAISetup {
         List<NotificationEvent> events = notification.getEvents();
         assertThat(events.size(), is(2));
 
-        String notificationEventHeader = events.get(1).getEventHeader().marshal(false);
-        String notificationEventBody = events.get(1).getObj().marshal(false);
+        EventHeader notificationEventHeader = events.get(1).getEventHeader();
+        String notificationEventBody = events.get(1).getEntity().toString();
 
-        assertThat(notificationEventHeader, containsString("\"action\":\"CREATE\""));
-        assertThat(notificationEventHeader, containsString("\"entity-type\":\"p-interface\""));
-        assertThat(notificationEventHeader, containsString("\"top-entity-type\":\"pserver\""));
+        assertEquals("CREATE", notificationEventHeader.getAction());
+        assertEquals("p-interface", notificationEventHeader.getEntityType());
+        assertEquals("pserver", notificationEventHeader.getTopEntityType());
 
         String expectedNotificationHeader = PayloadUtil.getResourcePayload(
                 "notification-dmaap-events/depth-zero/expected-notification-header-create-child-on-existing-obj.json");
         String expectedNotificationBody = PayloadUtil.getResourcePayload(
                 "notification-dmaap-events/depth-zero/expected-notification-body-create-child-on-existing-obj.json");
 
-        JSONAssert.assertEquals(expectedNotificationHeader, notificationEventHeader, false);
+        String eventHeaderJson = mapper.writeValueAsString(events.get(1).getEventHeader());
+        JSONAssert.assertEquals(expectedNotificationHeader, eventHeaderJson, false);
         JSONAssert.assertEquals(expectedNotificationBody, notificationEventBody, false);
     }
 
@@ -168,7 +170,7 @@ public class NotificationDmaapEventTest extends AAISetup {
             throws IOException, AAIException {
 
         String uri = "/aai/v14/cloud-infrastructure/pservers/pserver/example-hostname-val-85598";
-        UEBNotification notification = Mockito.spy(new UEBNotification(ModelType.MOXY, loaderFactory, schemaVersions));
+        UEBNotification notification = Mockito.spy(new UEBNotification(loaderFactory, schemaVersions));
         HttpTestUtil httpTestUtil = new HttpTestUtil(queryStyle);
 
         String pserverResource = PayloadUtil.getResourcePayload("pserver-with-children-for-notification.json");
@@ -200,19 +202,19 @@ public class NotificationDmaapEventTest extends AAISetup {
         List<NotificationEvent> events = notification.getEvents();
         assertThat(events.size(), is(1));
 
-        String notificationEventHeader = events.get(0).getEventHeader().marshal(false);
-        String notificationEventBody = events.get(0).getObj().marshal(false);
-
-        assertThat(notificationEventHeader, containsString("\"action\":\"UPDATE\""));
-        assertThat(notificationEventHeader, containsString("\"entity-type\":\"pserver\""));
-        assertThat(notificationEventHeader, containsString("\"top-entity-type\":\"pserver\""));
+        EventHeader notificationEventHeader = events.get(0).getEventHeader();
+        String notificationEventBody = events.get(0).getEntity().toString();
+        assertEquals("UPDATE", notificationEventHeader.getAction());
+        assertEquals("pserver", notificationEventHeader.getEntityType());
+        assertEquals("pserver", notificationEventHeader.getTopEntityType());
 
         String expectedNotificationHeader = PayloadUtil.getResourcePayload(
                 "notification-dmaap-events/depth-all/expected-notification-header-create-child-on-existing-obj.json");
         String expectedNotificationBody = PayloadUtil.getResourcePayload(
                 "notification-dmaap-events/depth-all/expected-notification-body-create-child-on-existing-obj.json");
 
-        JSONAssert.assertEquals(expectedNotificationHeader, notificationEventHeader, false);
+        String eventHeaderJson = mapper.writeValueAsString(events.get(0).getEventHeader());
+        JSONAssert.assertEquals(expectedNotificationHeader, eventHeaderJson, false);
         JSONAssert.assertEquals(expectedNotificationBody, notificationEventBody, false);
 
         response = httpTestUtil.doGet(uri, "0");
@@ -235,7 +237,7 @@ public class NotificationDmaapEventTest extends AAISetup {
         String cloudRegionUri =
                 "/aai/v14/cloud-infrastructure/cloud-regions/cloud-region/random-cloud-region-owner/random-cloud-region-id";
 
-        UEBNotification notification = Mockito.spy(new UEBNotification(ModelType.MOXY, loaderFactory, schemaVersions));
+        UEBNotification notification = Mockito.spy(new UEBNotification(loaderFactory, schemaVersions));
         HttpTestUtil httpTestUtil = new HttpTestUtil(queryStyle, notification, AAIProperties.MINIMUM_DEPTH);
 
         Map<String, String> uriPayload = new LinkedHashMap<>();
@@ -252,8 +254,7 @@ public class NotificationDmaapEventTest extends AAISetup {
         assertThat("Expecting the number of dmaap events to be 2", numberOfEventsActual, is(expectedEvents));
 
         notification.getEvents().forEach((event) -> {
-            String notificationEventHeader = event.getEventHeader().marshal(false);
-            assertThat(notificationEventHeader, containsString("\"CREATE\""));
+            assertEquals("CREATE", event.getEventHeader().getAction());
         });
     }
 
@@ -265,7 +266,7 @@ public class NotificationDmaapEventTest extends AAISetup {
         String cloudRegionUri =
                 "/aai/v14/cloud-infrastructure/cloud-regions/cloud-region/random-cloud-region-owner/random-cloud-region-id";
 
-        UEBNotification notification = Mockito.spy(new UEBNotification(ModelType.MOXY, loaderFactory, schemaVersions));
+        UEBNotification notification = Mockito.spy(new UEBNotification(loaderFactory, schemaVersions));
         HttpTestUtil httpTestUtil = new HttpTestUtil(queryStyle, notification, AAIProperties.MAXIMUM_DEPTH);
 
         Map<String, String> uriPayload = new LinkedHashMap<>();
@@ -282,8 +283,7 @@ public class NotificationDmaapEventTest extends AAISetup {
         assertThat("Expecting the number of dmaap events to be 2", numberOfEventsActual, is(expectedEvents));
 
         notification.getEvents().forEach((event) -> {
-            String notificationEventHeader = event.getEventHeader().marshal(false);
-            assertThat(notificationEventHeader, containsString("\"CREATE\""));
+            assertEquals("CREATE", event.getEventHeader().getAction());
         });
     }
 
@@ -291,7 +291,7 @@ public class NotificationDmaapEventTest extends AAISetup {
     public void testDeleteOnExistingPserverAndCheckIfNotificationDepthIsZeroThatAllEventsHaveDeleteAndThatDepthIsZeroOnEachNotificationEvent()
             throws IOException, AAIException {
         String uri = "/aai/v14/cloud-infrastructure/pservers/pserver/example-hostname-val-85598";
-        UEBNotification notification = Mockito.spy(new UEBNotification(ModelType.MOXY, loaderFactory, schemaVersions));
+        UEBNotification notification = Mockito.spy(new UEBNotification(loaderFactory, schemaVersions));
         HttpTestUtil httpTestUtil = new HttpTestUtil(queryStyle);
 
         String pserverResource = PayloadUtil.getResourcePayload("pserver-with-children-for-notification.json");
@@ -316,19 +316,16 @@ public class NotificationDmaapEventTest extends AAISetup {
         assertThat(notificationEvents.size(), is(17));
 
         notificationEvents.forEach((event) -> {
-
-            String header = event.getEventHeader().marshal(false);
-
-            assertThat(event.getEventHeader().marshal(false), containsString("\"DELETE\""));
-
-            assertThat(header, containsString("\"top-entity-type\":\"pserver\""));
+            EventHeader header = event.getEventHeader();
+            assertEquals("DELETE", header.getAction());
+            assertEquals("pserver", header.getTopEntityType());
         });
     }
 
     @Test
     public void testDeleteOnExistingResourceVersionMismatchNoEventGenerated() throws IOException, AAIException {
         String uri = "/aai/v14/cloud-infrastructure/pservers/pserver/example-hostname-val-85598";
-        UEBNotification notification = Mockito.spy(new UEBNotification(ModelType.MOXY, loaderFactory, schemaVersions));
+        UEBNotification notification = Mockito.spy(new UEBNotification(loaderFactory, schemaVersions));
         HttpTestUtil httpTestUtil = new HttpTestUtil(queryStyle);
 
         String pserverResource = PayloadUtil.getResourcePayload("pserver-with-children-for-notification.json");
@@ -362,7 +359,7 @@ public class NotificationDmaapEventTest extends AAISetup {
             throws IOException, AAIException {
 
         String uri = "/aai/v14/cloud-infrastructure/pservers/pserver/example-hostname-val-85598";
-        UEBNotification notification = Mockito.spy(new UEBNotification(ModelType.MOXY, loaderFactory, schemaVersions));
+        UEBNotification notification = Mockito.spy(new UEBNotification(loaderFactory, schemaVersions));
         HttpTestUtil httpTestUtil = new HttpTestUtil(queryStyle, notification, AAIProperties.MAXIMUM_DEPTH);
 
         String resource = PayloadUtil.getResourcePayload("pserver-with-children-for-notification.json");
@@ -378,20 +375,16 @@ public class NotificationDmaapEventTest extends AAISetup {
         NotificationEvent notificationEvent = notification.getEvents().get(0);
 
         // Verify all the events are create since its a new PUT
-        String header = notificationEvent.getEventHeader().marshal(false);
-
-        assertThat(header, containsString("\"CREATE\""));
-
-        assertThat(header, containsString("\"entity-type\":\"pserver\""));
-
-        assertThat(header, containsString("\"top-entity-type\":\"pserver\""));
-
-        assertThat(header, containsString("\"entity-link\":\"" + uri + "\""));
+        EventHeader eventHeader = notificationEvent.getEventHeader();
+        assertEquals("CREATE", eventHeader.getAction());
+        assertEquals("pserver", eventHeader.getEntityType());
+        assertEquals("pserver", eventHeader.getTopEntityType());
+        assertEquals(uri, eventHeader.getEntityLink());
 
         response = httpTestUtil.doGet(uri);
         assertEquals("Expecting the pserver to be found", 200, response.getStatus());
 
-        JSONAssert.assertEquals(response.getEntity().toString(), notificationEvent.getObj().marshal(false), false);
+        JSONAssert.assertEquals(response.getEntity().toString(), notificationEvent.getEntity().toString(), false);
     }
 
     @Test
@@ -399,7 +392,7 @@ public class NotificationDmaapEventTest extends AAISetup {
             throws IOException, AAIException {
 
         String uri = "/aai/v14/cloud-infrastructure/pservers/pserver/example-hostname-val-85598";
-        UEBNotification notification = Mockito.spy(new UEBNotification(ModelType.MOXY, loaderFactory, schemaVersions));
+        UEBNotification notification = Mockito.spy(new UEBNotification(loaderFactory, schemaVersions));
         HttpTestUtil httpTestUtil = new HttpTestUtil(queryStyle);
 
         String resource = PayloadUtil.getResourcePayload("pserver-with-children-for-notification.json");
@@ -424,7 +417,7 @@ public class NotificationDmaapEventTest extends AAISetup {
         assertThat(response.getEntity().toString(), containsString("new-equip-patch-type"));
 
         assertThat(notification.getEvents().size(), is(1));
-        String updateNotificationEvent = notification.getEvents().get(0).getObj().marshal(true);
+        String updateNotificationEvent = notification.getEvents().get(0).getEntity().toString();
 
         // Check that everything in notification event is also response body
         // Not comparing the other way as notification only includes parents main properties
@@ -436,7 +429,7 @@ public class NotificationDmaapEventTest extends AAISetup {
             throws IOException, AAIException {
 
         String uri = "/aai/v14/cloud-infrastructure/pservers/pserver/example-hostname-val-85598";
-        UEBNotification notification = Mockito.spy(new UEBNotification(ModelType.MOXY, loaderFactory, schemaVersions));
+        UEBNotification notification = Mockito.spy(new UEBNotification(loaderFactory, schemaVersions));
         HttpTestUtil httpTestUtil = new HttpTestUtil(queryStyle);
 
         String resource = PayloadUtil.getResourcePayload("pserver-with-children-for-notification.json");
@@ -461,7 +454,7 @@ public class NotificationDmaapEventTest extends AAISetup {
         assertThat(response.getEntity().toString(), containsString("new-equip-patch-type"));
 
         assertThat(notification.getEvents().size(), is(1));
-        String updateNotificationEvent = notification.getEvents().get(0).getObj().marshal(true);
+        String updateNotificationEvent = notification.getEvents().get(0).getEntity().toString();
 
         // Check that everything in notification event is also response body
         // Not comparing the other way as notification only includes parents main properties
@@ -476,7 +469,7 @@ public class NotificationDmaapEventTest extends AAISetup {
             throws IOException, AAIException {
 
         String uri = "/aai/v14/cloud-infrastructure/pservers/pserver/example-hostname-val-85598";
-        UEBNotification notification = Mockito.spy(new UEBNotification(ModelType.MOXY, loaderFactory, schemaVersions));
+        UEBNotification notification = Mockito.spy(new UEBNotification(loaderFactory, schemaVersions));
         HttpTestUtil httpTestUtil = new HttpTestUtil(queryStyle);
 
         String resource = PayloadUtil.getResourcePayload("pserver-with-children-for-notification.json");
@@ -506,7 +499,7 @@ public class NotificationDmaapEventTest extends AAISetup {
         assertThat(response.getEntity().toString(), containsString("new-equipment-identifier"));
 
         assertThat(notification.getEvents().size(), is(1));
-        String updateNotificationEvent = notification.getEvents().get(0).getObj().marshal(true);
+        String updateNotificationEvent = notification.getEvents().get(0).getEntity().toString();
 
         // Check that everything in notification event is also response body
         // Not comparing the other way as notification only includes parents main properties
@@ -520,7 +513,7 @@ public class NotificationDmaapEventTest extends AAISetup {
             throws IOException, AAIException {
 
         String uri = "/aai/v14/cloud-infrastructure/pservers/pserver/example-hostname-val-85598";
-        UEBNotification notification = Mockito.spy(new UEBNotification(ModelType.MOXY, loaderFactory, schemaVersions));
+        UEBNotification notification = Mockito.spy(new UEBNotification(loaderFactory, schemaVersions));
         HttpTestUtil httpTestUtil = new HttpTestUtil(queryStyle);
 
         String resource = PayloadUtil.getResourcePayload("pserver-with-children-for-notification.json");
@@ -547,7 +540,7 @@ public class NotificationDmaapEventTest extends AAISetup {
 
         response = httpTestUtil.doGet(uri);
         assertThat(notification.getEvents().size(), is(1));
-        String updateNotificationEvent = notification.getEvents().get(0).getObj().marshal(true);
+        String updateNotificationEvent = notification.getEvents().get(0).getEntity().toString();
         System.out.println("Update notification " + updateNotificationEvent);
 
         // Check that everything in notification event is also response body
@@ -564,7 +557,7 @@ public class NotificationDmaapEventTest extends AAISetup {
         String pserverUri = "/aai/v14/cloud-infrastructure/pservers/pserver/" + hostname;
         String genericVnfUri = "/aai/v14/network/generic-vnfs/generic-vnf/generic-vnf-notification";
 
-        UEBNotification notification = Mockito.spy(new UEBNotification(ModelType.MOXY, loaderFactory, schemaVersions));
+        UEBNotification notification = Mockito.spy(new UEBNotification(loaderFactory, schemaVersions));
         HttpTestUtil httpTestUtil = new HttpTestUtil(queryStyle);
 
         String resource = PayloadUtil.getResourcePayload("pserver-with-children-for-notification.json");
@@ -604,9 +597,9 @@ public class NotificationDmaapEventTest extends AAISetup {
         String expectedNotificationBody = PayloadUtil.getResourcePayload(
                 "notification-dmaap-events/depth-zero/expected-notification-body-create-edge-between-pserver-and-generic-vnf.json");
 
-        JSONAssert.assertEquals(expectedNotificationHeader, notificationEvents.get(0).getEventHeader().marshal(false),
+        JSONAssert.assertEquals(expectedNotificationHeader, mapper.writeValueAsString(notificationEvents.get(0).getEventHeader()),
                 false);
-        JSONAssert.assertEquals(expectedNotificationBody, notificationEvents.get(0).getObj().marshal(false), false);
+        JSONAssert.assertEquals(expectedNotificationBody, notificationEvents.get(0).getEntity().toString(), false);
 
         response = httpTestUtil.doGet(genericVnfUri);
 
@@ -623,7 +616,7 @@ public class NotificationDmaapEventTest extends AAISetup {
         String pserverUri = "/aai/v14/cloud-infrastructure/pservers/pserver/" + hostname;
         String genericVnfUri = "/aai/v14/network/generic-vnfs/generic-vnf/generic-vnf-notification";
 
-        UEBNotification notification = Mockito.spy(new UEBNotification(ModelType.MOXY, loaderFactory, schemaVersions));
+        UEBNotification notification = Mockito.spy(new UEBNotification(loaderFactory, schemaVersions));
         HttpTestUtil httpTestUtil = new HttpTestUtil(queryStyle);
 
         String resource = PayloadUtil.getResourcePayload("pserver-with-children-for-notification.json");
@@ -663,10 +656,10 @@ public class NotificationDmaapEventTest extends AAISetup {
         String expectedNotificationBody = PayloadUtil.getResourcePayload(
                 "notification-dmaap-events/depth-all/expected-notification-body-create-edge-between-pserver-and-generic-vnf.json");
 
-        System.out.println("Notification Body: " + notificationEvents.get(0).getObj().marshal(false));
-        JSONAssert.assertEquals(expectedNotificationHeader, notificationEvents.get(0).getEventHeader().marshal(false),
+        System.out.println("Notification Body: " + notificationEvents.get(0).getEntity().toString());
+        JSONAssert.assertEquals(expectedNotificationHeader, mapper.writeValueAsString(notificationEvents.get(0).getEventHeader()),
                 false);
-        JSONAssert.assertEquals(expectedNotificationBody, notificationEvents.get(0).getObj().marshal(false), false);
+        JSONAssert.assertEquals(expectedNotificationBody, notificationEvents.get(0).getEntity().toString(), false);
 
         response = httpTestUtil.doGet(genericVnfUri);
 
@@ -685,7 +678,7 @@ public class NotificationDmaapEventTest extends AAISetup {
 
         String relationship = PayloadUtil.getResourcePayload("pserver-to-gvnf-relationship-notification.json");
 
-        UEBNotification notification = Mockito.spy(new UEBNotification(ModelType.MOXY, loaderFactory, schemaVersions));
+        UEBNotification notification = Mockito.spy(new UEBNotification(loaderFactory, schemaVersions));
         HttpTestUtil httpTestUtil = new HttpTestUtil(queryStyle);
 
         String resource = PayloadUtil.getResourcePayload("pserver-with-children-for-notification.json");
@@ -741,9 +734,9 @@ public class NotificationDmaapEventTest extends AAISetup {
         String expectedNotificationBody = PayloadUtil.getResourcePayload(
                 "notification-dmaap-events/depth-zero/expected-notification-body-delete-edge-between-pserver-and-generic-vnf.json");
 
-        JSONAssert.assertEquals(expectedNotificationHeader, notificationEvents.get(0).getEventHeader().marshal(false),
+        JSONAssert.assertEquals(expectedNotificationHeader, mapper.writeValueAsString(notificationEvents.get(0).getEventHeader()),
                 false);
-        JSONAssert.assertEquals(expectedNotificationBody, notificationEvents.get(0).getObj().marshal(false), false);
+        JSONAssert.assertEquals(expectedNotificationBody, notificationEvents.get(0).getEntity().toString(), false);
 
     }
 
@@ -758,7 +751,7 @@ public class NotificationDmaapEventTest extends AAISetup {
 
         String relationship = PayloadUtil.getResourcePayload("pserver-to-gvnf-relationship-notification.json");
 
-        UEBNotification notification = Mockito.spy(new UEBNotification(ModelType.MOXY, loaderFactory, schemaVersions));
+        UEBNotification notification = Mockito.spy(new UEBNotification(loaderFactory, schemaVersions));
         HttpTestUtil httpTestUtil = new HttpTestUtil(queryStyle);
 
         String resource = PayloadUtil.getResourcePayload("pserver-with-children-for-notification.json");
@@ -813,9 +806,9 @@ public class NotificationDmaapEventTest extends AAISetup {
         String expectedNotificationBody = PayloadUtil.getResourcePayload(
                 "notification-dmaap-events/depth-all/expected-notification-body-delete-edge-between-pserver-and-generic-vnf.json");
 
-        JSONAssert.assertEquals(expectedNotificationHeader, notificationEvents.get(0).getEventHeader().marshal(false),
+        JSONAssert.assertEquals(expectedNotificationHeader, mapper.writeValueAsString(notificationEvents.get(0).getEventHeader()),
                 false);
-        JSONAssert.assertEquals(expectedNotificationBody, notificationEvents.get(0).getObj().marshal(false), false);
+        JSONAssert.assertEquals(expectedNotificationBody, notificationEvents.get(0).getEntity().toString(), false);
 
     }
 
@@ -823,7 +816,7 @@ public class NotificationDmaapEventTest extends AAISetup {
     public void testDeleteOnExistingResourceVersionMismatchNoEventGeneratedFullDepth()
             throws IOException, AAIException {
         String uri = "/aai/v14/cloud-infrastructure/pservers/pserver/example-hostname-val-85598";
-        UEBNotification notification = Mockito.spy(new UEBNotification(ModelType.MOXY, loaderFactory, schemaVersions));
+        UEBNotification notification = Mockito.spy(new UEBNotification(loaderFactory, schemaVersions));
         HttpTestUtil httpTestUtil = new HttpTestUtil(queryStyle);
 
         String pserverResource = PayloadUtil.getResourcePayload("pserver-with-children-for-notification.json");
@@ -851,7 +844,7 @@ public class NotificationDmaapEventTest extends AAISetup {
     @Test
     public void testCreateVnfWithChildrenCreateCustomerWithChildrenAndCousinBetweenVlanAndServiceInstanceThenDeleteCustomerVerifyingVlanRV()
             throws IOException, AAIException {
-        UEBNotification notification = Mockito.spy(new UEBNotification(ModelType.MOXY, loaderFactory, schemaVersions));
+        UEBNotification notification = Mockito.spy(new UEBNotification(loaderFactory, schemaVersions));
         HttpTestUtil httpTestUtil = new HttpTestUtil(queryStyle);
 
         String json = PayloadUtil.getResourcePayload(
@@ -912,7 +905,7 @@ public class NotificationDmaapEventTest extends AAISetup {
 
     @Test
     public void testBulkCreateOfComplexAndPserverWithRelationshipThenBulkDeleteBoth() throws IOException, AAIException {
-        UEBNotification notification = Mockito.spy(new UEBNotification(ModelType.MOXY, loaderFactory, schemaVersions));
+        UEBNotification notification = Mockito.spy(new UEBNotification(loaderFactory, schemaVersions));
         HttpTestUtil httpTestUtil = new HttpTestUtil(queryStyle, notification, AAIProperties.MAXIMUM_DEPTH);
 
         JsonObject payloads = JsonParser
@@ -945,7 +938,7 @@ public class NotificationDmaapEventTest extends AAISetup {
         Map<String, Pair<String, String>> deletes = new LinkedHashMap<>();
         deletes.put(pserverUri, new Pair<>(pserverRv, null));
         deletes.put(complexUri, new Pair<>(complexRV, null));
-        notification = Mockito.spy(new UEBNotification(ModelType.MOXY, loaderFactory, schemaVersions));
+        notification = Mockito.spy(new UEBNotification(loaderFactory, schemaVersions));
         httpTestUtil = new HttpTestUtil(queryStyle, notification, AAIProperties.MAXIMUM_DEPTH);
         httpTestUtil.doDelete(deletes);
 
@@ -958,7 +951,7 @@ public class NotificationDmaapEventTest extends AAISetup {
     @Test
     public void testCreateVnfWithChildrenCreateCustomerWithChildrenAndCousinBetweenVlanAndServiceInstanceThenImplicitDeleteVlanVerifyingServiceInstanceRV()
             throws IOException, AAIException {
-        UEBNotification notification = Mockito.spy(new UEBNotification(ModelType.MOXY, loaderFactory, schemaVersions));
+        UEBNotification notification = Mockito.spy(new UEBNotification(loaderFactory, schemaVersions));
         HttpTestUtil httpTestUtil = new HttpTestUtil(queryStyle);
 
         String json = PayloadUtil.getResourcePayload(
index e8e3d69..6b90782 100644 (file)
@@ -61,8 +61,6 @@ import org.onap.aai.restcore.HttpMethod;
 import org.onap.aai.serialization.engines.TransactionalGraphEngine;
 import org.springframework.test.annotation.DirtiesContext;
 
-import com.fasterxml.jackson.databind.ObjectMapper;
-
 @DirtiesContext(classMode = DirtiesContext.ClassMode.BEFORE_CLASS)
 public class HttpEntryNotificationIntegrationTest extends AAISetup {
 
@@ -77,8 +75,6 @@ public class HttpEntryNotificationIntegrationTest extends AAISetup {
   private List<String> aaiRequestContextList;
   private List<MediaType> outputMediaTypes;
 
-  ObjectMapper mapper = new ObjectMapper();
-
   @Before
   public void setup() {
 
@@ -129,7 +125,7 @@ public class HttpEntryNotificationIntegrationTest extends AAISetup {
   public void notificationOnRelatedToTest() throws UnsupportedEncodingException, AAIException {
 
     Loader ld = loaderFactory.createLoaderForVersion(ModelType.MOXY, schemaVersions.getDefaultVersion());
-    UEBNotification uebNotification = Mockito.spy(new UEBNotification(ld, loaderFactory, schemaVersions));
+    UEBNotification uebNotification = Mockito.spy(new UEBNotification(loaderFactory, schemaVersions));
     traversalHttpEntry.setHttpEntryProperties(schemaVersions.getDefaultVersion(), uebNotification);
 
     Loader loader = traversalHttpEntry.getLoader();
@@ -148,25 +144,24 @@ public class HttpEntryNotificationIntegrationTest extends AAISetup {
     content = "{\"related-to\":\"pserver\",\"related-link\":\"/aai/" + schemaVersions.getDefaultVersion().toString()
         + "/cloud-infrastructure/pservers/pserver/junit-edge-test-pserver\",\"relationship-label\":\"org.onap.relationships.inventory.LocatedIn\"}";
 
-    doNothing().when(uebNotification).triggerEvents();
     Response response = doRequest(traversalHttpEntry, loader, dbEngine, HttpMethod.PUT_EDGE, uri,
         content);
 
     assertEquals("Expected the pserver relationship to be deleted", 200, response.getStatus());
     assertEquals("Two notifications", 2, uebNotification.getEvents().size());
     assertEquals("Notification generated for PUT edge", "UPDATE",
-        uebNotification.getEvents().get(0).getEventHeader().getValue("action").toString());
+        uebNotification.getEvents().get(1).getEventHeader().getAction());
     assertThat("Event body for the edge create has the related to",
-        uebNotification.getEvents().get(0).getObj().marshal(false),
+        uebNotification.getEvents().get(1).getEntity().toString(),
         containsString("cloud-infrastructure/pservers/pserver/junit-edge-test-pserver"));
 
     response = doRequest(traversalHttpEntry, loader, dbEngine, HttpMethod.DELETE_EDGE, uri, content);
     assertEquals("Expected the pserver relationship to be deleted", 204, response.getStatus());
     assertEquals("Two notifications", 2, uebNotification.getEvents().size());
     assertEquals("Notification generated for DELETE edge", "UPDATE",
-        uebNotification.getEvents().get(0).getEventHeader().getValue("action").toString());
+        uebNotification.getEvents().get(0).getEventHeader().getAction());
     assertThat("Event body for the edge delete does not have the related to",
-        uebNotification.getEvents().get(0).getObj().marshal(false),
+        uebNotification.getEvents().get(0).getEntity().toString(),
         not(containsString("cloud-infrastructure/pservers/pserver/junit-edge-test-pserver")));
     dbEngine.rollback();
 
index 95301c6..4fd2149 100644 (file)
@@ -24,6 +24,7 @@ import static org.mockito.ArgumentMatchers.anyInt;
 import static org.mockito.ArgumentMatchers.anyList;
 import static org.mockito.ArgumentMatchers.eq;
 import static org.mockito.Mockito.doNothing;
+import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.times;
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
@@ -50,6 +51,7 @@ import org.onap.aai.db.props.AAIProperties;
 import org.onap.aai.exceptions.AAIException;
 import org.onap.aai.introspection.Introspector;
 import org.onap.aai.introspection.LoaderFactory;
+import org.onap.aai.kafka.NotificationProducerService;
 import org.onap.aai.prevalidation.ValidationService;
 import org.onap.aai.serialization.db.DBSerializer;
 import org.onap.aai.serialization.engines.query.QueryEngine;
@@ -62,6 +64,7 @@ public class NotificationServiceTest extends AAISetup {
   @Mock SchemaVersions schemaVersions;
   @Mock UEBNotification uebNotification;
   @Mock ValidationService validationService;
+  @Mock NotificationProducerService notificationProducerService;
   @Mock DBSerializer dbSerializer;
   @Mock QueryEngine queryEngine;
   @Mock Introspector introspector;
@@ -77,9 +80,10 @@ public class NotificationServiceTest extends AAISetup {
     when(dbSerializer.touchStandardVertexPropertiesForEdges()).thenReturn(Collections.emptySet());
     when(dbSerializer.getLatestVersionView(any(),anyInt())).thenReturn(introspector);
 
-    notificationService = new NotificationService(validationService, loaderFactory, basePath, isDeltaEventsEnabled);
+    notificationService = new NotificationService(validationService, loaderFactory, basePath, isDeltaEventsEnabled, notificationProducerService);
     when(schemaVersions.getDefaultVersion()).thenReturn(new SchemaVersion("v29"));
     doNothing().when(uebNotification).createNotificationEvent(any(),any(),any(),any(),any(),any(),any());
+    doNothing().when(notificationProducerService).sendUEBNotification(any());
   }
 
   @Test
@@ -101,7 +105,7 @@ public class NotificationServiceTest extends AAISetup {
 
     verify(uebNotification, times(1)).createNotificationEvent(eq("transactionId"), eq("sourceOfTruth"), eq(Status.OK), eq(URI.create("/aai/v29/pservers/pserver/hostname")), eq(introspector), any(), eq("/aai"));
     verify(validationService, times(1)).validate(anyList());
-    verify(uebNotification, times(1)).triggerEvents();
+    verify(notificationProducerService, times(1)).sendUEBNotification(uebNotification);
   }
 
   @Test
@@ -119,9 +123,9 @@ public class NotificationServiceTest extends AAISetup {
     SchemaVersion schemaVersion = new SchemaVersion("v29");
     when(dbSerializer.getUpdatedVertexes()).thenReturn(Collections.emptyMap());
 
-    notificationService = new NotificationService(null, loaderFactory, basePath, isDeltaEventsEnabled);
+    notificationService = new NotificationService(null, loaderFactory, basePath, isDeltaEventsEnabled, notificationProducerService);
     notificationService.generateEvents(uebNotification, AAIProperties.MINIMUM_DEPTH, "sourceOfTruth", dbSerializer, "transactionId", queryEngine, mainVertexesToNotifyOn, schemaVersion);
 
-    verify(uebNotification, times(1)).triggerEvents();
+    verify(notificationProducerService, times(1)).sendUEBNotification(uebNotification);
   }
 }
index 229abae..e176f1c 100644 (file)
@@ -71,14 +71,14 @@ public class UEBNotificationTest extends AAISetup {
         Introspector pserver = loader.introspectorFromName("pserver");
         pserver.setValue("hostname", "hn");
         URI uri = new URI("/cloud-infrastructure/pservers/pserver/hn");
-        UEBNotification uebNotification = new UEBNotification(loader, loaderFactory, schemaVersions);
+        UEBNotification uebNotification = new UEBNotification(loaderFactory, schemaVersions);
         uebNotification.createNotificationEvent(UUID.randomUUID().toString(), "JUNIT-SOT", Response.Status.CREATED, uri,
                 pserver, new HashMap<>(), BASE_PATH);
 
         assertEquals("One event created", 1, uebNotification.getEvents().size());
         assertEquals("Uri is correct",
                 BASE_PATH + "/" + schemaVersions.getDefaultVersion() + "/cloud-infrastructure/pservers/pserver/hn",
-                uebNotification.getEvents().get(0).getEventHeader().getValue("entity-link").toString());
+                uebNotification.getEvents().get(0).getEventHeader().getEntityLink());
     }
 
     @Test
@@ -87,13 +87,13 @@ public class UEBNotificationTest extends AAISetup {
         Introspector pserver = loader.introspectorFromName("pserver");
         pserver.setValue("hostname", "hn");
         URI uri = new URI(BASE_PATH + "/v12/cloud-infrastructure/pservers/pserver/hn");
-        UEBNotification uebNotification = new UEBNotification(loader, loaderFactory, schemaVersions);
+        UEBNotification uebNotification = new UEBNotification(loaderFactory, schemaVersions);
         uebNotification.createNotificationEvent(UUID.randomUUID().toString(), "JUNIT-SOT", Response.Status.CREATED, uri,
                 pserver, new HashMap<>(), BASE_PATH);
 
         assertEquals("One event created", 1, uebNotification.getEvents().size());
         assertEquals("Uri is correct",
                 BASE_PATH + "/" + schemaVersions.getDefaultVersion() + "/cloud-infrastructure/pservers/pserver/hn",
-                uebNotification.getEvents().get(0).getEventHeader().getValue("entity-link").toString());
+                uebNotification.getEvents().get(0).getEventHeader().getEntityLink());
     }
 }
index 7dca441..bec04ee 100644 (file)
@@ -61,6 +61,7 @@ import org.onap.aai.serialization.queryformats.QueryFormatTestHelper;
 import org.onap.aai.setup.SchemaVersion;
 import org.onap.aai.setup.SchemaVersions;
 import org.onap.aai.util.AAIConstants;
+import org.onap.aai.web.KafkaNotificationEventConfig;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.test.context.ContextConfiguration;
 import org.springframework.test.context.TestPropertySource;
@@ -71,10 +72,11 @@ import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
 @ContextConfiguration(
         classes = {ConfigConfiguration.class, AAICoreFakeEdgesConfigTranslator.class, NodeIngestor.class,
                 EdgeIngestor.class, EdgeSerializer.class, SpringContextAware.class, IntrospectionConfig.class,
-                XmlFormatTransformerConfiguration.class, LoaderFactory.class, NotificationService.class})
+                XmlFormatTransformerConfiguration.class, LoaderFactory.class, NotificationService.class,
+                KafkaNotificationEventConfig.class})
 @TestPropertySource(
         properties = {"schema.translator.list = config", "schema.nodes.location=src/test/resources/onap/oxm",
-                "schema.edges.location=src/test/resources/onap/dbedgerules"})
+                "schema.edges.location=src/test/resources/onap/dbedgerules","aai.notifications.enabled=false"})
 public class DbSerializer_needsFakeRulesTest {
 
     // to use, set thrown.expect to whatever your test needs
index 0fab96d..86c6799 100644 (file)
@@ -1,64 +1,61 @@
 {
-    "event-topic": "AAI-EVENT",
-    "aaiEventPayload": {
-        "cambria.partition": "AAI",
-        "event-header": {
-            "severity": "NORMAL",
-            "entity-type": "object-group",
-            "top-entity-type": "object-group",
-            "entity-link": "/aai/v28/common/object-groups/object-group/ric_cluster",
-            "event-type": "AAI-EVENT",
-            "domain": "dev",
-            "action": "UPDATE",
-            "sequence-number": "0",
-            "id": "23f12123-c326-48a7-b57e-e48746c295ea",
-            "source-name": "postman-api",
-            "version": "v28",
-            "timestamp": "20231207-12:14:44:757"
+    "cambria.partition": "AAI",
+    "event-header": {
+        "severity": "NORMAL",
+        "entity-type": "object-group",
+        "top-entity-type": "object-group",
+        "entity-link": "/aai/v28/common/object-groups/object-group/ric_cluster",
+        "event-type": "AAI-EVENT",
+        "domain": "dev",
+        "action": "UPDATE",
+        "sequence-number": "0",
+        "id": "23f12123-c326-48a7-b57e-e48746c295ea",
+        "source-name": "postman-api",
+        "version": "v28",
+        "timestamp": "20231207-12:14:44:757"
+    },
+    "entity": {
+        "relationship-list": {
+            "relationship": [
+                {
+                    "related-to": "cell",
+                    "relationship-data": [
+                        {
+                            "relationship-value": "445611193273958916",
+                            "relationship-key": "cell.cell-id"
+                        }
+                    ],
+                    "related-link": "/aai/v28/network/cells/cell/445611193273958916",
+                    "relationship-label": "org.onap.relationships.inventory.MemberOf",
+                    "related-to-property": [
+                        {
+                            "property-key": "cell.cell-name",
+                            "property-value": "MY6885_M-Schwere-Reiter-Str-440460_GU2_84079913"
+                        }
+                    ]
+                },
+                {
+                    "related-to": "cell",
+                    "relationship-data": [
+                        {
+                            "relationship-value": "445611193272330241",
+                            "relationship-key": "cell.cell-id"
+                        }
+                    ],
+                    "related-link": "/aai/v28/network/cells/cell/445611193272330241",
+                    "relationship-label": "org.onap.relationships.inventory.MemberOf",
+                    "related-to-property": [
+                        {
+                            "property-key": "cell.cell-name",
+                            "property-value": "MY6885_M-Schwere-Reiter-Str-440460_GTC2_84003803"
+                        }
+                    ]
+                }
+            ]
         },
-        "entity": {
-            "relationship-list": {
-                "relationship": [
-                    {
-                        "related-to": "cell",
-                        "relationship-data": [
-                            {
-                                "relationship-value": "445611193273958916",
-                                "relationship-key": "cell.cell-id"
-                            }
-                        ],
-                        "related-link": "/aai/v28/network/cells/cell/445611193273958916",
-                        "relationship-label": "org.onap.relationships.inventory.MemberOf",
-                        "related-to-property": [
-                            {
-                                "property-key": "cell.cell-name",
-                                "property-value": "MY6885_M-Schwere-Reiter-Str-440460_GU2_84079913"
-                            }
-                        ]
-                    },
-                    {
-                        "related-to": "cell",
-                        "relationship-data": [
-                            {
-                                "relationship-value": "445611193272330241",
-                                "relationship-key": "cell.cell-id"
-                            }
-                        ],
-                        "related-link": "/aai/v28/network/cells/cell/445611193272330241",
-                        "relationship-label": "org.onap.relationships.inventory.MemberOf",
-                        "related-to-property": [
-                            {
-                                "property-key": "cell.cell-name",
-                                "property-value": "MY6885_M-Schwere-Reiter-Str-440460_GTC2_84003803"
-                            }
-                        ]
-                    }
-                ]
-            },
-            "group-name": "Urban",
-            "resource-version": "1701951284582",
-            "group-type": "cell",
-            "object-group-id": "ric_cluster"
-        }
+        "group-name": "Urban",
+        "resource-version": "1701951284582",
+        "group-type": "cell",
+        "object-group-id": "ric_cluster"
     }
-}
\ No newline at end of file
+}
index 9ee2b71..4243c53 100644 (file)
@@ -27,21 +27,18 @@ import java.time.format.DateTimeFormatter;
 public class FormatDate {
 
     private final String timeZone;
-    private final String pattern;
+    private final DateTimeFormatter formatter ;
 
     public FormatDate(String pattern) {
-        this.pattern = pattern;
-        this.timeZone = "GMT";
+        this(pattern, "GMT");
     }
 
     public FormatDate(String pattern, String timeZone) {
-        this.pattern = pattern;
         this.timeZone = timeZone;
+        this.formatter = DateTimeFormatter.ofPattern(pattern);
     }
 
     public String getDateTime() {
-
-        final DateTimeFormatter formatter = DateTimeFormatter.ofPattern(pattern);
         return formatter.format(ZonedDateTime.now(ZoneId.of(timeZone)));
     }
 }