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=========================================================
21 package org.openecomp.sdc.be.model.operations.impl;
23 import org.janusgraph.core.JanusGraph;
24 import org.janusgraph.core.JanusGraphVertex;
25 import fj.data.Either;
26 import org.apache.commons.lang3.tuple.ImmutablePair;
27 import org.apache.tinkerpop.gremlin.structure.Vertex;
28 import org.openecomp.sdc.be.config.Configuration;
29 import org.openecomp.sdc.be.config.Configuration.ArtifactTypeConfig;
30 import org.openecomp.sdc.be.config.ConfigurationManager;
31 import org.openecomp.sdc.be.dao.api.ActionStatus;
32 import org.openecomp.sdc.be.dao.graph.datatype.GraphEdge;
33 import org.openecomp.sdc.be.dao.graph.datatype.GraphNode;
34 import org.openecomp.sdc.be.dao.graph.datatype.GraphRelation;
35 import org.openecomp.sdc.be.dao.janusgraph.JanusGraphOperationStatus;
36 import org.openecomp.sdc.be.dao.neo4j.GraphEdgeLabels;
37 import org.openecomp.sdc.be.dao.neo4j.GraphPropertiesDictionary;
38 import org.openecomp.sdc.be.dao.janusgraph.JanusGraphGenericDao;
39 import org.openecomp.sdc.be.datatypes.category.CategoryDataDefinition;
40 import org.openecomp.sdc.be.datatypes.category.GroupingDataDefinition;
41 import org.openecomp.sdc.be.datatypes.category.SubCategoryDataDefinition;
42 import org.openecomp.sdc.be.datatypes.enums.NodeTypeEnum;
43 import org.openecomp.sdc.be.datatypes.enums.ResourceTypeEnum;
44 import org.openecomp.sdc.be.model.ArtifactType;
45 import org.openecomp.sdc.be.model.PropertyScope;
46 import org.openecomp.sdc.be.model.Tag;
47 import org.openecomp.sdc.be.model.category.CategoryDefinition;
48 import org.openecomp.sdc.be.model.category.GroupingDefinition;
49 import org.openecomp.sdc.be.model.category.SubCategoryDefinition;
50 import org.openecomp.sdc.be.model.operations.api.IElementOperation;
51 import org.openecomp.sdc.be.model.operations.api.StorageOperationStatus;
52 import org.openecomp.sdc.be.resources.data.TagData;
53 import org.openecomp.sdc.be.resources.data.category.CategoryData;
54 import org.openecomp.sdc.be.resources.data.category.GroupingData;
55 import org.openecomp.sdc.be.resources.data.category.SubCategoryData;
56 import org.openecomp.sdc.common.log.wrappers.Logger;
57 import org.openecomp.sdc.common.util.ValidationUtils;
58 import org.springframework.beans.factory.annotation.Qualifier;
59 import org.springframework.stereotype.Component;
63 @Component("element-operation")
64 public class ElementOperation implements IElementOperation {
66 private static final String COULDN_T_FETCH_janusGraph_GRAPH = "Couldn't fetch janusgraph graph";
67 private static final String UNKNOWN_CATEGORY_TYPE = "Unknown category type {}";
68 private JanusGraphGenericDao janusGraphGenericDao;
70 public ElementOperation(@Qualifier("janusgraph-generic-dao")
71 JanusGraphGenericDao janusGraphGenericDao) {
73 this.janusGraphGenericDao = janusGraphGenericDao;
76 private static final Logger log = Logger.getLogger(ElementOperation.class.getName());
82 public Either<List<CategoryDefinition>, ActionStatus> getAllServiceCategories() {
83 return getAllCategories(NodeTypeEnum.ServiceNewCategory, false);
87 public Either<List<CategoryDefinition>, ActionStatus> getAllResourceCategories() {
88 return getAllCategories(NodeTypeEnum.ResourceNewCategory, false);
92 public Either<List<CategoryDefinition>, ActionStatus> getAllProductCategories() {
93 return getAllCategories(NodeTypeEnum.ProductCategory, false);
103 public Either<CategoryDefinition, ActionStatus> createCategory(CategoryDefinition category, NodeTypeEnum nodeType) {
104 return createCategory(category, nodeType, false);
108 public Either<CategoryDefinition, ActionStatus> createCategory(CategoryDefinition category, NodeTypeEnum nodeType, boolean inTransaction) {
109 Either<CategoryDefinition, ActionStatus> result = null;
110 category.setUniqueId(UniqueIdBuilder.buildCategoryUid(category.getNormalizedName(), nodeType));
111 CategoryData categoryData = new CategoryData(nodeType, category);
114 Either<CategoryData, JanusGraphOperationStatus> createNode = janusGraphGenericDao
115 .createNode(categoryData, CategoryData.class);
116 if (createNode.isRight()) {
117 JanusGraphOperationStatus value = createNode.right().value();
118 ActionStatus actionStatus = ActionStatus.GENERAL_ERROR;
119 log.debug("Problem while creating category, reason {}", value);
120 if (value == JanusGraphOperationStatus.JANUSGRAPH_SCHEMA_VIOLATION) {
121 actionStatus = ActionStatus.COMPONENT_CATEGORY_ALREADY_EXISTS;
123 result = Either.right(actionStatus);
126 CategoryDefinition created = new CategoryDefinition(createNode.left().value().getCategoryDataDefinition());
127 result = Either.left(created);
130 if (!inTransaction) {
131 if (result != null && result.isLeft()) {
132 janusGraphGenericDao.commit();
134 janusGraphGenericDao.rollback();
141 public Either<SubCategoryDefinition, ActionStatus> createSubCategory(String categoryId, SubCategoryDefinition subCategory, NodeTypeEnum nodeType) {
142 return createSubCategory(categoryId, subCategory, nodeType, false);
146 public Either<SubCategoryDefinition, ActionStatus> createSubCategory(String categoryId, SubCategoryDefinition subCategory, NodeTypeEnum nodeType, boolean inTransaction) {
148 Either<SubCategoryDefinition, ActionStatus> result = null;
151 // create edge from category to sub-category
152 Either<CategoryData, JanusGraphOperationStatus> categoryNode = janusGraphGenericDao
153 .getNode(UniqueIdBuilder.getKeyByNodeType(nodeType), categoryId, CategoryData.class);
154 ActionStatus actionStatus = ActionStatus.GENERAL_ERROR;
155 if (categoryNode.isRight()) {
156 JanusGraphOperationStatus janusGraphOperationStatus = categoryNode.right().value();
157 log.debug("Problem while fetching category, reason {}", janusGraphOperationStatus);
158 if (janusGraphOperationStatus == JanusGraphOperationStatus.NOT_FOUND) {
159 actionStatus = ActionStatus.COMPONENT_CATEGORY_NOT_FOUND;
161 result = Either.right(actionStatus);
165 CategoryDataDefinition categoryDataDefinition = categoryNode.left().value().getCategoryDataDefinition();
166 subCategory.setUniqueId(UniqueIdBuilder.buildSubCategoryUid(categoryDataDefinition.getUniqueId(), subCategory.getNormalizedName()));
167 SubCategoryData subCategoryData = new SubCategoryData(nodeType, subCategory);
169 Either<SubCategoryData, JanusGraphOperationStatus> subCategoryNode = janusGraphGenericDao
170 .createNode(subCategoryData, SubCategoryData.class);
171 if (subCategoryNode.isRight()) {
172 JanusGraphOperationStatus janusGraphOperationStatus = subCategoryNode.right().value();
173 log.debug("Problem while creating category, reason {}", janusGraphOperationStatus);
174 if (janusGraphOperationStatus == JanusGraphOperationStatus.JANUSGRAPH_SCHEMA_VIOLATION) {
175 actionStatus = ActionStatus.COMPONENT_SUB_CATEGORY_EXISTS_FOR_CATEGORY;
177 result = Either.right(actionStatus);
181 Either<GraphRelation, JanusGraphOperationStatus> relation = janusGraphGenericDao
182 .createRelation(categoryNode.left().value(), subCategoryNode.left().value(), GraphEdgeLabels.SUB_CATEGORY, null);
183 if (relation.isRight()) {
184 log.debug("Problem while create relation between category and sub-category ", relation.right().value());
185 result = Either.right(actionStatus);
188 SubCategoryDefinition subCategoryCreated = new SubCategoryDefinition(subCategoryNode.left().value().getSubCategoryDataDefinition());
189 result = Either.left(subCategoryCreated);
192 if (!inTransaction) {
193 if (result != null && result.isLeft()) {
194 janusGraphGenericDao.commit();
196 janusGraphGenericDao.rollback();
203 public Either<GroupingDefinition, ActionStatus> createGrouping(String subCategoryId, GroupingDefinition grouping, NodeTypeEnum nodeType) {
205 Either<GroupingDefinition, ActionStatus> result = null;
208 // create edge from sub-category to grouping
209 Either<SubCategoryData, JanusGraphOperationStatus> subCategoryNode = janusGraphGenericDao
210 .getNode(UniqueIdBuilder.getKeyByNodeType(nodeType), subCategoryId, SubCategoryData.class);
211 ActionStatus actionStatus = ActionStatus.GENERAL_ERROR;
212 if (subCategoryNode.isRight()) {
213 JanusGraphOperationStatus janusGraphOperationStatus = subCategoryNode.right().value();
214 log.debug("Problem while fetching category, reason {}", janusGraphOperationStatus);
215 if (janusGraphOperationStatus == JanusGraphOperationStatus.JANUSGRAPH_SCHEMA_VIOLATION) {
216 actionStatus = ActionStatus.COMPONENT_CATEGORY_NOT_FOUND;
218 result = Either.right(actionStatus);
222 SubCategoryDataDefinition subCatData = subCategoryNode.left().value().getSubCategoryDataDefinition();
223 grouping.setUniqueId(UniqueIdBuilder.buildGroupingUid(subCatData.getUniqueId(), grouping.getNormalizedName()));
224 GroupingData groupingData = new GroupingData(nodeType, grouping);
226 Either<GroupingData, JanusGraphOperationStatus> groupingNode = janusGraphGenericDao
227 .createNode(groupingData, GroupingData.class);
228 if (groupingNode.isRight()) {
229 JanusGraphOperationStatus janusGraphOperationStatus = groupingNode.right().value();
230 log.debug("Problem while creating grouping, reason {}", janusGraphOperationStatus);
231 if (janusGraphOperationStatus == JanusGraphOperationStatus.NOT_FOUND) {
232 actionStatus = ActionStatus.COMPONENT_GROUPING_EXISTS_FOR_SUB_CATEGORY;
234 result = Either.right(actionStatus);
238 Either<GraphRelation, JanusGraphOperationStatus> relation = janusGraphGenericDao
239 .createRelation(subCategoryNode.left().value(), groupingNode.left().value(), GraphEdgeLabels.GROUPING, null);
240 if (relation.isRight()) {
241 log.debug("Problem while create relation between sub-category and grouping", relation.right().value());
242 result = Either.right(actionStatus);
245 GroupingDefinition groupingCreated = new GroupingDefinition(groupingNode.left().value().getGroupingDataDefinition());
246 result = Either.left(groupingCreated);
249 if (result != null && result.isLeft()) {
250 janusGraphGenericDao.commit();
252 janusGraphGenericDao.rollback();
258 public Either<List<CategoryDefinition>, ActionStatus> getAllCategories(NodeTypeEnum nodeType, boolean inTransaction) {
260 if (nodeType != NodeTypeEnum.ResourceNewCategory && nodeType != NodeTypeEnum.ServiceNewCategory && nodeType != NodeTypeEnum.ProductCategory) {
261 log.debug(UNKNOWN_CATEGORY_TYPE, nodeType.name());
262 return Either.right(ActionStatus.GENERAL_ERROR);
265 Either<List<org.openecomp.sdc.be.resources.data.category.CategoryData>, JanusGraphOperationStatus> either = janusGraphGenericDao
266 .getAll(nodeType, org.openecomp.sdc.be.resources.data.category.CategoryData.class);
267 if (either.isRight() && (either.right().value() != JanusGraphOperationStatus.NOT_FOUND)) {
268 log.debug("Problem while get all categories. reason - {}", either.right().value());
269 return Either.right(ActionStatus.GENERAL_ERROR);
271 List<CategoryData> categoryDataList = either.isLeft() ? either.left().value() : null;
272 List<CategoryDefinition> categoryList = new ArrayList<>();
273 if (categoryDataList != null) {
274 for (CategoryData elem : categoryDataList) {
275 CategoryDataDefinition categoryDataDefinition = elem.getCategoryDataDefinition();
277 CategoryDefinition categoryDefinition = new CategoryDefinition(categoryDataDefinition);
278 String categoryName = categoryDataDefinition.getName();
279 log.trace("Found category {}, category type {}", categoryName, nodeType);
280 JanusGraphOperationStatus
281 setSubCategories = setSubCategories(nodeType, categoryDefinition);
282 if (setSubCategories != JanusGraphOperationStatus.OK) {
283 log.debug("Failed to set sub-categories for category {}, category type {}, error {}", categoryName, nodeType, setSubCategories);
284 return Either.right(ActionStatus.GENERAL_ERROR);
286 categoryList.add(categoryDefinition);
289 return Either.left(categoryList);
291 if (!inTransaction) {
292 janusGraphGenericDao.commit();
297 private JanusGraphOperationStatus setSubCategories(NodeTypeEnum parentNodeType, CategoryDefinition parentCategory) {
298 NodeTypeEnum childNodeType = getChildNodeType(parentNodeType);
299 if (childNodeType != null) {
300 String categoryName = parentCategory.getName();
301 log.trace("Getting sub-categories for category {}, category type {}", categoryName, parentNodeType);
302 Either<List<ImmutablePair<SubCategoryData, GraphEdge>>, JanusGraphOperationStatus> parentNode = janusGraphGenericDao
303 .getChildrenNodes(UniqueIdBuilder.getKeyByNodeType(parentNodeType), parentCategory.getUniqueId(), GraphEdgeLabels.SUB_CATEGORY,
304 childNodeType, SubCategoryData.class);
305 if (parentNode.isRight()) {
306 JanusGraphOperationStatus janusGraphOperationStatus = parentNode.right().value();
307 if (janusGraphOperationStatus == JanusGraphOperationStatus.NOT_FOUND) {
308 log.trace("Didn't find subcategories for category {}, category type {}", categoryName, parentNodeType);
309 janusGraphOperationStatus = JanusGraphOperationStatus.OK;
311 return janusGraphOperationStatus;
313 List<ImmutablePair<SubCategoryData, GraphEdge>> subsCategoriesData = parentNode.left().value();
314 List<SubCategoryDefinition> subCategoriesDefinitions = new ArrayList<>();
315 for (ImmutablePair<SubCategoryData, GraphEdge> subCatPair : subsCategoriesData) {
316 SubCategoryDataDefinition subCategoryDataDefinition = subCatPair.getLeft().getSubCategoryDataDefinition();
317 SubCategoryDefinition subCategoryDefinition = new SubCategoryDefinition(subCategoryDataDefinition);
319 log.trace("Found sub-category {} for category {}, category type {}", subCategoryDataDefinition.getName(), categoryName, parentNodeType);
320 JanusGraphOperationStatus
321 setGroupings = setGroupings(childNodeType, subCategoryDefinition);
322 if (setGroupings != JanusGraphOperationStatus.OK) {
323 log.debug("Failed to set groupings for sub-category {}, sub-category type {}, error {}", subCategoryDataDefinition.getName(), childNodeType, setGroupings);
324 return JanusGraphOperationStatus.GENERAL_ERROR;
326 subCategoriesDefinitions.add(subCategoryDefinition);
328 parentCategory.setSubcategories(subCategoriesDefinitions);
330 return JanusGraphOperationStatus.OK;
333 private JanusGraphOperationStatus setGroupings(NodeTypeEnum parentNodeType, SubCategoryDefinition parentSubCategory) {
334 NodeTypeEnum childNodeType = getChildNodeType(parentNodeType);
335 if (childNodeType != null) {
336 String subCategoryName = parentSubCategory.getName();
337 log.trace("Getting groupings for subcategory {}, subcategory type {}", subCategoryName, parentNodeType);
338 Either<List<ImmutablePair<GroupingData, GraphEdge>>, JanusGraphOperationStatus> parentNode = janusGraphGenericDao
339 .getChildrenNodes(UniqueIdBuilder.getKeyByNodeType(parentNodeType), parentSubCategory.getUniqueId(), GraphEdgeLabels.GROUPING,
340 childNodeType, GroupingData.class);
341 if (parentNode.isRight()) {
342 JanusGraphOperationStatus janusGraphOperationStatus = parentNode.right().value();
343 if (janusGraphOperationStatus == JanusGraphOperationStatus.NOT_FOUND) {
344 log.trace("Didn't find groupings for subcategory {}, subcategory type {}", subCategoryName, parentNodeType);
345 janusGraphOperationStatus = JanusGraphOperationStatus.OK;
347 return janusGraphOperationStatus;
349 List<ImmutablePair<GroupingData, GraphEdge>> groupingData = parentNode.left().value();
350 List<GroupingDefinition> groupingDefinitions = new ArrayList<>();
351 for (ImmutablePair<GroupingData, GraphEdge> groupPair : groupingData) {
352 GroupingDataDefinition groupingDataDefinition = groupPair.getLeft().getGroupingDataDefinition();
353 log.trace("Found grouping {} for sub-category {}, sub-category type {}", groupingDataDefinition.getName(), subCategoryName, parentNodeType);
354 groupingDefinitions.add(new GroupingDefinition(groupingDataDefinition));
356 parentSubCategory.setGroupings(groupingDefinitions);
358 return JanusGraphOperationStatus.OK;
361 private static NodeTypeEnum getChildNodeType(NodeTypeEnum parentTypeEnum) {
362 NodeTypeEnum res = null;
363 switch (parentTypeEnum) {
364 case ResourceNewCategory:
365 res = NodeTypeEnum.ResourceSubcategory;
367 case ProductCategory:
368 res = NodeTypeEnum.ProductSubcategory;
370 case ProductSubcategory:
371 res = NodeTypeEnum.ProductGrouping;
380 public Either<CategoryDefinition, ActionStatus> getCategory(NodeTypeEnum nodeType, String categoryId) {
382 if (nodeType != NodeTypeEnum.ResourceNewCategory && nodeType != NodeTypeEnum.ServiceNewCategory && nodeType != NodeTypeEnum.ProductCategory) {
383 log.debug(UNKNOWN_CATEGORY_TYPE, nodeType.name());
384 return Either.right(ActionStatus.GENERAL_ERROR);
387 Either<CategoryData, JanusGraphOperationStatus> categoryDataEither = janusGraphGenericDao
388 .getNode(UniqueIdBuilder.getKeyByNodeType(nodeType), categoryId, CategoryData.class);
389 if (categoryDataEither.isRight()) {
390 JanusGraphOperationStatus janusGraphOperationStatus = categoryDataEither.right().value();
391 log.debug("Problem while get category by id {}. reason {}", categoryId,
392 janusGraphOperationStatus);
393 if (janusGraphOperationStatus == JanusGraphOperationStatus.NOT_FOUND) {
394 return Either.right(ActionStatus.COMPONENT_CATEGORY_NOT_FOUND);
396 return Either.right(ActionStatus.GENERAL_ERROR);
398 CategoryDataDefinition categoryDataDefinition = categoryDataEither.left().value().getCategoryDataDefinition();
399 return Either.left(new CategoryDefinition(categoryDataDefinition));
401 janusGraphGenericDao.commit();
406 public Either<SubCategoryDefinition, ActionStatus> getSubCategory(NodeTypeEnum nodeType, String subCategoryId) {
408 if (nodeType != NodeTypeEnum.ResourceSubcategory && nodeType != NodeTypeEnum.ProductSubcategory) {
409 log.debug("Unknown sub-category type {}", nodeType.name());
410 return Either.right(ActionStatus.GENERAL_ERROR);
413 Either<SubCategoryData, JanusGraphOperationStatus> subCategoryDataEither = janusGraphGenericDao
414 .getNode(UniqueIdBuilder.getKeyByNodeType(nodeType), subCategoryId, SubCategoryData.class);
415 if (subCategoryDataEither.isRight()) {
416 JanusGraphOperationStatus janusGraphOperationStatus = subCategoryDataEither.right().value();
417 log.debug("Problem while get sub-category by id {}. reason {}", subCategoryId,
418 janusGraphOperationStatus);
419 if (janusGraphOperationStatus == JanusGraphOperationStatus.NOT_FOUND) {
420 return Either.right(ActionStatus.COMPONENT_CATEGORY_NOT_FOUND);
422 return Either.right(ActionStatus.GENERAL_ERROR);
424 SubCategoryDataDefinition subCategoryDataDefinition = subCategoryDataEither.left().value().getSubCategoryDataDefinition();
425 return Either.left(new SubCategoryDefinition(subCategoryDataDefinition));
427 janusGraphGenericDao.commit();
432 public Either<CategoryDefinition, ActionStatus> deleteCategory(NodeTypeEnum nodeType, String categoryId) {
433 Either<CategoryDefinition, ActionStatus> result = null;
435 if (nodeType != NodeTypeEnum.ResourceNewCategory && nodeType != NodeTypeEnum.ServiceNewCategory && nodeType != NodeTypeEnum.ProductCategory) {
436 log.debug(UNKNOWN_CATEGORY_TYPE, nodeType.name());
437 result = Either.right(ActionStatus.GENERAL_ERROR);
440 Either<CategoryData, JanusGraphOperationStatus> categoryDataEither = janusGraphGenericDao
441 .getNode(UniqueIdBuilder.getKeyByNodeType(nodeType), categoryId, CategoryData.class);
442 if (categoryDataEither.isRight()) {
443 log.debug("Failed to retrieve category for id {} ", categoryId);
444 result = Either.right(ActionStatus.GENERAL_ERROR);
448 Either<JanusGraph, JanusGraphOperationStatus> graph = janusGraphGenericDao.getGraph();
449 if (graph.isRight()) {
450 log.debug(COULDN_T_FETCH_janusGraph_GRAPH);
451 result = Either.right(ActionStatus.GENERAL_ERROR);
455 JanusGraph tGraph = graph.left().value();
457 Iterable<JanusGraphVertex> verticesArtifact = tGraph.query().has(UniqueIdBuilder.getKeyByNodeType(nodeType), categoryId).vertices();
458 Iterator<JanusGraphVertex> iterator = verticesArtifact.iterator();
459 if (!iterator.hasNext()) {
460 log.debug("No category node for id = {}", categoryId);
461 result = Either.right(ActionStatus.GENERAL_ERROR);
464 Vertex artifactV = iterator.next();
466 CategoryDefinition deleted = new CategoryDefinition(categoryDataEither.left().value().getCategoryDataDefinition());
467 result = Either.left(deleted);
470 if (result != null && result.isLeft()) {
471 janusGraphGenericDao.commit();
473 janusGraphGenericDao.rollback();
479 public Either<SubCategoryDefinition, ActionStatus> deleteSubCategory(NodeTypeEnum nodeType, String subCategoryId) {
480 Either<SubCategoryDefinition, ActionStatus> result = null;
482 if (nodeType != NodeTypeEnum.ResourceSubcategory && nodeType != NodeTypeEnum.ProductSubcategory) {
483 log.debug("Unknown sub-category type {}", nodeType.name());
484 result = Either.right(ActionStatus.GENERAL_ERROR);
487 Either<SubCategoryData, JanusGraphOperationStatus> subCategoryDataEither = janusGraphGenericDao
488 .getNode(UniqueIdBuilder.getKeyByNodeType(nodeType), subCategoryId, SubCategoryData.class);
489 if (subCategoryDataEither.isRight()) {
490 log.debug("Failed to retrieve sub-category for id {}", subCategoryId);
491 result = Either.right(ActionStatus.GENERAL_ERROR);
495 Either<JanusGraph, JanusGraphOperationStatus> graph = janusGraphGenericDao.getGraph();
496 if (graph.isRight()) {
497 log.debug(COULDN_T_FETCH_janusGraph_GRAPH);
498 result = Either.right(ActionStatus.GENERAL_ERROR);
502 JanusGraph tGraph = graph.left().value();
504 Iterable<JanusGraphVertex> verticesArtifact = tGraph.query().has(UniqueIdBuilder.getKeyByNodeType(nodeType), subCategoryId).vertices();
505 Iterator<JanusGraphVertex> iterator = verticesArtifact.iterator();
506 if (!iterator.hasNext()) {
507 log.debug("No sub-category node for id {}", subCategoryId);
508 result = Either.right(ActionStatus.GENERAL_ERROR);
511 Vertex artifactV = iterator.next();
514 SubCategoryDefinition deleted = new SubCategoryDefinition(subCategoryDataEither.left().value().getSubCategoryDataDefinition());
515 result = Either.left(deleted);
518 if (result != null && result.isLeft()) {
519 janusGraphGenericDao.commit();
521 janusGraphGenericDao.rollback();
528 public Either<GroupingDefinition, ActionStatus> deleteGrouping(NodeTypeEnum nodeType, String groupingId) {
529 Either<GroupingDefinition, ActionStatus> result = null;
531 if (nodeType != NodeTypeEnum.ProductGrouping) {
532 log.debug("Unknown grouping type {}", nodeType.name());
533 result = Either.right(ActionStatus.GENERAL_ERROR);
536 Either<GroupingData, JanusGraphOperationStatus> groupingDataEither = janusGraphGenericDao
537 .getNode(UniqueIdBuilder.getKeyByNodeType(nodeType), groupingId, GroupingData.class);
538 if (groupingDataEither.isRight()) {
539 log.debug("Failed to retrieve grouping for id {}", groupingId);
540 result = Either.right(ActionStatus.GENERAL_ERROR);
544 Either<JanusGraph, JanusGraphOperationStatus> graph = janusGraphGenericDao.getGraph();
545 if (graph.isRight()) {
546 log.debug(COULDN_T_FETCH_janusGraph_GRAPH);
547 result = Either.right(ActionStatus.GENERAL_ERROR);
551 JanusGraph tGraph = graph.left().value();
553 Iterable<JanusGraphVertex> verticesArtifact = tGraph.query().has(UniqueIdBuilder.getKeyByNodeType(nodeType), groupingId).vertices();
554 Iterator<JanusGraphVertex> iterator = verticesArtifact.iterator();
555 if (!iterator.hasNext()) {
556 log.debug("No grouping node for id {}", groupingId);
557 result = Either.right(ActionStatus.GENERAL_ERROR);
560 Vertex artifactV = iterator.next();
563 GroupingDefinition deleted = new GroupingDefinition(groupingDataEither.left().value().getGroupingDataDefinition());
564 result = Either.left(deleted);
567 if (result != null && result.isLeft()) {
568 janusGraphGenericDao.commit();
570 janusGraphGenericDao.rollback();
576 public Either<Boolean, ActionStatus> isCategoryUniqueForType(NodeTypeEnum nodeType, String normalizedName) {
578 Map<String, Object> properties = new HashMap<>();
579 properties.put(GraphPropertiesDictionary.NORMALIZED_NAME.getProperty(), normalizedName);
581 Either<List<CategoryData>, JanusGraphOperationStatus> categoryEither = janusGraphGenericDao
582 .getByCriteria(nodeType, properties, CategoryData.class);
583 if (categoryEither.isRight() && categoryEither.right().value() != JanusGraphOperationStatus.NOT_FOUND) {
584 log.debug("Failed to get categories, nodeType {}, normalizedName {}, error {}", nodeType, normalizedName, categoryEither.right().value());
585 return Either.right(ActionStatus.GENERAL_ERROR);
587 List<CategoryData> categoryList = (categoryEither.isLeft() ? categoryEither.left().value() : null);
588 if (categoryList != null && categoryList.size() > 0) {
589 log.debug("Found category for nodeType {} with normalizedName {}", nodeType, normalizedName);
590 if (categoryList.size() > 1) {
591 log.debug("Found more than 1 unique categories for nodeType {} with normalizedName", nodeType, normalizedName);
592 return Either.right(ActionStatus.GENERAL_ERROR);
594 return Either.left(false);
596 log.debug("Category for nodeType {} with normalizedName {} doesn't exist in graph", nodeType, normalizedName);
597 return Either.left(true);
600 janusGraphGenericDao.commit();
605 public Either<Boolean, ActionStatus> isSubCategoryUniqueForCategory(NodeTypeEnum nodeType, String subCategoryNormName, String parentCategoryId) {
607 String subCategoryId = UniqueIdBuilder.buildSubCategoryUid(parentCategoryId, subCategoryNormName);
609 Either<SubCategoryData, JanusGraphOperationStatus> subCategoryDataEither = janusGraphGenericDao
610 .getNode(UniqueIdBuilder.getKeyByNodeType(nodeType), subCategoryId, SubCategoryData.class);
611 if (subCategoryDataEither.isRight() && subCategoryDataEither.right().value() != JanusGraphOperationStatus.NOT_FOUND) {
612 log.debug("Failed to get sub-category with id {}, error {}", subCategoryId, subCategoryDataEither.right().value());
613 return Either.right(ActionStatus.GENERAL_ERROR);
615 SubCategoryData subCategoryData = (subCategoryDataEither.isLeft() ? subCategoryDataEither.left().value() : null);
616 if (subCategoryData != null) {
617 log.debug("Found sub-category with id {}", subCategoryId);
618 return Either.left(false);
620 log.debug("Sub-category for id {} doesn't exist in graph", subCategoryId);
621 return Either.left(true);
624 janusGraphGenericDao.commit();
629 public Either<Boolean, ActionStatus> isGroupingUniqueForSubCategory(NodeTypeEnum nodeType, String groupingNormName, String parentSubCategoryId) {
631 String groupingId = UniqueIdBuilder.buildGroupingUid(parentSubCategoryId, groupingNormName);
633 Either<GroupingData, JanusGraphOperationStatus> groupingDataEither = janusGraphGenericDao
634 .getNode(UniqueIdBuilder.getKeyByNodeType(nodeType), groupingId, GroupingData.class);
635 if (groupingDataEither.isRight() && groupingDataEither.right().value() != JanusGraphOperationStatus.NOT_FOUND) {
636 log.debug("Failed to get grouping with id {}, error {}", groupingId, groupingDataEither.right().value());
637 return Either.right(ActionStatus.GENERAL_ERROR);
639 GroupingData groupingData = (groupingDataEither.isLeft() ? groupingDataEither.left().value() : null);
640 if (groupingData != null) {
641 log.debug("Found grouping with id {}", groupingId);
642 return Either.left(false);
644 log.debug("Grouping for id {} doesn't exist in graph", groupingId);
645 return Either.left(true);
648 janusGraphGenericDao.commit();
653 public Either<SubCategoryDefinition, ActionStatus> getSubCategoryUniqueForType(NodeTypeEnum nodeType, String normalizedName) {
654 Map<String, Object> properties = new HashMap<>();
655 properties.put(GraphPropertiesDictionary.NORMALIZED_NAME.getProperty(), normalizedName);
657 Either<List<SubCategoryData>, JanusGraphOperationStatus> subCategoryEither = janusGraphGenericDao
658 .getByCriteria(nodeType, properties, SubCategoryData.class);
659 if (subCategoryEither.isRight() && subCategoryEither.right().value() != JanusGraphOperationStatus.NOT_FOUND) {
660 log.debug("Failed to get sub-categories, nodeType {}, normalizedName {}, error {}", nodeType, normalizedName, subCategoryEither.right().value());
661 return Either.right(ActionStatus.GENERAL_ERROR);
663 List<SubCategoryData> subCategoryList = (subCategoryEither.isLeft() ? subCategoryEither.left().value() : null);
664 if (subCategoryList != null && subCategoryList.size() > 0) {
665 log.debug("Found sub-category for nodeType {} with normalizedName {}", nodeType, normalizedName);
666 SubCategoryData subCategoryData = subCategoryList.get(0);
667 SubCategoryDefinition subCategoryDefinition = new SubCategoryDefinition(subCategoryData.getSubCategoryDataDefinition());
668 return Either.left(subCategoryDefinition);
670 log.debug("Sub-category for nodeType {} with normalizedName {} doesn't exist in graph", nodeType, normalizedName);
671 return Either.left(null);
674 janusGraphGenericDao.commit();
679 public Either<GroupingDefinition, ActionStatus> getGroupingUniqueForType(NodeTypeEnum nodeType, String groupingNormalizedName) {
680 Map<String, Object> properties = new HashMap<>();
681 properties.put(GraphPropertiesDictionary.NORMALIZED_NAME.getProperty(), groupingNormalizedName);
683 Either<List<GroupingData>, JanusGraphOperationStatus> groupingEither = janusGraphGenericDao
684 .getByCriteria(nodeType, properties, GroupingData.class);
685 if (groupingEither.isRight() && groupingEither.right().value() != JanusGraphOperationStatus.NOT_FOUND) {
686 log.debug("Failed to get grouping, nodeType {}, normalizedName {}, error {}", nodeType, groupingNormalizedName, groupingEither.right().value());
687 return Either.right(ActionStatus.GENERAL_ERROR);
689 List<GroupingData> groupingList = (groupingEither.isLeft() ? groupingEither.left().value() : null);
690 if (groupingList != null && groupingList.size() > 0) {
691 log.debug("Found grouping for nodeType {} with normalizedName {}", nodeType, groupingNormalizedName);
692 GroupingData groupingData = groupingList.get(0);
693 GroupingDefinition groupingDefinition = new GroupingDefinition(groupingData.getGroupingDataDefinition());
694 return Either.left(groupingDefinition);
696 log.debug("Grouping for nodeType {} with normalizedName {} doesn't exist in graph", nodeType, groupingNormalizedName);
697 return Either.left(null);
700 janusGraphGenericDao.commit();
709 public Either<List<Tag>, ActionStatus> getAllTags() {
711 Either<List<TagData>, JanusGraphOperationStatus> either = janusGraphGenericDao
712 .getAll(NodeTypeEnum.Tag, TagData.class);
713 if (either.isRight()) {
714 log.debug("Problem while get all tags. reason - {}", either.right().value());
715 return Either.right(ActionStatus.GENERAL_ERROR);
717 List<TagData> tagDataList = either.left().value();
718 List<Tag> tagList = convertToListOfTag(tagDataList);
719 return Either.left(tagList);
721 janusGraphGenericDao.commit();
726 public <T extends GraphNode> Either<org.openecomp.sdc.be.resources.data.CategoryData, StorageOperationStatus> getCategoryData(String name, NodeTypeEnum type, Class<T> clazz) {
728 String categoryUid = null;
729 if (type == NodeTypeEnum.ResourceCategory) {
730 String[] categoryFields = name.split("/");
731 if (categoryFields.length != 2) {
732 return Either.right(StorageOperationStatus.CATEGORY_NOT_FOUND);
734 categoryUid = UniqueIdBuilder.buildResourceCategoryUid(categoryFields[0], categoryFields[1], type);
736 categoryUid = UniqueIdBuilder.buildServiceCategoryUid(name, type);
738 Either<T, JanusGraphOperationStatus> either = janusGraphGenericDao
739 .getNode(UniqueIdBuilder.getKeyByNodeType(type), categoryUid, clazz);
741 if (either.isRight()) {
742 JanusGraphOperationStatus janusGraphOperationStatus = either.right().value();
743 log.debug("Problem while geting category with id {}. reason - {}", categoryUid, janusGraphOperationStatus
745 if (janusGraphOperationStatus == JanusGraphOperationStatus.NOT_FOUND) {
746 return Either.right(StorageOperationStatus.CATEGORY_NOT_FOUND);
748 return Either.right(StorageOperationStatus.GENERAL_ERROR);
751 return Either.left((org.openecomp.sdc.be.resources.data.CategoryData) either.left().value());
753 return Either.right(StorageOperationStatus.GENERAL_ERROR);
757 private List<Tag> convertToListOfTag(List<TagData> tagDataList) {
758 List<Tag> tagList = new ArrayList<>();
759 for (TagData elem : tagDataList) {
761 tag.setName(elem.getName());
768 public Either<List<PropertyScope>, ActionStatus> getAllPropertyScopes() {
770 List<PropertyScope> propertyScopes = new ArrayList<>();
771 PropertyScope propertyScope1 = new PropertyScope();
772 propertyScope1.setName("A&AI");
773 PropertyScope propertyScope2 = new PropertyScope();
774 propertyScope2.setName("Order");
775 PropertyScope propertyScope3 = new PropertyScope();
776 propertyScope3.setName("Runtime");
777 propertyScopes.add(propertyScope1);
778 propertyScopes.add(propertyScope2);
779 propertyScopes.add(propertyScope3);
780 return Either.left(propertyScopes);
784 public Either<List<ArtifactType>, ActionStatus> getAllArtifactTypes() {
785 List<ArtifactType> artifactTypes = new ArrayList<>();
787 List<String> artifactTypesList = ConfigurationManager.getConfigurationManager().getConfiguration().getArtifactTypes();
788 for (String artifactType : artifactTypesList) {
789 ArtifactType artifactT = new ArtifactType();
790 artifactT.setName(artifactType);
791 artifactTypes.add(artifactT);
793 return Either.left(artifactTypes);
797 public Either<Map<String, Object>, ActionStatus> getAllDeploymentArtifactTypes() {
799 Map<String, Object> artifactTypes = new HashMap<>();
800 Map<String, ArtifactTypeConfig> artifactResourceTypes = ConfigurationManager.getConfigurationManager().getConfiguration().getResourceDeploymentArtifacts();
801 Map<String, ArtifactTypeConfig> artifactServiceTypes = ConfigurationManager.getConfigurationManager().getConfiguration().getServiceDeploymentArtifacts();
802 Map<String, ArtifactTypeConfig> artifactResourceInstanceTypes = ConfigurationManager.getConfigurationManager().getConfiguration().getResourceInstanceDeploymentArtifacts();
804 artifactTypes.put("resourceDeploymentArtifacts", artifactResourceTypes);
805 artifactTypes.put("serviceDeploymentArtifacts", artifactServiceTypes);
806 artifactTypes.put("resourceInstanceDeploymentArtifacts", artifactResourceInstanceTypes);
808 return Either.left(artifactTypes);
813 public Either<Configuration.HeatDeploymentArtifactTimeout, ActionStatus> getDefaultHeatTimeout() {
814 return Either.left(ConfigurationManager.getConfigurationManager().getConfiguration().getHeatArtifactDeploymentTimeout());
818 public Either<Map<String, String>, ActionStatus> getResourceTypesMap() {
819 ResourceTypeEnum[] enumConstants = ResourceTypeEnum.class.getEnumConstants();
820 Map<String, String> resourceTypes = new HashMap<>();
821 if (enumConstants != null) {
822 for (int i = 0; i < enumConstants.length; ++i) {
823 resourceTypes.put(enumConstants[i].name(), enumConstants[i].getValue());
827 return Either.left(resourceTypes);
831 public <T extends GraphNode> Either<CategoryData, StorageOperationStatus> getNewCategoryData(String name, NodeTypeEnum type, Class<T> clazz) {
833 String categoryUid = UniqueIdBuilder.buildServiceCategoryUid(name, type);
834 Map props = new HashMap<>();
835 props.put(GraphPropertiesDictionary.NORMALIZED_NAME.getProperty(), ValidationUtils.normalizeCategoryName4Uniqueness(name));
836 Either<List<T>, JanusGraphOperationStatus> either = janusGraphGenericDao
837 .getByCriteria(type, props, clazz);
839 if (either.isRight()) {
840 JanusGraphOperationStatus janusGraphOperationStatus = either.right().value();
841 log.debug("Problem while geting category with id {}. reason - {}", categoryUid, janusGraphOperationStatus
843 if (janusGraphOperationStatus == JanusGraphOperationStatus.NOT_FOUND) {
844 return Either.right(StorageOperationStatus.CATEGORY_NOT_FOUND);
846 return Either.right(StorageOperationStatus.GENERAL_ERROR);
849 return Either.left((CategoryData) either.left().value().get(0));
851 return Either.right(StorageOperationStatus.GENERAL_ERROR);