205faf535593b76eacb54e42612d5daedeb6129d
[sdc.git] /
1 package org.openecomp.sdc.asdctool.impl.migration.v1707.jsonmodel;
2
3 import fj.data.Either;
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;
8
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;
15
16 public class NormativesResolver {
17
18     @javax.annotation.Resource(name = "resource-operation")
19     private IResourceOperation resourceOperation;
20
21     /**
22      *
23      * @return list of all normatives sorted by neighboring order
24      */
25     public Either<List<Resource>, StorageOperationStatus> getAllNodeTypeNormatives() {
26         Either<List<Resource>, StorageOperationStatus> rootNormatives = resourceOperation.getRootResources();
27         return rootNormatives.either(this::getAllNormatives,
28                                      Either::right);
29
30     }
31
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());
38             }
39             allNormatives.addAll(normativesOfRoot.left().value());
40         }
41         return Either.left(allNormatives);
42     }
43
44     private Either<List<Resource>, StorageOperationStatus> getAllNodeTypeNormatives(Resource root) {
45         List<Resource> normativeResources = new ArrayList<>();
46         Queue<Resource> resources = new ArrayDeque<>();
47         resources.add(root);
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());
54             }
55             List<Resource> derivedResources = allDerivedResources.left().value();
56             replaceDerivedNameWithDerivedUniqueId(currentResource, derivedResources);
57             resources.addAll(derivedResources);
58         }
59         return Either.left(normativeResources);
60     }
61
62     private void replaceDerivedNameWithDerivedUniqueId(Resource currentResource, List<Resource> derivedResources) {
63         derivedResources.forEach(resource -> resource.setDerivedFrom(Collections.singletonList(currentResource.getUniqueId())));
64     }
65
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);
70     }
71
72     private List<Resource> filterNonVFResources(List<Resource> resources) {
73         return resources.stream().filter(resource -> resource.getResourceType() != ResourceTypeEnum.VF).collect(Collectors.toList());
74     }
75
76     private Either<List<Resource>, StorageOperationStatus> resolveEmptyListOrErrorStatus(StorageOperationStatus storageOperationStatus) {
77         return storageOperationStatus == StorageOperationStatus.NOT_FOUND ? Either.left(Collections.emptyList()) : Either.right(storageOperationStatus);
78     }
79
80
81 }