Migrate "ms/controllerblueprints" from ccsdk/apps
[ccsdk/cds.git] / ms / controllerblueprints / modules / service / src / main / java / org / onap / ccsdk / apps / controllerblueprints / service / AutoResourceMappingService.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.apps.controllerblueprints.service;\r
19 \r
20 import com.att.eelf.configuration.EELFLogger;\r
21 import com.att.eelf.configuration.EELFManager;\r
22 import com.google.common.base.Preconditions;\r
23 import org.apache.commons.collections.CollectionUtils;\r
24 import org.apache.commons.lang3.StringUtils;\r
25 import org.onap.ccsdk.apps.controllerblueprints.core.BluePrintException;\r
26 import org.onap.ccsdk.apps.controllerblueprints.core.data.PropertyDefinition;\r
27 import org.onap.ccsdk.apps.controllerblueprints.resource.dict.ResourceAssignment;\r
28 import org.onap.ccsdk.apps.controllerblueprints.resource.dict.ResourceDefinition;\r
29 import org.onap.ccsdk.apps.controllerblueprints.resource.dict.utils.ResourceDictionaryUtils;\r
30 import org.onap.ccsdk.apps.controllerblueprints.service.domain.ResourceDictionary;\r
31 import org.onap.ccsdk.apps.controllerblueprints.service.model.AutoMapResponse;\r
32 import org.onap.ccsdk.apps.controllerblueprints.service.repository.ResourceDictionaryRepository;\r
33 import org.springframework.stereotype.Service;\r
34 \r
35 import java.util.ArrayList;\r
36 import java.util.HashMap;\r
37 import java.util.List;\r
38 import java.util.Map;\r
39 \r
40 /**\r
41  * AutoResourceMappingService.java Purpose: Provide Automapping of Resource Assignments AutoResourceMappingService\r
42  *\r
43  * @author Brinda Santh\r
44  * @version 1.0\r
45  */\r
46 \r
47 @Service\r
48 @SuppressWarnings("unused")\r
49 public class AutoResourceMappingService {\r
50 \r
51     private static EELFLogger log = EELFManager.getInstance().getLogger(AutoResourceMappingService.class);\r
52 \r
53     private ResourceDictionaryRepository dataDictionaryRepository;\r
54 \r
55     /**\r
56      * This is a AutoResourceMappingService constructor\r
57      *\r
58      * @param dataDictionaryRepository dataDictionaryRepository\r
59      */\r
60     public AutoResourceMappingService(ResourceDictionaryRepository dataDictionaryRepository) {\r
61         this.dataDictionaryRepository = dataDictionaryRepository;\r
62     }\r
63 \r
64     /**\r
65      * This is a autoMap service to map the template keys automatically to Dictionary fields.\r
66      *\r
67      * @param resourceAssignments resourceAssignments\r
68      * @return AutoMapResponse\r
69      */\r
70     public AutoMapResponse autoMap(List<ResourceAssignment> resourceAssignments) throws BluePrintException {\r
71         AutoMapResponse autoMapResponse = new AutoMapResponse();\r
72         try {\r
73             if (CollectionUtils.isNotEmpty(resourceAssignments)) {\r
74 \r
75                 // Create the Dictionary definitions for the ResourceAssignment Names\r
76                 Map<String, ResourceDictionary> dictionaryMap = getDictionaryDefinitions(resourceAssignments);\r
77 \r
78                 for (ResourceAssignment resourceAssignment : resourceAssignments) {\r
79                     if (resourceAssignment != null && StringUtils.isNotBlank(resourceAssignment.getName())\r
80                             && StringUtils.isBlank(resourceAssignment.getDictionaryName())) {\r
81 \r
82                         populateDictionaryMapping(dictionaryMap, resourceAssignment);\r
83 \r
84                         log.info("Mapped Resource : {}", resourceAssignment);\r
85 \r
86                     }\r
87                 }\r
88             }\r
89             List<ResourceDictionary> dictionaries = getDictionaryDefinitionsList(resourceAssignments);\r
90             List<ResourceAssignment> resourceAssignmentsFinal = getAllAutomapResourceAssignments(resourceAssignments);\r
91             autoMapResponse.setDataDictionaries(dictionaries);\r
92             autoMapResponse.setResourceAssignments(resourceAssignmentsFinal);\r
93         } catch (Exception e) {\r
94             log.error(String.format("Failed in auto process %s", e.getMessage()));\r
95             throw new BluePrintException(e.getMessage(), e);\r
96         }\r
97         return autoMapResponse;\r
98     }\r
99 \r
100     private void populateDictionaryMapping(Map<String, ResourceDictionary> dictionaryMap, ResourceAssignment resourceAssignment) {\r
101         ResourceDictionary dbDataDictionary = dictionaryMap.get(resourceAssignment.getName());\r
102         if (dbDataDictionary != null && dbDataDictionary.getDefinition() != null) {\r
103 \r
104             ResourceDefinition dictionaryDefinition = dbDataDictionary.getDefinition();\r
105 \r
106             if (dictionaryDefinition != null && StringUtils.isNotBlank(dictionaryDefinition.getName())\r
107                     && StringUtils.isBlank(resourceAssignment.getDictionaryName())) {\r
108 \r
109                 resourceAssignment.setDictionaryName(dbDataDictionary.getName());\r
110                 ResourceDictionaryUtils.populateSourceMapping(resourceAssignment, dictionaryDefinition);\r
111             }\r
112         }\r
113     }\r
114 \r
115     private Map<String, ResourceDictionary> getDictionaryDefinitions(List<ResourceAssignment> resourceAssignments) {\r
116         Map<String, ResourceDictionary> dictionaryMap = new HashMap<>();\r
117         List<String> names = new ArrayList<>();\r
118         for (ResourceAssignment resourceAssignment : resourceAssignments) {\r
119             if (resourceAssignment != null && StringUtils.isNotBlank(resourceAssignment.getName())) {\r
120                 names.add(resourceAssignment.getName());\r
121             }\r
122         }\r
123         if (CollectionUtils.isNotEmpty(names)) {\r
124 \r
125             List<ResourceDictionary> dictionaries = dataDictionaryRepository.findByNameIn(names);\r
126             if (CollectionUtils.isNotEmpty(dictionaries)) {\r
127                 for (ResourceDictionary dataDictionary : dictionaries) {\r
128                     if (dataDictionary != null && StringUtils.isNotBlank(dataDictionary.getName())) {\r
129                         dictionaryMap.put(dataDictionary.getName(), dataDictionary);\r
130                     }\r
131                 }\r
132             }\r
133         }\r
134         return dictionaryMap;\r
135 \r
136     }\r
137 \r
138     private List<ResourceDictionary> getDictionaryDefinitionsList(List<ResourceAssignment> resourceAssignments) {\r
139         List<ResourceDictionary> dictionaries = null;\r
140         List<String> names = new ArrayList<>();\r
141         for (ResourceAssignment resourceAssignment : resourceAssignments) {\r
142             if (resourceAssignment != null && StringUtils.isNotBlank(resourceAssignment.getDictionaryName())) {\r
143 \r
144                 if (!names.contains(resourceAssignment.getDictionaryName())) {\r
145                     names.add(resourceAssignment.getDictionaryName());\r
146                 }\r
147 \r
148                 if (resourceAssignment.getDependencies() != null && !resourceAssignment.getDependencies().isEmpty()) {\r
149                     List<String> dependencyNames = resourceAssignment.getDependencies();\r
150                     for (String dependencyName : dependencyNames) {\r
151                         if (StringUtils.isNotBlank(dependencyName) && !names.contains(dependencyName)) {\r
152                             names.add(dependencyName);\r
153                         }\r
154                     }\r
155                 }\r
156             }\r
157         }\r
158         if (CollectionUtils.isNotEmpty(names)) {\r
159             dictionaries = dataDictionaryRepository.findByNameIn(names);\r
160         }\r
161         return dictionaries;\r
162 \r
163     }\r
164 \r
165     private List<ResourceAssignment> getAllAutomapResourceAssignments(List<ResourceAssignment> resourceAssignments) {\r
166         List<ResourceDictionary> dictionaries = null;\r
167         List<String> names = new ArrayList<>();\r
168         for (ResourceAssignment resourceAssignment : resourceAssignments) {\r
169             if (resourceAssignment != null && StringUtils.isNotBlank(resourceAssignment.getDictionaryName())) {\r
170                 if (resourceAssignment.getDependencies() != null && !resourceAssignment.getDependencies().isEmpty()) {\r
171                     List<String> dependencieNames = resourceAssignment.getDependencies();\r
172                     for (String dependencieName : dependencieNames) {\r
173                         if (StringUtils.isNotBlank(dependencieName) && !names.contains(dependencieName)\r
174                                 && !checkAssignmentsExists(resourceAssignments, dependencieName)) {\r
175                             names.add(dependencieName);\r
176                         }\r
177                     }\r
178                 }\r
179             }\r
180         }\r
181 \r
182         if (!names.isEmpty()) {\r
183             dictionaries = dataDictionaryRepository.findByNameIn(names);\r
184         }\r
185         if (dictionaries != null) {\r
186             for (ResourceDictionary resourcedictionary : dictionaries) {\r
187                 ResourceDefinition dictionaryDefinition = resourcedictionary.getDefinition();\r
188                 Preconditions.checkNotNull(dictionaryDefinition, "failed to get Resource Definition from dictionary definition");\r
189                 PropertyDefinition property = new PropertyDefinition();\r
190                 property.setRequired(true);\r
191                 ResourceAssignment resourceAssignment = new ResourceAssignment();\r
192                 resourceAssignment.setName(resourcedictionary.getName());\r
193                 resourceAssignment.setDictionaryName(resourcedictionary\r
194                         .getName());\r
195                 resourceAssignment.setVersion(0);\r
196                 resourceAssignment.setProperty(property);\r
197                 ResourceDictionaryUtils.populateSourceMapping(resourceAssignment, dictionaryDefinition);\r
198                 resourceAssignments.add(resourceAssignment);\r
199             }\r
200         }\r
201         return resourceAssignments;\r
202 \r
203     }\r
204 \r
205 \r
206     private boolean checkAssignmentsExists(List<ResourceAssignment> resourceAssignmentsWithDepencies, String resourceName) {\r
207         return resourceAssignmentsWithDepencies.stream().anyMatch(names -> names.getName().equalsIgnoreCase(resourceName));\r
208     }\r
209 \r
210 }\r