2 * ============LICENSE_START=======================================================
3 * ONAP : ccsdk features
4 * ================================================================================
5 * Copyright (C) 2023 highstreet technologies GmbH Intellectual Property.
7 * ================================================================================
8 * Licensed under the Apache License, Version 2.0 (the "License");
9 * you may not use this file except in compliance with the License.
10 * You may obtain a copy of the License at
12 * http://www.apache.org/licenses/LICENSE-2.0
14 * Unless required by applicable law or agreed to in writing, software
15 * distributed under the License is distributed on an "AS IS" BASIS,
16 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17 * See the License for the specific language governing permissions and
18 * limitations under the License.
19 * ============LICENSE_END=========================================================
22 package org.onap.ccsdk.features.sdnr.wt.dataprovider.model;
24 import java.io.IOException;
25 import java.util.ArrayList;
26 import java.util.List;
27 import org.onap.ccsdk.features.sdnr.wt.common.database.queries.SortOrder;
28 import org.onap.ccsdk.features.sdnr.wt.dataprovider.model.types.DataTreeChildObject;
29 import org.onap.ccsdk.features.sdnr.wt.dataprovider.model.types.DataTreeObject;
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.InventoryEntity;
31 import org.opendaylight.yangtools.yang.common.Uint32;
33 public abstract class BaseInventoryTreeProvider implements InventoryTreeProvider {
35 private static final String INVENTORY_PROPERTY_TREELEVEL = "tree-level";
36 protected static final String INVENTORY_PROPERTY_NODEID = "node-id";
37 protected static final String INVENTORY_PROPERTY_UUID = "uuid";
38 protected static final String INVENTORY_PROPERTY_PARENTUUID = "parent-uuid";
40 protected abstract List<String> getAllNodeIds();
42 protected abstract List<InventoryEntity> search(String filter, String sortOrderProperty, SortOrder sortOrder);
44 protected abstract List<InventoryEntity> search(String filter, String nodeId, String parentUuid, String uuid,
45 String sortOrderProperty, SortOrder sortOrder);
47 protected abstract List<InventoryEntity> getItemsForNodes(List<String> nodeIds, String sortOrderProperty,
52 public DataTreeObject readInventoryTree(List<String> tree, String filter) throws IOException {
54 //root nodes will be node-information -> below inventory
55 if (tree == null || tree.size() <= 0) {
56 return this.readInventoryTreeWithNode(filter);
58 //root node will be inventory on tree-level if sliced treePath
60 return this.readInventoryTreeForNode(tree.get(0), tree.subList(0, tree.size() - 1), filter);
66 * Provide inventory list for a node, starting from element described by path
68 * @param path describing element
70 * @return Inventory tree
72 private DataTreeObject readInventoryTreeForNode(String nodeId, List<String> path, String filter)
74 DataTreeObject tree = new DataTreeObject(INVENTORY_PROPERTY_PARENTUUID, INVENTORY_PROPERTY_UUID);
75 //get parent uuid of path
76 final String parentUuid = path.size() > 1 ? path.get(path.size() - 2) : null;
78 final String uuid = path.size() > 0 ? path.get(path.size() - 1) : null;
79 List<InventoryEntity> matches =
80 this.search(filter, nodeId, parentUuid, uuid, INVENTORY_PROPERTY_TREELEVEL, SortOrder.ASCENDING);
81 //tree.a(subtreePath);
82 List<InventoryEntity> others =
83 this.search((String) null, nodeId, null, null, INVENTORY_PROPERTY_TREELEVEL, SortOrder.ASCENDING);
84 if (matches.size() > 0) {
85 int treeLevelToStart = (path == null || path.size() <= 0) ? 0 : path.size() - 1;
88 for (InventoryEntity hit : matches) {
89 if (hit.getTreeLevel().longValue() == treeLevelToStart) {
91 new DataTreeChildObject(hit.getUuid(), true)
92 .setProperty(INVENTORY_PROPERTY_UUID, hit.getUuid())
93 .setProperty(INVENTORY_PROPERTY_PARENTUUID, hit.getParentUuid()));
96 for (InventoryEntity hit : others) {
97 if (hit.getTreeLevel().longValue() == treeLevelToStart) {
98 tree.putIfNotExists(hit.getId(),
99 new DataTreeChildObject(hit.getUuid(), false)
100 .setProperty(INVENTORY_PROPERTY_UUID, hit.getUuid())
101 .setProperty(INVENTORY_PROPERTY_PARENTUUID, hit.getParentUuid()));
105 for (InventoryEntity hit : matches) {
106 if (hit.getTreeLevel().longValue() > treeLevelToStart) {
107 tree.put(hit.getTreeLevel().longValue() - treeLevelToStart - 1, hit.getId(),
108 new DataTreeChildObject(hit.getUuid(), true)
109 .setProperty(INVENTORY_PROPERTY_UUID, hit.getUuid())
110 .setProperty(INVENTORY_PROPERTY_PARENTUUID, hit.getParentUuid()));
113 for (InventoryEntity hit : others) {
114 if (hit.getTreeLevel().longValue() > treeLevelToStart) {
115 tree.putIfNotExists(hit.getTreeLevel().longValue() - treeLevelToStart - 1, hit.getId(),
116 new DataTreeChildObject(hit.getUuid(), false)
117 .setProperty(INVENTORY_PROPERTY_UUID, hit.getUuid())
118 .setProperty(INVENTORY_PROPERTY_PARENTUUID, hit.getParentUuid()));
121 tree.removeUnmatchedPaths();
127 * node will be root elements inventory information below from level-1
131 * @throws IOException
133 private DataTreeObject readInventoryTreeWithNode(String filter) throws IOException {
134 DataTreeObject tree = new DataTreeObject(INVENTORY_PROPERTY_PARENTUUID, INVENTORY_PROPERTY_UUID);
136 List<InventoryEntity> matches = this.search(filter, INVENTORY_PROPERTY_TREELEVEL, SortOrder.ASCENDING);
137 List<InventoryEntity> others = null;
138 if (matches.size() > 0) {
139 if (filter != null) {
140 //find all parents up to tree-level 0
142 List<String> alreadyInList = new ArrayList<>();
143 for (InventoryEntity hit : matches) {
144 nodeId = hit.getNodeId();
145 if (alreadyInList.contains(nodeId)) {
148 alreadyInList.add(nodeId);
150 new DataTreeChildObject(nodeId, false).setProperty(INVENTORY_PROPERTY_UUID, nodeId));
153 others = this.getItemsForNodes(alreadyInList, INVENTORY_PROPERTY_TREELEVEL, SortOrder.ASCENDING);
155 List<String> nodeIds = this.getAllNodeIds();
156 for (String node : nodeIds) {
157 tree.put(node, new DataTreeChildObject(node, false).setProperty(INVENTORY_PROPERTY_UUID, node));
163 for (InventoryEntity hit : matches) {
164 if (hit.getTreeLevel() == Uint32.ZERO) {
165 tree.put(0, hit.getId(),
166 new DataTreeChildObject(hit.getUuid(), true)
167 .setProperty(INVENTORY_PROPERTY_UUID, hit.getUuid())
168 .setProperty(INVENTORY_PROPERTY_PARENTUUID, hit.getNodeId()));
171 if (others != null) {
172 for (InventoryEntity hit : others) {
173 if (hit.getTreeLevel() == Uint32.ZERO) {
174 tree.putIfNotExists(0, hit.getId(),
175 new DataTreeChildObject(hit.getUuid(), false)
176 .setProperty(INVENTORY_PROPERTY_UUID, hit.getUuid())
177 .setProperty(INVENTORY_PROPERTY_PARENTUUID, hit.getNodeId()));
181 //fill child elements
182 for (InventoryEntity hit : matches) {
183 long treeLevel = hit.getTreeLevel().longValue();
185 tree.put(treeLevel, hit.getId(),
186 new DataTreeChildObject(hit.getUuid(), true)
187 .setProperty(INVENTORY_PROPERTY_UUID, hit.getUuid())
188 .setProperty(INVENTORY_PROPERTY_PARENTUUID, hit.getParentUuid()));
191 if (others != null) {
192 for (InventoryEntity hit : others) {
193 long treeLevel = hit.getTreeLevel().longValue();
195 tree.putIfNotExists(treeLevel, hit.getId(),
196 new DataTreeChildObject(hit.getUuid(), false)
197 .setProperty(INVENTORY_PROPERTY_UUID, hit.getUuid())
198 .setProperty(INVENTORY_PROPERTY_PARENTUUID, hit.getParentUuid()));
202 tree.removeUnmatchedPaths();