2 * ============LICENSE_START=======================================================
4 * ================================================================================
5 * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
6 * ================================================================================
7 * Licensed under the Apache License, Version 2.0 (the "License");
8 * you may not use this file except in compliance with the License.
9 * You may obtain a copy of the License at
11 * http://www.apache.org/licenses/LICENSE-2.0
13 * Unless required by applicable law or agreed to in writing, software
14 * distributed under the License is distributed on an "AS IS" BASIS,
15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 * See the License for the specific language governing permissions and
17 * limitations under the License.
18 * ============LICENSE_END=========================================================
20 package org.openecomp.sdc.be.model.operations.impl;
22 import fj.data.Either;
23 import java.util.ArrayList;
24 import java.util.HashMap;
25 import java.util.Iterator;
26 import java.util.List;
28 import java.util.stream.Collectors;
29 import org.apache.commons.lang3.tuple.ImmutablePair;
30 import org.apache.tinkerpop.gremlin.structure.Vertex;
31 import org.janusgraph.core.JanusGraph;
32 import org.janusgraph.core.JanusGraphVertex;
33 import org.openecomp.sdc.be.config.ArtifactConfigManager;
34 import org.openecomp.sdc.be.config.ArtifactConfiguration;
35 import org.openecomp.sdc.be.config.Configuration;
36 import org.openecomp.sdc.be.config.ConfigurationManager;
37 import org.openecomp.sdc.be.dao.api.ActionStatus;
38 import org.openecomp.sdc.be.dao.graph.datatype.GraphEdge;
39 import org.openecomp.sdc.be.dao.graph.datatype.GraphNode;
40 import org.openecomp.sdc.be.dao.graph.datatype.GraphRelation;
41 import org.openecomp.sdc.be.dao.janusgraph.JanusGraphGenericDao;
42 import org.openecomp.sdc.be.dao.janusgraph.JanusGraphOperationStatus;
43 import org.openecomp.sdc.be.dao.neo4j.GraphEdgeLabels;
44 import org.openecomp.sdc.be.dao.neo4j.GraphPropertiesDictionary;
45 import org.openecomp.sdc.be.datatypes.category.CategoryDataDefinition;
46 import org.openecomp.sdc.be.datatypes.category.GroupingDataDefinition;
47 import org.openecomp.sdc.be.datatypes.category.SubCategoryDataDefinition;
48 import org.openecomp.sdc.be.datatypes.enums.NodeTypeEnum;
49 import org.openecomp.sdc.be.datatypes.enums.ResourceTypeEnum;
50 import org.openecomp.sdc.be.model.ArtifactType;
51 import org.openecomp.sdc.be.model.PropertyScope;
52 import org.openecomp.sdc.be.model.Tag;
53 import org.openecomp.sdc.be.model.category.CategoryDefinition;
54 import org.openecomp.sdc.be.model.category.GroupingDefinition;
55 import org.openecomp.sdc.be.model.category.SubCategoryDefinition;
56 import org.openecomp.sdc.be.model.operations.api.IElementOperation;
57 import org.openecomp.sdc.be.model.operations.api.StorageOperationStatus;
58 import org.openecomp.sdc.be.resources.data.TagData;
59 import org.openecomp.sdc.be.resources.data.category.CategoryData;
60 import org.openecomp.sdc.be.resources.data.category.GroupingData;
61 import org.openecomp.sdc.be.resources.data.category.SubCategoryData;
62 import org.openecomp.sdc.common.log.wrappers.Logger;
63 import org.openecomp.sdc.common.util.ValidationUtils;
64 import org.springframework.beans.factory.annotation.Qualifier;
65 import org.springframework.stereotype.Component;
67 @Component("element-operation")
68 public class ElementOperation implements IElementOperation {
70 private static final String COULDN_T_FETCH_janusGraph_GRAPH = "Couldn't fetch janusgraph graph";
71 private static final String UNKNOWN_CATEGORY_TYPE = "Unknown category type {}";
72 private static final Logger log = Logger.getLogger(ElementOperation.class.getName());
73 private JanusGraphGenericDao janusGraphGenericDao;
75 public ElementOperation(@Qualifier("janusgraph-generic-dao") JanusGraphGenericDao janusGraphGenericDao) {
77 this.janusGraphGenericDao = janusGraphGenericDao;
80 private static NodeTypeEnum getChildNodeType(NodeTypeEnum parentTypeEnum) {
81 NodeTypeEnum res = null;
82 switch (parentTypeEnum) {
83 case ResourceNewCategory:
84 res = NodeTypeEnum.ResourceSubcategory;
87 res = NodeTypeEnum.ProductSubcategory;
89 case ProductSubcategory:
90 res = NodeTypeEnum.ProductGrouping;
102 public Either<List<CategoryDefinition>, ActionStatus> getAllServiceCategories() {
103 return getAllCategories(NodeTypeEnum.ServiceNewCategory, false);
107 public Either<List<CategoryDefinition>, ActionStatus> getAllResourceCategories() {
108 return getAllCategories(NodeTypeEnum.ResourceNewCategory, false);
112 public Either<List<CategoryDefinition>, ActionStatus> getAllProductCategories() {
113 return getAllCategories(NodeTypeEnum.ProductCategory, false);
120 public Either<CategoryDefinition, ActionStatus> createCategory(CategoryDefinition category, NodeTypeEnum nodeType) {
121 return createCategory(category, nodeType, false);
125 public Either<CategoryDefinition, ActionStatus> createCategory(CategoryDefinition category, NodeTypeEnum nodeType, boolean inTransaction) {
126 Either<CategoryDefinition, ActionStatus> result = null;
127 category.setUniqueId(UniqueIdBuilder.buildCategoryUid(category.getNormalizedName(), nodeType));
128 CategoryData categoryData = new CategoryData(nodeType, category);
130 Either<CategoryData, JanusGraphOperationStatus> createNode = janusGraphGenericDao.createNode(categoryData, CategoryData.class);
131 if (createNode.isRight()) {
132 JanusGraphOperationStatus value = createNode.right().value();
133 ActionStatus actionStatus = ActionStatus.GENERAL_ERROR;
134 log.debug("Problem while creating category, reason {}", value);
135 if (value == JanusGraphOperationStatus.JANUSGRAPH_SCHEMA_VIOLATION) {
136 actionStatus = ActionStatus.COMPONENT_CATEGORY_ALREADY_EXISTS;
138 result = Either.right(actionStatus);
141 CategoryDefinition created = new CategoryDefinition(createNode.left().value().getCategoryDataDefinition());
142 result = Either.left(created);
145 if (!inTransaction) {
146 if (result != null && result.isLeft()) {
147 janusGraphGenericDao.commit();
149 janusGraphGenericDao.rollback();
156 public Either<CategoryDefinition, ActionStatus> updateCategory(CategoryDefinition category, NodeTypeEnum nodeType) {
157 return updateCategory(category, nodeType, false);
161 public Either<CategoryDefinition, ActionStatus> updateCategory(CategoryDefinition category, NodeTypeEnum nodeType, boolean inTransaction) {
162 Either<CategoryDefinition, ActionStatus> result = null;
163 category.setUniqueId(UniqueIdBuilder.buildCategoryUid(category.getNormalizedName(), nodeType));
164 CategoryData categoryData = new CategoryData(nodeType, category);
166 Either<CategoryData, JanusGraphOperationStatus> updatedNode = janusGraphGenericDao.updateNode(categoryData, CategoryData.class);
167 if (updatedNode.isRight()) {
168 JanusGraphOperationStatus value = updatedNode.right().value();
169 ActionStatus actionStatus = ActionStatus.GENERAL_ERROR;
170 log.debug("Problem while creating category, reason {}", value);
171 result = Either.right(actionStatus);
174 CategoryDefinition created = new CategoryDefinition(updatedNode.left().value().getCategoryDataDefinition());
175 result = Either.left(created);
178 if (!inTransaction) {
179 if (result != null && result.isLeft()) {
180 janusGraphGenericDao.commit();
182 janusGraphGenericDao.rollback();
189 public Either<SubCategoryDefinition, ActionStatus> createSubCategory(String categoryId, SubCategoryDefinition subCategory,
190 NodeTypeEnum nodeType) {
191 return createSubCategory(categoryId, subCategory, nodeType, false);
195 public Either<SubCategoryDefinition, ActionStatus> createSubCategory(String categoryId, SubCategoryDefinition subCategory, NodeTypeEnum nodeType,
196 boolean inTransaction) {
197 Either<SubCategoryDefinition, ActionStatus> result = null;
199 // create edge from category to sub-category
200 Either<CategoryData, JanusGraphOperationStatus> categoryNode = janusGraphGenericDao
201 .getNode(UniqueIdBuilder.getKeyByNodeType(nodeType), categoryId, CategoryData.class);
202 ActionStatus actionStatus = ActionStatus.GENERAL_ERROR;
203 if (categoryNode.isRight()) {
204 JanusGraphOperationStatus janusGraphOperationStatus = categoryNode.right().value();
205 log.debug("Problem while fetching category, reason {}", janusGraphOperationStatus);
206 if (janusGraphOperationStatus == JanusGraphOperationStatus.NOT_FOUND) {
207 actionStatus = ActionStatus.COMPONENT_CATEGORY_NOT_FOUND;
209 result = Either.right(actionStatus);
212 CategoryDataDefinition categoryDataDefinition = categoryNode.left().value().getCategoryDataDefinition();
213 subCategory.setUniqueId(UniqueIdBuilder.buildSubCategoryUid(categoryDataDefinition.getUniqueId(), subCategory.getNormalizedName()));
214 SubCategoryData subCategoryData = new SubCategoryData(nodeType, subCategory);
215 Either<SubCategoryData, JanusGraphOperationStatus> subCategoryNode = janusGraphGenericDao
216 .createNode(subCategoryData, SubCategoryData.class);
217 if (subCategoryNode.isRight()) {
218 JanusGraphOperationStatus janusGraphOperationStatus = subCategoryNode.right().value();
219 log.debug("Problem while creating category, reason {}", janusGraphOperationStatus);
220 if (janusGraphOperationStatus == JanusGraphOperationStatus.JANUSGRAPH_SCHEMA_VIOLATION) {
221 actionStatus = ActionStatus.COMPONENT_SUB_CATEGORY_EXISTS_FOR_CATEGORY;
223 result = Either.right(actionStatus);
226 Either<GraphRelation, JanusGraphOperationStatus> relation = janusGraphGenericDao
227 .createRelation(categoryNode.left().value(), subCategoryNode.left().value(), GraphEdgeLabels.SUB_CATEGORY, null);
228 if (relation.isRight()) {
229 log.debug("Problem while create relation between category and sub-category ", relation.right().value());
230 result = Either.right(actionStatus);
233 SubCategoryDefinition subCategoryCreated = new SubCategoryDefinition(subCategoryNode.left().value().getSubCategoryDataDefinition());
234 result = Either.left(subCategoryCreated);
237 if (!inTransaction) {
238 if (result != null && result.isLeft()) {
239 janusGraphGenericDao.commit();
241 janusGraphGenericDao.rollback();
248 public Either<SubCategoryDefinition, ActionStatus> updateSubCategory(String subCategoryId, SubCategoryDefinition subCategory,
249 NodeTypeEnum nodeType) {
250 return updateSubCategory(subCategoryId, subCategory, nodeType, false);
254 public Either<SubCategoryDefinition, ActionStatus> updateSubCategory(String subCategoryId, SubCategoryDefinition subCategory,
255 NodeTypeEnum nodeType, boolean inTransaction) {
256 Either<SubCategoryDefinition, ActionStatus> result = null;
258 subCategory.setUniqueId(subCategoryId);
259 SubCategoryData subCategoryData = new SubCategoryData(nodeType, subCategory);
260 Either<SubCategoryData, JanusGraphOperationStatus> subCategoryNode = janusGraphGenericDao
261 .updateNode(subCategoryData, SubCategoryData.class);
262 if (subCategoryNode.isRight()) {
263 JanusGraphOperationStatus janusGraphOperationStatus = subCategoryNode.right().value();
264 log.debug("Problem while updating sub category, reason {}", janusGraphOperationStatus);
265 result = Either.right(ActionStatus.GENERAL_ERROR);
268 SubCategoryDefinition subCategoryUpdated = new SubCategoryDefinition(subCategoryNode.left().value().getSubCategoryDataDefinition());
269 result = Either.left(subCategoryUpdated);
272 if (!inTransaction) {
273 if (result != null && result.isLeft()) {
274 janusGraphGenericDao.commit();
276 janusGraphGenericDao.rollback();
283 public Either<GroupingDefinition, ActionStatus> createGrouping(String subCategoryId, GroupingDefinition grouping, NodeTypeEnum nodeType) {
284 Either<GroupingDefinition, ActionStatus> result = null;
286 // create edge from sub-category to grouping
287 Either<SubCategoryData, JanusGraphOperationStatus> subCategoryNode = janusGraphGenericDao
288 .getNode(UniqueIdBuilder.getKeyByNodeType(nodeType), subCategoryId, SubCategoryData.class);
289 ActionStatus actionStatus = ActionStatus.GENERAL_ERROR;
290 if (subCategoryNode.isRight()) {
291 JanusGraphOperationStatus janusGraphOperationStatus = subCategoryNode.right().value();
292 log.debug("Problem while fetching category, reason {}", janusGraphOperationStatus);
293 if (janusGraphOperationStatus == JanusGraphOperationStatus.JANUSGRAPH_SCHEMA_VIOLATION) {
294 actionStatus = ActionStatus.COMPONENT_CATEGORY_NOT_FOUND;
296 result = Either.right(actionStatus);
299 SubCategoryDataDefinition subCatData = subCategoryNode.left().value().getSubCategoryDataDefinition();
300 grouping.setUniqueId(UniqueIdBuilder.buildGroupingUid(subCatData.getUniqueId(), grouping.getNormalizedName()));
301 GroupingData groupingData = new GroupingData(nodeType, grouping);
302 Either<GroupingData, JanusGraphOperationStatus> groupingNode = janusGraphGenericDao.createNode(groupingData, GroupingData.class);
303 if (groupingNode.isRight()) {
304 JanusGraphOperationStatus janusGraphOperationStatus = groupingNode.right().value();
305 log.debug("Problem while creating grouping, reason {}", janusGraphOperationStatus);
306 if (janusGraphOperationStatus == JanusGraphOperationStatus.NOT_FOUND) {
307 actionStatus = ActionStatus.COMPONENT_GROUPING_EXISTS_FOR_SUB_CATEGORY;
309 result = Either.right(actionStatus);
312 Either<GraphRelation, JanusGraphOperationStatus> relation = janusGraphGenericDao
313 .createRelation(subCategoryNode.left().value(), groupingNode.left().value(), GraphEdgeLabels.GROUPING, null);
314 if (relation.isRight()) {
315 log.debug("Problem while create relation between sub-category and grouping", relation.right().value());
316 result = Either.right(actionStatus);
319 GroupingDefinition groupingCreated = new GroupingDefinition(groupingNode.left().value().getGroupingDataDefinition());
320 result = Either.left(groupingCreated);
323 if (result != null && result.isLeft()) {
324 janusGraphGenericDao.commit();
326 janusGraphGenericDao.rollback();
332 public Either<List<CategoryDefinition>, ActionStatus> getAllCategories(NodeTypeEnum nodeType, boolean inTransaction) {
334 if (nodeType != NodeTypeEnum.ResourceNewCategory && nodeType != NodeTypeEnum.ServiceNewCategory
335 && nodeType != NodeTypeEnum.ProductCategory) {
336 log.debug(UNKNOWN_CATEGORY_TYPE, nodeType.name());
337 return Either.right(ActionStatus.GENERAL_ERROR);
339 Either<List<org.openecomp.sdc.be.resources.data.category.CategoryData>, JanusGraphOperationStatus> either = janusGraphGenericDao
340 .getAll(nodeType, org.openecomp.sdc.be.resources.data.category.CategoryData.class);
341 if (either.isRight() && (either.right().value() != JanusGraphOperationStatus.NOT_FOUND)) {
342 log.debug("Problem while get all categories. reason - {}", either.right().value());
343 return Either.right(ActionStatus.GENERAL_ERROR);
345 List<CategoryData> categoryDataList = either.isLeft() ? either.left().value() : null;
346 List<CategoryDefinition> categoryList = new ArrayList<>();
347 if (categoryDataList != null) {
348 for (CategoryData elem : categoryDataList) {
349 CategoryDataDefinition categoryDataDefinition = elem.getCategoryDataDefinition();
350 CategoryDefinition categoryDefinition = new CategoryDefinition(categoryDataDefinition);
351 String categoryName = categoryDataDefinition.getName();
352 log.trace("Found category {}, category type {}", categoryName, nodeType);
353 JanusGraphOperationStatus setSubCategories = setSubCategories(nodeType, categoryDefinition);
354 if (setSubCategories != JanusGraphOperationStatus.OK) {
355 log.debug("Failed to set sub-categories for category {}, category type {}, error {}", categoryName, nodeType,
357 return Either.right(ActionStatus.GENERAL_ERROR);
359 categoryList.add(categoryDefinition);
362 return Either.left(categoryList);
364 if (!inTransaction) {
365 janusGraphGenericDao.commit();
370 private JanusGraphOperationStatus setSubCategories(NodeTypeEnum parentNodeType, CategoryDefinition parentCategory) {
371 NodeTypeEnum childNodeType = getChildNodeType(parentNodeType);
372 if (childNodeType != null) {
373 String categoryName = parentCategory.getName();
374 log.trace("Getting sub-categories for category {}, category type {}", categoryName, parentNodeType);
375 Either<List<ImmutablePair<SubCategoryData, GraphEdge>>, JanusGraphOperationStatus> parentNode = janusGraphGenericDao
376 .getChildrenNodes(UniqueIdBuilder.getKeyByNodeType(parentNodeType), parentCategory.getUniqueId(), GraphEdgeLabels.SUB_CATEGORY,
377 childNodeType, SubCategoryData.class);
378 if (parentNode.isRight()) {
379 JanusGraphOperationStatus janusGraphOperationStatus = parentNode.right().value();
380 if (janusGraphOperationStatus == JanusGraphOperationStatus.NOT_FOUND) {
381 log.trace("Didn't find subcategories for category {}, category type {}", categoryName, parentNodeType);
382 janusGraphOperationStatus = JanusGraphOperationStatus.OK;
384 return janusGraphOperationStatus;
386 List<ImmutablePair<SubCategoryData, GraphEdge>> subsCategoriesData = parentNode.left().value();
387 List<SubCategoryDefinition> subCategoriesDefinitions = new ArrayList<>();
388 for (ImmutablePair<SubCategoryData, GraphEdge> subCatPair : subsCategoriesData) {
389 SubCategoryDataDefinition subCategoryDataDefinition = subCatPair.getLeft().getSubCategoryDataDefinition();
390 SubCategoryDefinition subCategoryDefinition = new SubCategoryDefinition(subCategoryDataDefinition);
391 log.trace("Found sub-category {} for category {}, category type {}", subCategoryDataDefinition.getName(), categoryName,
393 JanusGraphOperationStatus setGroupings = setGroupings(childNodeType, subCategoryDefinition);
394 if (setGroupings != JanusGraphOperationStatus.OK) {
395 log.debug("Failed to set groupings for sub-category {}, sub-category type {}, error {}", subCategoryDataDefinition.getName(),
396 childNodeType, setGroupings);
397 return JanusGraphOperationStatus.GENERAL_ERROR;
399 subCategoriesDefinitions.add(subCategoryDefinition);
401 parentCategory.setSubcategories(subCategoriesDefinitions);
403 return JanusGraphOperationStatus.OK;
406 private JanusGraphOperationStatus setGroupings(NodeTypeEnum parentNodeType, SubCategoryDefinition parentSubCategory) {
407 NodeTypeEnum childNodeType = getChildNodeType(parentNodeType);
408 if (childNodeType != null) {
409 String subCategoryName = parentSubCategory.getName();
410 log.trace("Getting groupings for subcategory {}, subcategory type {}", subCategoryName, parentNodeType);
411 Either<List<ImmutablePair<GroupingData, GraphEdge>>, JanusGraphOperationStatus> parentNode = janusGraphGenericDao
412 .getChildrenNodes(UniqueIdBuilder.getKeyByNodeType(parentNodeType), parentSubCategory.getUniqueId(), GraphEdgeLabels.GROUPING,
413 childNodeType, GroupingData.class);
414 if (parentNode.isRight()) {
415 JanusGraphOperationStatus janusGraphOperationStatus = parentNode.right().value();
416 if (janusGraphOperationStatus == JanusGraphOperationStatus.NOT_FOUND) {
417 log.trace("Didn't find groupings for subcategory {}, subcategory type {}", subCategoryName, parentNodeType);
418 janusGraphOperationStatus = JanusGraphOperationStatus.OK;
420 return janusGraphOperationStatus;
422 List<ImmutablePair<GroupingData, GraphEdge>> groupingData = parentNode.left().value();
423 List<GroupingDefinition> groupingDefinitions = new ArrayList<>();
424 for (ImmutablePair<GroupingData, GraphEdge> groupPair : groupingData) {
425 GroupingDataDefinition groupingDataDefinition = groupPair.getLeft().getGroupingDataDefinition();
426 log.trace("Found grouping {} for sub-category {}, sub-category type {}", groupingDataDefinition.getName(), subCategoryName,
428 groupingDefinitions.add(new GroupingDefinition(groupingDataDefinition));
430 parentSubCategory.setGroupings(groupingDefinitions);
432 return JanusGraphOperationStatus.OK;
436 public Either<CategoryDefinition, ActionStatus> getCategory(NodeTypeEnum nodeType, String categoryId) {
438 if (nodeType != NodeTypeEnum.ResourceNewCategory && nodeType != NodeTypeEnum.ServiceNewCategory
439 && nodeType != NodeTypeEnum.ProductCategory) {
440 log.debug(UNKNOWN_CATEGORY_TYPE, nodeType.name());
441 return Either.right(ActionStatus.GENERAL_ERROR);
443 Either<CategoryData, JanusGraphOperationStatus> categoryDataEither = janusGraphGenericDao
444 .getNode(UniqueIdBuilder.getKeyByNodeType(nodeType), categoryId, CategoryData.class);
445 if (categoryDataEither.isRight()) {
446 JanusGraphOperationStatus janusGraphOperationStatus = categoryDataEither.right().value();
447 log.debug("Problem while get category by id {}. reason {}", categoryId, janusGraphOperationStatus);
448 if (janusGraphOperationStatus == JanusGraphOperationStatus.NOT_FOUND) {
449 return Either.right(ActionStatus.COMPONENT_CATEGORY_NOT_FOUND);
451 return Either.right(ActionStatus.GENERAL_ERROR);
453 CategoryDataDefinition categoryDataDefinition = categoryDataEither.left().value().getCategoryDataDefinition();
454 return Either.left(new CategoryDefinition(categoryDataDefinition));
456 janusGraphGenericDao.commit();
461 public Either<SubCategoryDefinition, ActionStatus> getSubCategory(NodeTypeEnum nodeType, String subCategoryId) {
463 if (nodeType != NodeTypeEnum.ResourceSubcategory && nodeType != NodeTypeEnum.ProductSubcategory) {
464 log.debug("Unknown sub-category type {}", nodeType.name());
465 return Either.right(ActionStatus.GENERAL_ERROR);
467 Either<SubCategoryData, JanusGraphOperationStatus> subCategoryDataEither = janusGraphGenericDao
468 .getNode(UniqueIdBuilder.getKeyByNodeType(nodeType), subCategoryId, SubCategoryData.class);
469 if (subCategoryDataEither.isRight()) {
470 JanusGraphOperationStatus janusGraphOperationStatus = subCategoryDataEither.right().value();
471 log.debug("Problem while get sub-category by id {}. reason {}", subCategoryId, janusGraphOperationStatus);
472 if (janusGraphOperationStatus == JanusGraphOperationStatus.NOT_FOUND) {
473 return Either.right(ActionStatus.COMPONENT_CATEGORY_NOT_FOUND);
475 return Either.right(ActionStatus.GENERAL_ERROR);
477 SubCategoryDataDefinition subCategoryDataDefinition = subCategoryDataEither.left().value().getSubCategoryDataDefinition();
478 return Either.left(new SubCategoryDefinition(subCategoryDataDefinition));
480 janusGraphGenericDao.commit();
485 public Either<CategoryDefinition, ActionStatus> deleteCategory(NodeTypeEnum nodeType, String categoryId) {
486 Either<CategoryDefinition, ActionStatus> result = null;
488 if (nodeType != NodeTypeEnum.ResourceNewCategory && nodeType != NodeTypeEnum.ServiceNewCategory
489 && nodeType != NodeTypeEnum.ProductCategory) {
490 log.debug(UNKNOWN_CATEGORY_TYPE, nodeType.name());
491 result = Either.right(ActionStatus.GENERAL_ERROR);
494 Either<CategoryData, JanusGraphOperationStatus> categoryDataEither = janusGraphGenericDao
495 .getNode(UniqueIdBuilder.getKeyByNodeType(nodeType), categoryId, CategoryData.class);
496 if (categoryDataEither.isRight()) {
497 log.debug("Failed to retrieve category for id {} ", categoryId);
498 result = Either.right(ActionStatus.GENERAL_ERROR);
501 Either<JanusGraph, JanusGraphOperationStatus> graph = janusGraphGenericDao.getGraph();
502 if (graph.isRight()) {
503 log.debug(COULDN_T_FETCH_janusGraph_GRAPH);
504 result = Either.right(ActionStatus.GENERAL_ERROR);
507 JanusGraph tGraph = graph.left().value();
508 Iterable<JanusGraphVertex> verticesArtifact = tGraph.query().has(UniqueIdBuilder.getKeyByNodeType(nodeType), categoryId).vertices();
509 Iterator<JanusGraphVertex> iterator = verticesArtifact.iterator();
510 if (!iterator.hasNext()) {
511 log.debug("No category node for id = {}", categoryId);
512 result = Either.right(ActionStatus.GENERAL_ERROR);
515 Vertex artifactV = iterator.next();
517 CategoryDefinition deleted = new CategoryDefinition(categoryDataEither.left().value().getCategoryDataDefinition());
518 result = Either.left(deleted);
521 if (result != null && result.isLeft()) {
522 janusGraphGenericDao.commit();
524 janusGraphGenericDao.rollback();
530 public Either<SubCategoryDefinition, ActionStatus> deleteSubCategory(NodeTypeEnum nodeType, String subCategoryId) {
531 Either<SubCategoryDefinition, ActionStatus> result = null;
533 if (nodeType != NodeTypeEnum.ResourceSubcategory && nodeType != NodeTypeEnum.ProductSubcategory) {
534 log.debug("Unknown sub-category type {}", nodeType.name());
535 result = Either.right(ActionStatus.GENERAL_ERROR);
538 Either<SubCategoryData, JanusGraphOperationStatus> subCategoryDataEither = janusGraphGenericDao
539 .getNode(UniqueIdBuilder.getKeyByNodeType(nodeType), subCategoryId, SubCategoryData.class);
540 if (subCategoryDataEither.isRight()) {
541 log.debug("Failed to retrieve sub-category for id {}", subCategoryId);
542 result = Either.right(ActionStatus.GENERAL_ERROR);
545 Either<JanusGraph, JanusGraphOperationStatus> graph = janusGraphGenericDao.getGraph();
546 if (graph.isRight()) {
547 log.debug(COULDN_T_FETCH_janusGraph_GRAPH);
548 result = Either.right(ActionStatus.GENERAL_ERROR);
551 JanusGraph tGraph = graph.left().value();
552 Iterable<JanusGraphVertex> verticesArtifact = tGraph.query().has(UniqueIdBuilder.getKeyByNodeType(nodeType), subCategoryId).vertices();
553 Iterator<JanusGraphVertex> iterator = verticesArtifact.iterator();
554 if (!iterator.hasNext()) {
555 log.debug("No sub-category node for id {}", subCategoryId);
556 result = Either.right(ActionStatus.GENERAL_ERROR);
559 Vertex artifactV = iterator.next();
562 SubCategoryDefinition deleted = new SubCategoryDefinition(subCategoryDataEither.left().value().getSubCategoryDataDefinition());
563 result = Either.left(deleted);
566 if (result != null && result.isLeft()) {
567 janusGraphGenericDao.commit();
569 janusGraphGenericDao.rollback();
575 public Either<GroupingDefinition, ActionStatus> deleteGrouping(NodeTypeEnum nodeType, String groupingId) {
576 Either<GroupingDefinition, ActionStatus> result = null;
578 if (nodeType != NodeTypeEnum.ProductGrouping) {
579 log.debug("Unknown grouping type {}", nodeType.name());
580 result = Either.right(ActionStatus.GENERAL_ERROR);
583 Either<GroupingData, JanusGraphOperationStatus> groupingDataEither = janusGraphGenericDao
584 .getNode(UniqueIdBuilder.getKeyByNodeType(nodeType), groupingId, GroupingData.class);
585 if (groupingDataEither.isRight()) {
586 log.debug("Failed to retrieve grouping for id {}", groupingId);
587 result = Either.right(ActionStatus.GENERAL_ERROR);
590 Either<JanusGraph, JanusGraphOperationStatus> graph = janusGraphGenericDao.getGraph();
591 if (graph.isRight()) {
592 log.debug(COULDN_T_FETCH_janusGraph_GRAPH);
593 result = Either.right(ActionStatus.GENERAL_ERROR);
596 JanusGraph tGraph = graph.left().value();
597 Iterable<JanusGraphVertex> verticesArtifact = tGraph.query().has(UniqueIdBuilder.getKeyByNodeType(nodeType), groupingId).vertices();
598 Iterator<JanusGraphVertex> iterator = verticesArtifact.iterator();
599 if (!iterator.hasNext()) {
600 log.debug("No grouping node for id {}", groupingId);
601 result = Either.right(ActionStatus.GENERAL_ERROR);
604 Vertex artifactV = iterator.next();
607 GroupingDefinition deleted = new GroupingDefinition(groupingDataEither.left().value().getGroupingDataDefinition());
608 result = Either.left(deleted);
611 if (result != null && result.isLeft()) {
612 janusGraphGenericDao.commit();
614 janusGraphGenericDao.rollback();
620 public Either<Boolean, ActionStatus> isCategoryUniqueForType(NodeTypeEnum nodeType, String normalizedName) {
621 Map<String, Object> properties = new HashMap<>();
622 properties.put(GraphPropertiesDictionary.NORMALIZED_NAME.getProperty(), normalizedName);
624 Either<List<CategoryData>, JanusGraphOperationStatus> categoryEither = janusGraphGenericDao
625 .getByCriteria(nodeType, properties, CategoryData.class);
626 if (categoryEither.isRight() && categoryEither.right().value() != JanusGraphOperationStatus.NOT_FOUND) {
627 log.debug("Failed to get categories, nodeType {}, normalizedName {}, error {}", nodeType, normalizedName,
628 categoryEither.right().value());
629 return Either.right(ActionStatus.GENERAL_ERROR);
631 List<CategoryData> categoryList = (categoryEither.isLeft() ? categoryEither.left().value() : null);
632 if (categoryList != null && categoryList.size() > 0) {
633 log.debug("Found category for nodeType {} with normalizedName {}", nodeType, normalizedName);
634 if (categoryList.size() > 1) {
635 log.debug("Found more than 1 unique categories for nodeType {} with normalizedName", nodeType, normalizedName);
636 return Either.right(ActionStatus.GENERAL_ERROR);
638 return Either.left(false);
640 log.debug("Category for nodeType {} with normalizedName {} doesn't exist in graph", nodeType, normalizedName);
641 return Either.left(true);
644 janusGraphGenericDao.commit();
649 public Either<Boolean, ActionStatus> isSubCategoryUniqueForCategory(NodeTypeEnum nodeType, String subCategoryNormName, String parentCategoryId) {
650 String subCategoryId = UniqueIdBuilder.buildSubCategoryUid(parentCategoryId, subCategoryNormName);
652 Either<SubCategoryData, JanusGraphOperationStatus> subCategoryDataEither = janusGraphGenericDao
653 .getNode(UniqueIdBuilder.getKeyByNodeType(nodeType), subCategoryId, SubCategoryData.class);
654 if (subCategoryDataEither.isRight() && subCategoryDataEither.right().value() != JanusGraphOperationStatus.NOT_FOUND) {
655 log.debug("Failed to get sub-category with id {}, error {}", subCategoryId, subCategoryDataEither.right().value());
656 return Either.right(ActionStatus.GENERAL_ERROR);
658 SubCategoryData subCategoryData = (subCategoryDataEither.isLeft() ? subCategoryDataEither.left().value() : null);
659 if (subCategoryData != null) {
660 log.debug("Found sub-category with id {}", subCategoryId);
661 return Either.left(false);
663 log.debug("Sub-category for id {} doesn't exist in graph", subCategoryId);
664 return Either.left(true);
667 janusGraphGenericDao.commit();
672 public Either<Boolean, ActionStatus> isGroupingUniqueForSubCategory(NodeTypeEnum nodeType, String groupingNormName, String parentSubCategoryId) {
673 String groupingId = UniqueIdBuilder.buildGroupingUid(parentSubCategoryId, groupingNormName);
675 Either<GroupingData, JanusGraphOperationStatus> groupingDataEither = janusGraphGenericDao
676 .getNode(UniqueIdBuilder.getKeyByNodeType(nodeType), groupingId, GroupingData.class);
677 if (groupingDataEither.isRight() && groupingDataEither.right().value() != JanusGraphOperationStatus.NOT_FOUND) {
678 log.debug("Failed to get grouping with id {}, error {}", groupingId, groupingDataEither.right().value());
679 return Either.right(ActionStatus.GENERAL_ERROR);
681 GroupingData groupingData = (groupingDataEither.isLeft() ? groupingDataEither.left().value() : null);
682 if (groupingData != null) {
683 log.debug("Found grouping with id {}", groupingId);
684 return Either.left(false);
686 log.debug("Grouping for id {} doesn't exist in graph", groupingId);
687 return Either.left(true);
690 janusGraphGenericDao.commit();
695 public Either<SubCategoryDefinition, ActionStatus> getSubCategoryUniqueForType(NodeTypeEnum nodeType, String normalizedName) {
696 Map<String, Object> properties = new HashMap<>();
697 properties.put(GraphPropertiesDictionary.NORMALIZED_NAME.getProperty(), normalizedName);
699 Either<List<SubCategoryData>, JanusGraphOperationStatus> subCategoryEither = janusGraphGenericDao
700 .getByCriteria(nodeType, properties, SubCategoryData.class);
701 if (subCategoryEither.isRight() && subCategoryEither.right().value() != JanusGraphOperationStatus.NOT_FOUND) {
702 log.debug("Failed to get sub-categories, nodeType {}, normalizedName {}, error {}", nodeType, normalizedName,
703 subCategoryEither.right().value());
704 return Either.right(ActionStatus.GENERAL_ERROR);
706 List<SubCategoryData> subCategoryList = (subCategoryEither.isLeft() ? subCategoryEither.left().value() : null);
707 if (subCategoryList != null && subCategoryList.size() > 0) {
708 log.debug("Found sub-category for nodeType {} with normalizedName {}", nodeType, normalizedName);
709 SubCategoryData subCategoryData = subCategoryList.get(0);
710 SubCategoryDefinition subCategoryDefinition = new SubCategoryDefinition(subCategoryData.getSubCategoryDataDefinition());
711 return Either.left(subCategoryDefinition);
713 log.debug("Sub-category for nodeType {} with normalizedName {} doesn't exist in graph", nodeType, normalizedName);
714 return Either.left(null);
717 janusGraphGenericDao.commit();
722 public Either<GroupingDefinition, ActionStatus> getGroupingUniqueForType(NodeTypeEnum nodeType, String groupingNormalizedName) {
723 Map<String, Object> properties = new HashMap<>();
724 properties.put(GraphPropertiesDictionary.NORMALIZED_NAME.getProperty(), groupingNormalizedName);
726 Either<List<GroupingData>, JanusGraphOperationStatus> groupingEither = janusGraphGenericDao
727 .getByCriteria(nodeType, properties, GroupingData.class);
728 if (groupingEither.isRight() && groupingEither.right().value() != JanusGraphOperationStatus.NOT_FOUND) {
729 log.debug("Failed to get grouping, nodeType {}, normalizedName {}, error {}", nodeType, groupingNormalizedName,
730 groupingEither.right().value());
731 return Either.right(ActionStatus.GENERAL_ERROR);
733 List<GroupingData> groupingList = (groupingEither.isLeft() ? groupingEither.left().value() : null);
734 if (groupingList != null && groupingList.size() > 0) {
735 log.debug("Found grouping for nodeType {} with normalizedName {}", nodeType, groupingNormalizedName);
736 GroupingData groupingData = groupingList.get(0);
737 GroupingDefinition groupingDefinition = new GroupingDefinition(groupingData.getGroupingDataDefinition());
738 return Either.left(groupingDefinition);
740 log.debug("Grouping for nodeType {} with normalizedName {} doesn't exist in graph", nodeType, groupingNormalizedName);
741 return Either.left(null);
744 janusGraphGenericDao.commit();
752 public Either<List<Tag>, ActionStatus> getAllTags() {
754 Either<List<TagData>, JanusGraphOperationStatus> either = janusGraphGenericDao.getAll(NodeTypeEnum.Tag, TagData.class);
755 if (either.isRight()) {
756 log.debug("Problem while get all tags. reason - {}", either.right().value());
757 return Either.right(ActionStatus.GENERAL_ERROR);
759 List<TagData> tagDataList = either.left().value();
760 List<Tag> tagList = convertToListOfTag(tagDataList);
761 return Either.left(tagList);
763 janusGraphGenericDao.commit();
768 public <T extends GraphNode> Either<org.openecomp.sdc.be.resources.data.CategoryData, StorageOperationStatus> getCategoryData(String name,
772 String categoryUid = null;
773 if (type == NodeTypeEnum.ResourceCategory) {
774 String[] categoryFields = name.split("/");
775 if (categoryFields.length != 2) {
776 return Either.right(StorageOperationStatus.CATEGORY_NOT_FOUND);
778 categoryUid = UniqueIdBuilder.buildResourceCategoryUid(categoryFields[0], categoryFields[1], type);
780 categoryUid = UniqueIdBuilder.buildServiceCategoryUid(name, type);
782 Either<T, JanusGraphOperationStatus> either = janusGraphGenericDao.getNode(UniqueIdBuilder.getKeyByNodeType(type), categoryUid, clazz);
783 if (either.isRight()) {
784 JanusGraphOperationStatus janusGraphOperationStatus = either.right().value();
785 log.debug("Problem while geting category with id {}. reason - {}", categoryUid, janusGraphOperationStatus.name());
786 if (janusGraphOperationStatus == JanusGraphOperationStatus.NOT_FOUND) {
787 return Either.right(StorageOperationStatus.CATEGORY_NOT_FOUND);
789 return Either.right(StorageOperationStatus.GENERAL_ERROR);
792 return Either.left((org.openecomp.sdc.be.resources.data.CategoryData) either.left().value());
794 return Either.right(StorageOperationStatus.GENERAL_ERROR);
798 private List<Tag> convertToListOfTag(List<TagData> tagDataList) {
799 List<Tag> tagList = new ArrayList<>();
800 for (TagData elem : tagDataList) {
802 tag.setName(elem.getName());
809 public Either<List<PropertyScope>, ActionStatus> getAllPropertyScopes() {
811 List<PropertyScope> propertyScopes = new ArrayList<>();
812 PropertyScope propertyScope1 = new PropertyScope();
813 propertyScope1.setName("A&AI");
814 PropertyScope propertyScope2 = new PropertyScope();
815 propertyScope2.setName("Order");
816 PropertyScope propertyScope3 = new PropertyScope();
817 propertyScope3.setName("Runtime");
818 propertyScopes.add(propertyScope1);
819 propertyScopes.add(propertyScope2);
820 propertyScopes.add(propertyScope3);
821 return Either.left(propertyScopes);
825 public List<ArtifactType> getAllArtifactTypes() {
826 final List<ArtifactConfiguration> artifactTypesList = ArtifactConfigManager.getInstance().getConfiguration();
827 return artifactTypesList.stream().map(artifactConfiguration -> {
828 final ArtifactType artifactType = new ArtifactType();
829 artifactType.setName(artifactConfiguration.getType());
831 }).collect(Collectors.toList());
835 public Either<Configuration.HeatDeploymentArtifactTimeout, ActionStatus> getDefaultHeatTimeout() {
836 return Either.left(ConfigurationManager.getConfigurationManager().getConfiguration().getHeatArtifactDeploymentTimeout());
840 public Either<Map<String, String>, ActionStatus> getResourceTypesMap() {
841 ResourceTypeEnum[] enumConstants = ResourceTypeEnum.class.getEnumConstants();
842 Map<String, String> resourceTypes = new HashMap<>();
843 if (enumConstants != null) {
844 for (int i = 0; i < enumConstants.length; ++i) {
845 resourceTypes.put(enumConstants[i].name(), enumConstants[i].getValue());
848 return Either.left(resourceTypes);
852 public <T extends GraphNode> Either<CategoryData, StorageOperationStatus> getNewCategoryData(String name, NodeTypeEnum type, Class<T> clazz) {
854 String categoryUid = UniqueIdBuilder.buildServiceCategoryUid(name, type);
855 Map props = new HashMap<>();
856 props.put(GraphPropertiesDictionary.NORMALIZED_NAME.getProperty(), ValidationUtils.normalizeCategoryName4Uniqueness(name));
857 Either<List<T>, JanusGraphOperationStatus> either = janusGraphGenericDao.getByCriteria(type, props, clazz);
858 if (either.isRight()) {
859 JanusGraphOperationStatus janusGraphOperationStatus = either.right().value();
860 log.debug("Problem while geting category with id {}. reason - {}", categoryUid, janusGraphOperationStatus.name());
861 if (janusGraphOperationStatus == JanusGraphOperationStatus.NOT_FOUND) {
862 return Either.right(StorageOperationStatus.CATEGORY_NOT_FOUND);
864 return Either.right(StorageOperationStatus.GENERAL_ERROR);
867 return Either.left((CategoryData) either.left().value().get(0));
869 return Either.right(StorageOperationStatus.GENERAL_ERROR);