Fix OSGi wiring issues
[ccsdk/features.git] / blueprints-processor / plugin / assignment-provider / src / main / java / org / onap / ccsdk / config / assignment / processor / ResourceAssignmentProcessor.java
1 /*\r
2  * Copyright © 2017-2018 AT&T Intellectual Property.\r
3  * Modifications Copyright © 2018 IBM.\r
4  * \r
5  * Licensed under the Apache License, Version 2.0 (the "License");\r
6  * you may not use this file except in compliance with the License.\r
7  * You may obtain a copy of the License at\r
8  * \r
9  * http://www.apache.org/licenses/LICENSE-2.0\r
10  * \r
11  * Unless required by applicable law or agreed to in writing, software\r
12  * distributed under the License is distributed on an "AS IS" BASIS,\r
13  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
14  * See the License for the specific language governing permissions and\r
15  * limitations under the License.\r
16  */\r
17 \r
18 package org.onap.ccsdk.config.assignment.processor;\r
19 \r
20 import java.util.ArrayList;\r
21 import java.util.HashMap;\r
22 import java.util.List;\r
23 import java.util.Map;\r
24 import org.apache.commons.collections.CollectionUtils;\r
25 import org.onap.ccsdk.config.model.data.ResourceAssignment;\r
26 import org.onap.ccsdk.config.model.utils.TopologicalSortingUtils;\r
27 import org.onap.ccsdk.sli.core.sli.SvcLogicContext;\r
28 import com.att.eelf.configuration.EELFLogger;\r
29 import com.att.eelf.configuration.EELFManager;\r
30 \r
31 public class ResourceAssignmentProcessor {\r
32     private static EELFLogger logger = EELFManager.getInstance().getLogger(ResourceAssignmentProcessor.class);\r
33 \r
34     private List<ResourceAssignment> assignments;\r
35     private Map<String, ResourceAssignment> resourceAssignmentMap;\r
36 \r
37     @SuppressWarnings("squid:S1172")\r
38     public ResourceAssignmentProcessor(List<ResourceAssignment> assignments, SvcLogicContext ctx) {\r
39         this.assignments = assignments;\r
40         this.resourceAssignmentMap = new HashMap<>();\r
41     }\r
42 \r
43     @SuppressWarnings("squid:S3776")\r
44     public List<List<ResourceAssignment>> process() {\r
45         List<List<ResourceAssignment>> sequenceBatchResourceAssignment = new ArrayList<>();\r
46         if (this.assignments != null) {\r
47             logger.info("Assignments ({})", this.assignments);\r
48             this.assignments.forEach(resourceMapping -> {\r
49                 if (resourceMapping != null) {\r
50                     logger.trace("Processing Key ({})", resourceMapping.getName());\r
51                     resourceAssignmentMap.put(resourceMapping.getName(), resourceMapping);\r
52                 }\r
53             });\r
54 \r
55             TopologicalSortingUtils<ResourceAssignment> topologySorting = new TopologicalSortingUtils<>();\r
56             this.resourceAssignmentMap.forEach((mappingKey, mapping) -> {\r
57                 if (mapping != null) {\r
58                     if (mapping.getDependencies() != null && !mapping.getDependencies().isEmpty()) {\r
59                         for (String dependency : mapping.getDependencies()) {\r
60                             topologySorting.add(resourceAssignmentMap.get(dependency), mapping);\r
61                         }\r
62                     } else {\r
63                         topologySorting.add(null, mapping);\r
64                     }\r
65                 }\r
66             });\r
67 \r
68             List<ResourceAssignment> sequencedResourceAssignments = topologySorting.topSort();\r
69             logger.info("Sorted Sequenced Assignments ({})", sequencedResourceAssignments);\r
70 \r
71             List<ResourceAssignment> batchResourceAssignment = null;\r
72             List<String> batchAssignmentName = null;\r
73             for (int i = 0; i < sequencedResourceAssignments.size(); i++) {\r
74                 ResourceAssignment resourceAssignment = sequencedResourceAssignments.get(i);\r
75                 ResourceAssignment previousResourceAssignment = null;\r
76 \r
77                 if (i > 0) {\r
78                     previousResourceAssignment = sequencedResourceAssignments.get(i - 1);\r
79                 }\r
80                 if (resourceAssignment != null) {\r
81 \r
82                     boolean dependencyPresence = false;\r
83                     if (batchAssignmentName != null && resourceAssignment.getDependencies() != null) {\r
84                         dependencyPresence =\r
85                                 CollectionUtils.containsAny(batchAssignmentName, resourceAssignment.getDependencies());\r
86                     }\r
87 \r
88                     logger.trace("({}) -> Checking ({}), with ({}), result ({})", resourceAssignment.getName(),\r
89                             batchAssignmentName, resourceAssignment.getDependencies(), dependencyPresence);\r
90 \r
91                     if (previousResourceAssignment != null && resourceAssignment.getDictionarySource() != null\r
92                             && resourceAssignment.getDictionarySource()\r
93                                     .equalsIgnoreCase(previousResourceAssignment.getDictionarySource())\r
94                             && !dependencyPresence) {\r
95                         batchResourceAssignment.add(resourceAssignment);\r
96                         batchAssignmentName.add(resourceAssignment.getName());\r
97                     } else {\r
98                         if (batchResourceAssignment != null) {\r
99                             sequenceBatchResourceAssignment.add(batchResourceAssignment);\r
100                             logger.trace("Created old Set ({})", batchAssignmentName);\r
101                         }\r
102                         batchResourceAssignment = new ArrayList<>();\r
103                         batchResourceAssignment.add(resourceAssignment);\r
104 \r
105                         batchAssignmentName = new ArrayList<>();\r
106                         batchAssignmentName.add(resourceAssignment.getName());\r
107                     }\r
108                 }\r
109 \r
110                 if (i == (sequencedResourceAssignments.size() - 1)) {\r
111                     logger.trace("Created old Set ({})", batchAssignmentName);\r
112                     sequenceBatchResourceAssignment.add(batchResourceAssignment);\r
113                 }\r
114             }\r
115             logger.info("Batched Sequence : ({})", sequenceBatchResourceAssignment);\r
116         }\r
117         return sequenceBatchResourceAssignment;\r
118     }\r
119 \r
120 }\r