Implementation of T-API notification rpcs
[transportpce.git] / nbinotifications / src / main / java / org / opendaylight / transportpce / nbinotifications / serialization / TapiNotificationDeserializer.java
1 /*
2  * Copyright © 2021 Nokia, Inc. and others.  All rights reserved.
3  *
4  * This program and the accompanying materials are made available under the
5  * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6  * and is available at http://www.eclipse.org/legal/epl-v10.html
7  */
8 package org.opendaylight.transportpce.nbinotifications.serialization;
9
10 import java.nio.charset.StandardCharsets;
11 import java.util.HashMap;
12 import java.util.Map;
13 import org.apache.kafka.common.serialization.Deserializer;
14 import org.opendaylight.transportpce.common.converter.JsonStringConverter;
15 import org.opendaylight.yang.gen.v1.nbi.notifications.rev211013.NotificationTapiService;
16 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.global._class.Name;
17 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.global._class.NameBuilder;
18 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.global._class.NameKey;
19 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.notification.rev181210.get.notification.list.output.Notification;
20 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.notification.rev181210.get.notification.list.output.NotificationBuilder;
21 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.notification.rev181210.notification.AdditionalInfo;
22 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.notification.rev181210.notification.AdditionalInfoBuilder;
23 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.notification.rev181210.notification.AdditionalInfoKey;
24 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.notification.rev181210.notification.AlarmInfoBuilder;
25 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.notification.rev181210.notification.ChangedAttributes;
26 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.notification.rev181210.notification.ChangedAttributesBuilder;
27 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.notification.rev181210.notification.ChangedAttributesKey;
28 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.notification.rev181210.notification.TargetObjectName;
29 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.notification.rev181210.notification.TargetObjectNameBuilder;
30 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.notification.rev181210.notification.TargetObjectNameKey;
31 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.notification.rev181210.notification.TcaInfoBuilder;
32 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
33 import org.opendaylight.yangtools.yang.data.codec.gson.JSONCodecFactorySupplier;
34 import org.slf4j.Logger;
35 import org.slf4j.LoggerFactory;
36
37 public class TapiNotificationDeserializer implements Deserializer<Notification> {
38     private static final Logger LOG = LoggerFactory.getLogger(TapiNotificationDeserializer.class);
39     private JsonStringConverter<NotificationTapiService> converter;
40
41     @SuppressWarnings("unchecked")
42     @Override
43     public void configure(Map<String, ?> configs, boolean isKey) {
44         LOG.info("Tapi Deserializer configuration {}", configs);
45         if (configs.containsKey(ConfigConstants.CONVERTER)
46             && configs.get(ConfigConstants.CONVERTER) instanceof JsonStringConverter<?>) {
47             converter = (JsonStringConverter<NotificationTapiService>) configs.get(ConfigConstants.CONVERTER);
48         }
49     }
50
51     @Override
52     public Notification deserialize(String topic, byte[] data) {
53         if (converter == null) {
54             throw new IllegalArgumentException(
55                 "Converter should be configured through configure method of deserializer");
56         }
57         String value = new String(data, StandardCharsets.UTF_8);
58         // The message published is
59         // org.opendaylight.yang.gen.v1.nbi.notifications.rev211013.NotificationTapiService
60         // we have to map it to
61         // org.opendaylight.yang.gen.v1
62         // .urn.onf.otcc.yang.tapi.notification.rev181210.get.notification.list.output.Notification
63         NotificationTapiService mappedString = converter.createDataObjectFromJsonString(
64             YangInstanceIdentifier.of(NotificationTapiService.QNAME), value, JSONCodecFactorySupplier.RFC7951);
65         if (mappedString == null) {
66             return null;
67         }
68         LOG.info("Reading Tapi event {}", mappedString);
69         return transformNotificationTapiService(mappedString);
70     }
71
72     private Notification transformNotificationTapiService(NotificationTapiService mappedString) {
73         LOG.info("Transforming TAPI notification for getNotificationList rpc");
74         Map<AdditionalInfoKey, AdditionalInfo> addInfoMap = new HashMap<>();
75         if (mappedString.getAdditionalInfo() != null) {
76             for (org.opendaylight.yang.gen.v1.nbi.notifications.rev211013.notification.tapi.service.AdditionalInfo
77                     addInfo:mappedString.getAdditionalInfo().values()) {
78                 AdditionalInfo transAddInfo = new AdditionalInfoBuilder()
79                     .setValue(addInfo.getValue())
80                     .setValueName(addInfo.getValueName())
81                     .build();
82                 addInfoMap.put(transAddInfo.key(), transAddInfo);
83             }
84         }
85         Map<ChangedAttributesKey, ChangedAttributes> changedAttMap = new HashMap<>();
86         if (mappedString.getChangedAttributes() != null) {
87             for (org.opendaylight.yang.gen.v1
88                     .nbi.notifications.rev211013.notification.tapi.service.ChangedAttributes changedAtt:mappedString
89                         .getChangedAttributes().values()) {
90                 ChangedAttributes transChangedAtt = new ChangedAttributesBuilder(changedAtt).build();
91                 changedAttMap.put(transChangedAtt.key(), transChangedAtt);
92             }
93         }
94         Map<NameKey, Name> nameMap = new HashMap<>();
95         if (mappedString.getName() != null) {
96             for (Name name:mappedString.getName().values()) {
97                 Name transName = new NameBuilder(name).build();
98                 nameMap.put(transName.key(), transName);
99             }
100         }
101         Map<TargetObjectNameKey, TargetObjectName> targetObjNameMap = new HashMap<>();
102         if (mappedString.getTargetObjectName() != null) {
103             for (org.opendaylight.yang.gen.v1
104                     .nbi.notifications.rev211013.notification.tapi.service.TargetObjectName
105                         targetObjectName:mappedString.getTargetObjectName().values()) {
106                 TargetObjectName transTargetObjName = new TargetObjectNameBuilder(targetObjectName).build();
107                 targetObjNameMap.put(transTargetObjName.key(), transTargetObjName);
108             }
109         }
110         LOG.info("Notification uuid = {}", mappedString.getUuid().getValue());
111         return new NotificationBuilder()
112             .setAlarmInfo(mappedString.getAlarmInfo() == null ? null
113                 : new AlarmInfoBuilder(mappedString.getAlarmInfo()).build())
114             .setAdditionalText(mappedString.getAdditionalText())
115             .setAdditionalInfo(addInfoMap)
116             .setNotificationType(mappedString.getNotificationType())
117             .setChangedAttributes(changedAttMap)
118             .setEventTimeStamp(mappedString.getEventTimeStamp())
119             .setLayerProtocolName(mappedString.getLayerProtocolName())
120             .setName(nameMap)
121             .setSequenceNumber(mappedString.getSequenceNumber())
122             .setSourceIndicator(mappedString.getSourceIndicator())
123             .setTargetObjectIdentifier(mappedString.getTargetObjectIdentifier())
124             .setTargetObjectName(targetObjNameMap)
125             .setTargetObjectType(mappedString.getTargetObjectType())
126             .setTcaInfo(mappedString.getTcaInfo() == null ? null
127                 : new TcaInfoBuilder(mappedString.getTcaInfo()).build())
128             .setUuid(mappedString.getUuid())
129             .build();
130     }
131 }
132