aboutsummaryrefslogtreecommitdiffstats
path: root/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/api/impl/utils/YangDataConverter.java
blob: 3954142976787cc100f6aa08335691a099b1a501 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
/*
 *  ============LICENSE_START=======================================================
 *  Copyright (C) 2022-2024 Nordix Foundation
 *  ================================================================================
 *  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.
 *
 *  SPDX-License-Identifier: Apache-2.0
 *  ============LICENSE_END=========================================================
 */

package org.onap.cps.ncmp.api.impl.utils;

import java.util.Collection;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.stream.Collectors;
import lombok.AccessLevel;
import lombok.NoArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.onap.cps.ncmp.api.impl.inventory.CompositeState;
import org.onap.cps.ncmp.api.impl.inventory.CompositeStateBuilder;
import org.onap.cps.ncmp.api.impl.yangmodels.YangModelCmHandle;
import org.onap.cps.ncmp.api.models.NcmpServiceCmHandle;
import org.onap.cps.spi.model.DataNode;

@NoArgsConstructor(access = AccessLevel.PRIVATE)
@Slf4j
public class YangDataConverter {

    private static final Pattern cmHandleIdInXpathPattern = Pattern.compile("\\[@id='(.*?)']");

    /**
     * This method convert yang model cm handle to ncmp service cm handle.
     * @param yangModelCmHandle the yang model of the cm handle
     * @return ncmp service cm handle
     */
    public static NcmpServiceCmHandle convertYangModelCmHandleToNcmpServiceCmHandle(
            final YangModelCmHandle yangModelCmHandle) {
        final NcmpServiceCmHandle ncmpServiceCmHandle = new NcmpServiceCmHandle();
        final List<YangModelCmHandle.Property> dmiProperties = yangModelCmHandle.getDmiProperties();
        final List<YangModelCmHandle.Property> publicProperties = yangModelCmHandle.getPublicProperties();
        ncmpServiceCmHandle.setCmHandleId(yangModelCmHandle.getId());
        ncmpServiceCmHandle.setCompositeState(yangModelCmHandle.getCompositeState());
        ncmpServiceCmHandle.setModuleSetTag(yangModelCmHandle.getModuleSetTag());
        ncmpServiceCmHandle.setAlternateId(yangModelCmHandle.getAlternateId());
        setDmiProperties(dmiProperties, ncmpServiceCmHandle);
        setPublicProperties(publicProperties, ncmpServiceCmHandle);
        return ncmpServiceCmHandle;
    }

    /**
     * This method convert yang model cm handle properties to simple map.
     * @param properties the yang model cm handle properties
     * @param propertiesMap the String, String map for the results
     */
    public static void asPropertiesMap(final List<YangModelCmHandle.Property> properties,
                                       final Map<String, String> propertiesMap) {
        for (final YangModelCmHandle.Property property : properties) {
            propertiesMap.put(property.getName(), property.getValue());
        }
    }

    /**
     * This method convert cm handle data node to yang model cm handle.
     * @param cmHandleDataNode the datanode of the cm handle
     * @return yang model cm handle
     */
    public static YangModelCmHandle convertCmHandleToYangModel(final DataNode cmHandleDataNode) {
        final NcmpServiceCmHandle ncmpServiceCmHandle = new NcmpServiceCmHandle();
        final String cmHandleId = cmHandleDataNode.getLeaves().get("id").toString();
        ncmpServiceCmHandle.setCmHandleId(cmHandleId);
        populateCmHandleDetails(cmHandleDataNode, ncmpServiceCmHandle);
        return YangModelCmHandle.toYangModelCmHandle(
                (String) cmHandleDataNode.getLeaves().get("dmi-service-name"),
                (String) cmHandleDataNode.getLeaves().get("dmi-data-service-name"),
                (String) cmHandleDataNode.getLeaves().get("dmi-model-service-name"),
                ncmpServiceCmHandle,
                (String) cmHandleDataNode.getLeaves().get("module-set-tag"),
                (String) cmHandleDataNode.getLeaves().get("alternate-id")
        );
    }

    /**
     * This method convert cm handle data nodes to yang model cm handles.
     * @param cmHandleDataNodes the datanode of the cm handle
     * @return yang model cm handles
     */
    public static Collection<YangModelCmHandle> convertDataNodesToYangModelCmHandles(
            final Collection<DataNode> cmHandleDataNodes) {
        return cmHandleDataNodes.stream().map(YangDataConverter::convertCmHandleToYangModel)
                .collect(Collectors.toList());
    }

    /**
     * This method extract cm handle id from xpath of data node.
     * @param xpath for data node of the cm handle
     * @return cm handle Id
     */
    public static String extractCmHandleIdFromXpath(final String xpath) {
        final Matcher matcher = cmHandleIdInXpathPattern.matcher(xpath);
        matcher.find();
        return matcher.group(1);
    }


    private static void populateCmHandleDetails(final DataNode cmHandleDataNode,
                                                final NcmpServiceCmHandle ncmpServiceCmHandle) {
        final Map<String, String> dmiProperties = new LinkedHashMap<>();
        final Map<String, String> publicProperties = new LinkedHashMap<>();
        final CompositeStateBuilder compositeStateBuilder = new CompositeStateBuilder();
        CompositeState compositeState = compositeStateBuilder.build();
        for (final DataNode childDataNode: cmHandleDataNode.getChildDataNodes()) {
            if (childDataNode.getXpath().contains("/additional-properties[@name=")) {
                addProperty(childDataNode, dmiProperties);
            } else if (childDataNode.getXpath().contains("/public-properties[@name=")) {
                addProperty(childDataNode, publicProperties);
            } else if (childDataNode.getXpath().endsWith("/state")) {
                compositeState = compositeStateBuilder.fromDataNode(childDataNode).build();
            }
        }
        ncmpServiceCmHandle.setDmiProperties(dmiProperties);
        ncmpServiceCmHandle.setPublicProperties(publicProperties);
        ncmpServiceCmHandle.setCompositeState(compositeState);
    }

    private static void addProperty(final DataNode propertyDataNode, final Map<String, String> propertiesAsMap) {
        propertiesAsMap.put(String.valueOf(propertyDataNode.getLeaves().get("name")),
                String.valueOf(propertyDataNode.getLeaves().get("value")));
    }

    private static void setDmiProperties(final List<YangModelCmHandle.Property> dmiProperties,
                                         final NcmpServiceCmHandle ncmpServiceCmHandle) {
        final Map<String, String> dmiPropertiesMap = new LinkedHashMap<>(dmiProperties.size());
        asPropertiesMap(dmiProperties, dmiPropertiesMap);
        ncmpServiceCmHandle.setDmiProperties(dmiPropertiesMap);
    }

    private static void setPublicProperties(final List<YangModelCmHandle.Property> publicProperties,
                                            final NcmpServiceCmHandle ncmpServiceCmHandle) {
        final Map<String, String> publicPropertiesMap = new LinkedHashMap<>();
        asPropertiesMap(publicProperties, publicPropertiesMap);
        ncmpServiceCmHandle.setPublicProperties(publicPropertiesMap);
    }
}