1 package org.openecomp.sdc.asdctool.impl.migration.v1707.jsonmodel;
4 import org.openecomp.sdc.be.datatypes.enums.ResourceTypeEnum;
5 import org.openecomp.sdc.be.model.Resource;
6 import org.openecomp.sdc.be.model.operations.api.IResourceOperation;
7 import org.openecomp.sdc.be.model.operations.api.StorageOperationStatus;
9 import java.util.ArrayDeque;
10 import java.util.ArrayList;
11 import java.util.Collections;
12 import java.util.List;
13 import java.util.Queue;
14 import java.util.stream.Collectors;
16 public class NormativesResolver {
18 @javax.annotation.Resource(name = "resource-operation")
19 private IResourceOperation resourceOperation;
23 * @return list of all normatives sorted by neighboring order
25 public Either<List<Resource>, StorageOperationStatus> getAllNodeTypeNormatives() {
26 Either<List<Resource>, StorageOperationStatus> rootNormatives = resourceOperation.getRootResources();
27 return rootNormatives.either(this::getAllNormatives,
32 private Either<List<Resource>, StorageOperationStatus> getAllNormatives(List<Resource> rootResources) {
33 List<Resource> allNormatives = new ArrayList<>();
34 for (Resource rootResource : rootResources) {
35 Either<List<Resource>, StorageOperationStatus> normativesOfRoot = getAllNodeTypeNormatives(rootResource);
36 if (normativesOfRoot.isRight()) {
37 return Either.right(normativesOfRoot.right().value());
39 allNormatives.addAll(normativesOfRoot.left().value());
41 return Either.left(allNormatives);
44 private Either<List<Resource>, StorageOperationStatus> getAllNodeTypeNormatives(Resource root) {
45 List<Resource> normativeResources = new ArrayList<>();
46 Queue<Resource> resources = new ArrayDeque<>();
48 while (!resources.isEmpty()) {
49 Resource currentResource = resources.poll();
50 normativeResources.add(currentResource);
51 Either<List<Resource>, StorageOperationStatus> allDerivedResources = getAllNonVFDerivedResources(currentResource);
52 if (allDerivedResources.isRight()) {
53 return Either.right(allDerivedResources.right().value());
55 List<Resource> derivedResources = allDerivedResources.left().value();
56 replaceDerivedNameWithDerivedUniqueId(currentResource, derivedResources);
57 resources.addAll(derivedResources);
59 return Either.left(normativeResources);
62 private void replaceDerivedNameWithDerivedUniqueId(Resource currentResource, List<Resource> derivedResources) {
63 derivedResources.forEach(resource -> resource.setDerivedFrom(Collections.singletonList(currentResource.getUniqueId())));
66 private Either<List<Resource>, StorageOperationStatus> getAllNonVFDerivedResources(Resource resource) {
67 Either<List<Resource>, StorageOperationStatus> childrenNodes = resourceOperation.getAllDerivedResources(resource);
68 return childrenNodes.either(resourceList -> Either.left(filterNonVFResources(resourceList)),
69 this::resolveEmptyListOrErrorStatus);
72 private List<Resource> filterNonVFResources(List<Resource> resources) {
73 return resources.stream().filter(resource -> resource.getResourceType() != ResourceTypeEnum.VF).collect(Collectors.toList());
76 private Either<List<Resource>, StorageOperationStatus> resolveEmptyListOrErrorStatus(StorageOperationStatus storageOperationStatus) {
77 return storageOperationStatus == StorageOperationStatus.NOT_FOUND ? Either.left(Collections.emptyList()) : Either.right(storageOperationStatus);